php - Drupal: ¿cómo actualizar un campo CCK NodeReference programáticamente?
drupal-6 (5)
"Vaciar el caché de contenido" Esto funciona para mí, especialmente si obtienes datos de node_load ()
Intento crear un nodo (tipo B) y asignarlo al campo nodereferencia CCK de un nodo tipo A utilizando el método node_save ().
$node_type_A = node_load($some_nid);
$node_type_A->field_type_B_node_ref[][''nid''] = $node_type_B_nid;
$node_type_A = node_submit($node_type_A);
node_save($node_type_A);
Como resultado, se creará un nuevo nodo de tipo B, pero no se asignará ninguna referencia al nodo de tipo A. Cualquier ayuda sería apreciada.
Acabo de comprobar uno de mis propios módulos que hace algo similar para el formato del objeto, y $node_type_A->field_type_B_node_ref[][''nid'']
debería ser correcto.
Una cosa para comprobar es que cuando cargue el nodo, CCK puede completar previamente la matriz de referencia del nodo con un valor vacío. Si ha configurado el campo para permitir solo un valor, utilizando el operador de agregar matriz ( field_type_B_node_ref[]
) creará una segunda entrada que será ignorada ( field_type_B_node_ref[1]
), en lugar de sobreescribir el valor existente ( field_type_B_node_ref[0]
). Intente especificar explícitamente la clave de matriz si es posible.
Gran publicación, pero una corrección: no vacíe las entradas de caché consultando manualmente la base de datos. En el caso de que alguien esté usando Memcache o cualquier otro caché externo, va a fallar.
cache_clear_all () es tu amigo para limpiar.
Código sugerido, directo del módulo CCK:
cache_clear_all(''content:''. $node_type_A->nid .'':''. $node_type_A->vid, content_cache_tablename());
GApple tiene razón, el formato es correcto, pero hay algunas cosas que podría interesarle.
Delta Value
Primero necesita saber el valor delta de la última referencia de nodo asociada a $node_type_A
, el delta es en realidad un índice parcial, cuando se combina con el campo vid
de $node_type_A
, se convierten en el índice de la tabla de referencia de nodos en la base de datos. En otras palabras, es un recuento para $node_type_B
que se hace referencia en $node_type_A
, ok?
GApple está en lo cierto otra vez, tienes que decir exactamente dónde agregar la nueva referencia. Cuando obtuviste ese valor delta , puedes decir exactamente dónde agregar (delta + 1) la nueva referencia. Aquí está:
function get_current_delta($node_vid){
return db_result(db_query("SELECT delta FROM {content_field_type_A_node_ref}
WHERE vid = ''%d''
ORDER BY delta DESC
LIMIT 1", $node_vid));
}
Agregar la nueva referencia
Tenemos delta ! para que podamos adjuntar el nuevo nodo $node_type_B
a nuestro nodo $node_type_A
:
// Loading type_A node.
$node_type_A = node_load($some_nid);
// Getting current delta value.
$current_delta = get_current_delta($node_type_A->vid);
// "Appending" a node reference based on delta.
$node_type_A->field_type_B_node_ref += array($current_delta + 1 => array(''nid'' => $node_type_B_nid));
Reanudando el nodo actualizado
Opcionalmente, llame a node_submit()
para rellenar algunos campos esenciales en el objeto nodo y guárdelo utilizando node_save()
. Después de todo, debe llamar a content_insert()
para hacer que el nodo esté completamente guardado asidelong con sus campos CCK:
// Resaving the updated node.
$node_type_A = node_submit($node_type_A);
node_save($node_type_A);
content_insert($node_type_A);
Vaciar el caché de contenido
Probablemente la parte más importante, esto fue matarme por un par de días. CCK tiene una tabla de caché en la base de datos llamada cache_content
(revise su estructura) , después de volver a guardar el nodo actualizado, notará que nada ha cambiado en el $node_type_A
tema $node_type_A
aunque las tablas estén actualizadas. Tenemos que eliminar un registro de esa tabla de caché de contenido, esto obligará a Drupal a mostrar la última instantánea de los datos. Puede definir lo siguiente como una función:
db_query("DELETE FROM {cache_content} WHERE cid = ''%s''", ''content:'' . $node_type_A->nid . '':'' . $node_type_A->vid);
Espero eso ayude ;)
$node->field_node_reference[0][''items''][0][''nid'']
referencias de nodo de almacenamiento de CCK como $node->field_node_reference[0][''items''][0][''nid'']
, not $node->field_node_reference[0][''nid'']
. ¿Has intentado imitar eso?