Actualice todos los nodos con un campo predeterminado después de agregar un nuevo campo al tipo de contenido


15

Tengo un tipo de contenido existente con varios nodos. Acabo de agregar un nuevo campo booleano con un valor predeterminado de "off".

Sin embargo, hasta que vuelva a guardar cada nodo, el valor predeterminado no está establecido, por lo que una vista que debería mostrar solo aquellos nodos donde el nuevo campo está utilizando el valor predeterminado está actualmente vacía.

¿Cómo puedo actualizar los nodos existentes, creados antes de que se haya agregado el campo, para establecer ese campo en su valor predeterminado?


Resolví este problema usando Views Bulk Operations and Rules como se describe en este fantástico video: commerceguys.com/resources/articles/217
DanH

El módulo Resave node puede ayudarlo a forzar la actualización de nodos.
Supriya Rajgopal

Respuestas:


9

Lamentablemente, no hay una manera muy simple de hacer esto (además de VBO / reglas), pero aquí está el código que uso en las funciones de actualización en los archivos de instalación de mi módulo personalizado cuando necesito rellenar previamente los valores de campo para un determinado tipo de nodo después de agregar un nuevo campo ( en este caso, nodos de 'página'):

<?php
// Get all nodes of 'page' type, populate the field with a value of '1'.
$pages = db_query("SELECT nid, vid FROM {node} WHERE type = 'page'")->fetchAllAssoc('nid');
foreach ($pages as $nid => $values) {
  $fields = array(
    'entity_type' => 'node',
    'bundle' => 'page',
    'deleted' => 0,
    'entity_id' => $values->nid,
    'revision_id' => $values->vid,
    'language' => LANGUAGE_NONE,
    'delta' => 0,
    'field_page_new_field_value' => 1,
  );
  db_insert('field_data_field_page_new_field')
    ->fields($fields)
    ->execute();
  db_insert('field_revision_field_page_new_field')
    ->fields($fields)
    ->execute();
}
?>

Otro método manual mencionado en esta respuesta utiliza EntityFieldQuery y carga / guarda cada nodo. Más Drupal-y, pero mucho menos rendimiento ... (¡requiere una operación de carga y guardado de nodo completo para cada nodo!).


Eso es muy triste
AlxVallejo

¿Has visto el módulo Field Defaults? dgo.to/field_defaults
bosque

Es un error ejecutar un código como este sin eliminar también todos los nodos afectados de la memoria caché de carga de la entidad: de lo entity_get_controller('node')->resetCache($nids);contrario, un posterior node_load()puede cargar datos obsoletos de la memoria caché, y cualquiera node_save()de esos objetos volvería a escribir esos datos obsoletos en la base de datos.
phils

2

La mejor apuesta es directamente en MySQl. Las tablas se verían así:

field_data_field_newbooleanfieldname
field_revision_field_newbooleanfieldname

Si los mira, es bastante sencillo: ¿necesita que le ayude a comenzar a ver cómo se vería la consulta o está bien desde aquí?


Gracias Mike, no, no es un problema, realmente puedo manejar el SQL. Simplemente siento que debería haber una opción de 'volver a guardar' o algo proporcionado como una operación masiva, creo que podría mirar la integración de VBO y Reglas para esto, de hecho.
DanH

Entendido. Estoy en una posición similar, estoy migrando alrededor de 30,000 artículos de otro CMS a Drupal. No veía el punto de agregar otro módulo cuando el SQL era rápido y sucio. Tal vez también pueda escribir una función rápida que llame a node_load () para todos sus nodos, que también puede funcionar.
Mike

0

Solo prueba la lógica de abajo. es mucho más rápido y también pasa por alto todas las implementaciones de gancho. Más detalles . puede escribir una consulta simple db_select directa para obtener todos los nid y hacer un bucle con este código de muestra.

$node = new stdClass();
$node->nid = $val;
$node->type = 'NODETYPE';
$node-field_whatever[LANGUAGE_NONE][0]['value'] = 'VALUE';
field_attach_presave('node', $node);
field_attach_update('node', $node);

0

usando sql, teniendo en cuenta que los nodos con el valor de campo no establecido son

SELECT nid,vid
 from node where type='procedure' and nid not in (select entity_id from field_data_field_pr_choix_du_document)

field_data_field_pr_choix_du_document es la tabla correspondiente a mi campo y contiene un valor par de entrada establecido con un ID de entidad que hace referencia al nodo

hice usando inserción SQL ... seleccione la sintaxis

https://dev.mysql.com/doc/refman/5.5/en/insert-select.html

INSERT INTO `field_data_field_pr_choix_du_document` (`entity_type`, `bundle`, `deleted`, `entity_id`, `revision_id`, `language`, `delta`, `field_pr_choix_du_document_value`)
SELECT 'node','procedure',0,nid,vid,'und',0,'Importer un document'
from node where type='procedure' and nid not in (select entity_id from field_data_field_pr_choix_du_document)

0

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.

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.


0

Encontré una manera fácil de actualizar los campos en el tipo de contenido con este módulo: Valores predeterminados de campo

Ver captura de pantalla. Puede actualizar el contenido existente con los valores predeterminados o mantener los valores existentes.

Lo probé en D7 y funciona.

ingrese la descripción de la imagen aquí

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.