De tots és conegut que el
camp calculat de cck és molt útil per guardar a la base de dades valors calculats en funció d'altres valors. El problema que té és que només es recalcula el valor quan s'edita el node en el que hi ha el camp calculat. Una forma que tenim per solucionar aquest problema és mitjançant el mòdul
rules (regles).
El mòdul rules és l'evolució del
workflow ng (workflow next generation), un mòdul que ja en el seu moment va ser tota una revolució. Rules és, doncs, el mòdul que heu de fer servir a drupal 6.x si necessiteu crear fluxes de treball diversos. Un flux de treball és un seguit d'accions determinades. Un flux de treball es pot executar en un moment concret, és a dir, quan una altra acció o event, anomenada disparador, ha tingut lloc. A cada acció del flux de treball se li pot aplicar, també, una o diverses condicions, de manera que només s'executarà si es compleixen totes les condicions.
En el nostre cas, doncs, el que necessitem és crear una regla que, quan es compleixi unes determinades condicions, un node determinat es carregui i es torni a guardar (acció d'actualitzar un node) perquè es recalculi el camp calculat que inclou. Aquest és el procés.
Per crea una nova regla aneu a admin/rules/trigger i feu clic a la pestanya *Add new rule*.
Afegiu el nom de la vostra regla al camp *Label*
[img_assist|nid=312|title=|desc=|link=none|align=none|width=542|height=112]
Després heu d'especificar el disparador que farà que aquesta regla, aquest flux de treball o conjunt d'accions, es posin marxa. Nosaltres volem que el camp es recalculi quan el node que conté el camp calculat estigui a punt de visualitzar-se. Veuràs el camp *Event*.
[img_assist|nid=313|title=|desc=|link=none|align=none|width=342|height=71]
Si hi fas clic es desplegarà una llista de possibles disparadors, que pot ser més o menys llarga en funció dels mòduls que tinguis activats i que incorporin un disparador per *rules*. selecciona l'event *Content is going to be viewed*.
[img_assist|nid=314|title=|desc=|link=none|align=none|width=327|height=448]
Tot seguit veuràs una pantalla d'administració d'aquesta nova regla, amb un apartat *Rule elements* que inclourà les condicions per les quals aquesta regla s'executarà i les accions concretes que farà.
[img_assist|nid=315|title=|desc=|link=none|align=none|width=393|height=221]
Fes clic a *Add a condition* per afegir una condició. Veuràs el formulari per afegir una condició.
[img_assist|nid=316|title=|desc=|link=none|align=none|width=276|height=176]
Si fas clic al camp *Select the condition to add* tornaràs a veure un desplegable amb les condicions disponibles. Volem que aquesta regla només s'executi si el tipus de contingut és del tipus que conté el camp calculat. No té cap sentit que s'executi quan estiguem a punt de veure un tipus de contingut que no conté cap camp calculat.
selecciona *Content has type* i fes clic a *Next*
[img_assist|nid=317|title=|desc=|link=none|align=none|width=256|height=349]
Accedeixes a la configuració d'aquesta condició. Cada condició té una etiqueta amb un valor per defecte que pots canviar, una configuració d'arguments i uns paràmetres determinats i que poden ser únics de cada condició. En aquest cas la pantalla és la següent
[img_assist|nid=318|title=|desc=|link=none|align=none|width=504|height=640]
Ara només cal que seleccionis el tipus de contingut que tingui el camp calculat i guardis la configuració fent clic al botó del peu del formulari.
Ara veuràs la pantalla de configuració principal de la regla amb una condició nova. Sota de l'apartat *IF* (si condicional) hi ha les condicions i sota de l'apartat *DO* (fer) hi ha les accions.
[img_assist|nid=319|title=|desc=|link=none|align=none|width=386|height=271]
Pots continuar afegint més condicions, si vols, o afegir una acció. Dependrà del tipus de càlcul que facis que et convindrà afegir més condicions o no. Per exemple, podries tenir un càlcul que segons una condició determinada el resultat fos null o en blanc, o que donés un resultat determinat si encara no es pogués fer el càlcul en el moment de crear el node (per exemple si necessites l'nid del node que s'està guardant). En aquest cas et convindria tenir una condició que digués 'recalcula el camp si el valor del camp és buit' o 'recalcula el camp si el valor del camp és x'.
Si no hi afegeixes cap més condició has de tenir present que cada vegada que es vegi un node del tipus que has seleccionat abans es farà el càlcul, i ho has de tenir en compte per si el càlcul en concret fos més o menys complex i pogués col·lapsar el sistema. Imagina't que has fet una vista amb views que llista els títols dels nodes d'aquest tipus i que la llista mostra els 50 primers títols. Això implicaria 50 recalculacions per cada pantalla mostrada. Si tens poques visites potser no és important però si en tens moltes, i el càlcul és complex, ho podria ser.
Ara hem d'afegir l'acció de guardar el node que estem a punt de veure. Quan drupal està a punt de mostrar un node, primer l'ha hagut de carregar, per tant ara no cal que li diguem que ho faci, ja el té carregat. Fes clic a l'*Add an action* de sota del *DO*.
Al desplegable del camp *Select an action to add*, selecciona *Save a content*
[img_assist|nid=320|title=|desc=|link=none|align=none|width=361|height=437]
Veuràs el formulari de configuració de l'acció que, com en el cas de les condicions, pot ser diferent en funció del tipus d'acció que triïs. A l'apartat de configuració de l'argument selecciona *viewed content* i desa el formulari.
[img_assist|nid=322|title=|desc=|link=none|align=none|width=256|height=124]
Arribats a aquest punt, la regla ja fa el càlcul cada vegada que es mostra el node, però hem d'afegir una darrera acció, la de tornar a carregar el node. Per què? Molt simple, perquè el node que té carregat el drupal en aquest punt és el que no conté el càlcul fet. El càlcul s'ha regenerat en guardar el node, que s'ha fet DESPRÉS de carregar-lo, per tant, el càlcul que veurem per pantalla correspondrà a la càrrega anterior. Si volem, doncs, veure el càlcul actualitzat, hem de tornar a carregar el node, que serà el que s'acabarà mostrant.
Afegim, doncs, una nova acció i al camp desplegable seleccionem *Load content by id*.
[img_assist|nid=323|title=|desc=|link=none|align=none|width=362|height=470]
Fem clic a *Token replacement patterns* i després a *Replacement patterns for viewed content*.
[img_assist|nid=324|title=|desc=|link=none|align=none|width=516|height=426]
Veuràs les opcions de què disposes. La que ens interessa és [node:nid]. Això és el que has de col·locar al camp *Content ID*.
[img_assist|nid=325|title=|desc=|link=none|align=none|width=232|height=59]
El que li estem dient és que faci servir l'nid del node, que estem veient, com a argument per tornar a carregar el node. Ja pots guardar el formulari.
Ara sí que tindrem el node amb el càlcul que acabem d'actualitzar i es mostrarà amb el càlcul actualitzat.
Com hauràs pogut veure, el mòdul rules és un mòdul molt potent que ens permet moltes possibilitats. No tinguis por a jugar amb ell i a treure-li el màxim profit.
Si mai tens problemes i no estàs segur de si està funcionant correctament, el mòdul disposa d'una opció de configuració per a depurar errors i et mostra un registre d'accions a l'àrea de missatges de la pàgina web. Aquesta n'és una mostra del registre de la nostra acció, amb una condició més (comprova que el camp field_alimentador estigui buit)
[img_assist|nid=326|title=|desc=|link=none|align=none|width=493|height=239]