Доступ к записям ноды через php

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

Аватар пользователя marirveze marirveze 13 марта 2015 в 20:16

Есть необходимость вывода новостей с картинками, при этом картинки должны вводится отдельным полем.
Добавил в тип материалов СТАТЬЯ поле изображения машинное имя которому присвоилось 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.png24.16 КБ

Комментарии

Аватар пользователя t1mm1 t1mm1 14 марта 2015 в 13:08

если по одной картинке к новости

  $query = db_select('node', 'n');
  $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 = db_select('node', 'n');
  $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 картинок, которые прикрепленны к вашему полю в рамках ноды. И записываю это все в массив.

Структура массива на выводе обоих вариантов будет одинаковой. И что там дальше делать с ним - уже решайте сами.

Надеюсь помог и у вас будет левел ап по знаниям.