Есть необходимость вывода новостей с картинками, при этом картинки должны вводится отдельным полем.
Добавил в тип материалов СТАТЬЯ поле изображения машинное имя которому присвоилось field_images.
При выводе массива получается что изображение нет (или ссылки на изображение),
Подскажите как получить изображение.
// Пошла выборка
$nodes2 = db_select('node', 'n')
->fields('n')
->condition('n.type', 'article') // Тип ноды: article, машинное имя
->condition('n.language', $language->language) // Тип языка
->orderBy('created', 'DESC') // Свежее вперед
->range(0, 4) // Показывать будем не более 4
->execute();
$i=0;
foreach ($nodes2 as $n2) {
// Получаем синоним пути
$massiv[$i] = array(
"url"=>drupal_get_path_alias('node/'.$n2->nid),
"title"=>$n2->title,
"img"=>$n2->field_images
);
echo "<pre>";
print_r($n2);
echo "</pre>";
$i++;
}
?>
Вложение | Размер |
---|---|
bezymyannyy.png | 24.16 КБ |
Комментарии
Пути картинок в другой таблице соединения с ней я не вижу.Надо соединится и появятся картинки
если по одной картинке к новости
$query->innerJoin('field_data_field_images', 'fd', 'n.nid = fd.entity_id');
$query->innerJoin('file_managed', 'fm', 'fm.fid = fd.field_images_fid');
$query->fields('n');
$query->fields('fm', array('uri'));
$query->condition('n.type', 'article');
$query->condition('n.language', $language->language);
$query->condition('fd.entity_type', 'node');
$query->condition('fd.bundle', 'article');
$query->orderBy('n.created', 'DESC');
$arr_nodes = $query->range(0, 4)->execute();
if($arr_nodes){
foreach($arr_nodes as $k => $v){
$image_url = '';
if($v->uri){
$image_url = image_style_url('тут_пропишите_ваш_стиль_обработки_картинки', $v->uri);
}
$massiv[] = array(
"url" => url('node/' . $v->nid),
"title" => $v->title,
"img" => array(
0 => $image_url
)
);
}
}
если надо вывести много картинок к одной новости
$query->fields('n');
$query->condition('n.type', 'article');
$query->condition('n.language', $language->language);
$query->orderBy('n.created', 'DESC');
$arr_nodes = $query->range(0, 4)->execute();
if($arr_nodes){
foreach($arr_nodes as $k => $v){
$query = db_select('field_data_field_images', 'fd');
$query->innerJoin('file_managed', 'fm', 'fm.fid = fd.field_images_fid');
$query->fields('fm', array('uri'));
$query->condition('fd.entity_type', 'node');
$query->condition('fd.bundle', 'article');
$query->condition('fd.entity_id', $v->nid);
$query->orderBy('fd.delta', 'DESC');
$arr_images = $query->execute();
$arr_images_node = array();
if($arr_images){
foreach($arr_images as $ki => $vi){
$arr_images_node[] = image_style_url('тут_пропишите_ваш_стиль_обработки_картинки', $vi->uri);
}
}
$massiv[] = array(
"url" => url('node/' . $v->nid),
"title" = > $v->title,
"images"=> $arr_images_node
);
}
}
второй вариант лучше, так как вытянет все картинки.
ну и далее делайте с ними что пожелаете.
как пример - я на выводе формирую ссылку ан картинку в соответствии с тем стилем, который присваиваю.
в коде могут быть ошибки (ну там пропустил точку с запятой или что-то такое). писал по памяти. Но идея, думаю, понятна.
В первом варианте я выбираю ноды и делаю джоин с таблицей картинок и потом с таблицей файлов, что бы не вызывать file_load.
Хотя с другой стороны можно было бы использовать node_load и написать свой форматтер к полю картинок. Тоже не плохое решение.
Во втором варианте я выбираю все ноды и потом по каждой иду, и выбираю все uri картинок, которые прикрепленны к вашему полю в рамках ноды. И записываю это все в массив.
Структура массива на выводе обоих вариантов будет одинаковой. И что там дальше делать с ним - уже решайте сами.
Надеюсь помог и у вас будет левел ап по знаниям.
Спасибо!!!
Решено, тема закрыта.