Правим taxonomy_forceall

Главные вкладки

Аватар пользователя Cyb_ Cyb_ 1 апреля 2008 в 22:51

друпальщик я начинающий. потому сильно не пинать.

недавно столкнулся с такой проблемой, надо было чтобы по клику на термине таксономии друпал выкидывал меня не на стандартную выдачу нод, а на нужную мне вьюшку с нужными фильтрами.

в качестве базы как нельзя лучше подходит модуль taxonomy_forceall.
переименовываем все как надо, чтобы все что содержит taxonomy_forceall выглядело бы иначе Smile
допустим назовем taxonomy_forceall1
открываем и находим function taxonomy_forceall1_link_alter (благо там всего три процедуры, не заблудитесь).
правим в нужном месте:

  if (strstr($module, 'taxonomy_term') && preg_match('/^taxonomy\/term\/\d*$/', $link['href'])) {
    $tid = substr($link['href'], 14, strlen($link['href'])-14);
    $result = db_query('SELECT * FROM {term_data} WHERE tid = %d', $tid);
    $name = db_fetch_array($result);
   
      $flag = false;
      if (module_exists('taxonomy') && $vids = variable_get('filter0', array())) {
        $res = db_query('SELECT vid, name, description FROM {vocabulary} WHERE vid IN (%s) ORDER BY weight ASC, name', implode(',', $vids));
          while ($t = db_fetch_object($res)) {
            if ($name['vid'] == $t->vid) $flag=true;
          }
      }

    $name['vid'] = $name['vid'] - 1;
   
    if ($flag) {
      $links[$module]['href'] = url( '<<strong>сюда можно вставить путь до вьюшки</strong>>','filter'.(string)$name['vid'].'=', NULL ,true).drupal_urlencode($name['name']);
      $links[$module]['title'] = $links[$module]['title'].'('.taxonomy_term_count_nodes($tid,'org').')';
    }
    else $links[$module]['href'] = $link['href'] .'/all';
   }

доработку всего остального раскрывать не буду, но там оно и не сложно. результат можно посмотреть у меня на http://macat.org, кликая по городам как раз и будет виден нужный мне результат.

с удовольствием почитаю как предложения так и замечания.

Комментарии

Аватар пользователя neochief neochief 1 апреля 2008 в 23:28

Это грязный хак Smile
"Нехаком" можно через теминг поля "Term" вашей вьюсы.
Но это - вообще дикие дебри по части недокументированности. Зато 100% правильно и корректно.
Наводку даю.

найдите в модуле views функцию theme_views_view_table. Там есть такая строка

$cell['data'] = views_theme_field('views_handle_field', $field['queryname'], $fields, $field, $node, $view);

Она формирует темовый вызов вашего поля. Для того чтобы оттемить нужное поле, ваша функция теминга будет называться так:

function phptemplate_views_handle_field_VIEW_NAME_FIELD_NAME($fields, $field, $data){
print_r('test');
$link = '';// собственно теминг.
// В параметрах вам передадуться нужные данные метки. Сформируйте из них и вашего фильтра ссылку
return $link;
}

VIEW_NAME - название вьюсы
FIELD_NAME - название поля. Оно эквивалентно $field['queryname'] в коде выше. Ставите print_r($field['queryname']); после $cell['data'] = ...; и выбираете нужное поле. После этого составляете правильное название функции. И если все сработало, то появится test вверху экрана.

PS. этого вам здесь никто не расскажет, и не покажет, так что таки сделайте, а то будет обидно что так много писал зря Smile