Rules többször tüzel

Lipi képe

Sziasztok!

Adott egy rule, ami a tartalom státusz változása esetén egy levelet küld.

Felvettem egy másik rule-t, ami tartalom módosítás esetén "Egyedi PHP kód hívás"-sal beállított egy mezőt:
$node->field_prioritas['und'][0]['value'] = 'P3';

Ahhoz, hogy a beállított mezőt elmentse a rule, az "Egyedi PHP kód hívása" után az "Entitás mentésé"-t is meghívtam a műveletek között.

Innentől fogva duplán küldte az első rule a leveleket, hiszen egyszer meghívódott a tartalom változásakor, egyszer meg az Entitás mentésekor.

A kérdésem: a rule-ok szintjén hogyan lehet megoldani ezt a problémát?

Most úgy "folytam körül" a jelenséget, hogy egy hook_node_presave callback-be tettem bele a mező beállítását, és letiltottam a második szabályt.

Melyik modulhoz, modulokhoz kapcsolódik a téma?: 
szantog képe

Egyrészt php code-t nem írunk textfieldbe, se rulesban, se máshol - pont az általad írthoz hasonló problémákkal lehet ilyenkor számolni.

Ha mező értékét akarod változtatni, akkor vagy konkrétan a direkt bundle-re kell lőni a rule-t (rule létrehozásánál meg lehet adni Restrict by type-t, vagy conditionként felvenni, hogy Entity has field. Az entitás mentése szintén felesleges, mivel a rules ezt okosan kezeli - kivéve persze ha ilyen php code mezős mellékutak vannak.

Entitás mentése nagyon ritkán indokolt rulesban, egyetlen esetben látom szükségesnek, ha kilépsz a forrás entitásból: Pl node mentésekor egy usert is létre akarsz hozni, na ekkor a usert kell elmenteni.

0
0

----
Rájöttem, miért kérdezek olyan ritkán a drupal.hu-n. Amíg szedem össze az infokat a kérdéshez, mindig rájövök a megoldásra.

Lipi képe

Köszönöm a választ.

"Egyrészt php code-t nem írunk textfieldbe, se rulesban, se máshol..." - kivéve, ha a rules által adott eszközökkel nagysáégreddel bonyolultabb leírni a beállítás feltételeit.

"Entitás mentése nagyon ritkán indokolt rulesban..." - igen, itt a megoldás. Pl. a hook_node_presave a rules-be is "ki van vezetve":

EVENT
Tartalom mentése előtt
Műveletek
Egyedi PHP kód végrehajtása

És így megírva a második szabályt, minden OK.

0
0
nevergone képe

Pedig Gábornak nagyon igaza van. Lehet, hogy Rulesben bonyolultabb valamit összerakni, mint beírni egy PHP kódot, de cserébe nem okoz ilyen és ehhez hasonló mellékhatást.
Vagy ha kódot akarsz írni, akkor a Rules szerepét nem értem: készíts egy modult és kész. :)

0
0
Lipi képe

A jelen esetben a problémát az okozta, hogy a Rule-ban megadott szabály EVENT-je "Tartalom módosítása után" volt, nem pedig "Tartalom mentése előtt". Teljesen mindegy, hogy a mező beállítása feltételekkel vagy egyedi PHP kóddal történt.

1
0
szantog képe

Ez valahogy ne maradjon már itt megoldásként..

Amikortól php kódot kell írni egy bármilyen, textfieldbe - ott már valami baromira el van baszva.

A rules minden eszközt a segged alá tol, amivel lehet dolgozni, csak tudni kell használni - szerintem korábban el is mondtam, hogyan.

0
0

----
Rájöttem, miért kérdezek olyan ritkán a drupal.hu-n. Amíg szedem össze az infokat a kérdéshez, mindig rájövök a megoldásra.

Lipi képe

Nagyképű, udvariatlan... és obszcén.

0
0
nevergone képe

Stílusa van - olyan, amilyen - de vedd már észre, hogy segíteni akar neked. Fent konkrét tanácsokat adott. Nem minket szívatsz meg, hanem magadat, ha egy hosszabb távon problémás megoldás rögzül benned. Gábor évek óta üzemeltet nagy terhelésű weboldalakat, így ha javasol valamit, azt érdemes megfontolnod.

Mondok konkrét példát: ha a fenti kódba valamiért szintaktikai hiba kerül, akkor jó eséllyel úgy száll el az oldalad, hogy csak adatbázis-piszkálással tudod helyreállítani.

Amúgy meg a te oldalad: ha rám hallgatsz, azt csinálsz, amit akarsz.

1
0
szantog képe

és elnézést kérek! Tényleg nyers vagyok, amikor valami custom vudu szembe megy a józan ésszel, illetve egy modul normál használatával.

A rules az entity apira épül, technikailag minden entitáson végzett rules művelet egy entity_metadata_wrapper(). Amikor php kódot írsz egy rules mezőbe, pontosan ezt a funkciót nyírod ki.

Egy példa: Ha netán később mezőszintű többnyelvűsítésre lesz szükség az oldalon, a fenti php kódod simán rossz értéket fog beállítani.

Másik példa: 5 év múlva upgradelni kell a siteot drupal 9-re. Szinte 1000% hogy a php kódod el fog hasalni, és lesz sok óra pislogással töltött debug, hogy mi a gáz, ugyanis hótzicher, hogy egy textareaba írt php kód hiba fog utoljára eszébe jutni annak, aki ezzel szenved.

Ha rendesen, 'rules módon' csinálod a dolgokat, akkor a többnyelvűsítéssel sem lesz problémád + jó eséllyel a rules fejlesztői fogják helyetted megírni az upgrade-et.

Ha drupalt használsz, akkor drupalul kell tudni, nem phpül.

3
0

----
Rájöttem, miért kérdezek olyan ritkán a drupal.hu-n. Amíg szedem össze az infokat a kérdéshez, mindig rájövök a megoldásra.