Drupal 7 Form API 'date' mező tiltása

feor58 képe

Sziasztok,

szeretnék 'disable' állapotba hozni egy Field modullal létrehozott 'date' mezőt a formon egy bizonyos szituációban. Találtam is erre egy-két kiváló cikket Drupal 6 alatt. Olvasom, hogy Drupal 7 alatt a form_builder() funkcióval ez a probléma intelligensebben (és talán egyszerűbben is) megoldható. Kutakodásaim alapjáni úgy látom, hogy a megoldás a hook_form_alter, form['#after_build'], element['#after_build'], form_process_date(), form_builder() Bermuda sokszögben keresendő. Azonban erre egyetlen példát sem találok a hálón, és hiába sejtem a megoldás architektúráját, képtelen vagyok a részletek pontos feltátására.

Tudnátok segíteni ebben?

Köszönettel, Gábor

Drupal verzió: 
Den képe

A hook_form_alter vagy a hook_form_FORM_ID_alter függvényeket kell saját modullal megvalósítanod.

A hook_form_FORM_ID_alter()-el pontosabban tudsz "célozni", csak az adott formra lesz érvényes.

Kikapcsolás így történik: http://api.drupal.org/api/drupal/developer--topics--forms_api_reference....

Tehát, neked valami hasonló kell:

$form[$form_element_name]['#disabled'] = TRUE;

Ahol a $form_element_name a te form elemed neve. Ha mélyebben van, nem a fő form elemek között, akkor a tömb címzése kövesse le a form fát: $form[group_name][$form_element_name]['#disabled'] = TRUE;

Minimális modult kell írnod, ami az alter függvényeket megvalósítja.

Ha véletlenül nem csak disabled elemet szeretnél (nem kattintható, nem átírható), hanem az egész form elemet eltűntetni, akkor a #disabled helyett a #access tulajdonságot állítsd FALSE-ra.

0
0
feor58 képe

Azt olvastam, hogy az "egyszerű elemtípusoknál," illetve "egyszerű attributumoknál" valóban ilyen könnyen megoldható. (Hogy mi az "egyszerű" definíciója, illetve melyek ezek az elemtípusok és attributumok, szintén nem sikerült eddig pontosan kihámoznom. Abban azonban biztos vagyok, hogy az említett szituáció - field modul/date mező és disable attributum - tuti nem az egyszerű eset.) Azonban a "nem egyszerű" elemeknél és attributumoknál - lásd az általam felvetett eset - a helyzet összetettebb és az általad javasolt megoldás sajnos nem elegendő. (Azt sem tudom természetesen, hogy mi az a furfang, ami miatt ez fennáll.)

Mégegyszer köszönöm a segítséged.

0
0
Den képe

Akkor csináld a form after_build fv-ben:

A form alter (form_id_alter) függvényben adj meg egy afterbuild függvényt, amit a form builder meghív.

$form[$element_name]['#after_build'][] => 'my_formid_afterbuild';

Majd a form afterbuild-ben már ott lesz az összes cck-s mező.

Arra figyelj, after build-ben a $formot vissza kell adni return-el.

0
0
feor58 képe

Két kiváló anyag (http://www.appnovation.com/retaining-default-values-disabled-cck-date-fi..., http://drupal.org/node/357328) leírják ezt a helyzetet egészen jól, benne a date field rekurzív tiltását is. A form_builder "dokumentáció" (http://api.drupal.org/api/drupal/includes--form.inc/function/form_builder/7) leírja mindezek Drupal 7 vonatkozásait is.

Idézem: "Developers are strongly encouraged to integrate the functionality needed by their form or module within one of these three pipelines (köztük a form_builder()) , using the appropriate callback property, rather than implementing their own recursive traversal of a form array. This facilitates proper integration between multiple modules. For example, module developers are familiar with the relative order in which hook_form_alter() implementations and #process functions run. A custom traversal function that affects the building of a form is likely to not integrate with hook_form_alter() and #process in the expected way. Also, deep recursion within PHP is both slow and memory intensive, so it is best to minimize how often it's done."

Ezért szeretném tehát inkább a standard, hatékonyabb módszert választani, amihez azonban képtelen vagyok használható példát találni. Ami azt fogalmazza meg nekem pontosan, hogyan végzem el ebben az infrastruktúrában a 'date' mező rekurzív tiltását.

0
0
Den képe

Kezdem érteni, mi a baj.

A dátum elemek hidden elemmé konvertálása nem oldja meg a problémádat? Nincs ott, de az értéke submitkor meglesz...

De, mint ahogy a példákban is látod, többféle megoldás van. Hivatalos "standard" erre az esetre nem hiszem, hogy van. Csináld meg az egyiket, és kész.

0
0
feor58 képe

Köszönöm.

0
0