Ребят, 2 недели бьюсь над задачей и никак не могу найти решение. Есть термины привязанные к нодам (она из них - профиль пользователя, другие - повторяют названия терминов). Термины: красный, желтый, зеленый и тд. Созданы страницы: красный, желтый, зеленый и тд. Как сделать, чтобы в профиле пользователя выводилась ссылка на ноду соответствующую термину? В node-profile.tpl.php вставил такой код
<?php if ($terms): ?>
<div class="trms"><strong>Цвет: </strong>
<?php
foreach($node->taxonomy as $tid => $taxo)
$taxo_links[] = l($taxo->name,"taxonomy/term/$taxo->tid", array('title' => $taxo->name));
print implode(', ',$taxo_links);
?>
</div><!--/trms-->
<?php endif; ?>
Но при нажатии на ссылку, выводятся все ноды связанные с этим термином.. а хотелось бы, чтобы выводилась только определенная нода (например с описанием красного цвета).
Во Views пытаюсь сделать, но получается только вывести title терминов.
Прошу помощи.
Комментарии
А зачем термины (зеленый и т.д. к ноде привязывать ?), надо использовать cck поле node_reference и привязывать материалы (зеленый и т.д.) ?!
Тоже верно Видимо я уж очень хотел все на таксономии построить.
Не ну если хочешь ты можешь в материале "цвета" сделать поле content_taxonomy а title формировать из него через auto_nodetitle, но нужна ли там тебе таксономия ?
Ух и заставил ты меня посмотреть на задачу с другой стороны За что большое спасибо, как и за советы. Нужно и правда подумать о необходимости таксономии там. Просто я как подумал.. раз вся идея сайта крутится вокруг цветов, то лучше использовать таксономию.
Сейчас понимаю, что цветов ограниченное количество, и можно пойти более простым путем. Еще раз спасибо, Алексей
Эх.. не совсем то получается. В профиле пользователя выводится только одна ссылка на ноду, даже если выбираешь две. Выводил так:
<?php print $node->field_color[0]['view'] ?>
А можно посмотреть
<?php print_r($node); ?>
?Ого.. там столько всего вывелось.. Причем в этой куче в 2х местах нормально отображается желаемое
Если убиваю node-profile.tpl.php - все отображается как надо. Бррр... пожалуй надо сделать передышку. Утро вечера мудренее (надеюсь).
В $node у тебя массив field_color, и записью
<?php print $node->field_color[0]['view'] ?>
ты обращаешся к 1му елементу массива, по-этому и выводит только одну ссылку. Посмотри как выводится поля в node.tpl.php или перебери массив field_color...Ну дык, Вы человек умный - достаньте "что надо"
Такой умный, что долго читал форум, чтобы правильно сформулировать вопрос (в php и друпале не силен).
Ну что же.. и правда, главное что сам результат в принципе достижим, буду ковырять дальше. Я бы оставил и дефолтный вывод, но хочется обернуть в div.
О! Енто же можно посмотреть в Firebugs
Посмотрел, подумал, почесал Увидел два варианта:
1. Темизировать cck поле. В моем случае нужно было бы создать content-field_color.tpl.php
2. Темизировать ноду. В моем случае node-profile.tpl.php
Первый вариант отпал. Безусловно он заслуживает внимания, но при другой постановке задачи. Второй вариант для меня сложноват, т.к в php не силен. Решил задачу просто - установил Content Templates. Подсмотрел код нужного мне поля cck. Получил такое:
<?php foreach ((array)$node->field_color as $item) { ?>
<div class="field-item"><?php print $item['view'] ?></div>
<?php } ?>
Дальше уже дело за css.
Всем еще раз спасибо за подсказки
Это капец какой-то.. Значения cck полей выводятся, а вот с заголовками не получается. Хотелось бы, чтобы они отображались, если только поле является заполненным. Например: заголовок "Цвет", отображается только если пользователь выбрал один из вариантов красный, желтый, зеленый.
Пробовал такой код
<?php if (!$field_empty) : ?>
<div class="field field-type-<?php print $field_type_css ?> field-<?php print $field_name_css ?>">
<?php if ($label_display == 'above') : ?>
<div class="field-label"><?php print t($label) ?>: </div>
<?php endif;?>
<?php foreach ((array)$node->field_color as $item) { ?>
<div class="field-item"><?php print $item['view'] ?></div>
<?php } ?>
но не работает. Ребят, если у кого-нибудь есть свободное время, помогите пожалуйста.
<?php
print content_format('field_color', $node->field_color);
?>
ничего не выводит с этим кодом
$node->field_color не пустое?
Не помню как множественные поля выводить.
Попробуй
<?php
foreach($node->field_color as $field){
print content_format('field_color', $field);
}
?>
Дэн, спасибо что откликнулся. С выводом полей разобрался, выводятся. Я выше писал, что проблема с выводом заголовка (label). Т.е если пользователь выбрал цвет(или цвета), выводится такое:
Цвет: красный, синий.
Соответственно, если ничего не выбрал, ничего и не выводится. Можно конечно в шаблон впихнуть название заголовка.. типа
<h1>Цвет:</h1>
но не красяво, получается, когда значения color не заполнено, заголовок все равно присутствует. Как то такТам же условие на field_empty.
Где?
Сделай проверку на поле цвет
<?php if ($node->field_color != NULL) echo '<h1>Цвет:</h1>'; ?>
...Не работает..
<?php if ($node->field_color != NULL) echo '<h1>Цвет:</h1>'; ?>
<?php foreach ((array)$node->field_color as $item) { ?>
<div class="field-item"><?php print $item['view'] ?></div>
<?php } ?>
Выводит заголовок Цвет в любом случае, не зависимо от того, выбрал пользователь цвет, или оставил поле пустым
Надо либо if(!empty($node->field_color)) либо if(!$node->field_color[0]['value']).
такой вариант:
<?php if (!$node->field_color[0]['value']) echo '<h1>Цвет:</h1>'; ?>
<?php foreach ((array)$node->field_color as $item) { ?>
<div class="field-item"><?php print $item['view'] ?></div>
<?php } ?>
и такой:
<?php if (!empty($node->field_color)) echo '<h1>Цвет:</h1>'; ?>
<?php foreach ((array)$node->field_color as $item) { ?>
<div class="field-item"><?php print $item['view'] ?></div>
<?php } ?>
Все равно выводят заголовок всегда.
Покажи $node->field_color
<?php if (isset($node->field_color[0]['value']) && $node->field_color[0]['value']) echo '<h1>Цвет:</h1>'; ?>
или
<?php if (!empty($node->field_color[0]['value'])) echo '<h1>Цвет:</h1>'; ?>
<?php if (!empty($node->field_color[0]['value'])) echo '<h1>Цвет:</h1>'; ?>
Работает для cck полей типа "Text". Но не работает для field_color у которой тип - Node reference.. Не выводит заголовок, хоть тресни
print_r поможет
Конечно, т.к. там не value, а nid.
Эх.. это как приехать в другую страну и не знать язык. Хочешь жить нормально - учи язык. Это я все понимаю. Но я нифига не программер, ребят, потому обьсняюсь на пальцах, и вас понимаю с трудом
Дэн, если я правильно понял, нужно обрабатывать не value а node id? Нод у меня этих порядка 25 (цвета). Замена value на nid не помогла. Па-ма-ги-те
Аааааааааааааа ...
Вставьте это кусочек в node-блабла.tpl.php и опубликуйте здесь файлик nifiga_ne_ponimay.txt который найдете в корне сайта после просмотра материала типа "блабла"
print_r($node);
$plain = ob_get_contents();
ob_end_clean(); // End buffering and discard
if ($handle = fopen($_SERVER['DOCUMENT_ROOT'] . base_path() . "nifiga_ne_ponimay.txt", 'w+')) {
fwrite($handle, $plain. "\n");
fclose($handle);
}
после просмотра вывело
ob_start(); // Start output buffering print_r($node); $plain = ob_get_contents(); ob_end_clean(); // End buffering and discard if ($handle = fopen($_SERVER['DOCUMENT_ROOT'] . base_path() . "nifiga_ne_ponimay.txt", 'w+')) { fwrite($handle, $plain. "\n"); fclose($handle); }
но файла "нифиганепонимаю" в корне нет.. в sites/default/files - тоже
Вы конечно вставили в <?php .... ?>
Упс.. нет конечно-же Сделал как надо, файл появился. но он пуст.
<?php<pre><?php print_r($node); ?></pre>?>
выдает
(
[0] => Array
(
[nid] => 34
[safe] => Array
(
[nid] => 34
[title] => Красный
[status] => 1
)
[view] => Красный
)
[1] => Array
(
[nid] => 74
[safe] => Array
(
[nid] => 74
[title] => Синий
[status] => 1
)
[view] => Синий
)
Вставил часть только.. ибо текста много и есть картинки
Это нода с заполненным полем. У вас, я так понимаю, проблемы с пустым. Приведите листинг ноды с пустым полем.
Вообще код <?php if ($node->field_color[0]['nid']) echo 'Цвет:'; ?> должен работать. Не понимаю, почему не работает.
<?php
[field_color] => Array
(
[#type_name] => profile
[#context] => full
[#field_name] => field_color
[#post_render] => Array
(
[0] => content_field_wrapper_post_render
)
[
#weight] => 9[field] => Array
(
[#description] =>
[items] => Array
(
[0] => Array
(
[#formatter] => default
[#node] => stdClass Object
*RECURSION*
[#type_name] => profile
[#field_name] => field_color
[#weight] => 0
[#theme] => nodereference_formatter_default
[#item] => Array
(
[nid] =>
[safe] => Array
(
)
[
#delta] => 0)
[
#title] =>[#description] =>
[#theme_used] => 1
[#printed] => 1
[#type] =>
[#value] =>
[#prefix] =>
[#suffix] =>
)
[
1] => Array(
[#formatter] => default
[#node] => stdClass Object
*RECURSION*
[#type_name] => profile
[#field_name] => field_color
[#weight] => 1
[#theme] => nodereference_formatter_default
[#item] => Array
(
[nid] =>
[safe] => Array
(
)
[
#delta] => 1)
[
#title] =>[#description] =>
[#theme_used] => 1
[#printed] => 1
[#type] =>
[#value] =>
[#prefix] =>
[#suffix] =>
)
[
2] => Array(
[#formatter] => default
[#node] => stdClass Object
*RECURSION*
[#type_name] => profile
[#field_name] => field_color
[#weight] => 2
[#theme] => nodereference_formatter_default
[#item] => Array
(
[nid] =>
[safe] => Array
(
)
[
#delta] => 2)
[
#title] =>[#description] =>
[#theme_used] => 1
[#printed] => 1
[#type] =>
[#value] =>
[#prefix] =>
[#suffix] =>
)
[
#title] =>[#description] =>
[#printed] => 1
)
[
#single] => 1[#attributes] => Array
(
)
[
#required] =>[#parents] => Array
(
)
[
#tree] =>[#context] => full
[#page] => 1
[#field_name] => field_color
[#title] => Цвет
[#access] => 1
[#label_display] => above
[#teaser] =>
[#node] => stdClass Object
*RECURSION*
[#type] => content_field
[#printed] => 1
)
[
#title] =>[#description] =>
[#printed] => 1
)
?>
Упс.. заработал вариант
<?php if ($node->field_color[0]['nid']) echo '<h1>Цвет:</h1>'; ?>
Значит я что-то недоглядел, или запятую не там поставил, или еще что, когда попробовал его в первый раз.
Дэн, Алексей, Андрей, огромное вам спасибо за помощь!
Пожалуйста
Поставь [Решено] в заголовке темы.
Поставил. Расширил название темы, т.к одно перетекло в другое
Сам недоглядел про
$node->field_color[0]['nid']
. Рад что у тебя получилось, успехов