A Drupal kereső doboz átalakítása és a tanulság
A Drupal alapértelmezett kereső dobozának átalakítása nem túl nagy kihívás: sima form, egy kis preprocess, hogy eltüntessem a Submit gombot, Lecserélem a kereső doboz feliratát, css-el az input doboz mérete beálltva, kész. Eddig az elmélet...
Barátunk a Google elmondta, hogy merre találok információt arról, amit csinálni szeretnék: Customizing the search form a Drupal.org-on. Nagyszerű, már van is a témában egy írás - thx!
Teljesen jó a leírás: a függvényt bemásoltam a saját sminkem template.php-jába, átírtam néhány dolgot: függvény neve a smink nevéhez igazítása, a form cím törlése, az alapértelmezett kereső mező felirat átírása. Mentés, theme cache törlése, böngészőben frissítés. És nem történik semmi!
Átnéztem újra, minden rendben lévőnek tűnik. Cache törlés, frissítés. Semmi. [censored]. Átnéz, cache töröl, újratölt. Semmi. [censored] [censored] [censored]
Nézzük theme developer mit mond?
template_preprocess + template_preprocess_search_theme_form + custom_breadcrumbs_preprocess + custom_breadcrumbs_paths_preprocess
De hol a saját sminkem preprocess függvénye? #drupal.hu irc csatornán sikítok, semmi. Korán van még...
Ekkor jutott eszembe, hátha ez is úgy működik, mint a box.tpl.php-ból származó box.tpl-ek átírása: ott kell lennie a saját sminkben egy box.tpl.php-nek, különben nem veszi észre a leszármazottait a smink motor. Hiba vagy feature? Nem tudom, ez ilyen jelenleg, hozzá kell szokni, megtanulni, haladjunk.
Készítettem egy sminkemneve_preprocess(&$vars, $hook) {} függvényt, ami, mint látszik is nem csinál semmit, üres. Ennyi, innentől a smink rendszer megtalálja az én személyre szabott preprocess függvényemet is! Ennyi szerettem volna elérni, feladat megoldva.
Tanulság: mindig legyen saját template_preprocess()-ed! :) De a nevét azért írd át!
Még egy kis trükk a végére:
// Add a custom class and placeholder text to the search box $vars['form']['search_theme_form']['#attributes'] = array('class' => 'NormalTextBox txtSearch', 'onfocus' => "if (this.value == this.defaultValue) {this.value = '';}", 'onblur' => "if (this.value == '') {this.value = this.defaultValue;}");
Így csak egyszer kell beírni az űrlap mező alapértelmezett értékét. Ha rákattintunk a mezőre a felirat eltűnik, ha nem modósítottuk még a szöveget és a form elemről „elkattintunk” akkor az eredeti felirat visszakerül. Ha már beírtunk valamit, akkor elkattintáskor az marad. Dübörög az UX, mindenki elégedett!
Hozzászólások
egy #search-block-form .form
egy
#search-block-form .form submit {
text-indent: -999px;
background-image: url(images/button.gif)}
nem lett volna elég?
Pontosabban azt szeretném megtudni, ha én CSS-ből intéztem el, akkor annak mi lehet a hátránya? Működni működik, ezért kérdezem.
De, valószínű, elég ha
De, valószínű, elég ha css-ből tűnteted csak el. Most én teljesen el akartam tüntetni, hogy a html kimenetben se legyen ott.
Illetve, a formnak mindig van befoglaló div-je, aminek van magassága, háttere, esetleg kerete. Sokkal jobb az egész befoglaló div-et eltüntetni, így nem a submit, hanem a befoglaló elemet célszerű a css szabályba felvenni.
Remek. Az okát is meg tudnád
Remek. Az okát is meg tudnád osztani? Miért kell ez a függvény, illetve miért elég, ha üres?
A pontos okot sajnos nem
A pontos okot sajnos nem tudom. A preprocess függvényem nem találja meg, ha nincs ott ez a "globális" preprocess. Érdemes lenne a theme layer preprocess fv javaslatok előállítási részt megvizsgálni, hogy mi az oka. Erre nem volt időm eddig.
Gyanítom, hogy olyasmi, mint a mikor a blokkod block.tpl-jét akarod átírni: a "block.tpl.php"-nak lennie kell a sminkedben, különben nem találja meg a blokkomneve-block.tpl.php-t. Bizonyítékom nincs rá, csak sejtem! :)
Van modul is, ami ezt
Van modul is, ami ezt megoldja - meg sok egyebet még: http://drupal.org/project/custom_search
Persze a saját kód az saját kód... :o)
Ismerem a modult, de két
Ismerem a modult, de két ilyen kis dologért nem kell egy teljes modul funkcionalitása...
Az utolsó kis JavaScript
Az utolsó kis JavaScript részhez egy kiegészítés, amit én is rendszeresen el szoktam felejteni: ha az alapértelmezett szöveg van a kereső beviteli mezőjében és a felhasználó rákattint a keresés (submit) gombra akkor rá fog keresni az alapértelmezett kifejezésre :)
Érdemes a submit gomb onclick eseményénél is vizsgálni az input mező értékét és nem engedni a kattintást, vagy üresbe állítani a beviteli mezőt.
Teljesen jogos a felvetés!
Teljesen jogos a felvetés! Köszönöm!