A Drupal globális base_url változója és a www redirect probléma
A Drupal-nak van egy globális változója, melynek a funkicója az, hogy visszadja azt az URL címet ahol a telepített CMS-ünk aktuálisan el van helyezve.
Ennek a lényege az, hogy pl. ha a fejlesztés egy már meglévő domain egy alkönyvtárában zajlik, akkor a site élesítésekor ne történjen semmilyen probléma. Gyakorlatilag a telepített Drupal-t akárhova pakolhatjuk, a képek elérései és az oldal elérések nem változnak.
Ez a változo a
-
<?php
-
$GLOBALS['base_url'];
-
?>
Ha ezt használjuk akkor mondjuk egy kép, vagy egy oldal eléréshez nem kell beledrótóznunk a fejlesztéshez használt alkönyvtár nevét.
Ha a Drupal pl. a root/ujweboldal könyvtárban van, akkor ha egy oldal elérését így adjuk meg:
-
<a href="/kapcsolat">Kapcsolat</a>
akkor nem a root/ujweboldal/kapcsolat oldal fog bejönni, hanem a root/kapcsolat. Ez pedig komoly problémékat okozhat.
Ezt elkerülendően általában a következő eljárást szoktuk alkalmazni:
-
<a href="<?php print $GLOBALS['base_url'] ?>/kapcsolat">Kapcsolat</a>
Ekkor akárhova helyezzük az oldalt müködni fog az elérés.
Viszont felmerült egy probléma ha az oldalt át akarjuk irányítani a www nélküli címéről a www-s címére.
Ez azt jelenti, hogy beállítunk egy olyan redirect-et, hogy a http://example.com automatikusan menjen át a http://www.example.com címre.
A probléma a form-ok feldolgozásánál jelentkezik!
-
<form action="<?php print $GLOBALS['base_url'] ?>/form-feldolgozas" method="post"></form>
A jelenség az, hogy a felhasználó megérkezik az oldalra és kitölti a űrlapot, majd a submit eseményt követően nem történik meg a mentés mert az adatok nincsenek benne a $_POST tömbbe. Elkedztem újra végignézni a folyamatot, hogy hol vesznek az értékek.
Észrevettem, hogy a form action paraméterében a $GLOBALS['base_url'] változó miatt az URL www nélküli címe szerepel, emiatt a $_POST adatok a domain www nélküli oldalára mennek át.
Ekkor a következő történik: az action meghívja a www nélküli oldal elérését, a redirect továbbdobja a www-s címre és közeben már nem szerepelnek az adatok a $_POST tömbben, mivel a síma, www nélküli elérésre lettek elküldve. Tehát a redirect miatt elvesztek.
A megoldás az, hogy a form-ok action paraméterében, nem a $_GOLBALS['base_url'] változót adjuk meg, hanem a Drupal beépített url() fgv-ét, mely nem a teljes URL címet adja vissza, hanem a telepített Drupal root könyvtárát.
Tehát a $_GLOBALS['base_url'] helyett a form-ban a következőt alkalmazzuk:
-
<form action="<?php print url('form-feldolgozas') ?>" method="post"></form>
Hogy szemléltessem a kettő közötti különbséget hasonlítsuk össze a két kód HTML kimenetét:
-
<form action="<?php print $GLOBALS['base_url'] ?>/form-feldolgozas" method="post"></form>
-
<form action="<?php print url('form-feldolgozas') ?>" method="post"></form>
-
<form action="http://example.com/ujweboldal/form-feldolgozas" method="post"></form>
-
<form action="/ujweboldal/form-feldolgozas" method="post"></form>
