Zbiorcza aktualizacja pola?

35

Dodałem nowe pole (tekstowe) do typu zawartości Drupal 7, który ma już wiele węzłów.

Jak mogę wypełnić pole wartością domyślną dla wszystkich tych węzłów?

daphshez
źródło

Odpowiedzi:

37

Możesz użyć, EntityFieldQueryaby pobrać listę węzłów, a następnie zaktualizować pola węzła za pomocą node_save():

$lang = LANGUAGE_NONE; // Replace with ISO639-2 code if localizing
$node_type = 'page'; // Machine name of the content type

$query = new EntityFieldQuery;
$result = $query
  ->entityCondition('entity_type', 'node')
  ->propertyCondition('type', $node_type)
  ->execute();

if (!empty($result['node'])) {
  $nodes = entity_load('node', array_keys($result['node']));

  foreach($nodes as $node) {
    // Replace field_foo with the machine name of the field to update.
    // - 0 refers to specific value within the field array, for when the field contains
    //    multiple values. If the field only has one value, it should be 0.
    $node->field_foo[$lang][0]['value'] = 'New Value';
    node_save($node);
  }
}

Jeśli jest to jednorazowa operacja, możesz użyć funkcji Wykonaj PHP modułu Devel , aby uruchomić powyższe: w przeciwnym razie możesz utworzyć prosty niestandardowy moduł.

dreftymac
źródło
2
Oprócz używania devel lub vbo, możesz także użyć „drush scr myscript.php”, aby wykonać powyższy kod w środowisku w pełni ładowanym.
fietserwin
Jak ten kod się zmienia, aby dostosować wykonanie tej samej operacji do pola referencyjnego terminu?
Screenack
17

Użyłbym Odwiedzin zbiorczego Operacje i korzystać z „wykonać dowolny skrypt PHP” zrobić zasadniczo pozycje wyżej, ale nie trzeba robić wszystko dodatkowy kod, tylko mały fragment, który robi to, co chcesz (jak $object->field_foo['und'][0]['value'] = 'some_value')

rfay
źródło
9

Jeśli chcesz tylko zaktualizować pole o pewną wartość, bardziej wydajną alternatywą dla zaakceptowanej odpowiedzi jest:

$lang = LANGUAGE_NONE; // Replace with ISO639-2 code if localizing
$node_type = 'page'; // Machine name of the content type

$query = new EntityFieldQuery;
$result = $query
  ->entityCondition('entity_type', 'node')
  ->propertyCondition('type', $node_type)
  ->execute();

if (!empty($result['node'])) {
  $nodes = entity_load('node', array_keys($result['node']));

  foreach($nodes as $node) {
    // Replace field_foo with the machine name of the field to update.
    // - 0 refers to specific within the field array, for when the field contains
    //    multiple values. If the field only has one value, it should be 0.
    $node->field_foo[$lang][0]['value'] = 'New Value';
    field_attach_presave('node', $node);
    field_attach_update('node', $node);
  }
}

Różnica polega na bezpośrednim korzystaniu z funkcji field_attach_presavei field_attach_updatefunkcji, które poprawnie aktualizują tylko pole węzła i pomijają resztę procesu zapisywania węzła. Ma to wpływ na to, że nie zostaną wywołane żadne przechwytywania / zapisywania węzłów, data „zmieniona” nie zostanie zaktualizowana do bieżącej daty itp. W zależności od przypadku użycia może być lepszy niż cały proces node_save ().

Mirsoft
źródło
4

Rzeczywiście VBO (Views Bulk Operations) to dobre rozwiązanie. Ponadto w najnowszych wersjach znajdziesz opcję „Modyfikuj wartości encji”, która zapewnia bardzo łatwy sposób aktualizacji języka węzłów w ramach jednej operacji.

xaa
źródło
2

Zainstaluj i włącz moduł Views Bulk Operations i utwórz widok z wyświetlaniem strony.

Dodaj => Operacje zbiorcze: pole Treść (treść) w widoku.

Odnosić się

wprowadź opis zdjęcia tutaj

Wybierz pola, które chcesz ustawić wartość domyślną.

W twoim przypadku jego tytuł. Na obrazie są to tagi.

Zapisz widok i przejdź do utworzonej strony. Jeśli masz więcej niż jedną stronę wyników, możesz wybrać, aby wybrać wszystkie elementy na bieżącej stronie, wszystkie elementy na wszystkich stronach lub możesz ręcznie zaznaczyć pola odpowiadające poszczególnym węzłom. Aby kontynuować, należy zaznaczyć przynajmniej jedno pole wyboru.

Teraz ustaw wartość domyślną i zapisz ją.

DRUPWAY
źródło