Il mio primo modulo

16 contenuti / 0 new
Ultimo contenuto
Il mio primo modulo

Sono alle prese con la creazione di un mio primo modulo, quello che mi interessa è la gestione dei field nella creazione di un nodo ovvero la gestione della visualizzazione dei field in base ai dati inseriti dagli utenti , l'Hook che utilizzo è hook_form_alter().

Come dicevo sono alle primissime armi, oggi è il mio primo tentativo :p

Ecco il mio modo di operare:

una volta creato il file .info e .module comincio dalla funzione:

function mio_modulo_form_alter (&$form, &$form_state, $form_id) {

echo "";
var_dump ($form);
var_dump($form_state);
var_dump ($form_id);
echo "";

mio codice
}

Prima di tutto ho utlizzato var_dump() per analizzare le tre variabili, $form_id mi da solo il nome del content type, le altre due invece non capisco bene le differenze, ma ho visto in vari snippet che viene usata solo $form, mente $form_state non ho capito quando e come si utilizza.

La mia prima domanda è la seguente:

il mio modo di operare è corretto? Se così fosse, mi consigliate un buon software per leggere gli array risultanti dalla variabile $form? Io utilizzo Notepad++ ma vorrei qualcosa di più specifico, la lista degli array è veramente lunga ed è difficile capire quale percorso seguire per arrivare al valore che si vuole.

Drupal Version:

Scusate, vi riscrivo in maniera più leggibile il codice

function mio_modulo_form_alter (&$form, &$form_state, $form_id) {
echo "<pre>";
var_dump ($form);
var_dump($form_state);
var_dump ($form_id);
echo "</pre>";
mio codice
}

Ciao,
stai procedendo nel modo corretto e ti consiglio di installare il modulo devel e di usare al posto di var_dump la funzione del suddetto modulo dpr(mio_array) oppure dpm(mio_array) dove:

- dpm, ti mostra l'array formattato come messaggio di drupal mentre
- dpr, ti mostra l'array come fa var_dump ma ben formattato

Veniamo alle 3 variabili di form_alter:

- $form è l'array che contiene la definizione del form cioè i campi;
- $form_state è un array che contiene le informazioni sullo stato attuale del form compreso eventuali valori settati al momento del submit del form stesso;
- $form_id ti ritorna l'id del form, utile nel caso in cui tu debba fare un alter di un form specifico tramite l'hook_form_FORM_ID_alter dato che l'hook_form_alter modifica tutti i form del sito.

Nel caso dai uno sguardo alla documentazione ufficiale su DO:
https://api.drupal.org/api/drupal/modules%21system%21system.api.php/func...

https://api.drupal.org/api/drupal/modules%21system%21system.api.php/func...

Spero di essere stato chiaro.

Ciao!

cyper983 grazie per le dritte... ora provo con il modulo Devel ;)

Quindi &form_state in quali occasioni si dovrebbe usare?
HO capito, quando si deve controllare un valore inserito, quindi se in un Field ho un certo valore, questo valore posso leggerlo in $form_state, ma non in $form.

Sto cercando di mostrare dei Field in base ai dati selezionati dall'utente, ma non dati già salvati.

Classico esempio, l'utente da una select seleziona "Macchine" e compare un field con l'elenco delle marche. Da quello che ho capito devo usare #STATES, ma non capisco come usarlo.

Ora mi sono creato un contenuto semplice semplice, un filed testo ed uno booleano, voglio che quando il booleano è true il field testo compaia

Continuo le mie ricerche:

$form['field_mybody']['#states'] = array(
      'visible' => array(
        ':input[name="field_pulsante[und]"]' => array('value' => 1),
      ),
    );

Aiutandomi con uno snipped trovato in rete sono riuscito nel mio intento ovvero quando si seleziona acceso il campo booleano, compare il field di testo.
Non capisco però la sintassi: ':input[name="field_pulsante[und]"]' => array('value' => 1),
non riesco a capire in quel [und] che value trova.

Vi riporto l'array completo del field

