Archive for July, 2008

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

  1. <?php
  2. $GLOBALS['base_url'];
  3. ?>

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:

  1. <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:

  1. <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!

  1. <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:

  1. <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:

  1. <form action="<?php print $GLOBALS['base_url'] ?>/form-feldolgozas" method="post"></form>
  2. <form action="<?php print url('form-feldolgozas') ?>" method="post"></form>
  1. <form action="http://example.com/ujweboldal/form-feldolgozas" method="post"></form>
  2. <form action="/ujweboldal/form-feldolgozas" method="post"></form>

Olyan oldalaknál ahol egy bizonyos node tipushoz sok beviteli mező tartozik elvárás lehet, hogy ne kelljen minden módosításnál lemenni a lap aljára.

A logikus megoldás az, hogy az ENTER gomb lenyomásával jelzi a felhasználó, hogy végzett a tartalom módosításával, feltöltésével.

Az eseményt a jQuery JavaScript könyvtárral könnyen meg lehet oldalni, utána pedig már csak egy nagyon egyszerű Drupal modult kell hozzá írni, és minden olyan weblapon alkalmazni lehet ahol szükség van rá.

Íme a JavaScript fájl amint majd hozzárendelünk az oldalhoz:

  1. var writing   = false;
  2. var node_edit = false;
  3.  
  4. $(document).ready(function() {
  5.  
  6.   if ($('#node-form').length) {
  7.     node_edit = true;
  8.   }
  9.  
  10.   if (node_edit) {
  11.     $('.form-textarea', $('#node-form').parent()).focus(function() {
  12.       writing = true;
  13.     });
  14.     $('.form-textarea', $('#node-form').parent()).blur(function() {
  15.       writing = false;
  16.     });
  17.   }
  18. });
  19.  
  20. $(document).keypress(function(event) {
  21.   if (event.keyCode == 13 && !writing && node_edit) {
  22.  
  23.     if (confirm_submit()) {
  24.       $('#edit-submit', $('#node-form').parent()).click();
  25.     }
  26.   }
  27. });
  28.  
  29. function confirm_submit() {
  30.   var agree = confirm("Valóban menti a tartalom változásait?");
  31.   if (agree) {
  32.     return true ;
  33.   } else {
  34.     return false ;
  35.   }
  36. }

Menjünk végig a kódon, mi miért van!

Először is a writing változó, a node_edit változó és az oldal betöltésekor lefutó fgv-ek, vagyis a $(document).ready(function()).
A writing változó azért fontos, mert az ENTER lenyomása esetén nem feltétlenül a tartalom szerkesztésének befejeztét jelzi a felhasználó, hanem esetlegesen éppen egy olyan szöveget gépel be, amiben van sortörés. Az pedig elég nagy gond lenne, ha nem lehetne több sort bevinni egy node-ba :-)
Ezért aztán létrehozzuk a writing bool tipusú változót alapértelmezetten hamisra állítva, és figyelve az eseményeket változtatjuk, hogy éppen gépelés történik vagy sem.
Az odlal betöltődésekor a form-textarea osztályokhoz hozzárendeljük a focus() és blur() fgv-eket.
Amikor egy textarea-ba bekattint (focus) a felhasználó a writing változó értéke igazra változik, amikor elhagyja (blur) hamisat vesz fesz vel.
A node_edit bool tipusú változót azért hozzuk létre, mert a későbbiekben a hook_form_alter()-t fogjuk használni a js beépítésére, ez azonban nem csak a node-ok szerkesztésénél fut le, hanem például a felhasználók kezelési felületén is. Ezért megvizsgáljuk, hogy a node-form létezik-e, és csak akkor futtatjuk a kódót ha igen.

A billentyű lenyomása, a keypress(function).
Ezt magához az oldalhoz ($(document)) kell hozzárendelni, hiszen nem valamely beviteli mezőt figyeljük.
A fgv paramétere az event változó, ez tartalmazza a billentyűlenyomás tulajdonságait.
A keyCode a lenyomott billentyű ID-ját tartalmazza ami egy egész. Az ENTER gomb kulcsa a 13-as szám.
Emiatt a feltételben megvizsgáljuk, hogy a 13-as kódszámmal rendelkező billentyű lett-e lenyomva (ENTER), és hogy éppen folyik-e a gépelés (writing változó).
Ha a feltételnek megfelelőek az értékek és a felhasználó megerősítette (confirm_submit), hogy befelyezte a szerkesztést akkor végrehajtjuk a node mentését.

