Odpovědět na komentář
Nepříjemný bug v modulu search - formuláře ve výsledcích hledání nefungují
Vložil/a wojtha, 2 Září, 2009 - 18:07Dnes jsem skoro hodinu zápasil s tím, že mi nefungovali formuláře zobrazené ve výsledcích hledání – konkrétně formulář „Přidat do košíku“ generovaný Übercartem. Po půl hodině, kdy jsem se snažil tento problém vyřešit sám, jsem to vzdal a začal googlit… A příčina je (alespoň pro mě) poměrně překvapivá.
Neočekávané chování způsobuje modul search a je to víceméně bug. Překvapivé také je, že se to „odhalilo“ poměrně nedávno, cca před dvěma měsíci … (viz Search conflicts with other forms, 20. června 2009 )
Kromě výše zmíněného vlákna se to řešilo i v rámci Übercartu: Search result as teaser ‚Add to cart‘ button doesn´t work
Pokud nutně formuláře ve výsledcích potřebujete, je nutné modul search patchnout – samozřejmě jen do té doby, než se patch dostane do oficiálního vydání Drupalu. Jelikož to není bezpečnostní chyba a moc lidí to zatím netrápí, může to klidně trvat i několik měsíců… (dva už jsou za námi …)
Patch je poměrně jednoduchý:
<?php
/*
* Soubor modules/search/search.pages.inc
*/
// před úpravou
if (!isset($_POST['form_id'])) {
...
// po úpravě
if (!isset($_POST['keys'])) {
...
?>
Chyba spočívá víceméně v tom, že funkce která vykresluje formulář a výsledky a hledání, „reaguje“ na jakýkoliv odeslaný formulář na této stránce [1]. Odeslání takovéhoto formuláře skončí tak, jako by se odeslal prázdný formulář Search.
[1] Tzn s atributem action obsahujícím URL, kterou obsluhuje search modul (typicky „/search/node/*“)
IMHO je tato „chyba“ v Drupalu zavlečená ještě z „dřevních dob“ Drupalů 4.6, 4.5 … verze 3 (?), kdy ještě neexistovalo robustní Forms API a s $_POST se v modulech operovalo celkem běžně. Některé části Drupalu jsou pěkně staré (např. DB API) a občas je to znát …