Как манипулировать значением перед сохранением узла в Drupal 8? - PullRequest
0 голосов
/ 23 мая 2018

У меня есть форма редактирования узла.Когда пользователь вводит новое значение и нажимает кнопку «Отправить», чтобы отредактировать узел, я сначала хочу вернуть старый узел, изменить значение, а затем просто сохранить / обновить узел.

Ниже приведено мое решение, но оно делаетне работает.

function custom_module_form_node_form_alter(&$form, FormStateInterface $form_state) {
    $editing_entity = $form_state->getFormObject()->getEntity();

    if (!$editing_entity->isNew()) {
        $form['actions']['submit']['#submit'][] = 'custom_module_node_form_submit';
    }
}

function custom_module_node_form_submit($form, FormStateInterface $form_state) {
   $editing_entity = $form_state->getFormObject()->getEntity();

   $entity = Drupal::entityTypeManager()->getStorage('node')->load($editing_entity->id());
}

В хуке form_submit я попытался вернуть старый узел, но уже слишком поздно, и узел уже обновлен / сохранен.Как я могу вернуть старый узел и манипулировать значением перед обновлением / сохранением узла в Drupal 8?

Ответы [ 3 ]

0 голосов
/ 23 мая 2018

Я решаю манипулировать значениями в форме проверки хука следующим образом.

function custom_module_form_node_form_alter(&$form, FormStateInterface $form_state) {
    $editing_entity = $form_state->getFormObject()->getEntity();

    if (!$editing_entity->isNew()) {
        $form['#validate'][] = 'custom_module_node_form_validate';
    }
}

function custom_module_node_form_validate(array &$form, FormStateInterface $form_state) {
    $old_entity = $form_state->getFormObject()->getEntity();
    $old_values = $old_entity->get('field_name')->getValue()

    $new_values = $form_state->getValue('field_name');

    // Manipulate and store desired values to be save here.
    $to_save_value = ['a', 'b', 'c'];
    $form_state->setValue('field_name', $to_save_value);
}
0 голосов
/ 23 мая 2018

Я бы использовал hook_ENTITY_TYPE_presave , вот так:

yourmodulename_node_presave(Drupal\Core\Entity\EntityInterface $entity) {
    if ($entity->getType() == 'your_content_type') {
       enter code here
    } 
}

Я думаю, что это лучшее решение, потому что с hook_form_alter вроде MilanG вы будете менятьсязначение только тогда, когда узел сохраняется из конкретной формы, которую вы изменяете!Если узел сохранен программно изнутри кода или каким-либо другим способом, ваш hook_form_alter не сработает.

0 голосов
/ 23 мая 2018

Попробуйте использовать hook_entity_presave():

/**
 * Implements hook_entity_presave().
 */
function YOUR_MODULE_entity_presave(Drupal\Core\Entity\EntityInterface $entity) {
  switch ($entity->bundle()) {
    // Here you modify only your day content type
    case 'day':
      // Setting the title with the value of field_date.
      $entity->setTitle($entity->get('field_date')->value);
     break;
  }
}

Решение, взятое отсюда: https://drupal.stackexchange.com/questions/194456/how-to-use-presave-hook-to-save-a-field-value-as-node-title

Также вы можете получить старое значение, например: $entity->original.Проверьте это здесь:

https://drupal.stackexchange.com/questions/219559/how-to-get-the-original-entity-on-hook-entity-presave

...