프로그래밍 방식으로 필드 값 업데이트


14

노드가 업데이트 될 때 노드 필드의 값을 업데이트하고 싶습니다.

여기에 언급 된 코드를 사용해 보았습니다. 프로그래밍 방식으로 노드 업데이트 Drupal 8

use Drupal\node\Entity\Node;

    function hello_world_entity_presave(Drupal\Core\Entity\EntityInterface $entity) {

      $check = \Drupal::routeMatch()->getParameter('node');

      if ($check) {
      $node = Node::load($check->nid->value);
      $node->title->value = 'testing';     //set value for field
      $node->save();
      }
    }

그러나 작동하지 않았습니다. 노드를 저장 한 후 500 오류가 발생합니다. 나는 if 문을 꺼내고 노드 ID를 지정하려고 시도했다.$node = Node::load(1);

Drupal 8에서 프로그래밍 방식으로 노드 / 엔티티 업데이트를 사용해 보았습니다.

use Drupal\node\Entity\Node;


function hello_world_node_update(Drupal\node\NodeInterface $node) {

$node = Node::load(1);
$node->set("title", 'New value'); // also tried $node->setTitle('The new Title');
$node->save();

}

그러나 운도 없다.

또한 다른 후크 entity_presave, entity_update, node_update를 사용해 보았지만 아무런 차이가 없었습니다.

답변:


25

이 코드를 시도해 볼 수 있습니다.

function MODULE_NAME_node_presave(Drupal\node\NodeInterface $node) {
  $node->setTitle('new Title');
  $node->set('body', 'this is body');
}

다른 사람이 다른 가능한 유사 콘텐츠를 추가하고 싶다면 다른 답변을 자유롭게 추가하십시오.
No Sssweat

1
@NoSssweat :이 답변에 표시된 코드에서 "body"가있는 줄이 실제로 질문에 대답하는 데 필요하지 않다고 가정하는 것이 맞습니까? 그리고이 줄은 몸과 같은 일을 어떻게 할 수 있는지를 보여줍니다. 또한 귀하의 질문은 "필드"에 관한 것이기 때문에 사용자 정의 필드에 대해 "body"가있는 라인과 비슷한 라인을 기계 이름 (예 : field_my_extra_field)으로 사용할 수 있습니까? 새로운 질문을하기 위해 답변을 가로채는 것처럼 보이는 것이 유감이지만, 답변에 "코드를 표시하는 것"(설명이 전혀 없음)도 여기에서 좋은 습관으로 인식되지 않습니다.
Pierre.Vriens

1
@ Pierre.Vriens 간단하게 Q에 제목을 사용했습니다. 제목을 변경하는 방법을 알고 있다면 모든 필드에서 동일하며 컴퓨터 이름 만 변경하면됩니다. 이 답변은 특정 방법을 사용하여 제목을 변경하므로 다른 분야에서는 작동하지 않으므로 실제로 몸에 대한 방법을 보여주는 것이 중요합니다.
No Sssweat

이 고리를 발사 할 수 없습니다. 컨텐츠 유형을 편집하고 제출을 클릭하지만 아무것도 없습니다.
Mr Pablo

7

이것은 원래 사용하려고 시도한 후크를 사용하는 또 다른 변형입니다.

코드의 문제는 노드의 새 인스턴스를로드하려고 시도하지만 매개 변수로 제공된 노드를 사용해야한다는 것입니다 $entity.

use Drupal\node\NodeInterface;

function hello_world_entity_presave(Drupal\Core\Entity\EntityInterface $entity)   {
  if ($entity instanceof NodeInterface) {
    $entity->title->value = 'testing';     //set value for field
    // $entity->save(); (not needed)
  }
}

편집하다:

코드에 use 문을 추가했습니다.


1
당신의 코드를했는데, 그것은 고전 받고, 사이트를 깨고The website encountered an unexpected error. Please try again later.
없음 Sssweat

1
이 코드는 후크 사용 방법을 보여주기위한 것입니다. 올바른 사용 설명이 필요합니다. 워치 독 (/ admin / reports / dblog)을 보면이 정보를 찾을 수 있습니다.
4k4

1
use Drupal\node\NodeInterface;코드를 추가해도 더 이상 사이트가 자동으로 중단되지 않지만 노드를 저장 한 후 질문에있는 것처럼 500 오류가 발생하고 로그에 아무것도 기록되지 않습니다.
No Sssweat

1
나는 단지 문제를 지적하고 싶었다 : 노드의 새로운 인스턴스를로드하지 말고 함수 매개 변수로 제공된 것을 사용하십시오. 500 뒤에 어떤 오류가 있습니까? 로그 파일을 확인하거나 오류 로깅을 켜십시오.
4k4

1
로그를 지우면 이전의 다른 모든 오류와 혼동되지 않지만 오류를 여러 번 저장하고
가져온

3

Drupal 8의 제목은 표준 필드와 같이 설정되지 않습니다. 그들은 자신의 기능을 가지고 있습니다. $node->setTitle('New Title');노드 또는 $entity->setLabel('New Title');일반 엔티티에 사용하십시오 . 자세한 정보는 Node :: setTitle 을 참조하십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.