custom 'submit' su un form di immissione di un custom content type

9 contenuti / 0 new
Ultimo contenuto
custom 'submit' su un form di immissione di un custom content type

Ho creato programmaticamente un nuovo content type. Nel form di immissione dato ho messo il pulsante di tipo submit ed ho omesso, nella funzione di theming del form, di chiamare il finale 'drupal_render($form)'.
Così facendo, la pressione del 'submit' non fa niente se prima non creo la funzione 'my_module_form_submit()' che indirizzerà alla funzione di registrazione della parte custom del nodo (hook_insert()). Se lasciassi fare al submit standard questo registrerebbe subito la parte standard del nodo (title e body), si procurerebbe il 'nid' e il 'vid' con il quale poi lanciare il mio 'hook_insert()' o il mio 'hook_update()'.
La domanda è: come fare per istruire la mia funzione 'my_module_form_submit()' ad ottenere lo stesso risultato?
Qualche idea?

Puoi spiegare meglio cosa vuoi ottenere?

Come ho detto ho costruito un modulo che crea un nuovo tipo di contenuto senza quindi usare CCK.
Per inserire i dati ho creato il form di ingresso che ho poi 'formattato' con una routine di temizzazione che fa usa della funzione drupal_render().
In tutti gli esempi dopo le chiamate a drupal_render con argomento tutti i field che si vogliono formattare in un certo modo ( io li voglio mettere in una tabella ) si fa una chiamata finale a drupal_render() con argomento l'intero form (drupal_render($form) ). Questo attiva il 'submit' standard che fa una chiamata alle funzioni necessarie per eseguire la validazione e la registrazione dei campi standard nella tabella node del database e quindi chiama la mia funzione hook_insert() per registrare i campi aggiuntivi in un record della tabella del nuovo content type correlandolo alla tabella node attraverso le variabili nid e vid già registrate nella tabella node stessa.
Orbene poiché io preferisco personalizzare del tutto il mio form, non eseguo la chiamata finale a drupal_render($form) e quindi mi devo arrangiare a costruirmi una funzione mio_modulo_form_submit() che faccia tutte queste cose.
Il fatto è che mentro so cosa fare per registrare i dati aggiuntivi della tabella relativa al nuovo content type, non so cosa fare o cosa invocare (e con quali parametri) per validare e registrare la canonica correlata riga nella tabella node del database ( con tra l'altro i campi title e body ) e per riportare i valori di nid e vid nella nuova tabella relativa al content type.
Spero di essermi spiegato
Grazie Pinolo per la tua attenzione.

Non sono sicuro di aver centrato il problema, ma mi pare che dovrebbe bastare node_save (dopo aver costruito l'oggetto nodo)

Anche io non ho compreso ma metto delle pulci:

ma queste cose ci sono:

-Funzione di render registrata e con lo stesso nome del form ma con theme davanti (theme_mioform)
-form_validate specifico
-form_submit specifico

Avete ragione tutti e due Sicuramente occorre un form_submit specifico. Il problema è che questo submit() deve imitare il submit() di un'ordinaria creazione di nodo.
E cioè, se siamo in inserimento, dovrebbe quantomeno:
- creare l'oggetto node;
- dichiararne il tipo;
- configurarne con apposito flag il comportamento: pubblicato, revision, date, commenti ecc.
- inserire i campi title e body
- chiamare il node_save($node) affinché questa funzione:
- registri il record sulla tabella node ( e tabelle collegate) del database;
- ricavi il 'node id' e il version 'id';
- registri un record nella tabella contenente i campi specifici del content type.
Analoghe (con le varianti del caso) operazioni in caso di aggiornamento o modifica.
Ma tra il dire e il fare... proseguo...

Ciao

Guarda che fa tutto node_save. Crea un oggetto node. Se visualizzi con devel un node esistente vedi quali proprietà vanno impostate per i vari flag di cui parli.
Passi l'oggetto a node_save (es. node_save($node)) e dopo nell'oggetto trovi il nid e il vid che puoi usare per scrivere nell'altra tabella con drupal_write_record

Solo che, all'interno della mia funzione di 'submit' dovrei eseguire un test:
se sono in modalità primo inserimento, allora sarebbe sufficiente creare un oggetto node, attribuirgli il type corrispondente al nuovo content type, impostare le varie proprietà e i ontenuti dei campi e infine passarlo alla node_save() con probabilmente un opportuno flag indicante record nuovo;
se invece sono in modalità modifica, allora un oggetto node esiste già, esso contiene il nid e vid, bisognerebbe recuperarlo, forse impostare un qualche indicatore di riscrittura senza creazione di una nuova revision e quindi ripassarlo alla node_save()
Come potrei eseguire questo test?

Se nel tuo meccanismo hai già previsto di gestire il form in fase di modifica hai di sicuro già un test di questo tipo. Per esempio, se stai modificando un nodo esistente, nel form avrai sicuramente un valore per un campo nid.