ФорумПрограммированиеPHP для идиотов → Подмена шаблона при асинхронном запросе

Подмена шаблона при асинхронном запросе

  • kostyl

    Сообщения: 5210 Репутация: N Группа: Джедаи

    Spritz 16 июня 2010 г. 17:12

    Такой вопрос. Не могу сообразить как красиво подменить шаблон при запросе ajax.
    Если кто знает Зенд, там есть слой - это основной шаблоно, в который инжектируются представления другие.
    При аджакс обращении он как то там убирается, то есть как я понимаю, благодря наличию сущьности лайер его можно задизейблить и всё как бы, ну не всё, там происходит куча всякой хуйни, которая меня напрягает.
    Так вот у меня есть объект Respose - обычный массив с гетом и сетом, представляющий данные представления. ))
    При аджаксе я могу сделать такие действия, чтобы убить основной шаблон:
    1. Так как основной шаблон - это самый первый массив в Respose, то я могу просто выдрать его от туда а остальное оставить, распарсить и отправить как json или еще что то там, но там могут остаться левые подмасиивы котрые были в главном шаблоне, тобишь меню и всякая херня. То есть мне этот метод не нравиться особо.
    2. Могу тупо по условию $request->isAjax() не вставлять главный шаблон, а брать данные отдельного экшена, но так теряется гибкость и возможно надо будет делать шаблон как при простом запросе, тобишь главный, но немного другой без всяких меню, чтобы возвращать результат нескольких экшенов.
    3. Может вы что то посоветуете, если поймете эту хрень, что я написал?
  • Абырвалг

    Сообщения: 6480 Репутация: N Группа: Джедаи

    Spritz 16 июня 2010 г. 17:14, спустя 2 минуты 18 секунд

    неприлично много написал)

    http://www.twig-project.org/book/02-Twig-for-Template-Designers
    Dynamic Inheritance (as of Twig 0.9.7)
  • kostyl

    Сообщения: 5210 Репутация: N Группа: Джедаи

    Spritz 16 июня 2010 г. 17:31, спустя 17 минут 11 секунд

    Абырвалг, предлагаешь подмену в шаблонизаторе самом сделать?
    Скорее всего надо сделать просто:
    1. Подменить шаблон
    2. Подменить тип ответа с заголовками
  • Абырвалг

    Сообщения: 6480 Репутация: N Группа: Джедаи

    Spritz 16 июня 2010 г. 17:49, спустя 18 минут 15 секунд

    Ну вообще я начинал писать BL задолго до того, как появилась эта фича. А она буквально на прошлой неделе появилась.

    у меня в BL_Response есть

    public function ajaxResponse($body, $type = 'json', $cache = false)

    body - строка/массив/объект+ArrayAccess
    тип - json/html/в планах XML
    cache - отправлять заголовки "не кешируй" или нет.


    То есть, в контроллере:
    $tpl = template('modulename/form')->assign('data', $data);
    if ($this->app->getRequest()->isAjax()) {
    $this->app->getResponse()->ajaxResponse($tpl->render(), 'html'); // тупо посылаю этот кусочек
    }
    $this->app->getPage()->setData('main', $tpl->render()); // это я беру шаблон главной основной страницы и ассигню кусочек на блок `main`
    Спустя 199 сек.
    а, и этот ajaxResponse сам ставит нужные заголовки (app/json, xml, html)
  • phpdude

    Сообщения: 26646 Репутация: N Группа: в ухо

    Spritz 16 июня 2010 г. 17:55, спустя 5 минут 50 секунд

    имхо ajax + !json = !ajax. другими словами аякс и хтмл ответы - дерьмо а не аякс
    Сапожник без сапог
  • adw0rd

    Сообщения: 22959 Репутация: N Группа: в ухо

    Spritz 16 июня 2010 г. 18:00, спустя 4 минуты 39 секунд

    хз, ajax прямого отношения не имеет к json и не надо
    https://smappi.org/ - платформа по созданию API на все случаи жизни
  • Абырвалг

    Сообщения: 6480 Репутация: N Группа: Джедаи

    Spritz 16 июня 2010 г. 18:04, спустя 4 минуты 11 секунд

    phpdude, далеко не всегда
  • kostyl

    Сообщения: 5210 Репутация: N Группа: Джедаи

    Spritz 16 июня 2010 г. 18:09, спустя 5 минут 16 секунд

    ага, ну ты отобразил мне вариант 2 из трёх, а если там надо результат двух модулей вернуть?
    Спустя 88 сек.
    phpdude, нафиг делать евал если можно изменить контент зону, заменив хтмл?
    Это не всегда так, но всё же?
  • Абырвалг

    Сообщения: 6480 Репутация: N Группа: Джедаи

    Spritz 16 июня 2010 г. 18:15, спустя 5 минут 49 секунд

    что знач двух модулей?

    публикуешь коммент - модуль комментарии отработал
  • kostyl

    Сообщения: 5210 Репутация: N Группа: Джедаи

    Spritz 16 июня 2010 г. 18:41, спустя 26 минут 9 секунд

    Абырвалг, не у меня может сразу обновится несколько контент зон, добавил коммент - добавился коммент, и где нить вверху обновилось число комментов. Ну это туповатый пример, но вообще так.
  • Абырвалг

    Сообщения: 6480 Репутация: N Группа: Джедаи

    Spritz 16 июня 2010 г. 18:44, спустя 2 минуты 19 секунд

    другими словами аякс и хтмл ответы - дерьмо а не аякс

    вот давай на примере комментариев рассмотрим. Пусть у нас есть блок с комментами и постраничная навигация в них осуществляется аяксово.

    html:
    мы на сервере через шаблон формируем этот список и отдает аштээмло

    json:
    мы возвращаем json и на стороне клиента формируем аштээмло (тут нужен какой-то свой шаблонизатор клиентский наверно).


    И тут мы решили поменять дизайн… В твоем случае придется лезть в 2 шаблона, в моем правки вносятся только в один.
  • Абырвалг

    Сообщения: 6480 Репутация: N Группа: Джедаи

    Spritz 16 июня 2010 г. 18:50, спустя 5 минут 55 секунд

    kostyl, используй json а внутри него html + какие-то данные


    console.log(response);

    {
    commentsCount : 100500,
    commentsText : '<div class="comments" ……'
    }
  • Faster

    Сообщения: 1159 Репутация: N Группа: Кто попало

    Spritz 16 июня 2010 г. 18:58, спустя 8 минут 51 секунду

    +1 дуду
    стоит вкрастся какой нибудь хуйне типа отображения ошибок и весь вывод летит к чертям
    только JSON
  • kostyl

    Сообщения: 5210 Репутация: N Группа: Джедаи

    Spritz 16 июня 2010 г. 19:07, спустя 8 минут 59 секунд

    Абырвалг, я так и делаю
    Кстати бля дуд, я так и делаю, шлю джсоном хтмл, да точно, ты прав в некотором смысле… но можно и хмл, хотя по простому можно и просто хтмл
  • master

    Сообщения: 3244 Репутация: N Группа: Джедаи

    Spritz 16 июня 2010 г. 20:43, спустя 1 час 35 минут 9 секунд

    как я уже говорил, сайт - это чёрный ящик, преобразующий заданные url в html или json, xml, etc. на выбор.

    например

    $routes = array(
    '/foo/' => array(
    'type' => 'html',
    'template' => 'templates/main.tpl',
    'action' => 'Foo::foo1',
    ),
    '/foo_jload/' => array(
    'type' => 'json',
    'action' => 'Foo::foo_get_json_blablabla',
    ),
    );


    т.е. тип отдаваемого документа и шаблон (в случае html) - свойство роута
    не всё полезно, что в swap полезло

Пожалуйста, авторизуйтесь, чтобы написать комментарий!