Làm thế nào để cập nhật giá trị trường cho một nút?


21

Tôi muốn thay đổi giá trị của một trường cho một nút. Tôi đã sử dụng đoạn mã sau:


$node = node_load($nid); // $nid is the function's parameter
$node->field['field_myfield'][$node->language][0]['value'] = 1;
node_save($node);

Vấn đề là $node->languagetrả lại estrong khi print_r($node)und. Tại sao $node->languagekhác với những gì trong mảng nút $ và làm thế nào tôi có thể nhận được nó?

Câu trả lời:


41
$node = node_load($nid);
$node_wrapper = entity_metadata_wrapper('node', $node);
$node_wrapper->field_myfield->set(1);
$node_wrapper->save();

Trình bao bọc siêu dữ liệu thực thể là một cách tuyệt vời để đặt hoặc đọc giá trị của các trường trong nút!


Tôi thích entity_metadata_wrapper bc nó làm mọi thứ tốt đẹp và sạch sẽ. Tôi sẽ bao gồm kiểm tra xem nút $ có tồn tại sau nút_load () để tránh một lỗi khó chịu khi vô tình chuyển NULL vào entity_metadata_wrapper () không.
texas-bronius

Bạn có thể trực tiếp chuyển $ nid cho EMW.
nawfal

sử dụng entity_metadata_wrapper sẽ là câu trả lời được chấp nhận.
akalata

2
Trong trường hợp không rõ ràng với người khác, entity_metadata_wrapper () là một phần của mô-đun Entity API: drupal.org/project/entity
BWPanda

9

Hãy thử field_attach_update()chức năng.

$node = node_load($nid); // $nid is the function's parameter
$node->field['field_myfield'][LANGUAGE_NONE][0]['value'] = 1;
field_attach_update('node', $node);

Nó sẽ cập nhật giá trị của trường và nó hoạt động tốt hơn node_save.


1
tại sao field_attach_update bị hạ cấp?
milkovsky

6
$node = node_load($nid); 
$field_language = field_language('node', $node, 'field_myfield');
$node->field['field_myfield'][$field_language][0]['value'] = 1;
node_save($node);

4

Nếu bạn muốn chỉ cập nhật giá trị trường (không cập nhật siêu dữ liệu nút về thời gian cập nhật, sửa đổi), hãy sử dụng chức năng field_attach_update().

Thí dụ:

$node = node_load($nid);
$field_language = field_language('node', $node, 'field_myfield');
$node->field_fieldname[$field_language][0]['value'] = 'some value';
field_attach_update('node', $node);

Đôi khi, bạn có thể cần phải thiết lập lại bộ đệm tĩnh của nút bằng resetCache(array($nid)):

entity_get_controller('node')->resetCache(array($node->nid));

Nguồn: Lưu các trường của nút mà không lưu chính nút đó


2

Tôi vừa thực hiện điều này và thấy rằng mã này làm việc cho tôi.

$node = node_load($nid); 
if (isset($node)) {
  $field_language = field_language('node', $node, 'field_myfield');
  $node->field_fieldname[$field_language][0]['value'] = 'some value';
  node_save($node);
}

Lưu ý rằng khi tôi cập nhật field_fieldname tôi thấy rằng sử dụng điều này trong dòng 4

$node->field['field_myfield'][0]['value'] = 'some value';

đã không làm việc.

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.