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

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

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

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

Комментарии

Аватар пользователя Drugan Drugan 10 сентября 2009 в 11:29

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

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

Аватар пользователя Drugan Drugan 10 сентября 2009 в 12:10

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

Аватар пользователя rumzes rumzes 10 сентября 2009 в 12:18

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

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

Аватар пользователя rumzes rumzes 10 сентября 2009 в 12:33

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

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

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

Аватар пользователя Drugan Drugan 10 сентября 2009 в 12:49

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

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

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

Аватар пользователя rumzes rumzes 10 сентября 2009 в 13:32

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

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

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

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

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

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

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

Аватар пользователя Dan Dan 12 сентября 2009 в 13:58

Делаем ссылку:
В 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; // скрываем выбор термина
}
}
}
?>
Код не проверял! В нём могут быть синтаксические и логические ошибки.

Аватар пользователя Drugan Drugan 12 октября 2009 в 14:24

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

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

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

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

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

Аватар пользователя Dan Dan 18 апреля 2012 в 1:25

В 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; ?>

Аватар пользователя volkodav87 volkodav87 19 апреля 2012 в 11:43

Что-то не Выходит 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; // скрываем выбор термина
    }
  }
}
?>

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

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

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

Столкнулся вот с такой задачей, когда добавляешь новый материал чтобы при переходе по нужной ссылке выбирался нужный термин! Отдельный модуль для такого писать желания совсем не было, так что 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) - переделывает нашу измененную форму с новыми значениями.

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

Аватар пользователя Dan Dan 19 апреля 2012 в 15:47

Описание задачи:
При просмотре материла типа 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; // скрываем выбор термина
}
}
}
?>

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

Аватар пользователя zviryatko zviryatko 19 апреля 2012 в 14:30

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

Аватар пользователя volkodav87 volkodav87 19 апреля 2012 в 16:00

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

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

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

Аватар пользователя volkodav87 volkodav87 22 апреля 2012 в 21:42

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) или я ошибаюсь?

Аватар пользователя volkodav87 volkodav87 22 апреля 2012 в 21:49

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

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

Аватар пользователя volkodav87 volkodav87 24 апреля 2012 в 22:12

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

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

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

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

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

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

Аватар пользователя volkodav87 volkodav87 25 апреля 2012 в 12:14

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, еще раз большое спасибо тебе за помощь и за допущенные мелкие ошибки, т.к. они помогли научиться разбирать и анализировать код.