Jak zaktualizować wartość pola dla węzła?

21

Chcę zmienić wartość pola dla węzła. Użyłem następującego kodu:


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

Problemem jest $node->languagepowrót, esgdy się w print_r($node)nim znajduje und. Dlaczego $node->languageróżni się od tego, co jest w tablicy $ node i jak mogę go zdobyć?

hpn
źródło

Odpowiedzi:

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

Opakowanie metadanych encji to świetny sposób na ustawienie lub odczyt wartości pól w węźle!

Kyvour
źródło
Wolę entity_metadata_wrapper bc, ponieważ robi to ładnie i czysto. Dodałbym sprawdzenie, czy $ node istnieje po node_load (), aby uniknąć nieprzyjemnego błędu podczas nieumyślnego przekazania NULL do instance_metadata_wrapper ().
texas-bronius
Możesz bezpośrednio przekazać $ nid do EMW.
nawfal
użycie encji_zwijacza_odmowa powinno być zaakceptowaną odpowiedzią.
akalata
2
W przypadku, gdy dla innych nie jest to oczywiste, entity_metadata_wrapper () jest częścią modułu Entity API: drupal.org/project/entity
BWPanda
9

Wypróbuj field_attach_update()funkcję.

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

Zaktualizuje wartość pola i działa lepiej niż node_save.

zaibatsu
źródło
1
dlaczego field_attach_update jest odrzucany?
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);
lenni
źródło
4

Jeśli chcesz zaktualizować tylko wartość pola (bez aktualizacji metadanych węzła o zaktualizowanym czasie, wersjach) użyj funkcji field_attach_update().

Przykład:

$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);

Czasami może być konieczne zresetowanie statycznej pamięci podręcznej węzła za pomocą resetCache(array($nid)):

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

Źródło: Zapisywanie pól węzła bez zapisywania samego węzła

Milkovsky
źródło
2

Właśnie to zaimplementowałem i stwierdziłem, że ten kod działa dla mnie.

$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);
}

Zauważ, że podczas aktualizacji nazwa_pola stwierdziłem, że używam tego w wierszu 4

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

nie działał.

Niccolo
źródło