Перейти к содержимому


Фотография
- - - - -

Как Правильно Использовать Jblayout


Лучший Ответ fiction13 , 04 September 2018 - 19:34

Вот Вам функция

    // Get Renderer

    public function getRenderer($item, $layout, $data = array())
    {
        $renderer   = $this->app->renderer->create('item')->addPath(array($this->app->path->path('component.site:'), $item->getApplication()->getTemplate()->getPath()));
        $path       = 'item';
        $prefix     = 'item.';
        $type       = $item->getType()->id;
        if ($renderer->pathExists($path.DIRECTORY_SEPARATOR.$type)) {
            $path   .= DIRECTORY_SEPARATOR.$type;
            $prefix .= $type.'.';
        }

        if (in_array($layout, $renderer->getLayouts($path))) {
            $result   = $renderer->render($prefix.$layout, array('view' => $item->getApplication(), 'item' => $item, 'data' => $data));

            return $result;
        }

        return;
    }

На входе объект итема, шаблон (teaser, full и т.д.), третья переменная Вам скорее всгего не нужна, я в ней данные передаю в шаблон.

 

На выходе html код.

Перейти к сообщению


Сообщений в теме: 7

#1 webinsight

webinsight

Отправлено 01 September 2018 - 20:18

Доброго дня!

 

Есть файл, который через ajax должен отдать html код нескольких новостей. Такой вот вариант:

<?php

defined('_JEXEC') or die;

$catId = JRequest::getVar('catId');

$app = App::getInstance('zoo');

$items = JBModelItem::model()->getList(1, $catId, null, array('limit' => 10));

foreach ($items as $item) {

    echo $app->jblayout->renderItem($item, 'teaser');
    
}

?>

ничего не выводит.

 

Доработанная версия:

<?php

...

foreach ($items as $item) {

    $renderer = $app->jbrenderer->create('item')->addPath([
        $app->path->path('component.site:'),
        $item->getApplication()->getTemplate()->getPath()
    ]);
    
    echo $app->jblayout->renderItem($item, 'teaser', $renderer);
 
}

?>

выводит материалы, но игнорируется кастомный шаблон для данного типа материалов (тип = news). То есть рендерится

 

renderer/item/teaser.php вместо

renderer/item/news/teaser.php

 

Может быть кто-то подскажет, как правильно вне контекста компонента для item вывести его html с учетом типа?

 

Спасибо!


Сообщение отредактировал webinsight: 01 September 2018 - 20:22

  • 0

#2 CB9TOIIIA

CB9TOIIIA

Отправлено 02 September 2018 - 18:53

Я помню когда-то давно пробовал, но не смог в итоге прямо в теле написал верстку, т.е. получаю $item и по полям собрал нужный мне код для вывода уже.

Спрошу у Дениса


  • 1

#3 webinsight

webinsight

Отправлено 03 September 2018 - 08:37

Спасибо, раньше я так и делал, но вот сейчас появилась необходимость использовать готовые layout-ы, поэтому если есть решение, буду очень благодарен.

 

Кстати, еще заметил, что тут:

 echo $app->jblayout->renderItem($item, 'teaser', $renderer);

что бы я не вписал вместо 'teaser', все равно рендерится teaser, он как-будто по-умолчанию где-то установлен в коде.


  • 0

#4 CB9TOIIIA

CB9TOIIIA

Отправлено 03 September 2018 - 08:45

Как вариант проще завести пару файлов или 1 файле со switch (разметку прямо в ajax кода отдачи).

 

 uvmNYSX.png


  • 0

#5 webinsight

webinsight

Отправлено 03 September 2018 - 09:09

Еще раз спасибо, но тут вопрос не в ajax, а немного в другом.

 

Приведенный мною код подключен в шаблон сайта. Из за этого в хелпере jblayout вот в этом месте кода:

    private function _getItemLayout($item, $layout)
    {
        if ($this->_params) {
            if (!isset($this->_params['template.layout_' . $layout])) {
                $layout = $this->_params->get('template.layout_' . $layout, $layout);
            } else {
                $layout = $this->_params->get('global.template.layout_' . $layout, $layout);
            }
        }

        if ($item && $this->_view) {
            if ($this->_view->renderer->pathExists('item/' . $item->type)
                && JFile::exists($this->_rendererPath . '/' . 'item' . '/' . $item->type . '/' . $layout . '.php')
            ) {
                return 'item.' . $item->type . '.' . $layout;

            } else {
                if (JFile::exists($this->_rendererPath . '/item/' . $layout . '.php')) {
                    return 'item.' . $layout;

                } else {
                    return 'item.teaser';
                }
            }
        }

        return 'item.teaser';
    }

