[Решено]Вывод одного изображения из поля cck

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

Аватар пользователя wiw wiw 4 декабря 2011 в 19:34

Есть cck поле, Тип "Изображение", может содержать много изображений. По умолчанию, через это поле выводятся все загруженные изображения. Но это не комильфо. Допустим надо вывести только первое изображение. В drupal6 это решалось простым кодом:
<?php print $node->field_canvas[0]['view']; ?>

В drupal7 похоже всё только усложнили...

Код
<?php print render($content['field_canvas']); ?>
и
<?php print render($content['#children']); ?> выводит все изображения загруженное в поле field_canvas.

Если же написать <?php print $node->field_canvas['und'][0]['uri']); ?> то мы получим uri - внутреннюю ссылку на файл, используя функцию image_style_url, которая преобразует uri в нормальную ссылку мы можем вставить изображение в ноду. Вот как это получилось у меня:

<?php <div class="field field-name-field-canvas field type-image field-label-hidden">
  <
div class="field_items">
    <
div class="field-item <?php print $zebra; ?>">
      <
a href="<?php print image_style_url('large', $node->field_canvas['und'][0]['uri']); ?>" rel="lightbox" class="lightbox-processed">
        <
img typeof="foaf:Image" src="<?php print image_style_url('medium', $node->field_canvas['und'][0]['uri']); ?>">
      </
a>
    </
div>
  </
div>
</
div?>

Жуткий говнокод, но он частично работает. Не работает почему то lightbox, хотя rel="lightbox" стоит.

Вопрос! Как же! Как же нормально вывести одно изображение из многих в поле cck, не используя вышенаписанный код?

Примечание: получил вывод содержимого переменной $content, привожу его сюда.

ВложениеРазмер
Иконка простого текстового файла array.txt7 КБ

Комментарии

Аватар пользователя wiw wiw 10 ноября 2015 в 11:47

Что-то никто не пишет....

Но я близок к дзену.

<?php
    $image_uri_0 
$node->field_canvas['und'][0]['uri'];
    
$image_url_0 image_style_url('large'$image_uri_0);
    
$image_pic_0 theme('image_style', array(
        
'style_name' => 'medium',
        
'path' => $image_uri_0,
        
'alt' => '',
        
'title' => '',
        ));
    print 
"<div class=\"main-overlay\"><a href=\"{$image_url_0}\" rel=\"lightbox\">{$image_pic_0}</a></div>";
    print 
"<div class=\"micro-overlay\">";
    
$i 1;
    while (
$node->field_canvas['und'][$i]['uri']) {
    
$n $i++;
    
$image_url image_style_url('large'$node->field_canvas['und'][$n]['uri']);
    
$image_pic theme('image_style', array('style_name' => 'micro''path' => $node->field_canvas['und'][$n]['uri'], 'alt' => '''title' => ''));
    print 
"<div class=\"micro\"><a href=\"{$image_url}\" rel=\"lightbox\">{$image_pic}</a></div>";
  };
    print 
"</div>";
?>

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

Всё хорошо за одним исключением - цикл while перебирает все значения в массиве до бесконечности... Пока думаю...

Аватар пользователя wiw wiw 7 декабря 2011 в 20:31

Ну что ж, как говорится "спасение утопающих..."

<?php
    
//Вывод первого изображения из поля
    
$image_uri_0 $node->field_canvas['und'][0]['uri'];
    
$image_url_0 image_style_url('large'$image_uri_0);
    
$image_pic_0 theme('image_style', array(
        
'style_name' => 'medium',
        
'path' => $image_uri_0,
        
'alt' => '',
        
'title' => ''
        )); 
    print 
"<div class=\"main-overlay\"><a href=\"{$image_url_0}\" rel=\"lightbox\">{$image_pic_0}</a></div>";
    
//вывод оставшихся изображений в виде небольших превью
    
print "<div class=\"micro-overlay\">";
    
$max count($node->field_canvas['und']) - 1;
    for (
$i 1$i <= $max$i++) {
    if (isset(
$node->field_canvas['und'][$i])) {
    
$image_url image_style_url('large'$node->field_canvas['und'][$i]['uri']);
    
$image_pic theme('image_style', array('style_name' => 'micro''path' => $node->field_canvas['und'][$i]['uri'], 'alt' => '''title' => ''));
    print 
"<div class=\"micro\"><a href=\"{$image_url}\" rel=\"lightbox\">{$image_pic}</a></div>";
    };
  };
    print 
"</div>";
?>

Вкратце: Сначала выводится первое изображение из cck поля. Затем оставшиеся в виде небольших превью. А именно: проверяю количество картинок в поле и вычитаю единицу (так как нумерация с 0), затем используя цикл for перебираю все значения пока не доберусь до количества картинок -1. Параллельно с этим проверяю существование элемента массива функцией isset (чтобы ошибок не было). Вот и всё. Всего то три дня подумать Smile

P.S.: Вот за что я люблю Drupal-сообщество так это за то, что заставляют самим докапываться до сути и хрен кто поможет. Ребята вы молодцы, вы мне так помогли! Smile

Аватар пользователя forest_run forest_run 19 июля 2012 в 1:24

Уважаемый, wiw!
Благодарю за решение. Для шестёрки такое делал, а вот для семёрки начал поначалу ломать голову, но натолкнулся на этот пост и многое встало на свои места. Smile

Да улучшится Ваша карма Smile

Аватар пользователя Sever_a Sever_a 10 декабря 2012 в 8:20

Вот вроде решение по-изящнее:

<?phpfunction MYTHEME_process_field(&$vars) {
  $element = $vars['element'];

  // Field type image
  if ($element['#field_type'] == 'image') {

    // Reduce number of images in teaser view mode to single image
    if ($element['#view_mode'] == 'teaser') {
      $item = reset($vars['items']);
      $vars['items'] = array($item);
    }

  }

}?>