Modificare il titolo di un nodo in validazione

9 contenuti / 0 new
Ultimo contenuto
Modificare il titolo di un nodo in validazione

Ciao a tutti.
Vorrei modificare il titolo di un nodo, quando questo sta per essere inserito nel database.
Ho quindi creato un modulo e usato l'hook_nodeapi():

<?php
function myFilterTitle_nodeapi(&$node, $op, $a3 = NULL, $a4 = NULL) {
  ...
  switch (
$op) {
    case
'validate':
     
form_set_value($a3['title'], 'Nuovo Titolo', $a3);
      break;
  }
}
?>

Ma non funziona, non cambia il titolo del nodo.
Non so se sia giusto passare $a3 come terzo argomento...

Come si può fare questa semplice cosa?

Ciao, Giovanni

Ciao
Marco
--
My blog
Working at @agavee

eh, mavimo, il problema è che form_set_value() non sembra funzionare.

questo perché, almeno credo, hanno modificato il comportamento della validazione.
pare infatti non sia [più] possibile modificare i dati di un nodo quando $op == 'validate', ma soltanto controllarne la validità (ed eventualmente usare form_set_error()).

mi sa che non è possibile fare ciò che chiedo, e cioè modificare automaticamente il titolo di un nodo, quando l'utente clicka su "Preview"...

Ciao e grazie lo stesso, Giovanni

Allora, diciamo che dovresti dire che versione di D utilizzi, ma a parte questo oltre al validate ci sono altre posti dove si modificano le parti del form, per esempio:

Qui dovresti trarne le informazioni che ti servono.

Ciao
Marco
--
My blog
Working at @agavee

E' proprio in hook_nodeapi che mi trovo (vedi il primo post), ed è proprio in quelle pagine che viene detto che se $op è 'validate', allora "The user has just finished editing the node and is trying to preview or submit it. This hook can be used to check the node data" (il grassetto è mio).

Pare quindi che durante la validazione non si possa modificare alcunché, ma solo controllare i dati (il che è anche semanticamente corretto, ma IMHO dovrebbe comunque esserci la possibilità di fare ciò che chiedo).

Potrei forse percorrere altre strade un po' più complesse per arrivare a tale comportamento, ma preferisco lasciar perdere...

Grazie comunque del tuo aiuto.

Ciao, Giovanni

ps. uso Drupal 6.4 (guarda la tassonomia del primo post ;-))

Ok, non avevo fatto caso alla tassonomia, scusa.
Riporto due estratti dalle operazioni consentite nelle diverse operazioni (valori di $op):

  • "alter": the $node->content array has been rendered, so the node body or teaser is filtered and now contains HTML. This op should only be used when text substitution, filtering, or other raw text operations are necessary.
  • "presave": The node passed validation and is about to be saved. Modules may use this to make changes to the node before it is saved to the database.

tradotto grossomodo sarebbero

  • "alter": Il tutto è già stato renderizzato, ... è possibile andare a fere le modifiche prima della visualizzazione definitiva.
  • "presave": Il nodo ha passato la validazione e deve essere salvato. I moduli possono usare questo per effetture modifiche sul contenuto prima che venga salvato sul database.

Nel tuo caso specifico credo si possa andare ad agire su entrambi, ma mi sembra più pulita la seconda soluzione, anche se non sono sicuro faccia quello che ti serva nell'anteprima. Eventualmente la seconda per prendere e far effettuare le modifica pre inserimento e se si è in previews andare a a giocare sulla visualizzazione.

Ciao
Marco
--
My blog
Working at @agavee

hook_nodeapi() viene chiamato con $op='presave' solo quando si clicka 'Submit', non 'Preview'.
Con $op='alter' invece il codice verrebbe eseguito ad ogni visualizzazione di qualsiasi nodo, e mi sembra un piccolo spreco di risorse: a quel punto preferico usare form_set_error() e chiedere all'utente di modificare il titolo da sé...

Comunque sia, ho aperto un issue su drupal.org al riguardo. Ma non credo verrà preso in considerazione, perché in passato si poteva modificare il nodo al tempo della validazione, e l'hanno proibito successivamente... ora si tratterebbe di tornare indietro...

Ciao e grazie ancora, Giovanni

Se il titolo del nodo deve essere modificato e viene generato a "priori" non potresti farne evitare l'immissione all'utente e popolarlo in fase iniziale con $op=alter? Mi pare la soluzione più pulita se ho capito le tue richieste.

Ciao
Marco
--
My blog
Working at @agavee

No, purtroppo non viene generato a priori, ma elaborato in base al titolo immesso dall'utente...
Vedrò di utilizzare #after_build appena ho un po' più di tempo libero.
Ciao.