срабатывает одна из строк return 'item.teaser';

 

Поэтому вопрос скорее: как при выполнении моего кода правильно сформировать третий аргумент, $renderer:

 

echo $app->jblayout->renderItem($item, 'teaser', $renderer);

 

Если бы код был подключен где-нибудь в самом zoo, то тогда его вообще не требовалось бы указывать.


Сообщение отредактировал webinsight: 03 September 2018 - 09:10

  • 0

#6 mmth

mmth

Отправлено 04 September 2018 - 18:34

Еще раз спасибо, но тут вопрос не в ajax, а немного в другом.

 

Приведенный мною код подключен в шаблон сайта. Из за этого в хелпере jblayout вот в этом месте кода:

    private function _getItemLayout($item, $layout)
    {
        if ($this->_params) {
            if (!isset($this->_params['template.layout_' . $layout])) {
                $layout = $this->_params->get('template.layout_' . $layout, $layout);
            } else {
                $layout = $this->_params->get('global.template.layout_' . $layout, $layout);
            }
        }

        if ($item && $this->_view) {
            if ($this->_view->renderer->pathExists('item/' . $item->type)
                && JFile::exists($this->_rendererPath . '/' . 'item' . '/' . $item->type . '/' . $layout . '.php')
            ) {
                return 'item.' . $item->type . '.' . $layout;

            } else {
                if (JFile::exists($this->_rendererPath . '/item/' . $layout . '.php')) {
                    return 'item.' . $layout;

                } else {
                    return 'item.teaser';
                }
            }
        }

        return 'item.teaser';
    }

срабатывает одна из строк return 'item.teaser';

 

Поэтому вопрос скорее: как при выполнении моего кода правильно сформировать третий аргумент, $renderer:

 

echo $app->jblayout->renderItem($item, 'teaser', $renderer);

 

Если бы код был подключен где-нибудь в самом zoo, то тогда его вообще не требовалось бы указывать.

 

не пробовали смотреть что в $renderer попадает, тот ли путь и отдельно разбирать параметры которые ему передаете

$app->path->path('component.site:') и $item->getApplication()->getTemplate()->getPath()

и ещё можно попробовать дернуть items через

$cat_items = $this->app->table->item->getByCategory($app_id, $category->id, true, null, $category->getParams()->get('config.item_order', 'none'));

Сообщение отредактировал mmth: 04 September 2018 - 18:35

  • 1

#7 fiction13

fiction13

Отправлено 04 September 2018 - 19:34   Лучший Ответ

Вот Вам функция

    // Get Renderer

    public function getRenderer($item, $layout, $data = array())
    {
        $renderer   = $this->app->renderer->create('item')->addPath(array($this->app->path->path('component.site:'), $item->getApplication()->getTemplate()->getPath()));
        $path       = 'item';
        $prefix     = 'item.';
        $type       = $item->getType()->id;
        if ($renderer->pathExists($path.DIRECTORY_SEPARATOR.$type)) {
            $path   .= DIRECTORY_SEPARATOR.$type;
            $prefix .= $type.'.';
        }

        if (in_array($layout, $renderer->getLayouts($path))) {
            $result   = $renderer->render($prefix.$layout, array('view' => $item->getApplication(), 'item' => $item, 'data' => $data));

            return $result;
        }

        return;
    }

На входе объект итема, шаблон (teaser, full и т.д.), третья переменная Вам скорее всгего не нужна, я в ней данные передаю в шаблон.

 

На выходе html код.


Сообщение отредактировал fiction13: 04 September 2018 - 19:35

  • 2

#8 webinsight

webinsight

Отправлено 05 September 2018 - 09:23

не пробовали смотреть что в $renderer

 

Изучал хелпер renderer, но по-быстрому разобраться с ним не смог, а на детальное изучение не хватило времени.

 

Вот Вам функция

 

Спасибо, многое прояснилось, доработал под себя.

 

Всем спасибо за помощь! 


  • 1




Click to return to top of page in style!