Вход • Регистрация

Вызов шаблона модуля из другого модуля

  • 16 июня 2019 г.
  • Подскажите, что то я запутался, - мне кажется, что заблудился в трех соснах.
    Не могу решить задачу. Кратко вот какая проблема:
    В модуле cart.view.form.php вызывается echo $this->get('table', 'cart', $result); //вывод таблицы с товарами .
    С этим все понятно.

    А мне нужно, по аналогии, сформировать содержимое, выводимое этим шаблоном, в виде переменной в совершенно другом, любом другом, месте diafan. Не понимаю, как это сделать.
    Например мне надо в обработке AJAX в action.php получить в виде переменной то, что выводится по данному шаблону

    Я делаю вот так:
    Код
    Custom::inc('modules/cart/cart.model.php');
    $cart_model = new Cart_model($this->diafan);
    $cart_model->list_();
    $my_result = $cart_model->result();


    но как потом связать, то как работает шаблон при выводе view-шки:
    Код
    echo $this->get('table', 'cart', $my_result); //вывод таблицы с товарами

    с тем, что мне надо получить, что то типа:
    Код
    $my_view = $this->get('table', 'cart', $my_result);

    не получается ни через:
    $this->diafan->_tpl->get(...), ни через просто ->get

    В документации сказано:
    В модуле объект этого класса доступен через переменную $this->diafan->_tpl, в шаблоне модуля объект класса доступен через переменную $this.
    Но у меня не шаблон модуля , ни сам модуль, а совершенно другой модуль

    Подскажите, плиз! Мне кажется, что это простейшая задача, но я что-то совсем не так делаю.




    #шаблон #вывод шаблона #ajax
    • 16 июня 2019 г.
    • Что у Вас в $cart_model, выведите вардампом
      • 17 июня 2019 г.
      • Я привел данную конструкцию как описание задачи. В $cart_model - то, что выдается при выводе корзины в штатном diafan-е из коробки.

        Задача получить то же самое и засунуть это в перменную, но в другом месте diafan. Конкретно у меня, - это при обрпаботке AJAХ запроса от другого модуля.
        Модуль корзины я подключаю в другом модуле при помощи

        Код
        Custom::inc('modules/cart/cart.model.php');
        $cart_model = new Cart_model($this->diafan);


        А вот дальше ничего не получается.

    • 16 июня 2019 г. , редакция: 16 июня 2019 г.
    • $cart_model->result() - этот метод не возвращает данных
      Возможно (проверить не могу) нужно сделать $cart_model->result, то есть использовать переменную класса, а не метод.
    • 16 июня 2019 г.
    • Вам result собрать надо или шаблон дёрнуть?
      • 16 июня 2019 г.
      • в шаблон он result передает, ибо в шаблоне нечего будет выводить
        • 17 июня 2019 г.
        • Да, это понятно, что не будет - уже все перепробовал.

          Мне нужна получить в перменную то содержимое, которое в станадртном варианте выдается командой
          Код
          echo $this->get('table', 'cart', $my_result); //вывод таблицы с товарами

  • 17 июня 2019 г.
  • Посмотри как метод buy в shop.action работает с корзиной. Может это поможет.
  • 17 июня 2019 г. , редакция: 17 июня 2019 г.
  • Вообщем разобрался. Просто посмотрел, что фактически делается в методе get() класса class Template extends Diafan ( это файл includes/template.php)
    А там все элементарно просто, после всяких проверок на наличие, и допустимости фактически выполняется просто следующий код:

    Код

    $current_module = $this->diafan->current_module; // запоминаем имя текущего модуля в котором вызывается tpl->get()
    ob_start(); // отключаем вывод в броузер, вместо этого выводим в специальный промежуточный буфер, см докум. по PHP
    $this->diafan->current_module = $module; // это имя модуля к которому относится вызываемый шаблон
    $this->js($name, $module);// если у шаблона есть прикрепленный js - добавляем его
    include(ABSOLUTE_PATH.Custom::path($file)); // загружаем php файл шаблона, после этого он выполняется и все выводит в промежуточный буфер, а
    // не в броузер
    $this->diafan->current_module = $current_module; // восстанавливаем имя ранее сохраненного модуля
    $text = ob_get_contents(); // копируем все, что накопилось в буфере в переменную $text
    ob_end_clean();// очищаем буфер.

    return $text; // возвращаем то, что шаблрон сформировал в строковой переменной.


    После этого все стало на свои места.
    При использовании шаблона важно передать ему правильные переменные, такие же как он получает, когда просто выводит в броузер результаты своей работы.

    И еще момент. Если вы используете такого рода конструкции при обработке Ajax запроса, то надо обязательно сделать так, что бы у шаблона в начале и конце его работы НЕ ФОРМИРОВАЛСЯ открывающий тег <DIV> и соответсвующий ему закрывающий тег </div>

    В стандартном диафане это везде сделано при помощи использования переменной $result ["ajax"] = true;
    И в начале шаблона стоит такаой код :
    Код

    if (empty($result["ajax"])) { echo '<div>';
    }



    а в конце кода шаблона
    Код
    if (empty($result["ajax"])) { echo '</div>';
    }



    В очередной раз восхитился разработчиками Диафана, какие же они крутые программитсы, как все гибко и в то же время системно, просто и грамотно построено в их системе! Огромный респект!
    • 18 июня 2019 г.
    • Что то муть какая то про закрывающий и открывающийся див, вы написали так что в шаблоне вообще нельзя использовать дивы. Это сделано по иной причине.
      • 18 июня 2019 г.
      • Ну да, вся разметка делается в зависимости от того куда и по какому алгоритму используемый скрипт поставит содержимое ajax-ответа
      • 18 июня 2019 г.
      • Цитата
        При использовании шаблона важно передать ему правильные переменные
        Всему важно передавать правильные (только не переменные, а аргументы) :) В целом во всех исходниках diafan было и так видно, что нужно передавать название вьюхи, имя модуля, и результирующий массив.
      • 18 июня 2019 г.
      • Никакая это не муть. Вы просто не разобрались до конца. Посмотрите, - в штатном Диафане во всех шаблонах, если есть вывод через шаблон и при формировании страницы , и при обновлении страницы через AJAX, везде стоит проверка в начале и в конце - каким способом сформировано содержание При использовании шаблона при обычном выводе и при выводе через AJAX специально и сделано - либо с обертывающим DIV, либо без DIV ( при выводе через ajax)

        Это обусловлено тем, что при выводе через ajax - у вас на конечном этапе получения ajax ответа так или иначе стоит jquery код типа :

        Код
        $('#my_div).html(prepare(response.mydiv));


        Так вот, если содержимое в ответе сформировано шаблоном, то без использования проверки ajax | не ajax в коде шаблона у вас произойдет задвоение div-вов и результат будет неверный. Будт получаться вот так

        Код
        <div id="my_div"> содержимое </div>

        // это правильно, то есть так, как надо

        а при ajax ответе будет
        Код
        <div id="my_div"><div id="my_div"> содержимое </div></div>

        // это неправильно




        • 18 июня 2019 г.
        • Ну правильно все, только причем тут конкретно div, нужно говорить о классе или id, тогда будет верно, Андрей об этом и написал, собственно и я хотел такой пример привести, лень стало все расписывать, а ответом выше Вы в заблуждение вводите, говорите так, как будто теги в шаблоне категорически нельзя использовать, ну или только тег div
          • 18 июня 2019 г.
          • Да никого я никуда не ввожу, я все подробно расписал, кто хочет разобраться - тот поймет. Ни про какой конкрертный div я не писал, а лишь разжевал, почему во многих шаблонах стандартнрого diafan часто стоит конструкция в начале шаблона:
            Код

            if (empty($result["ajax"])) { echo '<div >';
            }


            и в конце

            Код
            if (empty($result["ajax"])) { echo '</div>';
            }


            Если вам это очевидно, то странно что вы не поняли смысла моей фразы:

            Цитата
            И еще момент. Если вы используете такого рода конструкции при обработке Ajax запроса, то надо обязательно сделать так, что бы у шаблона в начале и конце его работы НЕ ФОРМИРОВАЛСЯ открывающий тег <DIV> и соответсвующий ему закрывающий тег </div>

            • 18 июня 2019 г.
            • Да что Вы упираетесь, из вашего текста понятно только одно, не должен формироваться div и только, нужно было дописать что div с определенным классом или с id, по которому будет цепляться js.

Новости

  • 18 июня
  • В сборке большое обновление demo-шаблона, дополнительная защита от спама, улучшение YML-импорта и еще много важного и интересного.
  • 24 апреля
  • В новой сборке совершили революцию в структурировании кастомизированной информации в шаблонах, добавили авторегистрацию пользователей, усовершенствовали защиту от спама, актуализировали накопительную скидку, а также улучшили производительность и стабильность работы системы.
  • 12 января
  • После выхода сборки 7.1 мы выпустили уже три патча, в каждом из которых улучшаем административную часть сайта. Сборка DIAFAN.CMS 7.1.3 уже доступна к установке. 

Форум