Lehetséges, hogy a

  1. $('#edit-submit', $('#node-form').parent()).click();

sor egy kis magyarázatra szorul.

Az node-form a form id attributuma.
Gondolhatnánk a legegyszerűbb meghívni a submit eseményt a submit() fgv-el. A probléma az, hogy a node szerkesztési felületén három submit gomb van: beküldés, előnézet, törlés. Emiatt a submit esemény nem egyértelmű, hiszen mind a három gomb, ugyanannak a form-nak a submit gombjai, és mindegyik mást csinál. Emiatt nem történik semmi.
A következő gondolat az, hogy oldajuk meg a problémát az edit-submit id-jú gomb click esemény meghívásával.
Ezzel a gond az, hogy a Drupal beépített form-jainak mind ez az azonosítója. Így pl ha engedélyezve van a search modul akkor annak a submit gombaja is ugyanezzel az id-val rendelkezik, tehát könnyen előfordulhat, hogy az enter lenyomása mondjuk keresést eredményez, nem pedig a tartalom elmentését.
Ezért magában a form-ban kell megkeresnünk a megfelelő gombot, viszont form-on belül nem lehet html objektumot keresni, ezért a form-ot körülölelő div-ben kell megtennünk.

Az utolső fgv. a megerősítés, vagyis rákérdez a felhasználótól, hogy valóban mentsük-e a tartalmat.

Ez a jQuery megvalósítás működik, mostmár csak be kell építeni a site-ba.

Mivel ennek a JavaScript-nek csak és kizárólag a node szerkeztési felületén kell megjelnnie, így a hook_form_alter()-t a legérdemesebb használni.

A modulunk, tehát az .info fájlon kívül ennyi:

  1. <?php
  2. /**
  3.  * hook_form_alter().
  4.  */
  5. function enter_node_submit_form_alter($form_id, &$form) {
  6.   drupal_add_js(drupal_get_path('module', 'enter_node_submit') .'/enter_node_submit.js');
  7. }
  8. ?>

A modul letölthető innen:
enter_node_submit.module

Ebben a bejegyzésben a viral marketing megvalósításáról fogok írni egy rövid leírást.
A MarketingSzoftverek MailMaster szoftverét használva nagyon egyszerűa viral marketing alkalmazása.

A későbbiekben fogok írok majd egy részletesebb cikket is, amiben egy konkrét Drupal modulon keresztül mutatom be ennek a nagyon egyszerű ám annál hatékonyabb rendszernek a lényegét.

Először: mi is az a viral marketing és mire jó?

A rendszer egy nagyon egyszerű és ingyenes módszer a weboldal, blog, cikk vagy akár feliratkozó form látogatottságának növelésére. Azon kívül, hogy ingyenes és hatékony másik nagy előnye az, hogy egyből a célközönséget, a potenciális érdeklődőket veszi célba.

A rendszer lényege, hogy miután valakit meggyőztünk arról hogy adja meg email címét és iratkozzon fel a levelezőlistára, saját maga ajánlhatja az oldat ismerőseinek barátaink, olyan embereknek akikről úgy gondolja szintén érdekelheti az adott oldal.

Így ha valaki ajánl nem egy, hanem akár három-négy feliratkozót is nyerhetünk, akik szintén továbbküldik az oldalt.

Viral marketing ábrázolása

 

Az ábra remekül szemlélteti a viral marketing hatékonyságát.

Megvalósítás MailMaster segítségével

Először létre kell hozni egy új levelezőlistát, ebbe fognak bekerülni az ajánlott emberek. Az alapértlemezett mezőkön kívül vegyük fel az alábbi mezőket:

 

Ismerős keresztneve ismeros_keresztnev Rövid szöveges  
Ajánló email címe ajanlo_email Rövid szöveges  
Ajánló keresztneve ajanlo_keresztnev Rövid szöveges  
Kimenőüzenet szövege uzenet Hosszabb szöveg  
Ajánló vezetékneve ajanlo_vezeteknev Rövid szöveges

