it-swarm-eu.dev

Hromadná aktualizace pole?

Přidal jsem nové (textové) pole do typu obsahu Drupal 7), který již má mnoho uzlů.

Jak mohu vyplnit pole výchozí hodnotou pro všechny tyto uzly?

35
daphshez

Můžete použít EntityFieldQuery k načtení seznamu uzlů a poté aktualizovat pole uzlu 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);
  }
}

Pokud se jedná o jednorázovou operaci, můžete pomocí funkce Devel Execute PHP spustit výše: jinak, můžete vytvořit jednoduchý vlastní modul.

37
user7

Použil bych Views Bulk Operations a použil "Execute Arbitrary PHP Script"), abych v podstatě provedl výše uvedené položky, ale nemusíš dělat celý kód navíc. , jen malý úryvek, který dělá, co chcete (například $object->field_foo['und'][0]['value'] = 'some_value')

17
rfay

Pokud chcete pouze aktualizovat pole s nějakou hodnotou, pak výkonnější alternativou k přijaté odpovědi je toto:

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

Rozdíl je v přímém použití field_attach_presave a field_attach_update funkce, které správně aktualizují pouze pole uzlů a přeskočí zbytek procesu ukládání uzlů. To má dopad na to, že nebudou zavolány žádné háky pro uchování/uložení uzlů, „změněné“ datum nebude aktualizováno na aktuální datum atd. Podle vašeho případu použití může být lepší, jako při použití celého procesu node_save ().

9
Mirsoft

VBO (Views Bulk Operations) je opravdu dobrým řešením. Kromě toho v nejnovějších verzích najdete možnost „Upravit hodnoty entity“, která poskytuje velmi snadný způsob aktualizace jazyka uzlů v jedné operaci.

4
xaa

Nainstalujte a povolte modul Views Bulk Operations a vytvořte pohled se zobrazením stránky.

Přidat => Hromadné operace: Pole obsahu (Obsah) v zobrazení.

Viz

enter image description here

Vyberte pole, která chcete nastavit výchozí hodnotu.

Ve vašem případě jeho název. Na obrázku jsou značky.

Uložte pohled a přejděte na stránku, kterou vytvořil. Pokud máte více než jednu stránku s výsledky, můžete vybrat, zda vyberete všechny položky na aktuální stránce, všechny položky na všech stránkách, nebo můžete ručně zaškrtnout políčka odpovídající jednotlivým uzlům. Chcete-li pokračovat, musí být zaškrtnuto alespoň jedno zaškrtávací políčko.

Nyní nastavíte výchozí hodnotu a uložíte ji.

2
DRUPWAY