Автоматический выбор термина при создании ноды [Решено]

10 сентября 2009 в 9:13
Аватар пользователя Drugan Drugan 0 34

Как сделать, чтобы при создании ноды термин выбирался и записывался автоматически? Чтобы пользователю выбор/ввод терминов вообще не показывался.

Комментарии

"rumzes" wrote:
такое есть. поможет поиск по слову «term» drupal.org

если бы английский для меня был родным языком, тогда бы сразу искал там и на drupal.ru вообще бы не заходил

10 сентября 2009 в 11:29

Похоже не то. Один, как я понял, подставляет термины со сторонних сервисов, другой подставляет в зависимости от текста в ноде. Мне же нужно, чтобы термин вставлялся в зависимости от ссылки. Типа того, как это реализовано в форуме.

10 сентября 2009 в 12:10

Интересно... Нужно чтобы при создании ноды(пользователем) автоматически для нее проставлялись таги(определенные в зависимости от ссылки), при этом термины не должны показываться при создании ноды, а только при ее просмотре... Я все правильно понял?

Если так, то вроде только писать модуль.

10 сентября 2009 в 12:18

Drugan wrote:
Мне же нужно, чтобы термин вставлялся в зависимости от ссылки. Типа того, как это реализовано в форуме.

Кстати, здесь когда выбираем версию и форум — судя по всему выбираем термины из словарей.

А на сколько важно сделать именно так как Вым нужно? Какие задачи это решит?
Иногда бывает так, что есть не очень важная задача, при этом ее решение может потребовать очень много ресурсов.

10 сентября 2009 в 12:33

Делаю сервис Вопрос-Ответ. Категории вопросов задаю через словарь. Нужно чтобы пользователь ткнул в ссылку "Задать вопрос" на странице категории и сразу писал, не заморачиваясь выбором какому эксперту он пишет вопрос. Тем более он по логике уже выбрал это, перейдя на определенную страницу.

10 сентября 2009 в 12:49

Или я не разобрался, или этот модуль не делает то, что мне нужно. Как понял он привязывает один термин из словаря к определенному типу ноды.

10 сентября 2009 в 13:29

Drugan wrote:
В форуме при создании ссылка такая, например, http://drupal.ru/node/add/blog/2058 и форма открывается с уже выбранным термином.

Drugan wrote:
Или я не разобрался, или этот модуль не делает то, что мне нужно. Как понял он привязывает один термин из словаря к определенному типу ноды.

Что то не мойму...
А разве не это было нужно? Smile

10 сентября 2009 в 13:32

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

10 сентября 2009 в 13:40

Если честно, есть одна — не мучаться(готового нет) и сделать по старинке.
Обычная форма создания материала + стандартный выпадающий список с терминами(тематикой вопроса).

12 сентября 2009 в 11:09
Аватар пользователя Dan Dan 0

Делаем ссылку:
В template.php
<?php
function ТЕМА_preprocess_node($vars){
// Выбираем термин
$faq_term = 0;
foreach($vars['node']->taxonomy as $term)
if($term->vid == 7) // 7 - номер словаря
$faq_term = $term->tid;

if($faq_term)
$vars['faq_term'] = $faq_term;
}
?>
в шаблоне
<?php if($faq_term) print l('node/add/answer/'.$faq_term); ?>

Перехватываем номер термина при создании ноды
в модуле
<?php
function МОДУЛЬ_form_alter(&$form, &$form_state, $form_id) {
if ($form['type']['#value'] .'_node_form' == $form_id ) {
if(isset($form['taxonomy'][7]) && isnumeric(arg(3))){
$form['taxonomy'][7]['#default_value'] = arg(3); // значение по умолчанию
$form['taxonomy'][7]['#access'] = false; // скрываем выбор термина
}
}
}
?>
Код не проверял! В нём могут быть синтаксические и логические ошибки.

12 сентября 2009 в 13:58

Поставил Hierarchical Select и код перестал работать. Посмотрел $form - массива ['taxonomy'] не стало. Хотя Hierarchical Select для этого словаря отключен. При этом select на странице выводится.

12 октября 2009 в 14:24

Dan
не могли бы вы пояснить, что значит

"Dan" wrote:
в шаблоне
<?php if($faq_term) print l('node/add/answer/'.$faq_term); ?>

Не совсем понятно куда надо вставить вывод кнопки? В node.tpl.php ?

16 апреля 2012 в 21:41
Аватар пользователя Dan Dan 0

В template.php:
<?php
function ТЕМА_preprocess_node($vars){
// Выбираем термин
foreach($vars['node']->taxonomy as $term){
if($term->vid == 7){ // 7 - номер словаря
$vars['faq_term'] = l('Ответить по теме:'.$term->name, 'node/add/answer/'.$term->tid);
}
}
}
?>

в шаблоне (node.tpl.php)
<?php if(isset($faq_term)) print $faq_term; ?>

18 апреля 2012 в 1:25

