Здравствуйте, люди добрые!
Такой вопрос: вывожу список похожих товаров через views с использованием аргумента по "Таксономия: ID термина", где тип аргумента определяется PHP кодом, который я нашёл на этом замечательном сайте в одной из похожих тем:
<?phpif(arg(0) == 'node' && is_numeric(arg(1)) && !arg(2)) {
$node = node_load(arg(1));
$terms = taxonomy_node_get_terms_by_vocabulary($node, 1);
if($term = array_shift($terms)) {
return $term->tid;
}
}?>
Он прекрасно работает, но, у меня часто одному товару соответствует несколько терминов. Например, моющему пылесосу соответствуют "пылесосы", "пылесосы сухой и влажной уборки", "моющие пылесосы".
И в результате мне выводит похожие товары из термина "пылесосы".
Как мне заставить выводить из последнего термина "моющие пылесосы"? При этом, у последнего (самого точного и нужного мне термина) всегда больше ID (т.е. taxonomy/term/29 - у моющих пылесосов, а у просто пылесосов taxonomy/term/5).
Комментарии
А по какой логике должен действовать сервер по вашему? Если я вам дам детали от Шатла с тэгами и попрошу рассортировать у вас получится то же самое что и у компа
Вобщем если всегда есть один определяющий термин, то можно сделать для него отдельный словарь и искать похожие ноды только по терминам из этого словаря
По моей логике, сервер должен выбрать больший ID термина из терминов, которые присвоены ноде, и выводить по этому термину.
т.е. моему пылесосу соответствуют термины с ID 5, 18 и 29. Нужно, чтобы вывелись все пылесосы, у которых тоже есть термин с ID 29.
Проклянете потом себя, если так будете делать. (как реализовать не знаю)
Вобщем попробуйте [module=similarterms]. Модуль добавит вам вьюшку, вывод в ней настроите какой хотите. Там идет сортировка по умолчанию - similarity.
В вашем случае для моющего пылесоса сортировка будет выглядеть так:
1. Товары с терминами 5, 18, 29
2. Товары с терминами (5,29) или (5,18) или (18,29)
3. Товары с терминами 5 или 18 или 29
Вобщем по убыванию "похожести".
if(arg(0) == 'node' && is_numeric(arg(1)) && !arg(2)) {
$node = node_load(arg(1));
$terms = array_reverse(ksort(taxonomy_node_get_terms_by_vocabulary($node, 1)), TRUE);
if($term = array_shift($terms)) {
return $term->tid;
}
}
?>
Огромное спасибище Sentrashy@drupal.org , работает.
С меня пачка масла, если что
penexe, Ваш вариант вызывает ошибку:
* warning: array_shift() expects parameter 1 to be array, null given in T:\home\mag.ru\www\modules\views\plugins\views_plugin_argument_default_php.inc(48) : eval()'d code on line 4.
Не за что. И поставьте [РЕШЕНО] в шапке.