[field_pulsante] => Array
        (
            [und] => Array
                (
                    [#entity] => stdClass Object
                        (
                            [uid] => 1
                            [name] => admin
                            [type] => axis
                            [language] => und
                            [title] =>
                            [status] => 1
                            [promote] => 0
                            [sticky] => 0
                            [created] => 1435253681
                            [revision] =>
                            [ajax_example] => Array
                                (
                                    [example_1] => 0
                                    [example_2] =>
                                )
                            [comment] => 1
                            [menu] => Array
                                (
                                    [link_title] =>
                                    [mlid] => 0
                                    [plid] => 0
                                    [menu_name] => main-menu
                                    [weight] => 0
                                    [options] => Array
                                        (
                                        )
                                    [module] => menu
                                    [expanded] => 0
                                    [hidden] => 0
                                    [has_children] => 0
                                    [customized] => 0
                                    [parent_depth_limit] => 8
                                )
                        )
                    [#entity_type] => node
                    [#bundle] => axis
                    [#field_name] => field_pulsante
                    [#language] => und
                    [#field_parents] => Array
                        (
                        )
                    [#columns] => Array
                        (
                            [0] => value
                        )
                    [#title] => pulsante
                    [#description] =>
                    [#required] =>
                    [#delta] => 0
                    [#type] => radios
                    [#default_value] =>
                    [#options] => Array
                        (
                            [_none] => N/D
                            [0] => off
                            [1] => on
                        )
                    [#value_key] => value
                    [#element_validate] => Array
                        (
                            [0] => options_field_widget_validate
                        )
                    [#properties] => Array
                        (
                            [filter_xss] => 1
                            [empty_option] => option_none
                            [strip_tags] =>
                            [optgroups] =>
                        )
                    [#after_build] => Array
                        (
                            [0] => field_form_element_after_build
                        )
                )

Mi son bloccato:

Voglio che alcuni field siano richiesti quando soddisfano una certa condizione, es:

field A is required
IF
field B ha un determinato valore

ho provato ad utilizzare #states, ma non funziona (Drupal bug???)

Come potrei risolvere la cosa? Mi basterebbe controllare #states con un IF ELSE, ma non ci riesco :/

Cioè quello che non riesco a fare è interagire prima di salvare il contenuto

Ciao,
sempre con states puoi usare 'reqired' oppure 'optional' in base alle tue esigenze.

Ciao!

Cyper grazie della risposta, ma #states con required non funziona ossia compare solo l'asterisco rosso, ma sono come effetto grafico, per questo sto chiedendo aiuto alla community

Ciao! se sei un sviluppatore alle prime armi con Drupal potrai trovare molto utile questi esempi presenti nel modulo https://www.drupal.org/project/examples
Puoi installare il modulo in una installazione base di Drupal e vederne i risultati; successivamente studiarne il codice.. Nel tuo caso specifico credo che i moduli di esempio 'AJAX' e 'Form->#state' possano aiutarti..

Installo, guardo e vi so dire.... grazie ;)

Cercando anche su Drupal.org, sembra che l'unica soluzione sia usare #ajax. Purtroppo io di javascript non so nulla :/

Ho provato a guardare il modulo di esempio, ma ci capisco poco, nel modulo di esempio sono riuscito a visualizzare solo una funzionalità, ovvero, selezionando una checkbox compare un field. A me serve invece far diventare un field obbligatorio. Ho provato a cercare nella documentazione #ajax ma non ho trovato opzioni a riguardo, veramente non ho trovato documentazione sufficiente, quindi non so che opzione/comando dare per rendere un field required.

Avrei bisogno di una mano :D

Se proprio è così complicato impostare dinamicamente un field come required, si potrebbe usare la validazione?

(IF field A -> value1 AND field B -> empty) OR (IF field A -> value2 AND field B -> !empty)

Ho provato hook_field_validate, ma il comando dpr e dpm non mi riportano nessun dato dalle variabili.

Help pls :/

piccolo up

Meggis (non verificato)
Ritratto di Anonimo

" Io utilizzo Notepad++ " ---> www.mpsoftware.dk/phpdesigner.php

" mi consigliate un buon software per leggere gli array risultanti dalla variabile $form? " ---> drupal_set_message(' ' . print_r($form, TRUE) . ''); buon software??

" si potrebbe usare la validazione? "

/**
* Implementation of hook_node_validate();
*/
function MYMODULE_node_validate($node, $form, &$form_state) {
  drupal_set_message('<pre> ' . print_r($form, TRUE) . '</pre>');
  if (!isset($node->body['und'][0]['summary']) || !$node->body['und'][0]['summary']) {
    form_set_error('seo_analyzer_blazetech', t('You must enter a summary!'));
  }
}

" l'utente da una select seleziona "Macchine" e compare un field con l'elenco delle marche. "
http://stackoverflow.com/questions/5158744/drupal-7-best-practice-for-a-...

... potrebbe essere complicato e llafine il tuo modulo non si integrerebbe in drupal...
https://www.drupal.org/project/conditional_fields ? :)

Il principale problema del modulo conditinal_field è che non funziona con nessun widget di tassonomia, quindi per me è inutilizzabile purtroppo :/

Sono due settimane abbondanti che tra ricerche, prove e studio ci sto sbattendo la testa, sono riuscito più o meno a capire come "giocare" con i field, tra validazioni, required, hide/show condizionali.

I motivi per cui sto tentando di fare il tutto con un custom modulo sono:
1. Imparare un pò di Drupal, capire come funziona, capire come utilizzare le api
2. Avere un controllo più profondo rispetto a moduli già pronti
3. Come spesso accade in Drupal, i moduli vanno in conflitto tra loro, Conditional Field non funziona con nessun widget di tassonomia, a Field validation serve il modulo Token che se installato mi manda in palla l'intero sito riportando pagine bianche con numerose stringhe di errore

Mi manca ancora l'ultimo passo

Grazie a #states riesco a controllare in modo dinamico il valore inserito in un field e decidere se assegnare un'azione a valori specifici, es. se selezionato il valore A nel field A, mostra il filed B.

Ed ecco il mio problema

Faccio utilizzo massiccio di campi di tassonomia con 3 livelli di gerarchia e vocabolari corposi, ovviamente mi serve un widget per gestire tutti i termini e le gerarchie, utilizzo shs.... e qui il problema, tutti i widget non supporta il "change event" e quindi #states è inutilizzabile.
Sul sito Drupal.org forse si è trovata una soluzione, soluzione che però è fuori dalla mia portata, ho già aggiornato il modulo shs con le modifiche della patch, però non ho capito come utilizzare le info descritte nel README.txt, ovvero:
+* Change event
+ - Perform additional actions based on dropdown change. Include an event
+ listener in JavaScript for "shs-change" and access "id" and "value". Example:
+
+ document.addEventListener("shs-change", function(e) {
+ console.log(e.value);
+ alert("Current select ID is: " + e.id);
+ alert("Current select value is: " + e.value);
+ });
+
Di seguito le pagine delle discussioni con relative patch:
https://www.drupal.org/node/2499279
https://www.drupal.org/node/2264795

Mi serve la mano di un esperto, o almeno più esperto di me :p

Se patchando il modulo shs non si dovesse risolvere, che altra soluzione potrebbe esistere al mio problema, ovvero:

Dopo aver selezionato dinamicamente un termine di tassonomia con una struttura gerarchica -> azione

Ringrazio anticipatamente chiunque mi darà un consiglio