Увы, галочки в настройках я не нашел. И решил, что вывод категории в том или ином виде дело довольно "интимное", т.е. может понадобится вывод категорий в рамках одного и того же каталога и в виде только списка категорий и в виде списка всех товаров подкатегорий (сам с таким столкнулся). Править шаблон под то что часть ссылок должна иметь параметр recursive, часть нет а кроме того есть же еще модули и плагины. Править еще и модули с плагинами это совсем неправильно. В общем я решил прикрутить такую настройку к каждой категории:
Для этого я к объекту модели категорий добавил поле recursive.
1) Добавил поле recursive TINIINT(1) в БД в таблицу _scatalog_category
2) файл /components/com_scatalog/models/category.php (строка 78), видно что при чтении данных из БД сценарий выбирает все поля таблицы _scatalog_category
SELECT c.* ... FROM #__scatalog_category AS c ...
И нет необходимости заботится о том чтобы читать поле из БД оно и так прочтется, а функция _getList сформирует нужную структуру данных сама (строка 129 того же файла).
3) файл /components/com_scatalog/views/category/view.html.php (строка 81 и 88) на строке 81 находится вызов запроса на построение списка товаров категории
перед ним нужно добавить строку, в которой подредактировать одно из полей запроса
...
$options['recursive'] = ($category->recursive == 1 ? 1 : JRequest::getInt('recursive'));
$products = $model->getProducts( $options );
...
Кроме того следует изменить параметр, характеризующий родительскую категорию товара, для которого мы ищем информацию, передаваемый в модули для получения специфической информации о каждом из товаров из модулей. (строка 88 того же файла):
...
$result = $dispatcher->trigger('onScatalogProductsList', array(&$this, $products[$i] -> catid/*$categoryId*/, &$products[$i]));
...
Для этого меняем Id текущей отображаемой категории $categoryId на $products[$i] -> catid
Теперь нужно внести изменения в административную часть.4) Файл /administrator/components/com_scatalog/views/categories/tpl/form.php (строка 76):
Это форма редактирования параметров категории. необходимо добавить радиокнопки для выбора статуса отображения, для этого добавляем следующий HTML код:
...
<table class="adminform">
<tr>
<td class="key">
<label for="title" width="100">
<?php echo JText::_( 'Title' ); ?>:
</label>
</td>
<td>
<input class="text_area" type="text" name="title" id="title" value="<?php echo @$this->data->title; ?>" size="50" maxlength="255" title="<?php echo JText::_( 'A long name to be displayed in headings' ); ?>" />
</td>
<td width="120" class="key">
<?php echo JText::_( 'Published' ); ?>:
</td>
<td>
<?php echo $this->lists['published']; ?>
</td>
</tr>
<tr>
<td></td><td></td>
<td width="120" class="key">
<?php echo JText::_( 'Recursive' ); ?>:
</td>
<td>
<?php echo $this->lists['recursive']; ?>
</td>
</tr>
...
Только нужно не забыть добавить перевод "Recursive" в ресурсный файл, для русского языка.
5) В форме редактирования праметров категории я использовал предварительно подготовленный контрол с радиокнопками, по аналогии со свойством "Published": $this->lists['recursive']. Теперь его необходимо создать: $lists['recursive'] = JHTML::_('select.booleanlist', 'recursive', 'class="inputbox"', $isNew? true : $category->recursive );.
Файл /administrator/components/com_scatalog/views/categories/view.html.php (строка 68):
...
// build the HTML select list
$lists['published'] = JHTML::_('select.booleanlist', 'published', 'class="inputbox"', $isNew? true : $category->published );
$lists['recursive'] = JHTML::_('select.booleanlist', 'recursive', 'class="inputbox"', $isNew? true : $category->recursive );
$editor =& JFactory::getEditor();
...
6) Надо добавить функцию сохранения введенного пользователем значения этого поля. Добавляем функцию updateRecursive, по аналогии с updatePublished
Файл /administrator/components/com_scatalog/models/category.php (строка 379):
...
function updateRecursive($id, $recursive)
{
$query = "UPDATE #__scatalog_category SET recursive = $recursive WHERE id = $id";
$this->_db->setQuery($query);
if(!$this->_db->query()) {
$this->setError($this->_db->getErrorMsg());
return false;
}
return true;
}
...
7) Осталось создать обработчик посылки изменений параметра, добавив функцию updaterecursive, по аналогии с updatepublished.
Файл /administrator/components/com_scatalog/controllers/categories.php (строка 183):
...
function updaterecursive()
{
global $mainframe;
$nodes = json_decode(JRequest::getVar('nodes'));
$model = $this->getModel( 'categories' );
foreach($nodes as $node)
{
if(!$model->updateRecursive($node->id, $node->recursive?1:0))
{
echo '{"error":"model error: '.addslashes($model->getError()).'"}';
$mainframe->close();
}
}
echo '{"success":"true"}';
$mainframe->close();
}
...
8 ) Последнее это подредактировать описание данных категории, нужно добавить туда переменную recursive.
Файл /administrator/components/com_scatalog/tables/categories.php (строка 70):
...
/**
* @var string
*/
var $image = null;
/**
* @var int
*/
var $recursive = null;
/**
* @var int
*/
var $published = null;
...
Теперь каждая категория сама знает как ей отображаться.
Я пользуюсь платной версией каталога 1.1RC2.