Lập trình cập nhật giá trị của một trường


14

Tôi muốn cập nhật giá trị của một trường nút khi một nút được cập nhật.

Đã thử sử dụng mã được đề cập ở đây Lập trình cập nhật một nút 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();
      }
    }

nhưng nó không hoạt động. Tôi nhận được một lỗi 500 sau khi lưu nút. Tôi cũng đã thử lấy câu lệnh if và chỉ định id nút$node = Node::load(1);

Tôi cũng đã thử sử dụng Cập nhật một nút / Thực thể theo chương trình trong 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();

}

nhưng cũng không có may mắn.

Ngoài ra, tôi đã thử sử dụng các hook khác nhau entity_presave, entity_update, node_update, nhưng không tạo ra sự khác biệt nào.

Câu trả lời:


25

Bạn có thể thử mã này:

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

Cảm ơn điều này đã làm việc, nếu bất cứ ai khác muốn thêm các biến thể có thể khác, vui lòng thêm câu trả lời khác.
Không có Sssweat

1
@NoSssweat: Tôi có đúng không khi cho rằng dòng có "body" trong mã hiển thị trong câu trả lời này không thực sự cần thiết để trả lời câu hỏi của bạn? Và rằng dòng này minh họa cách bạn có thể làm những điều tương tự với cơ thể (ví dụ)? Ngoài ra, vì câu hỏi của bạn là về "trường", bạn có thể sử dụng một dòng tương tự như dòng có "cơ thể" cho trường tùy chỉnh, với tên máy (giả sử) field_my_extra_field không? Xin lỗi vì những gì ay có vẻ như chiếm đoạt một câu trả lời để đặt câu hỏi mới, nhưng chỉ "hiển thị mã" trong một câu trả lời (không có lời giải thích nào cả) cũng không được coi là một thực tiễn tốt ở đây, phải không?
Pierre.Vriens

1
@ Pierre.Vriens Tôi đã sử dụng tiêu đề trong Q của tôi để đơn giản. Tôi hình dung nếu tôi biết cách thay đổi tiêu đề, nó sẽ giống nhau cho bất kỳ lĩnh vực nào, chỉ cần thay đổi tên máy. Hóa ra câu trả lời này sử dụng một phương pháp cụ thể để thay đổi tiêu đề, sẽ không hoạt động cho bất kỳ lĩnh vực nào khác, vì vậy điều thực sự quan trọng là anh ấy hiển thị phương pháp cho cơ thể.
Không có Sssweat

Tôi không thể có được cái móc này để bắn. Tôi chỉnh sửa một loại nội dung, nhấp vào gửi, nhưng không có gì.
Ông Pablo

7

Đây là một biến thể khác với việc sử dụng hook mà ban đầu bạn đã thử sử dụng.

Tôi nghĩ vấn đề với mã của bạn là bạn cố tải một phiên bản mới của nút, nhưng bạn nên sử dụng nút được cung cấp dưới dạng paramater $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)
  }
}

Biên tập:

Đã thêm câu lệnh sử dụng vào mã.


1
vừa thử mã của bạn, nhưng nó phá vỡ trang web, trở thành cổ điểnThe website encountered an unexpected error. Please try again later.
Không có Sssweat

1
Mã này chỉ để chứng minh làm thế nào để sử dụng hook. Bạn cần các tuyên bố sử dụng đúng. Bạn có thể tìm thấy điều này, nếu bạn xem trong watchdog (/ admin / báo cáo / dblog).
4k4

1
thêm use Drupal\node\NodeInterface;mã không còn tự động phá vỡ trang web, nhưng sau khi lưu nút, tôi gặp lỗi 500 như tôi đã nhận được trong câu hỏi của mình và nhật ký không ghi nhật ký bất cứ điều gì về nó.
Không có Sssweat

1
Tôi chỉ muốn chỉ ra vấn đề: Không tải một thể hiện mới của nút, mà sử dụng một phiên bản được cung cấp dưới dạng tham số hàm. Lỗi gì sau 500? Vui lòng kiểm tra tệp nhật ký của bạn hoặc bật ghi nhật ký lỗi.
4k4

1
Tôi xóa nhật ký, vì vậy tôi không bị nhầm lẫn với tất cả các lỗi khác trước đó, nhưng sau khi lưu và nhận được lỗi nhiều lần, các tệp nhật ký trống
Không có Sssweat

3

Các tiêu đề trong Drupal 8 không được đặt như các trường tiêu chuẩn; họ có chức năng riêng của họ. Sử dụng $node->setTitle('New Title');cho một nút hoặc $entity->setLabel('New Title');cho một thực thể chung. Xem Node :: setTitle để biết thêm thông tin.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.