Для Zoo достаточно того, что написали выше модераторы. Респект им и плюс в карму за подробное описание действий. У нас была надстройка JBZoo поэтому, подобно их действиям, но более "топорно" сделали вот что:
1. Создали front-teaser, прописали позиции в positions.xml и сам тизер в metadata.xml в папке
item2. Открыли файл frontpage.php и увидели, что у нас в JBZoo он работает с category.php, чтобы ничего не ломать сделали копию файла category.php и назвали ее
frontcategory.php. При этом в самом frontpage.php прописали копию этого файла.
Было:
include dirname(__FILE__). '/category.php';
Стало:
include dirname(__FILE__). '/frontcategory.php';
3. В category.php мы видим, что за вывод item'ов отвечает кусок кода, в котором главную роль играет функция render. Меняем одну строку.
Было:
echo $this->app->jblayout->render('items', $this->items);
Стало:
echo $this->app->jblayout->render('frontitems', $this->items);
4. Далее копируем папку
items и переименовываем ее в
frontitems со всем содержимым.
Открываем в ней файл
_default.php и в нем меняем строку с функцией ответсвенной за формирование колонок вывода.
Было:
echo $this->columns('item', $vars['objects'], true);
Стало:
echo $this->columnsFront('item', $vars['objects'], true);
5. Теперь идем в файл /media/zoo/applications/jbuniversal/framework/helpers/jblayout.php в котором описана эта функция columns, которая работает с teaser, и делаем ее копию в этом же файле columnsFront, в котором прописываем наш front-teaser и копию функции renderItem
Функция columnsFront:
public function columnsFront($layoutName, $objects)
{
$cols_num = $this->_params->get('template.' . $layoutName . '_cols', 1);
$cols_order = $this->_params->get('template.' . $layoutName . '_order', 1);
$vars = array(
'cols_num' => $cols_num,
'cols_order' => $cols_order
);
// init vars
$i = 0;
$columns = array();
$column = 0;
$row = 0;
$countObjects = count($objects);
$rows = ceil($countObjects / $cols_num);
if ($countObjects > 0) {
foreach ($objects as $object) {
if ($cols_order) {
// order down
if ($row >= $rows) {
$column++;
$row = 0;
$rows = ceil(($countObjects - $i) / ($cols_num - $column));
}
$row++;
$i++;
} else {
// order across
$column = $i++ % $cols_num;
$column = $i;
}
if (!isset($columns[$column])) {
$columns[$column] = '';
}
if ($object instanceof Item) {
$columns[$column] .= $this->renderItemFront($object);
} else {
$columns[$column] .= $this->render($layoutName, $object, $vars);
}
}
return $this->render($layoutName . '_columns', $columns, $vars);
}
return false;
}
Функция renderItemFront:
public function renderItemFront(Item $item, $defaultLayout = 'front-teaser', ItemRenderer $renderer = null)
{
$this->app->jbdebug->mark('jblayout::renderItemFront (' . $item->id . ')::start');
$itemLayout = $this->_getItemLayout($item, $defaultLayout);
$htmlItem = null;
if (!$renderer && $this->_view) {
$renderer = $this->_view->renderer;
}
if ($renderer) {
$htmlItem = $renderer->render($itemLayout, compact('item'));
}
// add item wrapper if enabled
$wrapperTag = 'none';
if ($this->_application) {
$wrapperTag = $this->_application->params->get('global.config.wrap_item_style', 'none');
}
if ($wrapperTag != 'none') {
$class = array(
'jbzoo-item',
'jbzoo-item-' . $item->type,
'jbzoo-item-' . $defaultLayout,
'jbzoo-item-' . $item->id
);
$htmlItem = '<' . $wrapperTag . ' class="' . implode(' ', $class). '">' . $htmlItem . '</' . $wrapperTag . '>';
}
$this->app->jbdebug->mark('jblayout::itemRender (' . $item->id . ')::finish');
return $htmlItem;
}
Надеюсь, что ничего не упустил. И оно работает!
