A Trigger modul használatának előnyeiről és hátrányairól.

A Drupal hatosban mutatkoztak be a Trigger és Action modulok (csak a Trigger modult kell bekapcsolnunk az Action a beépült a rendszerbe). A két modul segítségével könnyedén alakíthatunk ki munkameneteket a Drupal rendszerünkben. A triggerek különböző események amelyek bekövetkeztekor valamilyen akciót vagy akciókat hajthatunk végre.
A tanfolyamaimon mintapélda szokott lenni, hogy a névtelen felhasználónak engedünk hírt beküldeni. Én ilyenkor azt szoktam csinálni, hogy létrehozok egy új tartalom típust felhasználói hír néven. Ennél a tartalom típusnál beállítom, hogy alapértelmezetten ne legyen közzétéve. Ezután már csak a jogosultságoknál kell jogot adni a névtelen felhasználónak a felhasználói hír létrehozására. Nem kell félnünk, mert a beküldött hírek nem kerülnek publikálásra, hisz csak a tartalmak adminisztrációja joggal rendelkező felhasználónak van ilyen beállítási lehetőség a tartalom beküldő űrlapon. Ez a megoldás már működőképes de igazából használhatatlan. Egyrészt nekünk árgus szemmel figyelni kell, hogy jött-e új tartalom, másrészt a felhasználónak a beküldés után egy hozzáférés megtagadva üzenet jelenik meg. Az üzenet nem véletlenül jelenik meg, hisz beküldés után a beküldött tartalmat mutatná a rendszer. A baj csak az, hogy az éppen beküldött tartalom nincs közzétéve, ezért az nem látható. Mindkét problémára megoldást tud nyújtani a két fent nevezett modul. Először létrehozunk egy akciót, ami levelet küld nekünk. Másodszor létrehozunk egy köszönő oldalt, majd egy olyan akciót, ami erre az oldalra irányít át. Ezután a két akciót hozzákapcsoljuk a tartalom beküldése eseményhez/triggerhez. Már kész is vagyunk. Kényelmesen hátradőlünk a székünkben és élvezzük a Drupal Csodálatos Világát.
Igen ám de később valószínűleg észrevesszük azt a kellemetlenséget, hogy a triggert nem tudjuk úgy beállítani, hogy csak bizonyos tartalom típusokra legyen érvényes, sem azt, hogy csak bizonyos felhasználókra vagy csoportokra hajtódjon végre az akció. Ezért aztán minden beküldött tartalom után megköszönjük saját magunknak a beküldött tartalmat. Ez egy apró kellemetlenség amivel együtt kel élnünk.? (megoldási javaslatokat várom)
A másik kellemetlenséggel akkor találjuk magunkat szembe, amikor a hozzászólásokról szeretnénk értesítést kapni. A rendszer ugyan lehetővé teszi, hogy küldjünk e-mailt hozzászólás érkezésekor, de a hozzászólás adataihoz nem férünk hozzá. Csak olyan semmitmondó leveleket tudunk kiküldeni, amiben pusztán az van benne, hogy melyik bejegyzéshez érkezett a hozzászólás. Sem a beküldő, sem a hozzászólás tartalmára vonatkozólag nem tudunk semmi információt küldeni. A legfurcsább az, hogy a trigger átadja az akciónak a hozzászólás adatait, de az nem kezd vele semmit. Küldtem be rá issue-t de többek ezt nem hibának, hanem egy új szolgáltatásnak fogják fel ezért a hatosba nem valószínű, hogy bekerül. Nem kell azonban aggódnunk, mert a megoldás nagyon egyszerű. Mint mondtam az adatok átadódnak az akciónak de az nem csinál vele semmit. Olyannyira nem csinál vele semmit, hogy a levél küldéséhez egyszerűen hozzácsapja, így egy ügyes mail_alter-el kijavíthatjuk a hibát.
Hozzunk létre először egy comment_action_mail.info fájlt és másoljuk bele a következőt:

  1. name = Comment mail action
  2. description = Add comment data to action mail
  3. core = 6.x

