[Решено] Вывод определенной ноды по термину. Вывод CCK полей.

Аватар пользователя Cody Cody 2 августа 2011 в 17:21

Ребят, 2 недели бьюсь над задачей и никак не могу найти решение. Есть термины привязанные к нодам (она из них - профиль пользователя, другие - повторяют названия терминов). Термины: красный, желтый, зеленый и тд. Созданы страницы: красный, желтый, зеленый и тд. Как сделать, чтобы в профиле пользователя выводилась ссылка на ноду соответствующую термину? В node-profile.tpl.php вставил такой код

<?php if ($terms): ?>
        <div class="trms"><strong>Цвет:&nbsp;</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 терминов.
Прошу помощи.

Комментарии

Аватар пользователя sas@drupal.org sas@drupal.org 2 августа 2011 в 17:40

А зачем термины (зеленый и т.д. к ноде привязывать ?), надо использовать cck поле node_reference и привязывать материалы (зеленый и т.д.) ?!

Аватар пользователя Cody Cody 2 августа 2011 в 17:47

Тоже верно Smile Видимо я уж очень хотел все на таксономии построить.

Аватар пользователя Cody Cody 2 августа 2011 в 21:23

Ух и заставил ты меня посмотреть на задачу с другой стороны Smile За что большое спасибо, как и за советы. Нужно и правда подумать о необходимости таксономии там. Просто я как подумал.. раз вся идея сайта крутится вокруг цветов, то лучше использовать таксономию.
Сейчас понимаю, что цветов ограниченное количество, и можно пойти более простым путем. Еще раз спасибо, Алексей Smile

Аватар пользователя Cody Cody 2 августа 2011 в 22:00

