¿Actualización de campo masivo?


35

Agregué un nuevo campo (texto) a un tipo de contenido de Drupal 7 que ya tiene muchos nodos.

¿Cómo puedo llenar el campo con un valor predeterminado para todos estos nodos?

Respuestas:


37

Puede utilizar EntityFieldQuerypara recuperar una lista de nodos, luego actualizar los campos del nodo con 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);
  }
}

Si se trata de una operación única, puede usar la función Ejecutar PHP del módulo Devel para ejecutar lo anterior: de lo contrario, puede crear un módulo personalizado simple.


2
Además de usar devel o vbo, también puedes usar "drush scr myscript.php" para ejecutar el código anterior en un entorno totalmente bootstrap.
fietserwin

¿Cómo cambia este código para acomodar la realización de la misma operación en un campo de referencia de término?
Screenack

17

Me gustaría utilizar Vistas a granel de Operaciones y utilizar el "Ejecutar Script PHP arbitrario" que ver esencialmente los elementos anteriores, pero usted no tiene que hacer todo el código extra, sólo el pequeño fragmento que hace lo que quiere (como $object->field_foo['und'][0]['value'] = 'some_value')


9

Si solo desea actualizar el campo con algún valor, la alternativa más eficaz a la respuesta aceptada es esta:

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

La diferencia está en usar directamente field_attach_presavey field_attach_updatefunciones, que actualizan correctamente solo el campo de nodo y omiten el resto del proceso de guardado de nodo. Esto tiene el impacto de que no se llamarán ganchos de guardado / guardado de nodos, la fecha "cambiada" no se actualizará a la fecha actual, etc. Según su caso de uso, puede ser mejor que usar todo el proceso node_save ().


4

De hecho, VBO (Views Bulk Operations) es una buena solución. Además, con las últimas versiones, encontrará una opción "Modificar valores de entidad" que proporciona una manera muy fácil de actualizar el lenguaje de los nodos en una sola operación.


2

Instale y habilite el módulo de Operaciones masivas de vistas y cree una vista con una visualización de página.

Agregar => Operaciones masivas: campo Contenido (Contenido) a la vista.

Referir

ingrese la descripción de la imagen aquí

Seleccione los campos que desea establecer el valor predeterminado.

En tu caso su título. En la imagen son etiquetas.

Guarde la vista y vaya a la página que creó. Si tiene más de una página de resultados, puede elegir seleccionar todos los elementos en la página actual, todos los elementos en todas las páginas, o puede marcar manualmente las casillas correspondientes a los nodos individuales. Se debe marcar al menos una casilla de verificación para continuar.

Ahora establece el valor predeterminado y guárdelo.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.