Есть 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.txt | 7 КБ |
Комментарии
Что-то никто не пишет....
Но я близок к дзену.
<?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 перебирает все значения в массиве до бесконечности... Пока думаю...
Ну что ж, как говорится "спасение утопающих..."
<?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 (чтобы ошибок не было). Вот и всё. Всего то три дня подумать
P.S.: Вот за что я люблю Drupal-сообщество так это за то, что заставляют самим докапываться до сути и хрен кто поможет. Ребята вы молодцы, вы мне так помогли!
Уважаемый, wiw!
Благодарю за решение. Для шестёрки такое делал, а вот для семёрки начал поначалу ломать голову, но натолкнулся на этот пост и многое встало на свои места.
Да улучшится Ваша карма
Вот вроде решение по-изящнее:
<?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);
}
}
}?>
Спасибо, работает.