Formok implementálása: mi változott az 4.5-ben?

kuller képe

Ugyan nem másik rendszer, de migráció:

Eddig 2 saját "modult" vagy inkább modulnak látszó tárgyat:) fejlesztettem a drupalhoz. Ezek tulajdonképpen függvényraktárak, így egy tartalomként beküldött függvénynév és paraméter (és a PHP kapcsoló) segítségével oldalakat, lekérdezéseket tudok generálni és menüpontokat illeszteni hozzájuk. Mindkettő külön rendszerben fut. Mindkettő tartalmaz formokat. Amikor upgradeltem 4.5-re mindkettő működése megváltozott: a modulok nem az indulási oldalt hívják meg a submit gomb lenyomása után, hanem az alap "node"-t.

Lebutítottam az egyik modult erre: "function telefonkonyv(){print(form(form_textfield('Névre', 'textfield_nev', $node->textfield_nev, 40, 40 ) . form_submit('Keresés'), $method = "post"));}", a hibajelenség megmaradt. Így már majdnem biztos, hogy a form környékén lehet a hiba. Megnéztem a form implementációját: változatlan. ("http://drupaldocs.org/api/4.5/function/form") Azonban valami változhatott (az eval függvény környékén), mert most már a php nyitó és záró tagokat is bele kell plántálni a kódba. Az $action paramétert nem használom, de beírva az urlt-sem jó. Sőt ha álnevet adok a lapnak, akkor sem lesz jó. A böngésző címsorában kiírja a helyes urlt, de nem hívja meg. Ha frissítek akkor sem, csak ha az urlbe viszem a kurzort és nyomok egy entert. (Firefoxot használok.)

Gondoltam, hogy a modulok bezavarhatnak, mert a toxonomy_menu, nodeperm_role, nodeperm_taxonomy és a nodeperm_user modulokat használom. Kikapcsoltam őket, de a hibajelenség továbbra is fennáll. Végül a view jogokat mindenkinek megadtam és a toxonomy_menu-t sem használom már, a "telefonkönyv" modulnak nem a taxonomy_menu generálja a menüt, sajnos eredmény nélkül.

Megakadtam, nem tudom merre keressek tovább..

chx képe

Szedjük szét, amit írsz.

Van egy modulod, aminek a tartalma (olvashatóbban):

function telefonkonyv() {
$form = form_textfield('Névre', 'textfield_nev', $node->textfield_nev, 40, 40);
$form .= form_submit('Keresés');
print form($form);
}
?>

A print parancsot már javítottam, mert amit csinálsz, az ugyan jó eredményt ad, de nem szoktunk értékadást tenni függvényhívásba, nem C ez... Szóval, ez itt a PHP és a Drupal syntaxnak megfelel. De a szintaxis (hogy írjuk ezt magyarul?) az kevés. Két kérdés: ki, mi, hol hívja ezt a függvényt? És, mellesleg honnan lesz a $node->textfield_nev -nek értéke?

0
0
kuller képe

Van egy telefonkonyv.modul nevű txt file a modules alkönyvtárban. Ez nem a hagyományos értelemben vett drupál modul, hanem egy függvényraktár. Ebben van a fenti függvény is.
Szvsz: a drupál végignézi a modules (és egyéb) könyvtárakban lévő filek tartalmát és ezekben a filekben lévő forráskódból építi fel magát. Ha egy függvény szerepel valamelyik modules kiterjesztésű filében, akkor azt a Drupal ismerni fogja. Ha egy tartalommal (modjuk page) beküldjük, hogy "telefonkonyv();" akkor a rendszer lefuttatja a függvényt. Lehet paraméterezni is, de ez már a telefonkönyv függvényen múlik.
Így egész komoly programokat lehet építeni minimális Drupál tudással is.

Hogy kérdésedre válaszoljak:
Az adott tartalom (page) meghívásánál hívódik meg a függvény.
Ekkor megjelenik a "textfield_nev" tehát a $node->textfield_nev, ami a "Keresés" submit gomb lenyomása után kap értéket.

