Php 在Drupal8中保存节点之前如何操作值?

Php 在Drupal8中保存节点之前如何操作值?,php,drupal,drupal-8,Php,Drupal,Drupal 8,我有一个编辑节点表单。当用户输入新值并单击submit以编辑节点时,我首先要获取旧节点,操纵该值,然后只保存/更新节点 下面是我的解决方案,但它不起作用 function custom_module_form_node_form_alter(&$form, FormStateInterface $form_state) { $editing_entity = $form_state->getFormObject()->getEntity(); if (!$e

我有一个编辑节点表单。当用户输入新值并单击submit以编辑节点时,我首先要获取旧节点,操纵该值,然后只保存/更新节点

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

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 hook中,我试图取回旧节点,但为时已晚,节点已经更新/保存。在Drupal 8中更新/保存节点之前,如何取回旧节点并操作值?

尝试使用
hook\u entity\u presave()

从这里采取的解决办法:

您还可以获得旧值,如:
$entity->original
。在这里查看:


我决定如下操作表单validate hook中的值

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);
}
像这样使用:

函数yourmodulename\u node\u presave(Drupal\node\NodeInterface$entity){
如果($entity->getType()==“您的内容类型”){
$entity->setTitle('Hello');
$entity->set('body','this is body');
} 
}

这是最好的解决方案,因为使用hook\u form\u alter(如MilanG),只有当节点从正在更改的特定表单中保存时,才能更改值!如果节点是从代码中以编程方式保存的,或者是通过其他方法保存的,那么钩子表单更改将不会生效。

感谢您的解决方案。我已经看过这个钩子了。但它太笼统了。我正在寻找更具体的东西,因为pressave钩子适用于所有save操作。我现在正在尝试form_validate hook,我可以在保存之前操纵该值。告诉我你对表单的看法。更新了我关于如何获取旧值的答案。不明白你说的“太普通”是什么意思?!?为什么你不能用它?在某些情况下是否需要取消验证表单(防止表单成功保存)?过于泛化,我的意思是,当保存所有内容(如节点、术语、用户等)时,将调用presave钩子。这就是为什么我们在presave钩子中使用switch语句。但是您的解决方案工作得很好。是的,您可以使用钩住所有实体类型的通用方法,或者将实体类型添加到函数名中,正如Kris所解释的。但要点是一样的。如果您只对节点实体感兴趣,那么使用hook\u ENTITY\u TYPE\u presave是一个更好的主意:这不是很有帮助。你所做的只是复制钩子的签名。它无法显示如何实际设置字段值。。。尤其是其中一个没有神奇方法的字段(比如setTitle())@sea26.2我根据您的评论改进了代码。我选择了这个解决方案,因为这个钩子不仅可以在自定义模块的上下文中工作,就像是hook_node_pressave一样,还可以在自定义主题文件的上下文中实现
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);
}