Ezután hozzunk létre egy comment_action_mail.module nevű fájlt a következő tartalommal:

  1. <?php
  2. function comment_action_mail_mail_alter(&$message) {
  3. if ($message['id'] == 'system_action_send_email') {
  4. if (isset($message['params']['context']['comment'])) {
  5. $comment = $message['params']['context']['comment'];
  6. $tr = array(
  7. '%comment_subject' => drupal_html_to_text($comment->subject),
  8. '%comment_body' => drupal_html_to_text(check_markup($comment->comment, $comment->filter)),
  9. '%comment_username' => drupal_html_to_text($comment->name),
  10. '%comment_delete_url' => url('comment/delete/'.$comment->cid, array('absolute'=>TRUE)),
  11. '%comment_edit_url' => url('comment/edit/'.$comment->cid, array('absolute'=>TRUE)),
  12. );
  13. foreach ($message['body'] as $key => $val) {
  14. $message['body'][$key] = strtr($val, $tr);
  15. }
  16. }
  17. }
  18. }

No ekkor kész is vagyunk, most már a fenti öt százalékjellel jelölt szövegrészt használhatjuk is a magunknak küldött üzenetekben. Amire még oda kell figyelnünk az az, hogy a levélküldő akció beállításakor nincs lehetőségünk szűrőket állítani. Így lemondhatunk a sortörés átalakítóról ami a soremeléseinket <br> tagokra cseréli. Ez azért gáz, mert a drupal_html_to_text() az összes soremelést és szóközt kidobálja a levelünkből. Tehát csak úgy tudunk normális leveleket küldeni magunknak, ha az üzenet beállításainál a megfelelő HTML kódokat használjuk. Pl.:

  1. <h1>%title</h1>
  2. %comment_username<br>
  3. <p>
  4. %comment_body
  5. </p>

Remélem hasznos volt ez a kis írás. Biztos ami biztos csatoltam a modult, hátha valakinek túl bonyolultak a fent leírtak.

CsatolmányMéret
Package icon comment_action_mail.zip958 byte

Hozzászólások

Lehet saját triggereket meg action-öket is csinálni. Ott nem lehet valami hasonlót?

Lehet, sőt az adott szituációban kell is. ;) A baj az, hogy igen egyszerűek a beépített akciók és triggerek. Bizonyos feladatokra tök jók, bizonyosakra meg nem. Vannak olyan részei amik jól átgondoltak és vannak olyan részei amik nem. Van ugyan egy hook_action_info_alter de azzal átírni nem tudod az akciót, mert a kulcs maga az akciót végrehajtó függvény. Tehát nincs más hátra mint írni egy sajátot. Lásd Workflow modul. Az első probléma tekintetében az érdekel, hogy valaki használt-e valami olyan modult, amivel a fenti munkamenet picit kezesebbé tehető.
A második problémára pedig a csatolt modul egy megoldás. Az más kérdés, hogy szerintem ez egy olyan hibás működés, amit javítani kéne a system modulban. (ezért is született a folt)
Saját akciót ebben az esetben felesleges csinálni.

pp

Mikorra várható a BlogAid modul következő verziójának megjelenése? Van egy dolog, amit úgy terveztem, hogy "belefejlesztem", de mostanság nincs rá időm, illetve egyelőre CVS hozzáféréssel sem rendelkezem.

Nemsokára. A 2.x-dev nemsokára megjelenik. Javaslom, hogy a kívánságaidat told be az issue queueba, vagy írj levelet. Készíts foltot inkább, mert a CVS-be addig nem tudsz commitolni úgy se amíg nem leszel a modul társszerzője.

pp

Elvileg összekopácsoltam egy issue-t, remélem használható. :)
A tartalmaknál a hozzászólások és trackback-ek tömeges tiltását/engedélyezését szeretném kérni.

koszi PP, mar fel is raktam a blogomra ;)

Köszi szépen a leírást! Kipróbáltam, bele is futottam egy érdekes problémába:
saját tartalomtípust küldtem be névtelen felhasználóként. Ez sikerült is, a köszönő oldal pedig megjelent.
Adminként megnéztem az új tartalmat, annak viszont csak a címe lett elmentve, maga a tartalom üres, nem jelenik meg semmi a címen kívül. Ha szerkeszteni akarom, lehet, de üres az összes mező.
A triggert kikapcsolva minden OK. Összefüggésben lehet ez a CCK multigroup moduljával? Ez az egyetlen "nem standard" modulom...

