Как изменить поле с помощью предварительного сохранения узла крючка()?


В 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 многое изменилось, и я изучаю его, но пока не нашел ответа на этот вопрос.

Author: kiamlaluno, 2015-11-09

4 answers

Немного устаревший, но все еще отличный ресурс:

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();
 3
Author: Berdir, 2015-11-09 19:31:34

Вероятно, здесь поздно, но если кто-то все еще ищет, то:

function mymodule_entity_presave(EntityInterface $entity){
    $entity->set( 'field_fieldname',importantfunction() );
}
 3
Author: madhukar, 2015-12-09 12:33:14

Я не знаю, является ли это лучшей практикой, но я пришел к такому решению:

function mymodule_node_presave(EntityInterface $node){
    $node->field_fieldname->set(0, importantfunction() );
}
 0
Author: ndvo, 2015-11-09 18:42:50

Это очень поздний ответ.

С интерфейсом \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');
    }
}
 -1
Author: benftwc, 2019-03-29 10:53:18