Tudom, hogy nem elegáns amit csinálok, de sajnos teljesítménykényszer miatt gyorsan kell sokat produkálnom. Emiatt sokszor az első működő megoldást választom:(

A dolog egyébként nagyszerűen működik, vagyis az előző verzióban még jó volt, itt egy példa: "http://elan.rulez.org/~kuller/wwiihq/taxonomy_menu/1/14"

(Nem tökéletes de azért működik az oldal és a submit gomb lenyomása után a leválogatás végeredménye és nem a bejelentkező szöveg jelenik meg.)

UI: Hogyan lehet ilyen szépen formázott forráskódot beküldeni?

0
0
Hojtsy Gábor képe

Felhasználók egyelőre csak a <code> és a <pre> elemeket használhatják, mert ha engedélyezzük a szép kód beküldést, akkor a HTML jogokat is szélesebbre kell tárni, akkor pedig durva HTML kódokat tudnátok beküldeni (a példákban használt HTML elemeket nem szabad szűrni, de az effektív elemeket igen). Ezért erre egyelőre csak az erre jogosult csapatok tagjai képesek, de ki fogunk sütni valamilyen megoldást.

0
0
chx képe

Szeretnénk segíteni, hidd el, de nem könnyíted meg a dolgunkat :( Mi végzi a leválogatást? Hogy kerül rá a vezérlés? Nézzd meg a saját címlap cikkemet, ennél egyszerűbb modul nincs. 4.5 alatt úgy tudom, hogy csak így lehet csinálni, a hook_link, hook_page (mintha ennek megvalósítására céloznál) megoldások nem működnek.

0
0
Hojtsy Gábor képe

Kuller arról beszél, hogy van egy modulja, amit csak függvények tárolására használ, csak arra jó, hogy betöltődjön. Aztán csinál PHP evaluator szűrő által feldolgozott tartalmakat, és ezekben felhasználja a függvényeit. Így a felvitt dolgokat taxonómiába is tudja tenni, amit például a _menu() kampón keresztül bajos lenne megoldani.

0
0
kuller képe

Igen, megtehetném, hogy az egészet bemásolom a tartalomba függvényestül függvényhívásostul, de akkor nem tudnám másik tartalomban is felhasználni ezeket a függvényeket.

0
0
Hojtsy Gábor képe

A form()-nak megadhatsz célpontot is, és akkor oda fogja submitolni, amit mondtál. Elméletileg a Drupalnak is a $_GET['q']-t kellene beletennie különben, azaz ugyanoda kellene submitolnia.

0
0
kuller képe

Ez az $action paraméter, és se vele se nélküle nem működik.
Nem az URL-el van probléma hanem a hivatkozott oldal megjelenítésével.

Letöltöttem az új 1.0-ás firefoxot és megnéztem Exploreren is, vátozást nem tapasztaltam. A 4.2-őn teljesen jól működik a "modul", a 4.5-ön viszont nem. Emiatt gondolom, hogy nem a böngészőkben van a hiba. Mivel semmi más nem változott és több gépen is próbáltam, emiatt a drupara tippelnék.

Mi a különbség a frissítés a (ctrl+frissítés) gomb és az URL-re ENTER között? Mert nem ua. történik a 2 esetben.

Összefoglalva:

A submit gomb lenyomása után a böngésző felső sorában jó URL jelenik meg de az oldal közepén az alap "node" tartalma.
Frissités gombnál ua, tehát jó URL rossz oldal.
Kurzor felüre az URL-hez és ott enter nyomásnál bejön a form alap állapotban, ha a submit gombra nyomok akkor GOTO előre:)

0
0
Hojtsy Gábor képe

Az, hogy klikkelsz vagy entert nyomsz, az ne a mi problémánk legyen, a felhasználóknak minden esetben ugyanazt kell kapniuk. A Drupal belül nem irányít át egy kérést, csak akkor, ha beállítottál elérési álnevet (path modullal). Ha ezt nem tetted meg, akkor pontosan ott kell kikötnie az űrlap beküldésnek, ahova az action mutat. Azaz, ha egy node oldalt nézel, amiben van egy űrlap, akkor ugyanarra az oldalra mutat. A mi kapcsolatfelvétel oldalunk is egy node, igaz kézzel van beírva a tartalom, és nem a PHP űrlap függvényei generálják, de ez az űrlap submitja szempontjából mindegy, mert az oda jut, ahova az action utasítja.

0
0
kuller képe

Én is így tudtam, de sajnos mégsem törti be a hivattkozott nodet.

A próba kedvéért kivettem a telefonkonyv modult a modules alól és a rövidített változatot (a 4 soros függvényt) bemásoltam direkt tartalomként majd meghívtam.

A submit gomb lenyomása után megint a bejelenztkező szöveget jeleníti meg, az url helyén a jó url:(

Arra gondolok, hogy a jogosultság kezelő modulok valamit véglegesen átállítottak. Nem értem, hogyan, mert legutóbb a modulokat fizikailag elmozgattam a helyéről, tehát hiába van az adatbázisban nodeperm_taxonomy tábla elvileg semmi sem használhatja.

Na mindegy nem értem az egészet. Felraktam egy másik rendszert ott működik az űrlapozás. Lehet, hogy előről fel kell építenem a rendszert. Ha rájövök mi volt a ludas, akkor azonnal beírom.

Kösz, hogy foglalkoztatok az üggyel, üdv:K

0
0
kuller képe

Kedves Drupál és Webmester Guruk!

A topikban tárgyalt probléma megoldásában teljesen megakadtam, pedig nem voltam rest 5* újrainstalállni a rendszert. Megtenném 6*rra is ha látnám értelmét, de a probléma számora teljesen megfoghatatlan. Bármilyen megoldásban benne vagyok, pl ha valaki ebédidőben a moszkva tér felé jár akkor a vendégem bárhol bármire egy support ellenében. Vagy elmegyek a hónom alatt a géppel akárhová, de ezt meg kell oldanom valahogy.
Kezdem úgy érezni, hogy ez egy X-akta.

Leírom a bénázásom történetét, sajnos a happy end elmarad:

Nos hát jobb híján elkeztdtem újra felépíteni a rendszert:

1.) Letöltöttem kicsomagoltam a 4.5-öt. A conf filét átmásoltam a régi rendszerből csak a $base_url-t változtattam meg az újra. Így az adatbázis azonos, minden egyéb file eredeti "made by Drupal":) volt. A probléma megmaradt, tehát a bibi az adatbázisban van.