Mit jelent számodra a nem standard? A CCK is egy nem core modul, de azt Te standardnak tekinted? Szerintem van még fent ott egy pár modul ami bezavar. Az alaprendszer és alaprendszer szükséges modulokon kívül az összes modul érdekes lehet. (Tiny vagy FCK pl.)

pp

Hát csak annyit, hogy a multigroup kísérleti és még fejlesztés alatt áll, ill. nem ajánlják éles használatra. Ezen kívül email, filefield, imageapi, imagecache, imagefield, lightbox, token és views modulok vannak fenn (Tiny és FCK nincsenek).

Ki kéne próbálni egy teszt oldalon, hogy mikor jön elő a hiba. Tehát szépen elkezdeni CCK nélkül működik-e. Utána bekapcsolni a CCK alap moduljait, hozzáadni egy pár mezőt és így is megvizsgálni. És így tovább, amíg ki nem jön a hiba. Akkor ezt leírni és beküldeni issue-ként a drupal.org-ra. Szívesen segítek, ha eljutsz eddig.

pp

Oké, köszi, hamarosan rászánok egy kis időt, aztán jeentkezem.

zoli

A hamarosan sajnos több mint egy hónapig tartott. De megvan a nyavalyás:)
1. Létrehoztam egy Redirect to URL akciót és ezt hozzárendeltem a node beküldése trigggerhez.
2. Ezután beküldtem egy új tartalmat (saját tartalomtípus cím és törzs mezőkkel).
3. Beküldtem egy új tartalmat, a redirect működik, a tartalmat elmentette.
4. Bekapcsoltam a Content és a Text modulokat, hozzáadtam egy szöveg mezőt a tartalmamhoz.
5. Beküldtem egy újabb tartalmat, a redirect működik, a tartalom létrejött, de a CCK-s szöveg mező tartalma üres. Az adatbázisban is.
6. a triggert kikapcsoltam, új tartalom létrehozása után minden a megfelelő módon működik.
7. kipróbáltam még a number, email és filefield modulokat is, az általuk létrehozott mezők tartalma bekapcsolt trgiggerel az elmentéskor törlődik.

Trigger modult tegyük a végére. A system táblában keresd meg a Trigger modul sorát. Ebben a sorban találsz egy weight mezőt, ami nulla ezt egy tetszőleges nagy számra írd át.

Kb.:

  1. UPDATE system SET weight=10000 WHERE name = 'trigger';

Van egy Module Weight modul, de az csak ötöshöz elérhető.

pp

Ez így már működik. A trigger modul weight mezejének átállítása után a beküldött tartalom helyesen lett elmentve.

Egyébként hatos alatt a Utility modul tudja azt, amit a Module Weight az ötösben.

Üdv!

Sikerült már valami megoldást találni arra a problémára, hogy nem lehet a triggereket egyéni tartalom típusra beállítani?
Nekem is csak annyi kellene, hogy ha beküldtek egy tartalmat az adott típusból, akkor arról kapjak egy levelet.
Még annyi, hogy a felhasználó ne kapjon nincs jogosultságos üzenetet...

Atis

Megoldás van. Használd a Rules modult hatoson, vagy a Workflow NG modult ötösön.

pp

Szia!

Megpróbáltam az általad írtakat átültetni saját oldalamra, de még nem sikerült.
Létrehoztam egy saját tartalomtípust, melyből nekem többek közt kéne a beküldő email címe, hogy visszaigazolást tudjak küldeni. A modulodban a "comment" szöveget "link"-re írtam, mert az a tartalomtípusom neve. CCK és Email modul segítségével létrehoztam egy email mezőt a tartalomhoz. Ez kéne hogy eljöjjön nekem az emailben. A %link_email nem működik, mert az emailcím nem jön. A trigger súlyát beállítottam, ahogy fent írtad.

Drupal6-ot használok.

Nincs valami ötleted?

Új hozzászólás