hook_form_alter
Ciao ragazzi,
Ho creato un search form con views e i exposed filter.
ho due campi di ricerca "titolo" e "corpo". quello che sto cercando di fare
e cambiare questi due campi con due checkbox ho preparato il mio module e visto che non capisco molto PHP nel miofile.module ho provato varie cose che ho trovato nei fari forum ma non ci riesco.
qualcuno potrebbe darmi una mano per favore ?
Grazie per il vostro aiuto

Risposte
Ciao, posta il codice che hai
Ciao, posta il codice che hai costruito finora e prova a spiegare più approfonditamente quello che vuoi fare.
ciao, ecco il
ciao,
ecco il codice.
<?php
/**
* Implementation of hook_theme().
*/
function checkbox_theme() {
return array(
'select_as_checkboxes' => array(
'function' => 'theme_select_as_checkboxes'
),
);
}
/**
* Implementation of checkbox_FORM_ID_alter(&$form, &$form_state).
*/
function checkbox_form_views_exposed_form_alter(&$form, &$form_state) {
// Note: if you have problems working out what the right form #id
// is you can do print_r($form); exit(); and it will print out the
// form array for you, which will contain the #id somewhere
// Make sure that you only edit the exposed views form you want:
if($form['#id'] != 'views-exposed-form-article-theme-page-1')
return;
// Apply the theme to the form element you want!
// If you can't work out the id of the form element do the print_r
// form thing again
$form['title']['#theme'] = 'select_as_checkboxes';
}
adesso non vedo piu il campo title e mi mette un errore
warning: Invalid argument supplied for foreach() in /Applications/MAMP/htdocs/web/sites/all/modules/better_exposed_filters/better_exposed_filters.module on line 209.
quello che cerco a fare e al posto di mettere una parola chiave nel campo tittolo o corpo metto una parola nell campo "parole chiave" e cosi posso scegliere di cercare nel tittolo o corpo o tutte due
grazie per il tuo aiuto
Per capire, al momento nel
Per capire, al momento nel form hai una cosa del genere:
Corpo: [TEXTBOX]
Titolo: [TEXTBOX]
[CERCA]
e vorresti
Parola chiave: [TEXTBOX]
Cerca in Corpo [CHECKBOX] Titolo [CHECKBOX]
[CERCA]
Se è così, dovresti prima modificare il form aggiungendo una textbox e due checkbox, poi nascondere le due textbox Corpo|Titolo (anche aggiungendo una classe css...). Devi poi aggiungere una funzione di validazione al form con
$form['#validate'][] = 'checkbox_form_views_exposed_form_validate';dentro tale funzione devi assegnare ai "vecchi" campi Corpo|Titolo il valore della nuova textbox (Parola Chiave) a seconda delle checkbox, in modo che i parametri vengano passati poi correttamente alla funzione di submit.
A occhio e croce la procedura così dovrebbe andare, ma devi provare.
il form e gia pronto l ho
il form e gia pronto l ho fatto con views. i campi che voglio rimpiazzare sono i titolli e i corpi del tipo di contenuto, non posso aggiungere un checkbox cosi. in questo momento tutto funziona benissimo. quando metto una parola chiave dentro il campo titollo mi cerca solo nel titollo,ecc.. (posso inviarti un imagine del form se vuoi)
Adesso legendo su i forum e sul sito drupal ho capito che con il hook_form_alter si poteva dire semplicemente di rimpiazzare il text field con un checkbox.
non e cosi ?
Ciao, perdonami non mi sono
Ciao, perdonami non mi sono spiegato bene. Per aggiungere campi intendevo una cosa del genere dentro la funzione hook_form_alter:
$form['keyword']=array('#title' => 'Parola Chiave',
'#type' => 'textfield'
);
$form['checkbox1']=array(
'#title' => 'Cerca nel corpo',
'#type' => 'checkbox'
);
$form['checkbox2']=array(
'#title' => 'Cerca nel titolo',
'#type' => 'checkbox'
);
$form['#validate'][] = 'checkbox_form_views_exposed_form_validate';
aggiungere poi la funzione checkbox_form_views_exposed_form_validate per gestire i valori che vanno in pasto alla funzione di submit.
Se modifichi solo il tipo dell'elemento (ex text-->checkbox) la vista non riuscirà a interpretare il valore dello stesso.
ciao Blackice, allora ci sono
ciao Blackice,
allora ci sono quasi con questo codice
<?php
/**
* Implementation of hook_form_alter().
*/
function checkbox_form_alter(&$form, &$form_state, $form_id) {
if ($form_id == 'views_exposed_form') {
$form['checkbox_title']=array(
'#title' => 'Cerca nel titollo',
'#type' => 'checkbox'
);
$form['checkbox_body']=array(
'#title' => 'Cerca nel corpo',
'#type' => 'checkbox'
);
}
}
function checkbox_form_views_exposed_form_validate() {
$form['#validate'][] = 'checkbox_form_views_exposed_form_validate';
}
adesso vedo i due checkbox, ma non funziona ancora. Non sono sicuro se ho fatto giusto per la validazione
Il codice per agganciare la
Il codice per agganciare la funzione di validazione va dentro l'hook form alter.
...$form['#validate'][] = 'checkbox_form_validate';
...
poi crei
function checkbox_form_validate($form, &$form_state){/*
dentro tale funzione devi assegnare ai "vecchi" campi Corpo|Titolo il valore della nuova textbox (Parola Chiave) a seconda delle checkbox, in modo che i parametri vengano passati poi correttamente alla funzione di submit
*/
}
Per una guida completa sui form: http://drupal.org/node/751826.
ma una cosa che non ho capito
ma una cosa che non ho capito e perche devo rifare una nuova textbox(parola chiave) ? visto che quella che ho fatto dentro views va bene
Puoi anche usare una textbox
Puoi anche usare una textbox esistente, non è vincolante, l'ho utilizzata solo per farti avere una visione più chiara dell'esempio sopra http://drupal.it/node/6593#comment-4013.
ciao Blackice, scusa per la
ciao Blackice,
scusa per la mia ignoranza con php. allora sono arrivato a questo.
<?php
/**
* Implementation of hook_form_alter().
*/
function checkbox_form_alter(&$form, &$form_state, $form_id) {
if ($form_id == 'views_exposed_form') {
/**$form['title'][#type] = 'checkbox';*/
$form['checkbox_title']=array(
'#title' => 'Cerca nel titollo',
'#type' => 'checkbox',
'#value' => ''
);
$form['checkbox_body']=array(
'#title' => 'Cerca nel corpo',
'#type' => 'checkbox',
'#value' => ''
);
$form['title'] = array('#type' => 'hidden');
$form['body'] = array('#type' => 'hidden');
$form['#validate'][] = 'checkbox_form_validate';
}
}
function checkbox_form_validate($form, &$form_state){
$form['body']=array(
'#title' => 'Cerca nel corpo',
'#type' => 'text',
'#value' => ''
);
$form['title']=array(
'#title' => 'Cerca nel titollo',
'#type' => 'text',
'#value' => ''
);
}
Adesso il valore della textbox e vuoto perche prende il valore di quello che metti dentro, giusto ? allora io che devo mettere lasciare vuoto ho utilizare un $_GET ?
Devi operare sulla variabile
Devi operare sulla variabile $form_state dentro la validazione. Se la checkbox relativa al titolo è flaggata ($form_state['values']['checkbox_title']==1 mi pare) nel valore del titolo metti quello della parola chiave (a questo serviva il campo in più). Stessa cosa per il campo corpo. Una cosa del genere (non testata devi rivederla):
if ($form_state['values']['checkbox_title']==1){$form_state['values']['title'] = $form_state['values']['keyword'];
}
if ($form_state['values']['checkbox_body']==1){
$form_state['values']['body'] = $form_state['values']['keyword'];
}
Grazie per il tuo aiuto ma
Grazie per il tuo aiuto ma diventa molto complicato per me. Ho visto che
lavoravi come freelancer drupal, sei indipendente ? fai lavori del genere ?
io sono in svizzera, magari si puo collaborare ? che prezzi fai ? caso mai mia mail e toutanne@tele2.ch
Imposto la richiesta come
Imposto la richiesta come risolta. ho provato a contattarti alla mail specificata ma non ho avuto risposta. Se vuoi, puoi comunque spedirmi un messaggio tramite il form di contatto sulla mia pagina utente.