Похоже не то. Один, как я понял, подставляет термины со сторонних сервисов, другой подставляет в зависимости от текста в ноде. Мне же нужно, чтобы термин вставлялся в зависимости от ссылки. Типа того, как это реализовано в форуме.
Интересно... Нужно чтобы при создании ноды(пользователем) автоматически для нее проставлялись таги(определенные в зависимости от ссылки), при этом термины не должны показываться при создании ноды, а только при ее просмотре... Я все правильно понял?
Мне же нужно, чтобы термин вставлялся в зависимости от ссылки. Типа того, как это реализовано в форуме.
Кстати, здесь когда выбираем версию и форум — судя по всему выбираем термины из словарей.
А на сколько важно сделать именно так как Вым нужно? Какие задачи это решит?
Иногда бывает так, что есть не очень важная задача, при этом ее решение может потребовать очень много ресурсов.
Делаю сервис Вопрос-Ответ. Категории вопросов задаю через словарь. Нужно чтобы пользователь ткнул в ссылку "Задать вопрос" на странице категории и сразу писал, не заморачиваясь выбором какому эксперту он пишет вопрос. Тем более он по логике уже выбрал это, перейдя на определенную страницу.
Мне нужно, чтобы к ноде привязывался не один и тот же термин из словаря, а выбирался нужный в зависимости от ссылки, как в примере, который я выше привел.
Если честно, есть одна — не мучаться(готового нет) и сделать по старинке.
Обычная форма создания материала + стандартный выпадающий список с терминами(тематикой вопроса).
Перехватываем номер термина при создании ноды в модуле
<?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; // скрываем выбор термина
}
}
}
?>
Код не проверял! В нём могут быть синтаксические и логические ошибки.
Поставил Hierarchical Select и код перестал работать. Посмотрел $form - массива ['taxonomy'] не стало. Хотя Hierarchical Select для этого словаря отключен. При этом select на странице выводится.
В 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; ?>
Что-то не Выходит 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; // скрываем выбор термина
}
}
}
?>
В общем немного все сложно на первых парах и объяснить некому, поэтому обращаюсь к Вам.
Столкнулся вот с такой задачей, когда добавляешь новый материал чтобы при переходе по нужной ссылке выбирался нужный термин! Отдельный модуль для такого писать желания совсем не было, так что 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) - переделывает нашу измененную форму с новыми значениями.
Сразу ПИШУ пока сам не проверял - это для общего рассмотрения - обсуждения
Описание задачи:
При просмотре материла типа 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; // скрываем выбор термина
}
}
}
?>
Огромное Спасибо Dan
Буду вникать. Теперь я понял, что моя задача несколько иная, но она вытекает из Вашего примера.
У меня есть 2 словаря таксономии и в каждом 13 списков терминов.
Меню построено на основе терминов - мне необходимо, чтобы на странице с материалами одного термина, можно было нажав одну кнопку создать материал определенного типа, с подставленным термином.
Т.е. в принципе, у меня просто будет другой тип материала не "answer", а мой.
Но я так понял, у Вас привязка делается к конкретному словарю, а у меня их 2,и в зависимости от словаря должен и термин выбираться. Можно конечно все термины свалить в один словарь, но будет некрасиво.
Меня до сих пор не покидает ощущение, что я что-то упускаю и ошибаюсь.
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) или я ошибаюсь?
Перехватываем номер термина при создании ноды
в модуле
<?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, еще раз большое спасибо тебе за помощь и за допущенные мелкие ошибки, т.к. они помогли научиться разбирать и анализировать код.
Комментарии
такое есть. поможет поиск по слову «term» drupal.org
если бы английский для меня был родным языком, тогда бы сразу искал там и на drupal.ru вообще бы не заходил
Точно не уверен, но кажется вот это и это
Похоже не то. Один, как я понял, подставляет термины со сторонних сервисов, другой подставляет в зависимости от текста в ноде. Мне же нужно, чтобы термин вставлялся в зависимости от ссылки. Типа того, как это реализовано в форуме.
Интересно... Нужно чтобы при создании ноды(пользователем) автоматически для нее проставлялись таги(определенные в зависимости от ссылки), при этом термины не должны показываться при создании ноды, а только при ее просмотре... Я все правильно понял?
Если так, то вроде только писать модуль.
Да, все правильно.
В принципе, тэг можно и показывать при создании, только скрыть через сss.
Кстати, здесь когда выбираем версию и форум — судя по всему выбираем термины из словарей.
А на сколько важно сделать именно так как Вым нужно? Какие задачи это решит?
Иногда бывает так, что есть не очень важная задача, при этом ее решение может потребовать очень много ресурсов.
Делаю сервис Вопрос-Ответ. Категории вопросов задаю через словарь. Нужно чтобы пользователь ткнул в ссылку "Задать вопрос" на странице категории и сразу писал, не заморачиваясь выбором какому эксперту он пишет вопрос. Тем более он по логике уже выбрал это, перейдя на определенную страницу.
В форуме при создании ссылка такая, например, http://drupal.ru/node/add/blog/2058 и форма открывается с уже выбранным термином.
Нашел )
Кстати, советую еще вот это. Полезная вещь для группировки тагов, с отображением их принадлежности к тому или иному словарю.
Или я не разобрался, или этот модуль не делает то, что мне нужно. Как понял он привязывает один термин из словаря к определенному типу ноды.
Что то не мойму...
А разве не это было нужно?
Мне нужно, чтобы к ноде привязывался не один и тот же термин из словаря, а выбирался нужный в зависимости от ссылки, как в примере, который я выше привел.
Больше идей нет?
Если честно, есть одна — не мучаться(готового нет) и сделать по старинке.
Обычная форма создания материала + стандартный выпадающий список с терминами(тематикой вопроса).
Делаем ссылку:
В 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; // скрываем выбор термина
}
}
}
?>
Код не проверял! В нём могут быть синтаксические и логические ошибки.
Все получилось! Большое спасибо! Использовал только в модуле, т.к. ссылки задаю вручную.
Всегда пожалуйста
Поставил Hierarchical Select и код перестал работать. Посмотрел $form - массива ['taxonomy'] не стало. Хотя Hierarchical Select для этого словаря отключен. При этом select на странице выводится.
Dan
не могли бы вы пояснить, что значит
Не совсем понятно куда надо вставить вывод кнопки? В node.tpl.php ?
В 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; ?>
Что-то не Выходит Dan, подскажите пожалуйста, правильно ли я понимаю
В общем немного все сложно на первых парах и объяснить некому, поэтому обращаюсь к Вам.
Вот наткнулся сегодня ссылка на источник
Столкнулся вот с такой задачей, когда добавляешь новый материал чтобы при переходе по нужной ссылке выбирался нужный термин! Отдельный модуль для такого писать желания совсем не было, так что 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) - переделывает нашу измененную форму с новыми значениями.
Сразу ПИШУ пока сам не проверял - это для общего рассмотрения - обсуждения
Описание задачи:
При просмотре материла типа 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; // скрываем выбор термина
}
}
}
?>
Теперь понятно?
Dan, поправьте пожалуйста в последнем примере функцию is_numeric(), а то потом будут вопросы почему не работает)
Спасибо, исправил.
Но вообще-то код не проверялся, писал "отсебятину"
Огромное Спасибо Dan
Буду вникать. Теперь я понял, что моя задача несколько иная, но она вытекает из Вашего примера.
У меня есть 2 словаря таксономии и в каждом 13 списков терминов.
Меню построено на основе терминов - мне необходимо, чтобы на странице с материалами одного термина, можно было нажав одну кнопку создать материал определенного типа, с подставленным термином.
Т.е. в принципе, у меня просто будет другой тип материала не "answer", а мой.
Но я так понял, у Вас привязка делается к конкретному словарю, а у меня их 2,и в зависимости от словаря должен и термин выбираться. Можно конечно все термины свалить в один словарь, но будет некрасиво.
Меня до сих пор не покидает ощущение, что я что-то упускаю и ошибаюсь.
Надо убрать проверку на номер словаря.
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) или я ошибаюсь?
Да забыл сказать, меню по разделам таксономии не создавал. Обязательно ли это?
Наконец все частично заработало (По примеру описанному den в первый раз)
Теперь отображается ссылка с добавлением ноды и в ссылке явно указана словарь таксономии и номер термина.
Но выводится следующий список ошибок.
При нажатии на ссылку добавления ноды ничего не происходит.
Если скопировать ссылку, то и вставить в адресную строку, то все получается.
Я так понимаю возникает ошибка при реализации кода в template.php
Второй вариант вообще ничего не выводит. даже ошибок.
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, еще раз большое спасибо тебе за помощь и за допущенные мелкие ошибки, т.к. они помогли научиться разбирать и анализировать код.
А для 7-ки такой код будет работать?