在正文字段中写入的小模块

Posted

技术标签:

【中文标题】在正文字段中写入的小模块【英文标题】:Small module to write in a body field 【发布时间】:2021-03-19 07:11:15 【问题描述】:

我正在尝试制作一个小模块。模块应该从某个节点拉出正文内容。这部分工作到目前为止。现在我会将这些内容准确地写回到当前节点的正文字段中。但是我脑子里有一个节点。如何将内容写入其中?也许有人可以在跳跃时帮助我。

我当前在模块中的代码:

`

<?php
use Drupal\node\Entity\Node;
use Drupal\Core\Form\FormStateInterface;
/**
* Implements hook_form_alter().
*/
function copy_fields_from_model_contract_form_alter(&$form, FormStateInterface $form_state, $form_id) 

  $nid = 6766;
  $node_storage = \Drupal::entityTypeManager()->getStorage('node');
  $node = $node_storage->load($nid);
  $contract1 = $node->field_vertragsinhalt->value;

if ($form_id == 'node_buch_anlegen_edit_form') 
  dpm($form);
  

`

【问题讨论】:

【参考方案1】:

不清楚您打算何时执行此加载/修改/保存操作。每次在网站上加载表单时,HOOK_form_alter(从上面)都会运行。

您上面的代码将在每次加载表单时加载 node(id:6766),然后如果它是 buch_anlegen 类型的任何节点的编辑表单,则会将您的表单打结。因此,首先,您要么将所有特定于此表单的逻辑放入 if 语句中,要么使用 hook_form_FORM_ID_alter。其次,我怀疑你每次更新 buch_anlegen 类型的节点时都想写 node(id:6766) 的 body 字段。

如果您想预先填充所有 buch_anlegen 节点编辑表单,那么您使用的是正确的钩子,但您需要修改 $form_state 变量中的值。

如果您想在保存时修改所有 buch_anlegen 节点,并向正文字段添加一些文本,您可以执行以下操作

// Implements hook_entity_presave().
function copy_fields_from_model_contract_entity_presave(Drupal\Core\Entity\EntityInterface $entity) 
  $body_value = $entity->body->getValue();
  $body_value = $body_value . " Add this string to the body field".
  $entity->body->value = $body_value;     //set value for field

当然,这会在每次保存实体时添加字符串,因此您可能需要进行检查。

注意,你不必在这个钩子中调用 $entity->save(),因为它是一个 presave 钩子并且可能导致无限递归。但是,如果您尝试在其他地方执行此操作,则可以参考此链接:

https://www.heididev.com/how-programmatically-update-fields-value-drupal-8

【讨论】:

以上是关于在正文字段中写入的小模块的主要内容,如果未能解决你的问题,请参考以下文章

为啥向HttpServletResponse中写入相应正文之后,就无法用setHeader()方法改变响应头了。

为啥没有在请求正文中发送禁用的输入字段? [复制]

Boost Asio,聊天示例:如何在消息正文中手动写入? [chat_message.hpp]

使用 HttpClient 写入正文请求

颤振:如何在 api 正文中传递文本字段值

何时/何地在 FastAPI 中使用正文/路径/查询/字段?