Что-то не Выходит Dan, подскажите пожалуйста, правильно ли я понимаю

"Dan" wrote:

Делаем ссылку:
В template.php
<?php
function ТЕМА_preprocess_node($vars){
  // Выбираем термин
  $faq_term = 0; //- Обнуляем значение
  foreach($vars['node']->taxonomy as $term)//- запускаем цикл. Вытаскиваем все значения элементов масива Таксономии
    if($term->vid == 7) // 7 - номер словаря //- Задаем номер словаря. Зачем нам это нужно?
      $faq_term = $term->tid; //- присваиваем $faq_term идентификатор термина

  if($faq_term)
    $vars['faq_term'] = $faq_term; //- проверяем, если термин не равен 0, то --ВОТ ОТСЮДА УСЛОВИЕ МНЕ НЕ ПОНЯТНО
}
?>

в шаблоне
<?php if($faq_term) print l('node/add/answer/'.$faq_term); ?> <>

//Эта часть также не понятна Можно по подробней - если $faq_term не равен 0,то при создании ноды вставляем значение $faq_term . Зачем в адресе answer? Почему print l? Зачем нужна I (?

Перехватываем номер термина при создании ноды
в модуле
<?php
function МОДУЛЬ_form_alter(&$form, &$form_state, $form_id) {
  if ($form['type']['#value'] .'_node_form' == $form_id ) {
    if(isset($form['taxonomy'][7]) && isnumeric(arg(3))) //- Определяем установлены ли
переменные Номер Словаря (7) и переменная arg(3). Зачем опять нам нужен словарь 7.
Arg в данном случае, смотрит что мы находимся в создании ноды?

{
      $form['taxonomy'][7]['#default_value'] = arg(3); // значение по умолчанию . -Здесь присваивается полю Таксономия значение arg(3), но если мы находимся в создании ноды
по адресу node/add/ то это безсмыслица. Если же здесь значение arg(3)это значение пути
по которому находится термин таксономии, тогда логично.
      $form['taxonomy'][7]['#access'] = false; // скрываем выбор термина
    }
  }
}
?>

В общем немного все сложно на первых парах и объяснить некому, поэтому обращаюсь к Вам.

19 апреля 2012 в 11:43

Вот наткнулся сегодня ссылка на источник

Столкнулся вот с такой задачей, когда добавляешь новый материал чтобы при переходе по нужной ссылке выбирался нужный термин! Отдельный модуль для такого писать желания совсем не было, так что template.php в помощь. Скажу честно, сам не ас потому ушло у меня на это в общем 1.5-2 часа. В долгих поисках на англоязычных форумах поддержки друпала наконец нашел то что мне нужно.Итак. Первым делом открываем template.php вашей текущей темы и добавляем в самый конец такой вот код:

<?php
function phptemplate_node_form($form) {
if(arg(3) != '') {
$form['taxonomy'][1]['#value'] = arg(3);
return drupal_render($form);
}
}
?>
Поясню, phptemplate_node_form дает нам возможность изменить что-то в форме добавления материалов, далее идет проверка на то пустой ли третий аргумент, например для example.com/node/add/story/123 node это - arg(0), add - arg(1), story - arg(2) и 123 - arg(3) это и будет нашим заданным термином, вернее его идентификатором. Дальше меняем вывод формы с нужными параметрами: $form['taxonomy'] - модуль таксономии; [1] - номер словаря, для каждого словаря будет форма выбора; ['#value'] - значение которое передаст форма, установив это значение заранее мы можем наблюдать как на странице добавления материала оно будет установлено по умолчанию. Дальше уже более понятно, drupal_render($form) - переделывает нашу измененную форму с новыми значениями.

Сразу ПИШУ пока сам не проверял - это для общего рассмотрения - обсуждения

19 апреля 2012 в 12:11
Аватар пользователя Dan Dan 0

Описание задачи:
При просмотре материла типа answer неоходимо дать пользователю создать материал типа answer в том же разделе, что и исходный материал. Разделы сделаны с помощью словаря таксономии. Номер словаря - 5. При добавлении материала необходимо скрыть остальные разделы.

Решение:
[Более правильное решение - с использованием [ru-api=hook_link]hook_link[/ru-api]]
Сначала формируем ссылку при просмотре материала.
Препроцессинг (template.php)
<?php
function ИМЯТЕМЫ_preprocess_node($vars){
$node = $vars['node'];
if($node->type == 'answer'){
// Просматриваем все термины материала
foreach($node->taxonomy as $term){
if($term->vid == 5){ // Если термин из нужного нам словаря - это наш пациент
// Формируем ссылку вида Создать материал в категории: Помощь
$vars['faq_link'] = l('Создать материал в категории: '.$term->name, 'node/add/answer/'.$term->tid);
break;
}
}
}
}
?>
Шаблон материала (node.tpl.php или node-answer.tpl.php)
<?php
// Если ссылка существует (а её вполне может и не быть) - вставляем её
if(isset($faq_link)){
print $faq_link;
}
?>

