Динамически добавить «коллекцию полей» в Drupal 7 по сценарию? - PullRequest
3 голосов
/ 05 июня 2011

Я хочу добавить « коллекцию полей » динамически. Но я не знаком с Field API или Entity API. Новый Entity API в Drupal очень плохо документирован.

Вот мой код, до сих пор:

$node = node_load(1);
$field_collection_item = entity_create('field_collection_item', array('field_name' => 'field_book_text'));
$field_collection_item->setHostEntity('node', $node);

// Adding fields to field_collection

$field_collection_item.save();

Модуль "Сбор полей" использует функцию " entity_form_submit_build_entity ", которую я не могу использовать, потому что в моем случае нет формы.

Буду признателен, если вы подскажете, как мне добавить поля?

Ответы [ 6 ]

7 голосов
/ 28 сентября 2011

На основе кода, который я использовал в живом проекте:

// Create and save research field collection for node.
$field_collection_item = entity_create('field_collection_item', array('field_name' => 'field_article_references'));
$field_collection_item->setHostEntity('node', $node);
$field_collection_item->field_reference_text[$node->language][]['value'] = 'ABCD';          
$field_collection_item->field_reference_link[$node->language][]['value'] = 'link-val';
$field_collection_item->field_reference_order[$node->language][]['value'] = 1;
$field_collection_item->save();
4 голосов
/ 08 декабря 2012

Любой, кто использует приведенные выше примеры кода, должен рассмотреть возможность использования функции entity_metadata_wrapper из API-интерфейса Entity для установки значений полей в объекте вместо использования оператора присваивания. Итак, код из «более полного примера» выше:

  if ($node->field_collection[LANGUAGE_NONE][0]) {
    // update
    $fc_item = reset(entity_load('field_collection_item', array($node->field_collection[LANGUAGE_NONE][0]['value'])));
  }
  else {
    // create
    $fc_item = entity_create('field_collection_item', array('field_name' => 'field_collection'));
    $fc_item->setHostEntity('node', $node);
  }

  // Use the Entity API to "wrap" the field collection entity and make CRUD on the
  // entity easier
  $fc_wrapper = entity_metadata_wrapper('field_collection_item', $fc_item);

  // ... set some values ...
  $fc_wrapper->field_terms->set('lars-schroeter.com');

  // save the wrapper and the node
  // Note that the "true" is required due to a bug as of this time
  $fc_wrapper->save(true);

  node_save($node);
1 голос
/ 16 мая 2012

Более полный пример:

  if ($node->field_collection[LANGUAGE_NONE][0]) {
    // update
    $fc_item = reset(entity_load('field_collection_item', array($node->field_collection[LANGUAGE_NONE][0]['value'])));
  }
  else {
    // create
    $fc_item = entity_create('field_collection_item', array('field_name' => 'field_collection'));
    $fc_item->setHostEntity('node', $node);
  }

  // ... set some values ...
  $fc_item->field_terms[LANGUAGE_NONE][0]['value'] = 'lars-schroeter.com';

  // save node and field-collection
  $node->field_collection[LANGUAGE_NONE][0] = array('entity' => $fc_item);
  node_save($node);
0 голосов
/ 15 марта 2016

Вы можете найти Entity API, документированный в Entity API Tutorial на Drupal.org.

Там вы найдете несколько полезных примеров, особенно проверка на Оболочки метаданных Entity page.

Вот пример, основанный на ваших переменных:

$node = node_load(1);
$field_collection_item = entity_create('field_collection_item', array('field_name' => 'field_book_text')); // field_book_text is field collection
$field_collection_item->setHostEntity('node', $node);
$cwrapper = entity_metadata_wrapper('field_collection_item', $field_collection_item);
// Adding fields to field_collection
$cwrapper->field_foo_text->set("value");
$cwrapper->field_foo_multitext->set(array("value1", "value2"));
$cwrapper.save();

Вот еще один пример использования коллекций полей из вышеупомянутой страницы документации:

<?php
    // Populate the fields.
    $ewrapper = entity_metadata_wrapper('node', $node);
    $ewrapper->field_lead_contact_name->set($contact_name);
    $ewrapper->field_lead_contact_phone->set($contact_phone);
    $ewrapper->field_lead_contact_email->set($contact_email);  

    // Create the collection entity and set it's "host".
    $collection = entity_create('field_collection_item', array('field_name' => 'field_facilities_requested'));
    $collection->setHostEntity('node', $node);  

    // Now define the collection parameters.
    $cwrapper = entity_metadata_wrapper('field_collection_item', $collection);
    $cwrapper->field_facility->set(intval($offset));
    $cwrapper->save();  

    // Save.
    $ewrapper->save();
?>

Здесьэто более продвинутый мой пример, который для данной сущности загружает ссылки на термины таксономии из field_rs_property_features, затем для каждого вторичного термина, у которого есть родительский термин, добавляет свое имя термина и имя родительского термина в field_feed_characteristics_value, группируя их вместе в заголовок(родитель) и значение (ребенок).Вероятно, это труднее объяснить, не видя код.Итак, вот оно:

/**
 * Function to set taxonomy term names based on term references for given entity.
 */
function MYMODULE_refresh_property_characteristics(&$entity, $save = FALSE) {
  try {
    $w_node = entity_metadata_wrapper('node', $entity);
    $collections = array();
    foreach ($w_node->field_rs_property_features->getIterator() as $delta => $term_wrapper) {
      if ($term_wrapper->parent->count() > 0) {
        $name = $term_wrapper->name->value();
        $pname = $term_wrapper->parent->get(0)->name->value();
        if (array_key_exists($pname, $collections)) {
          $collections[$pname]->field_feed_characteristics_value[] = $name;
        } else {
          // Create the collection entity, set field values and set it's "host".
          $field_collection_item = entity_create('field_collection_item', array('field_name' => 'field_feed_characteristics'));
          $field_collection_item->setHostEntity('node', $w_node->value());
          $collections[$pname] = entity_metadata_wrapper('field_collection_item', $field_collection_item);
          $collections[$pname]->field_feed_characteristics_title = $pname;
          $collections[$pname]->field_feed_characteristics_value = array($name);
        }
      }
    }
    if ($save) {
      $w_node->save();
    }
  } catch (Exception $e) {
    drupal_set_message(t('Error setting values for field collection: @title, message: @error.',
          array('@title' => $w_node->title->value(), '@error' => $e->getMessage())), 'error');
    watchdog_exception('MYMODULE', $e);
    return FALSE;
  }
  return TRUE;
}
0 голосов
/ 01 июня 2014

используйте обертки, они ваши друзья:

  // Create an Entity
  $e = entity_create('node', array('type' => 'CONTENT_TYPE'));
  // Specify the author.
  $e->uid = 1;
  // Create a Entity Wrapper of that new Entity
  $entity = entity_metadata_wrapper('node',$e);

  // Specify the title
  $entity->title = 'Test node';

  // Add field data... SO MUCH BETTER!
  $entity->field_FIELD_NAME->set(1111);
  // Save the node.
  $entity->save();
0 голосов
/ 22 августа 2013

Вам не нужно вызывать node_save ($ node) при использовании entity_metadata_wrapper. Это обеспечит сохранение только данных объекта и ссылки на хост без какого-либо запуска node_save, что является хорошим приростом производительности.

Однако вам все равно понадобится node_save (), если у вас есть какие-либо действия, инициируемые node_save, которые используют эту коллекцию полей (например, правило, отправляющее электронные письма при редактировании узла).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...