Выбор поля Node Reference в зависимости от термина таксономии

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

Аватар пользователя RayB RayB 20 июля 2010 в 7:13

Заголовок наверное полный бред. Сейчас попытаюсь донести смысл вопроса.

Есть два типа материала: "Ресторан" и "Отзыв"
Есть словарь: "город"

Словарь присвоен типу материала "ресторан".

В материале "Отзыв" есть поле Node Reference, которое связывает с материалом типа "Ресторан"

А теперь проблема: как сделать так, чтобы при создании материала типа "отзыв" мы могли выбрать сначала город (словарь таксономии) и потом в соответствии с выбранным термином выбрать в поле Node Reference материал типа "ресторан" (чтобы в списке остались только те материалы типа "ресторан" которые принадлежат данному термину "город")?

Пример.
Термину "Иркутск" принадлежат следующие материалы типа "ресторан":
- ресторан 1
- ресторан 2

Термину "Москва" принадлежат следующие материалы типа "ресторан":
- ресторан 3
- ресторан 4

Мы создаем материал типа "отзыв" как-то выбираем город Иркутск и в списке при выборе поля Node Reference остаются только:
- ресторан 1
- ресторан 2

Выведите на пусть истинный Smile

Комментарии

Аватар пользователя eLSe eLSe 20 июля 2010 в 12:25

1) создаешь свой модуль
2) пишешь функцию

function <имя модуля>_menu() {
  $items = array();
  $items['<имя модуля>-filter'] = array(
    'page callback'    => '<имя модуля>_filterlist',
    'access callback'  => TRUE,
    'type'             => MENU_CALLBACK,
        'access arguments' => array('access content'),
  );

  return $items;
}

3) объявляешь функцию

function <имя модуля>_form_alter(&$form, $form_state, $form_id){
        switch ($form_id) {
                case '<имя материала-отзыва>_node_form':
                        $form['taxonomy'][<номер словаря с городами>]['#ahah'] = array(
                          'event'   => 'change',
                          'path'    => '<имя модуля>-filter',
                          'wrapper' => 'edit-field-<имя материала-ресторана>-nid-nid-wrapper',
                          'method' => 'replace',
                          'effect' => 'fade'
                        );
                        break
        }
}

4) объявляешь функцию

function <имя модуля>_filterlist() {

        $sql='SELECT DISTINCT(node.nid) AS nid,
                        node.title AS node_title
                        FROM node node
                        INNER JOIN term_node term_node ON node.vid = term_node.vid
                        WHERE (node.status <> 0) AND (node.type in ("<имя материала-ресторана>"))'
.((count($_POST['taxonomy'][<номер словаря с городами>])>0)? ' AND (term_node.tid IN ('.join(', ',$_POST['taxonomy'][<номер словаря с городами>]).'))' : '').'
                        ORDER BY node_title ASC'
;
        $res=db_query($sql);
        $options=array();
        while ($row=db_fetch_array($res)){
          $options[]='<option value="'.$row['nid'].'">'.htmlspecialchars($row['node_title']).'</option>';
        }

        $output = '<label for="edit-field-<имя материала-ресторана>-nid-nid">Ресторан: <span title="Обязательное поле" class="form-required">*</span></label>
 <select id="edit-field-<имя материала-ресторана>-nid-nid" class="form-select required" name="field_<имя материала-ресторана>[nid][nid]">'
.join("\n",$options).'</select>';
 
        drupal_json(array('status' => TRUE, 'data' => $output));
}

Заменяешь <имя модуля>, <имя материала-ресторана>, <имя материала-отзыва>, <номер словаря с городами> на свои названия, подправляешь html-код (в случае если он не совпадает с моим), подключаешь модуль, правишь синтаксические ошибки (возникшие в результате копи-паста-реплэйса), и наслаждаешься жизнью Smile

Аватар пользователя RayB RayB 20 июля 2010 в 12:32

"eLSe" wrote:
1) создаешь свой модуль

ух как вы меня послали так послали ))) спасибо, попробую. Видимо все-таки придется освоить азы модулестроения, как бы я от этого не отталкивался )

Аватар пользователя eLSe eLSe 20 июля 2010 в 12:41

Не бойся, это не сложно. Создаешь папку с именем модуля, создаешь файл <имя модуля>.info и пишешь в него:

; $Id: <имя модуля>.info,v 0.1 2010/07/20 14:12:36 Exp $
name = <имя модуля>
description = Alter form.
core = 6.x
package = "other"

и еще файл <имя модуля>.module а в нем вышеуказанные функции

Аватар пользователя iNFerNo iNFerNo 13 июля 2012 в 11:47

да для 7 ки и не только для терминов но и для нод. если одна нода привязана по нодереференсе к другой ноде... то при выборе в селекторе заголовки этих других нод в другом селекторе появлялись только привязаные к это ноде (из первого селектора) связные ноды