2008-09-17 13 views
6

En un módulo personalizado para drupal 4.7 pirateé juntos un objeto de nodo y lo pasé a node_save ($ node) para crear nodos. Parece que este hack ya no funciona en drupal 6. Aunque estoy seguro de que este hack podría solucionarse, tengo curiosidad de saber si existe una solución estándar para crear nodos sin un formulario. En este caso, los datos se extraen de un feed personalizado en otro sitio web.¿Cómo creo un nodo a partir de un trabajo cron en drupal?

Respuesta

6

No conozco una API estándar para crear un nodo de forma pragmática. Pero esto es lo que obtuve al construir un módulo que hace lo que estás tratando de hacer.

  1. Asegúrese de que se establecen los campos importantes: uid, nombre, tipo, idioma, título, el cuerpo del filtro (ver node_add() y node_form())
  2. Pasar el nodo a través node_object_prepare() por lo demás módulos se pueden agregar al nodo $ objeto.
11

El método de mejores prácticas para hacer esto posible es utilizar drupal_execute. drupal_execute ejecutará la validación estándar y las operaciones básicas de nodo para que las cosas se comporten de la manera que espera el sistema. drupal_execute tiene sus peculiaridades y es ligeramente menos intuitivo que simplemente un node_save, pero, en Drupal 6, puedes utilizar drupal_execute de la siguiente manera.

 

$form_id = 'xxxx_node_form'; // where xxxx is the node type 
$form_state = array(); 
$form_state['values']['type'] = 'xxxx'; // same as above 
$form_state['values']['title'] = 'My Node Title'; 
// ... repeat for all fields that you need to save 
// this is required to get node form submits to work correctly 
$form_state['submit_handlers'] = array('node_form_submit'); 

$node = new stdClass(); 
// I don't believe anything is required here, though 
// fields did seem to be required in D5 

drupal_execute($form_id, $form_state, $node); 
 
+0

Considero que drupal_execute es un riesgo, ya que mezcla las API de formulario y nodo, y una de las consecuencias es que no funciona bien en un bucle, que a menudo se requiere al crear los nodos mediante programación. Con algunos módulos contrib, puede ser necesario, pero en el mejor de los casos es una solución. – FGM

0

una respuesta más que descubrí fue utilizar the example del módulo blogapi en el núcleo de Drupal. El hecho de que esté en el núcleo me da un poco más de confianza de que continuará funcionando en futuras versiones.

0

Hay algunas buenas respuestas arriba, pero en el ejemplo específico de convertir un elemento de alimentación ingerido en un nodo, también podría tomar el enfoque de usar el módulo de alimentación simple (http://wwww.drupal.org/project/simplefeed). Este módulo usa el motor simplepie para ingerir feeds y convierte los elementos individuales de cada feed en nodos. Me doy cuenta de que esto no aborda específicamente el problema de la creación de nodos desde cron, pero podría ser una solución más fácil para su problema en general.

+0

El problema es que no hay nada simple acerca del simplefeed y está lleno de crutage y bloat. – deadprogrammer

+0

Parece el mismo problema con muchos módulos contrib ... – Rimian

9

node_save() todavía funciona bien en Drupal 6; necesitará un par de datos específicos para que funcione.

$node = new stdClass(); 
$node->type = 'story'; 
$node->title = 'This is a title'; 
$node->body = 'This is the body.'; 
$node->teaser = 'This is the teaser.'; 
$node->uid = 1; 
$node->status = 1; 
$node->promote = 1; 

node_save($node); 

'Estado' y 'promover' son fáciles de pasar por alto - si usted no fija esos, el nodo permanecerá sin publicar y sin promotor, y sólo se va a ver si vas a la pantalla de administración de contenido .

+0

Creo que también debe establecer $ node-> revision. Si lo configura en un valor inicial y lo guarda, entonces debe establecerse como la ID del nodo. Me parece recordar que tuve algunos problemas con esto en algún lugar en el fondo de mi mente ... – Rimian

Cuestiones relacionadas