Эх.. не совсем то получается. В профиле пользователя выводится только одна ссылка на ноду, даже если выбираешь две. Выводил так:
<?php print $node->field_color[0]['view'?>

Аватар пользователя Cody Cody 2 августа 2011 в 22:18

Ого.. там столько всего вывелось.. Причем в этой куче в 2х местах нормально отображается желаемое

Аватар пользователя Cody Cody 2 августа 2011 в 22:27

Если убиваю node-profile.tpl.php - все отображается как надо. Бррр... пожалуй надо сделать передышку. Утро вечера мудренее (надеюсь).

Аватар пользователя AK47 AK47 3 августа 2011 в 1:06

В $node у тебя массив field_color, и записью <?php print $node->field_color[0]['view'] ?> ты обращаешся к 1му елементу массива, по-этому и выводит только одну ссылку. Посмотри как выводится поля в node.tpl.php или перебери массив field_color...

Аватар пользователя sas@drupal.org sas@drupal.org 3 августа 2011 в 10:58

"Cody" wrote:
нормально отображается желаемое

Ну дык, Вы человек умный - достаньте "что надо"

Аватар пользователя Cody Cody 3 августа 2011 в 11:10

Такой умный, что долго читал форум, чтобы правильно сформулировать вопрос Lol (в php и друпале не силен).
Ну что же.. и правда, главное что сам результат в принципе достижим, буду ковырять дальше. Я бы оставил и дефолтный вывод, но хочется обернуть в div.
О! Енто же можно посмотреть в Firebugs

Аватар пользователя Cody Cody 3 августа 2011 в 12:24

Посмотрел, подумал, почесал Smile Увидел два варианта:
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.
Всем еще раз спасибо за подсказки Smile

Аватар пользователя Cody Cody 3 августа 2011 в 17:43

Это капец какой-то.. Значения 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?>:&nbsp;</div>
  <?php endif;?>
    <?php foreach ((array)$node->field_color as $item) { ?>
      <div class="field-item"><?php print $item['view'?></div>
    <?php ?>

но не работает. Ребят, если у кого-нибудь есть свободное время, помогите пожалуйста.

Аватар пользователя Dan Dan 4 августа 2011 в 11:24

$node->field_color не пустое?

Не помню как множественные поля выводить.
Попробуй
<?php
foreach($node->field_color as $field){
print content_format('field_color', $field);
}
?>

Аватар пользователя Cody Cody 4 августа 2011 в 16:11

Дэн, спасибо что откликнулся. С выводом полей разобрался, выводятся. Я выше писал, что проблема с выводом заголовка (label). Т.е если пользователь выбрал цвет(или цвета), выводится такое:
Цвет: красный, синий.
Соответственно, если ничего не выбрал, ничего и не выводится. Можно конечно в шаблон впихнуть название заголовка.. типа <h1>Цвет:</h1> но не красяво, получается, когда значения color не заполнено, заголовок все равно присутствует. Как то так Smile

Аватар пользователя Cody Cody 5 августа 2011 в 10:31

Не работает..

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

Выводит заголовок Цвет в любом случае, не зависимо от того, выбрал пользователь цвет, или оставил поле пустым

Аватар пользователя Cody Cody 5 августа 2011 в 11:22

такой вариант:

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

Все равно выводят заголовок всегда.

Аватар пользователя sas@drupal.org sas@drupal.org 5 августа 2011 в 11:54

<?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>'?>

Аватар пользователя Cody Cody 5 августа 2011 в 12:18

<?php if (!empty($node->field_color[0]['value']))  echo '<h1>Цвет:</h1>'?>
Работает для cck полей типа "Text". Но не работает для field_color у которой тип - Node reference.. Не выводит заголовок, хоть тресни

Аватар пользователя Cody Cody 5 августа 2011 в 14:22

Эх.. это как приехать в другую страну и не знать язык. Хочешь жить нормально - учи язык. Это я все понимаю. Но я нифига не программер, ребят, потому обьсняюсь на пальцах, и вас понимаю с трудом Smile
Дэн, если я правильно понял, нужно обрабатывать не value а node id? Нод у меня этих порядка 25 (цвета). Замена value на nid не помогла. Па-ма-ги-те Smile

Аватар пользователя sas@drupal.org sas@drupal.org 5 августа 2011 в 14:28

Аааааааааааааа ...

Вставьте это кусочек в node-блабла.tpl.php и опубликуйте здесь файлик nifiga_ne_ponimay.txt который найдете в корне сайта после просмотра материала типа "блабла"

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);
}

Аватар пользователя Cody Cody 5 августа 2011 в 14:40

после просмотра вывело
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 - тоже

Аватар пользователя Cody Cody 5 августа 2011 в 15:09

<?php<pre><?php print_r($node); ?></pre>?>
выдает

[field_color] => Array
        (
            [0] => Array
                (
                    [nid] => 34
                    [safe] => Array
                        (
                            [nid] => 34
                            [title] => Красный
                            [status] => 1
                        )

                    [view] => Красный
                )

            [1] => Array
                (
                    [nid] => 74
                    [safe] => Array
                        (
                            [nid] => 74
                            [title] => Синий
                            [status] => 1
                        )

                    [view] => Синий
                )

Вставил часть только.. ибо текста много и есть картинки

Аватар пользователя Dan Dan 5 августа 2011 в 15:25

Это нода с заполненным полем. У вас, я так понимаю, проблемы с пустым. Приведите листинг ноды с пустым полем.

Вообще код <?php if ($node->field_color[0]['nid']) echo 'Цвет:'; ?> должен работать. Не понимаю, почему не работает.

Аватар пользователя Cody Cody 5 августа 2011 в 15:44
<?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
                
)
?>
Аватар пользователя Cody Cody 5 августа 2011 в 15:49

Упс.. заработал вариант <?php if ($node->field_color[0]['nid'])  echo '<h1>Цвет:</h1>'?>
Значит я что-то недоглядел, или запятую не там поставил, или еще что, когда попробовал его в первый раз.
Дэн, Алексей, Андрей, огромное вам спасибо за помощь!

Аватар пользователя AK47 AK47 8 августа 2011 в 0:16

Сам недоглядел про $node->field_color[0]['nid']. Рад что у тебя получилось, успехов Smile