如何在节点保存在Drupal 8之前操作值?

时间:2018-05-23 07:47:20

标签: php drupal drupal-8

我有一个编辑节点表单。当用户输入新值并单击“提交”以编辑节点时,我首先想要返回旧节点,操纵值,然后只保存/更新节点。

以下是我的解决方案,但它不起作用。

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 :(得分:2)

尝试使用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

答案 1 :(得分:1)

我会使用 hook_ENTITY_TYPE_presave ,如下所示:

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

我认为这是最好的解决方案,因为使用像 MilanG 这样的hook_form_alter,只有在从您正在更改的特定表单中保存节点时才会更改该值!如果节点是从代码中以编程方式保存的,或者通过其他方法保存,则hook_form_alter将不会启动。

答案 2 :(得分:0)

我决定按照以下方式操作表单中的值。

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);
}