Немного по другому решил эту проблему - способ кастыльный
Создал отдельную таблицу
jos_zoo_item_separated
id int(11) unsigned Автоматическое приращение
item_id int(11)
application_id int(11)
identifier varchar(255)
value varchar(255)
text text
тут еще индексы добавьте
в класс ItemTable добавил новый метод
function saveSaparatedData($item, $identifier, $data) {
$db = & JFactory::getDBO();
$sql = 'DELETE FROM `#__zoo_item_separated` WHERE (
`identifier` = "'.$identifier.'" AND
`application_id` = "'.$item->application_id.'" AND
`item_id` = "'.$item->id.'"
)';
$db->setQuery($sql);
$db->query();
if (count($data) > 0) {
foreach ($data as $key=>$val) {
if (strlen($val['value']) > 0 || strlen($val['text']) > 0) {
$obj = new stdClass;
$obj->item_id = $item->id;
$obj->application_id = $item->application_id;
$obj->identifier = $identifier;
$obj->value = $val['value'];
$obj->text = $val['text'];
$db->insertObject('#__zoo_item_separated', $obj);
}
}
}
}
при сохранении в этом же классе
public function save($object) {
...
foreach ($object->getElements() as $id => $element) {
...
if ($element->getConfig()->get('separated', 0) == '1') {
$this->saveSaparatedData($object, $element->identifier, $element->getSeparateData());
}
}
...
}
Чтобы не нарушить баланса сил в природе, добавил в абстрактном классе Element
public function getSeparateData() {
return array();
}
Теперь для любого элемента добавляем в параметры
<param name="separated" type="radio" default="0" label="Separate table" description="Save data in separate table">
<option value="0">No</option>
<option value="1">Yes</option>
</param>
+ метод, который вернет данные для записи в таблицу (это пример для relateditems.php)
function getSeparateData() {
$items = $this->_getRelatedItems();
$values = array();
foreach($items as $item) {
$values[] = array(
'value' => $item->id,
'text' => ''
);
}
return $values;
}
---------------
что происходит тут... ?
Во время сохранения проверяется значение конфига элемента "separated", если оно равно 1, то данные копией сохраняются в новую таблицу.
Затем по этой таблице можно делать выборки по различным полям, и вытаскивать элементы каталога. (через join)
Минусов у метода тьма
- много хламу в одной таблице
- нужно менять много файлов ядра Zoo
- работает только для новых элементов каталога (или пересохранять старые)
- нет рализации для фронта (делается уже в зависимости от задачи ручками)
- мне самому не очень нравиться, но быстро костыль
Плюсы тоже есть
- реализвать сортировки, фильтры без больших нагрузок на php и mysql
- выборки элементов по определнным полям
- элементы реально связываются
В принципе тоже самое уже реализованое при индексации поиска (#_zoo_search_index). но меня в нем много не устраивает: данные фильтруются (фильтры переписывать как то не очень), не все элементы туда попадают), таблица активна используется для поиска - пусть для него и остается.
----------------------------------------------------------------------------------------
Думаю люди, знакомые с кодом Zoo, Joomla и php как таковым поймут что к чему.