Получить поля Paragraphs вместе с нодой, и Сохранение ноды с Paragraphs

Аватар пользователя g2100636 g2100636 17 февраля в 16:18

Подскажите как работать с модулем Paragraphs на программном уровне?

Например есть страница ноды (type1), на которой должны подтягиваться другие ноды (type2) с параграфами.
Известны айди нужных нод.
<?php$nodes = node_load_multiple($array_nodes_id);?>
Через функцию node_load_multiple объекты содержат только айди параграфов.
Мне нужны все поля ноды, вместе полями параграфов.

Кроме того потребуется программное создание\изменение нод типа type2. Например тут есть код сохранения для drupal8:

<?php$paragraph = \Drupal\paragraphs\Entity\Paragraph::create([
    'type' => 'image_text',
    'field_description' => array(
      "value" => 'My description',
    ),
    'field_image' => array(
      "target_id" => $file->id(),
      "alt" => "docteur portrait",
      "title" => "docteur portrait",
    ),
  ]);
  $paragraph->save();
  $node->field_page_content->appendItem($paragraph);
  $node->save();?>

Как его адаптировать для drupal7?

Комментарии

Аватар пользователя bumble bumble 17 февраля в 17:29

Как его адаптировать для drupal7?

Больно, обидно и унизительно.

Ищите про EntityMetatateWrapper.
Соображайте, с привлечением его, зацикленные циклы, необходимой вложенности.
Обмазывайтесь кучей необходимых проверок, которые Вам придется дублировать по логике используемых сущностей.

Аватар пользователя g2100636 g2100636 18 февраля в 1:29
1

Спасибо! вроде разобрался Smile

Получилось както так.
Создание новой ноды:


  <?php
  
// сначала создаем ноду с обычными полями
  
$node = new stdClass();
  
$node->type 'review';
  
node_object_prepare($node);
  
$node->title 'Создание ноды';
  
$node->language 'ru';
  
$node->body[LANGUAGE_NONE][0]['value'] = 'Содержание ноды';
  
$node->body[LANGUAGE_NONE][0]['summary'] = 'Текст анонса';
  
$node->body[LANGUAGE_NONE][0]['format'] = 'user_format';
  
$node->uid 1
  
$node->status 1;  
  
node_save($node);

  

// затем тут же создаем поля параграфа, и добавляем к этой ноде
  
$paragraph = new ParagraphsItemEntity(array('field_name' => 'field_answer''bundle' => 'comment'));
  
$paragraph->is_new TRUE;
  
$paragraph->setHostEntity('node'$node);
  
$paragraph->field_comment_author[LANGUAGE_NONE][0]['value'] = 'text';
  
$paragraph->field_comment_text[LANGUAGE_NONE][0]['format'] = 'user_format';
  
$paragraph->field_comment_text[LANGUAGE_NONE][0]['value'] = 'text';
  
$paragraph->save();
  
?>

с получением полей не совсем понял как оно так получилось. Изначально сработала такая вещь:


  <?php 
    $wrapper 
entity_metadata_wrapper('node'55); // где 55 - это айди ноды
    
print $wrapper->field_city->value(); // обычное поле
    
print $wrapper->field_answer->field_date->value(); // поле параграфа
  
?>

После того как я научился создавать новые ноды с параграфми, код выше перестал работать. Ругается мол нет такого свойства field_date. В этом то и проявилась "боль с обидой :))"
Изначально у меня был всего один экземпляр параграфа на всем сайте, а затем появлись и другие. Судя по всему изза этого работало и потом перестало работать.
В итоге понял что надо специально грузить сущность параграфа по айди, указанному в поле field_answer ноды.
получилось так:
Получить поля параграфов:


  <?php
  
// 14 это айди экземпляра параграфа
  
$wrapper entity_metadata_wrapper('paragraphs_item'14);
  print 
$wrapper->field_comment_text->value();
  
?>

Соответственно с изменением полей параграфов так же.


  <?php
  
// сначала работало так, потом перестало.
  
$wrapper entity_metadata_wrapper('node'$node);
  
$wrapper->field_answer->field_date 12999999;
  
$wrapper->save();
  
?>

Рабочий вариант сохранения полей:


  <?php
  $wrapper 
entity_metadata_wrapper('paragraphs_item'1);
  
$wrapper->field_date=12999999;
  
$wrapper->save();
  
?>

В принципе кучи проверок вроде пока нету. Есть только цикл в цикле, чтобы вывести нормально)