Természetesen más mezőket is létre lehet hozni attól függően, hogy milyen információkat akarunk letárolni.

Ezután látrehozunk egy text levelet aminek a szövege egyszerűen ennyi:

[uzenet]

Tehát az üzenet lényegében egy feliratkozáskor megkapott érték.

Ezek után a levélhez beállítunk egy időzítést az előbb létrehozott lista feliratkozására.

A feladó [ajanlo_vezeteknev] [ajanlo_keresztnev] a feladó email címe: [ajanlo_email] a tárgy amit akarunk pl: “Te is véteknek tartanád kihagyni?”, de akár külön létrehozhatunk a tárgynak is egy mezőt!

Innenstől kezdve a MailMaster autamatikusan kezeli a továbbajánlásokat!
Mostmár csak a php kódot kell megírni hozzá és működik a rendszer!

De először nézzük meg a folyamatot!

Kell egy feliratkozó form, amin keresztül a felhasználó bekerül a levelezőlistába:

 

Feliratkozó form

 

A submit folyamat után a felhasználó átkerül a viral oldalra:

Viral oldal

Itt van egy nagyon fontos dolog!

Amikor a felhasználó erre az oldalra kerül már itt fel kell dolgozni a levelezőlistába való bekerülését! (Nyilván nem az ajánló listába hanem fő levelezőlistába, amivel email marketingelünk)

Ennek az oka az, hogy sok ember nem ajánl és Ők 90%-ban amikor erre az oldalra kerülnek tovább is mennek azt gondolva a feliratkozásuk siekres volt. Ha nem kezeljük már itt a listába való bekerülést, akkor nemhogy több embert szerzünk, hanem még veszítünk is.

Tehát a lista feliratkozást és a viral rendszert el kell különíteni!

Ezután jöhet a feliratkozást biztosító php kód, azaz a MailMaster API

  1. <?php
  2. if ($_POST['ajanlo_email']) {
  3.  
  4.   for ($i = 0; $i<5; $i++) {
  5.     if ($_POST["ismeros_email_$i"]) {
  6.       $uzenet = preg_replace("/\[ismeros_keresztnev]/i", $_POST["ismeros_keresztnev_$i"], $_POST['uzenet']);
  7.       $uzenet = preg_replace("/\[ajanlo_keresztnev]/i", $_POST['ajanlo_keresztnev'], $uzenet);
  8.       $uzenet = preg_replace("/\[weboldal_cime]/i", $_POST['weboldal_cime'], $uzenet);
  9.  
  10.       $param = array(
  11.       'mssys_formid'         => 'a-form-azonositoja',
  12.       'email'                => $_POST["ismeros_email_$i"],
  13.       'ismeros_keresztnev'   => $_POST["ismeros_keresztnev_$i"],
  14.       'ajanlo_keresztnev'    => $_POST['ajanlo_keresztnev'],
  15.       'ajanlo_vezeteknevnev' => $_POST['ajanlo_vezeteknevnev'],
  16.       'ajanlo_email'         => $_POST['ajanlo_email'],
  17.       'uzenet'               => $uzenet
  18.       );
  19.  
  20.       $stringParam = base64_encode(gzdeflate(serialize($param)));
  21.       $remoteURL = "http://www.marketingszoftverek.hu/newsletter/remote-subscribe-id.php?d=$stringParam";
  22.       if (!($fp=fopen($remoteURL, "r"))) {
  23.         echo "Could not open the URL";
  24.         exit;
  25.       }
  26.  
  27.       $feliratkozasOK = '';
  28.       while (!feof($fp)) {
  29.         $feliratkozasOK .= fread($fp, 8192);
  30.       }
  31.       fclose($fp);
  32.     }
  33.   }
  34. }
  35. ?>

Ezután a viral marketingel továbbajánlott emberek bekerülnek a viral-nak létrehozott email listába és a feliratkozásra beállított levél autamatikusan kimegy.
Mivel az üzenet szövege a php oldalon személyre szabottan le lett cserélve így mindenkinek más lesz az üzenete, és az ajánló adataival kerülnek elküldésre a levelek.