2.) Új original adatbázis létrehozva és a conf filében adatbáziselérés módosítva. A kivesézett 4 soros telefonkönyv függvényt meghívva, az adott node ("?q=node/1") és nem a default bejelentkezés a "node" node jelenik meg. Tehát a form függvény jó, ahogy sejtettem, mert a világ többi részén is működik:)

3.) A jogosultság kezelő modulokra ("http://drupal.hu/node/65#comment-182") gyanaxom, ezért ezeket rakom fel következőnek, hogy ne a jól belőtt rendszert bombázzák szét:
a.) taxonomy_menu.module felrakva, form jól működik
b.) nodeperm_taxonomy.module felrakva, form jól működik
c.) nodeperm_role.module felrakva, a telefonkönyv page eléréseének megadása autentikált és nem autentikált usereknek. A form most már nem a telefonkönyvet hanem a "node"-t hívja meg. A form nem működik! Tehát a hiba a nodeperm_role.module modulban van! Sajnos annyira nem látom át a drupál működését, hogy a táblákból ránézésre lássam, hogy hol a hiba. (adatbázis dumpolva) Visszaállítottam az eredeti jogokat, inaktiváltam és fizikailag elmozgattam a modult hátha visszaáll a rendszer, de nem:( Véglegesen elkefélt valamit.

4.) Modul forráskód (Sajnos nem vagyok profi programozó így nem látom át egészében.): a node_access táblát bolygatja a modul, de mégsincs semmi a node access-ben! Ez hogyan lehet?. (Jó lenne tudni mi volt ott eredetileg, hogy vissza tudjam állítani.) Az is látszik, hogy a case-ben insert-nél rácsurog a vezérlés az update-re!? Ez is fura.

5.) Adatbázis letöröl, újrarak, nodeperm_role.module előtt és után dump, összehasolít...
(1 megjegyzés: a nodeperm_taxonomy modul, amellett, hogy létrehozza a nodeperm_taxonomy táblát letörli "delete from node_access where nid = 0;" a node_access egyetlen bejegyzését a "INSERT INTO node_access VALUES("0","0","all","1","0","0");-t Gyanús.)

6.) A nodeperm_taxonomy modul felrakása után a nodeperm_role.module felrakása előtt jelentkezik a dolog. Az előbb csak a nodeperm_role.module felrakása után jelentkezett. Nagyon furcsa, hogy most már enneél a modulnál jelentkezik a hiba.

7.) GOTO 5 mindenhol dump és hasonlítás.

8.) 3*orra is felraktam a drupal adatbázisát, MOST MÁR EGYBŐL JELENTKEZIK A PROBLÉMA! Egyetlen modul sincs fennt. A telefonkönyv függvényt lebutítottam egytlen submit gombra. A böngésző nem azt az url-t hívja meg amit a felső sorba ír, hanem az alap node-t.