Теперь изменяем форму редактирования материала, дабы скрыть выбор других разделов.
<?php
function МОДУЛЬ_form_alter(&$form, &$form_state, $form_id) {
// Если это форма ноды... [вместо этой проверки можно использовать [ru-api=hook_form_FORM_ID_alter]hook_form_FORM_ID_alter[/ru-api]]
if ($form['type']['#value'] .'_node_form' == $form_id ) {
// Проверяем, что на форме есть выбор раздела (который находится в словаре номер 5, как мы помним)
// Проверяем, так же, что путь имеет вид node/add/answer/123 (то есть arg(3) будет равен '123')
if(isset($form['taxonomy'][5]) && is_numeric(arg(3))){
$form['taxonomy'][5]['#default_value'] = arg(3); // значение по умолчанию, будет равно 123
$form['taxonomy'][5]['#access'] = false; // скрываем выбор термина
}
}
}
?>

Теперь понятно?

19 апреля 2012 в 15:47

Dan, поправьте пожалуйста в последнем примере функцию is_numeric(), а то потом будут вопросы почему не работает)

19 апреля 2012 в 14:30

Огромное Спасибо Dan
Буду вникать. Теперь я понял, что моя задача несколько иная, но она вытекает из Вашего примера.
У меня есть 2 словаря таксономии и в каждом 13 списков терминов.
Меню построено на основе терминов - мне необходимо, чтобы на странице с материалами одного термина, можно было нажав одну кнопку создать материал определенного типа, с подставленным термином.

Т.е. в принципе, у меня просто будет другой тип материала не "answer", а мой.
Но я так понял, у Вас привязка делается к конкретному словарю, а у меня их 2,и в зависимости от словаря должен и термин выбираться. Можно конечно все термины свалить в один словарь, но будет некрасиво.

Меня до сих пор не покидает ощущение, что я что-то упускаю и ошибаюсь.

19 апреля 2012 в 16:00

Den
Что то не выходит.
У себя изменяю if($node->type == 'answer'){ на свой тип материала
У себя для проверки поставил словарь 1.

код <?php
// Если ссылка существует (а её вполне может и не быть) - вставляем её
if(isset($faq_link)){
print $faq_link;
}
?>

Вставил в node.tpl.php, чтобы отображался в подвале.
Код для модуля (заменил в нем answer на свой тип материала) вставил в созданный модуль и подключил его.

Проблема в следующем 1 - не отображается ссылки создать материал в подвале.
2 - При переходе по стандартной ссылке создать материал в левом меню, никакого эффекта установки термина не наблюдаю.

также вы пишете, что // Проверяем, так же, что путь имеет вид node/add/answer/123 (то есть arg(3) будет равен '123')

почему путь будет иметь вид node/add/answer/123? у меня при создании материала, он имеет вид /node/add/animal-foto/ т.е. arg(2) или я ошибаюсь?

22 апреля 2012 в 21:42

Да забыл сказать, меню по разделам таксономии не создавал. Обязательно ли это?

"Dan" wrote:
Разделы сделаны с помощью словаря таксономии.

22 апреля 2012 в 21:49

Наконец все частично заработало (По примеру описанному den в первый раз)

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

Но выводится следующий список ошибок.
Ошибка

При нажатии на ссылку добавления ноды ничего не происходит.

Если скопировать ссылку, то и вставить в адресную строку, то все получается.

Я так понимаю возникает ошибка при реализации кода в template.php

24 апреля 2012 в 22:12

Dan, все заработало подправил некоторые ошибки, вот полностью работоспособный код

Делаем ссылку:
В template.php
<?php>
function fervens_preprocess_node($vars){
// Выбираем термин
$faq_term = 0;
foreach($vars['node']->taxonomy as $term)
if($term->vid == 1){ // 1 - номер словаря
$faq_term = $term->tid;

if($faq_term){
$vars['faq_term'] = $faq_term;
}
}
}
?>

в шаблоне node.tpl.php

<?php if($faq_term) print l('Add Node','node/add/animal-foto/'.$faq_term); ?>

Перехватываем номер термина при создании ноды
в модуле
<?php
function mymodule_form_alter(&$form, &$form_state, $form_id) {
  if ($form['type']['#value'] .'_node_form' == $form_id ) {
    if(isset($form['taxonomy'][1]) && is_numeric(arg(3))){
      $form['taxonomy'][1]['#default_value'] = arg(3); // значение по умолчанию
      // $form['taxonomy'][1]['#access'] = false; // скрываем выбор термина, в моем случае эта строчка не нужна.
    }
  }
}
?>

fervens - имя моей темы
animal-foto - мой тип материала
mymodule - имя моего модуля

Dan, еще раз большое спасибо тебе за помощь и за допущенные мелкие ошибки, т.к. они помогли научиться разбирать и анализировать код.

25 апреля 2012 в 12:14