Drupal 7では、hook_node_presave()
を使用してノードの非表示フィールドを更新していました。
function mymodule_node_presave($node){
if ( CONDITIONS ) {
$node->field_fieldname['und'][0]['value'] = importantfunction();
}
}
Drupal 8では、同じことはできません。オブジェクトを調べて、これを試しました。
function mymodule_node_presave($node){
if ( CONDITIONS ) {
$node->values['field_fieldname'][0]['value'];
}
}
それはうまくいきません。 Drupal 8で多くの変更があったことを私は知っています。私はそれを研究していますが、これに対する答えはまだ見つかりませんでした。
少し時代遅れですが、それでも素晴らしいリソースです:
http://wizzlern.nl/drupal/drupal-8-entity-cheat-sheet
Drupal.orgのドキュメント: https://www.drupal.org/node/1795854
簡単に言うと、フィールドは、プロパティと配列アクセスのマジックメソッドを使用して、値の読み取りと書き込みを単純化するオブジェクトのリストです。
// Set a value, the field class will decide what to do with it, usually write to the primary property...
$entity->field_fieldname = importantfunction();
// The default property is often called value, but for reference fields, it is target_id, text fields also have a format for example
$entity->field_fieldname->format = 'full_html';
// By default, you access delta 0, you can also set other deltas.
$entity->field_fieldname[1] = importantfunction();
// You can also append a new item, without hardcoding the delta.
$entity->field_fieldname->appendItem(importantfunction());
// Note that when accessing fields, you must always specify the property:
print $entity->field_fieldname->value;
print $entity->field_fieldname[1]->value;
// What basically happens internally for the above is:
$entity->get('field_fieldname')->get(0)->get('value')->getValue();
おそらくここで遅くなりますが、誰かがまだ見ているなら:
function mymodule_entity_presave(EntityInterface $entity){
$entity->set( 'field_fieldname',importantfunction() );
}
これは非常に遅い答えです。
\ Drupal\node\NodeInterface インターフェースで、私はあなたのニーズを達成するためにそのスニペットを使用しています:
/**
* Implements hook_node_presave();
*
* @param \Drupal\node\NodeInterface $node
*/
function module_name_node_presave(\Drupal\node\NodeInterface $node) {
if($node->get('field_name')->getString() != 'search') {
$node->set('field_name', 'new field value');
}
}
これがベストプラクティスであるかどうかはわかりませんが、私はこの解決策を見つけました:
function mymodule_node_presave(EntityInterface $node){
$node->field_fieldname->set(0, importantfunction() );
}