9.) Megnéztem a Drupal fileait, hogy nem írt e vissza valamit a rendszer valamelyik szöveges állományba, de nem. Nincs más hátra le kell gyalulni az egész könyvtárstruktúrát + az adatbázist és megint felrakni.

10.) Megint teljesen újraraktam a rendszert az állományokat és az adatbázist is és megint alapból jelentkezik a probléma. Egy modul sincs fennt, a saját formom mindössze 1 submit gombból áll. Az a fura, hogy a többi form (a gyári drupal űrlapok) működnek. Továbbá furcsa, hogy az újratelepítések után, ugyanazokra az eseményekre nem ugyanaz történt. Mivel minden esetben ugyanannak hívtam az új adatbázist és alkönytárt, utoljára még megpróbálom másnak elnevezni őket.

11.) Most másként hívtam az alkönyvtárat és az adatbázist is, a probléma fenntáll!!

Nem lehet, hogy a hiba nem a Drupalban van? Cashelésben, proxiban, webfilterben, hosts filében vagy bármilyen más környezeti beállításban?

Feladom a harcot, elmegyek kazánfűtőnek:(

Összefoglalás: A

"telefonkonyv();

function telefonkonyv() {
$form .= form_submit('Keresés');
print form($form);
}"

tartalomként beküldve (php kapcsoló bepipálva), a keresés gomb lenyomása után nem a küldő url-t hanem az alap "node"-t hívja meg a rendszer. Többszöri újratelepítés után sem változott a helyzet, sőt ami eleinte működött az később már nem. Elképzelésem sincs, hogy mi okozhat ilyen problémát.

0
0
Hojtsy Gábor képe

Az egész bejövő menü kezelés lényege a menu_execute_active_handler()-ben van elásva (ezt az index.php forrásából lehet megtudni :) Namost ha megnézed, akkor ez a függvény lekéri a q paramétert, és az alapján keres megfelelő menüpontot. Ha nem talál, akkor egyel feljebb lép a menün, és ahhoz keres kezelőt. A node/12 oldalt azért tudja megjeleníteni, mert a node be van jegyezve a menübe, és arra lép vissza, mivel látja, hogy node/12 nincs a menüben közvetlenül. Namost amikor a node megjelenik, akkor az viszont előveszi a számot, és az annak megfelelő tartalmat jeleníti meg. Mindez a node_page()-ben van megvalósítva, ott kellene megnézni, hogy tényleg ki tudja-e választani a view operációt, és itt lehet rájönni a turpisságra!

Megoldás(i ötlet): Namost mivel a form_submit() függvényt használod az űrlap elkészítésére, csak egy paraméterrel, az egy op nevű submit gombot csinál. A node_page() leveszi ezt az opot, melynek Keresés az értéke és látja, hogy erre nincs definiált működés, ezért az alapértelmezést hajtja végre, ami egy sima node összefoglaló oldal. Megoldás, hogy adsz nevet (második paraméter) a submit gombnak, és akkor nem ütközik majd az op vizsgálóval.

Általános tanács, hogy érdemesebb a kérés/adat útját figyelni, mint feltételezéseket tenni a hibára, mert a feltevések általában nem jönnek be. Arra nem tudok választ adni, hogy korábban miért nem volt konzisztens a hibajelenség, mert a kód szerint mindig rossznak kellett volna lennie...

0
0
chx képe

A node/12 oldalt azért tudja megjeleníteni, mert a node be van jegyezve a menübe, és arra lép vissza, mivel látja, hogy node/12 nincs a menüben közvetlenül.

Mint azt a magyar Drupal kézikönyv megfelelő fejezetéből megtudhatjuk, azért tudja megjeleníteni a node/12 oldalt, mert amikor a node/12-t hívod be, akkor éppen be van jegyezve a node/12, ezt most ki is emelem ott...

0
0
kuller képe

Szóval pontosan az volt amit írsz, adtam nevet a submit gombnak és egyből minden működött:)

Nem jöttem volna rá egyedül, már mindenféle deface kémprogramokat vizionáltam, de a megoldás tényleg sokkal 7köznapibb:)

Az ajánlatom áll, amit folyékony tudatmódosítóra is át lehet konvertálni:)

A topik címéhez visszakanyarodva: történhetett valamilyen módosítás ezen a területen (is) a 4.5-ös Drupalban, mert az elődei nem követelték meg a gomb nevét.

Köszönettel:Kuller

0
0