Utilizzo hook_form_FORM_ID_alter per filtri esposti di una vista
Salve,
ho letto che per modificare un form devo utilizzare la funzione hook_form_alter
all'interno del modulo... dato che sto litigando sempre con le views volevo utilizzare tale funzione sempre per modificare il form dei filtri esposti all'utente.
Per all'interno del modulo views non ho to trovato la funzione hook_form_alter ma la seguente
nel file views.module.php:
/**
* Implements hook_form_alter() for the exposed form.
*
* Since the exposed form is a GET form, we don't want it to send a wide
* variety of information.
*/
function views_form_views_exposed_form_alter(&$form, FormStateInterface $form_state) {
$form['form_build_id']['#access'] = FALSE;
$form['form_token']['#access'] = FALSE;
$form['form_id']['#access'] = FALSE;
/*
if($form['form_id']=="views-exposed-form-dataset-list-test-page-1"){
$form['actions']['submit']['0']['value'] = t('TROVA');
}
*/
}
ed avevo provato a fare un controllo su id del form per cambiare etichetta del pulsante invia,
ma non succede nulla sulla form... è questa la funzione da modificare ?
Risposte
Non modificare mai il codice
Non modificare mai il codice del core di Drupal, al primo aggiornamento perderesti tutto.
Crea un modulo custom per il form alter.
<?php
function TUOMODULO_form_views_exposed_form_alter(&$form, \Drupal\Core\Form\FormStateInterface $form_state) {
if ($form['#id'] == 'views-exposed-form-ID_VISTA-ID_DISPLAY') {
$form['actions']['submit']['#value'] = 'Testo del bottone';
}
}
?>
Questo post di qualche giorno fa ti potrebbe essere utile: http://drupal.it/supporto/hook-form-alter
mmmmm cioè dovendo alterare
mmmmm cioè dovendo alterare il comportamento del form dei filtri esposti delle views come devo fare??? non mi è chiaro come fare con un mio modulo custom
Nel primo post, in
Nel primo post, in riferimento alla modifica del rendering del form chiedevi come cambiare etichetta del pulsante invia. Questo snippet di codice, modificando il nome del modulo e l'id della vista in base al nome che dai al tuo modulo e alla vista che usi, ti permette di farlo.
mmmmmm non ho capito dove
mmmmmm non ho capito dove inserire questo codice...
Crea un modulo custom
Crea un modulo custom semplicissimo così:
1. crea la cartella modules/custom
2. crea la cartella modules/custom/miomodulo
3. crea il file modules/custom/miomodulo/miomodulo.info.yml con questo contenuto
name: Miomodulo
description: Miomodulo
package: Custom
type: module
version: 1.0
core: 8.x
4. crea il file modules/custom/miomodulo/miomodulo.module con questo contenuto:
<?php
function miomodulo_form_views_exposed_form_alter(&$form, \Drupal\Core\Form\FormStateInterface $form_state) {
if ($form['#id'] == 'views-exposed-form-dataset-list-test-page-1') {
$form['actions']['submit']['#value'] = 'Testo del bottone';
}
}
?>
5. vai in admin/modules cerca Miomodulo, selezionalo con il checkbox e clicca Instlla sul fondo della pagina.
Se tutto va bene visitando la pagina della vista (controlla che l'id che ho specificato sia giusto) con id dataset-list-test, dovresti vedere il bottone modificato.
Nota: corretto il post sopra, mi riferisco alla prima richiesta di questa pagina.
Quindi in questo modulo non
Quindi in questo modulo non farei altro che controllare i campi del form della vista giusto? cioè se sto capendo bene posso controllare tramite un modulo mio personale anche form di altri moduli facendo il controllo sull'id della form capito bene ?
Esatto
Esatto
Ok grazie mille
Ok grazie mille
Buongiorno fatto il modulo
Buongiorno fatto il modulo custom con la funziona hook,
ma ora per aggiungere un pulsante alla form ed associargli una classe css e codice javascript da eseguire come devo fare ?
Grazie mille
Posso farti l'esempio più
Posso farti l'esempio più semplice possibile, aggiungi questo:
<?php
..
$form['actions']['miobottone'] = [
'#type' => 'button',
'#value' => 'Cliccami',
'#attributes' => [
'class' => ['btn', 'btn-primary'],
'onclick' => 'return confirm("Procedere con il submit?")'
]
];
..
?>
ci sono metodi più complessi (aggiunta librerie e attachments) per gestire le necessità della tua applicazione.
Per tutto il resto ti linko la documentazione utile:
Creare elementi nei form:
https://www.drupal.org/docs/8/api/form-api/form-render-elements
Creare librerie js per moduli custom:
https://www.drupal.org/docs/8/creating-custom-modules/adding-stylesheets...
Questo modulo:
https://www.drupal.org/project/examples
contiene moltissimi esempi e snipper da testare copiare e modificare da cui prendere spunto.
Non potrei aggiungere di più .. buon lavoro!
Per aggiungegere un js o css
Per aggiungegere un js o css personalizzato nel modulo invece devo fare le cartelle js e css e li vado a mettere il codice giusto? poi per fare la funzione esterna al file?
Segui https://www.drupal.org/
Segui
https://www.drupal.org/docs/8/creating-custom-modules/adding-stylesheets...
trovi tutto passo passo, dalla definizione della libreria esterna a come inserirla nel codice.
Grazie mille per l'aiuto
Grazie mille per l'aiuto
Ciao, ho fatto il modulo come
Ciao, ho fatto il modulo come mi hai suggerito tu per iniziare a fare la prova per cambiare il pulsante del form ma non ho nessun risultato.... ti allego le foto... vedi ho fatto bene ?
Dove sbaglio ?
Grazie mille
Domande: il modulo è
Domande:
il modulo è attivo?
hai provato a ripulire la cache?
hai provato a stampare un testo qualsiasi prima della condizione per verificare che effettivamente il sistema passa di lì?
il modulo scritto come suggerito funziona correttamente per la vista dataset?
Ciao il modulo ora funziona
Ciao il modulo ora funziona prende il css a quanto pare...
ma come devo fare per agganciare il js?
Ho fatto la cartella js all'interno del mio modulo e li messo il file js.
Poi all'interno del file miomodulo1.module ho aggiunto la seguente funzione
function miomodulo1_page_attachments(array &$page) {
$page['#attached']['library'][] = 'miomodulo1/custom_view';
$page['#attached']['library'][] = 'miomodulo1/custom_js';
}
mentre nel file miomodulo1.libraries.yml cosi ho dichiarato i componenti:
custom_view:
css:
component:
css/miomodulo1.css: {}
custom_js:
js:
component:
js/funzioni.js: {}
Questo il contenuto del file funzioni.js
function prova(){
alert("ciao mondo");
}
e questo il contenuo del file miomodulo1.module per agganciare il javascript al pulsante...
dove sbaglio ???
<?php
/*
function miomodulo1_form_views_exposed_form_alter(&$form, \Drupal\Core\Form\FormStateInterface $form_state,$form_id) {
if ($form_id == "views-exposed-form-elencoannunci-page-1") {
$form['actions']['submit']['#value'] = 'Testo del bottone';
}
}
*/
function miomodulo1_form_views_exposed_form_alter(&$form, \Drupal\Core\Form\FormStateInterface $form_state) {
if ($form['#id'] == 'views-exposed-form-elencoannunci-page-1') {
$form['actions']['submit']['#value'] = 'Testo del bottone1';
$form['button']['miobottone'] = [
'#type' => 'button',
'#value' => 'Cliccami',
'#attributes' => [
'class' => ['btn', 'btn-primary'],
'onclick' => 'prova();'
]
];
}
}
function miomodulo1_page_attachments(array &$page) {
$page['#attached']['library'][] = 'miomodulo1/custom_view';
$page['#attached']['library'][] = 'miomodulo1/custom_js';
}
?>
Ho notato che cosi facendo mi
Ho notato che cosi facendo mi crea il pulsante Cliccami con type="submit" invece deve essere di tipo button in modo tale che non deve fare il submit della form... dove sbaglio ???
Per agganciare il modulo js
Per agganciare il modulo js al form ho eseguito i seguenti passaggi:
Contenuto del file miomodulo1.libraries.yam:
custom_view:
css:
component:
css/miomodulo1.css: {}
custom_js:
js:
component:
js/funzioni.js: {}
contenuto del file funzioni.js:
function prova(){
alert("ciao mondo");
return false;
}
Contenuto del file miomodulo1.module:
<?php
/*
function miomodulo1_form_views_exposed_form_alter(&$form, \Drupal\Core\Form\FormStateInterface $form_state,$form_id) {
if ($form_id == "views-exposed-form-elencoannunci-page-1") {
$form['actions']['submit']['#value'] = 'Testo del bottone';
}
}
*/
function miomodulo1_form_views_exposed_form_alter(&$form, \Drupal\Core\Form\FormStateInterface $form_state) {
if ($form['#id'] == 'views-exposed-form-elencoannunci-page-1') {
$form['actions']['submit']['#value'] = 'Testo del bottone1';
$form['#attached']['library'][] = 'miomodulo1/custom_js';
/*$form['views-exposed-form-elencoannunci-page-1']['button']['miobottone'] = [
'#type' => 'button',
'#value' => 'Cliccami',
'#attributes' => [
'class' => ['btn', 'btn-primary'],
'onclick' => 'prova();'
]
];
*/
$form['views-exposed-form-elencoannunci-page-1']['miobottone'] = [
'#type' => 'button',
'#value' => 'Cliccami',
'#button_type' => 'button',
'#attributes' => [
'class' => ['btn', 'btn-primary'],
'onclick' => 'prova();'
]
];
}
}
function miomodulo1_page_attachments(array &$page) {
$page['#attached']['library'][] = 'miomodulo1/custom_view';
$page['#attached']['library'][] = 'miomodulo1/custom_js';
// $element['#attached']['library'][] = 'miomodulo1/custom_js';
}
function miomodulo1_form_alter(&$form, \Drupal\Core\Form\FormStateInterface $form_state,$form_id) {
if ($form_id == "views-exposed-form-elencoannunci-page-1") {
$form['#attached']['library'][] = 'miomodulo1/custom_js';
}
}
?>
Inoltre non voglio un pulsante di tipo submit come me lo crea adesso, per come ho fatto,
ma vorrei un pulsante di tipo button che esegue la semplice funzione javascript.... dove sbaglio ???
Per bloccare il submit è
Per bloccare il submit è sufficiente che ritorni un valore false alla funzione dichiarata su onclick. Vedi il mio esempio "return confirm(...)".
Provato ... ma non va.....
Provato ... ma non va..... però facendo l'aggancio del modulo javascript mi sembra di capire che non aggancia il modulo vedi ho usato questa funzione qua...
custom_view:
css:
component:
css/miomodulo1.css: {}
custom_js:
js:
component:
js/funzioni.js: {}
function miomodulo1_page_attachments(array &$page) {
$page['#attached']['library'][] = 'miomodulo1/custom_view';
$page['#attached']['library'][] = 'miomodulo1/custom_js';
// $element['#attached']['library'][] = 'miomodulo1/custom_js';
}
ma la parola component la devo togliere dal custom_js...? non riesco a capire dove sbaglio..
Ci sono riuscito ad
Ci sono riuscito ad agganciare il javascript.... sbagliavo nel file della libreria che avevo cosi:
custom_view:
css:
component:
css/miomodulo1.css: {}
custom_js:
js:
component:
js/funzioni.js: {}
invece cambiandola cosi è andata:
custom_view:
css:
component:
css/miomodulo1.css: {}
custom_js:
js:
js/funzioni.js: {}
cioè cancellando la riga component nella sezione js...
Pero non si è preso il return false dalla funzione javascript
function prova(){
alert("ciao mondo");
return false;
}
console.log("Hello world!");
dato che io la funzione ho agganciato ad evento onclick e non onsubmit....
aggancio ad evento onsubmit?
onclick deve ritornare un
onclick deve ritornare un valore false, quindi non:
'onclick' => 'prova();'
ma
'onclick' => 'return prova();'
tieni sempre conto che sono valide la sintassi e le funzioni Javascript e in generale questo è il metodo per bloccare il process di submit di un form.