Mező értékének meghatározása valamilyen feltétellel

mpety képe

Üdv Mindenkinek!

A következő a problémám (7-es Drupal):
Van egy tartalomtípusom és annak van egy mezője (egész szám típusú). Azt szeretném elérni, hogy ebbe a mezőbe csak olyan értékeket lehessen megadni amelyek nagyobbak a már eddig ugyanazon felhasználó által létrehozott (és jelenleg létező) hasonló típusú tartalmak hasonló mezőjének értékénél!

Tehát ha valaki létrehoz egy új tartalmat, majd megadja a mező értékének, hogy 5, de már létezik olyan általa beküldött tatalom, ahol ennek a mezőnek az értéke 3, akkor ne tudja ezt létrehozni, hanem kapjon egy üzenetet, hogy csak nagyobbat írhat bele, mint 5! mondjuk...

Jelenleg ott tartok, hogy készítettem egy pici kis modult amellyel létrehoztam a mezőt, gondoltam így biztosan könnyebb lesz valamilyen értékét befolyásoló feltételt írni hozzá... ez alapján: http://realguess.net/node/161 plusz a drupal.org API alapján.
Elkezdtem keresgélni, hogy hogyan is lehetne befolyásolni a mező értékét, de sajna elakadtam és ehhez szeretnék valami útmutatást, tanácsot, iránymutatást kérni!
Találtam még egy ilyet is: http://drupal.org/node/1343708 de valami azt súgja nekem, hogy van ettől egyszerűbb verzió is...

Arra is gondoltam, hogy itt adok meg valami feltételeket:

$field = array(
        'default' => valami feltételek
    );

Hasonlítanám az épp aktuális node mezőjét az ugyanazon felhasználó által már létrehozott node-ok hasonló mezőihez, de ez már így leírva nagyon sántít, hiszen ettől még akármilyen értékre átírhatja, mivel ez csak egy default értéket ad a mezőnek... meg egyébként sem tudom hogy hogyan hivatkozhatok a többi node hasonló mezőjére meg az épp aktuális node mezőjére...

Előre is köszönöm a segítséget!

Melyik modulhoz, modulokhoz kapcsolódik a téma?: 
Drupal verzió: 
Fórum: 
minarikede képe

Szerintem modul nélkül is működik a dolog. A sminked template.php fájljában meghívod: hook_node_validate() függvényt és ott elvégzed a szükséges validációkat.

0
-1
mpety képe

Köszönöm az ötletet, rágom is rajta magamat már egy ideje de sehogyan sem akar működni...
Valamit nagyon elrontok...
Most jelenleg ennyi a kód a sminkem template.php fájljában:

function mytheme_node_validate($node, $form) {
  if ($node->type == 'pelda_tipus') {
	if($node->uid == $user->uid) {
		if($node->content['field_pelda'] == field_get_items('node', $node, 'field_pelda', $node->language)) {
			if($node->content['field_pelda2'] < field_get_items('node', $node, 'field_pelda2', $node->language)) {
				form_set_error(NULL, t('ERROR!'));
			}
		}
	}
  }
}

Tehát valami olyasmit szeretnék, hogy ha a felhasználó beír egy számot egy bizonyos tartalomtípus mezőjébe, akkor ha már van olyan tartalom amit szintén ő hozott létre és a referencia (node_reference) mezőjében ugyanaz van, mint az épp aktuális tartalomnak (amit most készül létrehozni), akkor ne írhasson be nagyobb számot ebbe a mezőbe, mint annál a már létrehozott tartalomnál van ugyanebben a mezőben!
Elég körmönfont tudom... de ha van valami ötlet szívesen fogadom!
0
0

Üdv
Peti

szantog képe

„de sehogyan sem akar működni.”
define "nem működik"
mi történik?
amúgy sminkbe illik hook_node_validate-et (meg úgy általában, bármilyen működési logikához kapcsolódó hookot) megvalósítani?
- nem lennék meglepődve, ha egyáltalán nem hívódna meg.

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.

mpety képe

Legalábbis most így ebben a formában nem működik, meg úgy sem működött ahogyan eddig próbáltam...
"mi történik?" Semmi! Semmi nem történik...
Az a helyzet, hogy nem igazán csináltam még ilyesmit, szóval nem tudom/ismerem a debuggolás rejtelmeit...
Igazából csak próbálkozok és várom, hogy mi lesz... :) (már látom le leszek szidva)

Hogy illik-e ilyesmit csinálni vagy sem azt megint nem tudom, kaptam egy tanácsot feljebb és én meg megörülve neki vakon követni kezdtem!
Lehet, hogy valóban meg sem hívódik...
Rápróbálok az eredeti modulos megvalósításra is ugyanezzel a szintaktikával... hátha. (esetleg nem hook_node_validate-el hanem field_validate-el...? http://api.drupal.org/api/drupal/modules!field!field.api.php/function/ho...)

0
0

Üdv
Peti

szantog képe

debugoláshoz próbáld meg az adott függvény végére beírni, hogy dsm(get_defined_vars()); - kell hozzá a devel modul.

Ekkor 90%-ban fogod látni, hogy egyáltalán lefut-e a függvényed, vagy nem. Ha lefut, akkor már azokat a változókat is látod, amiket éppen elérsz.

Viszont annyi, hogy a dsm pont az ilyen validate típusú dolgokban hajlamos nem mutatni semmit. Szóval még meg lehet próbálni egy ilyet:. watchdog('teszt', 'futok'); Ha ezek után nem látsz a drupal logjában ilyet, hogy 'futok', akkor biztosan nem fut.

Ha csak a dsm nem fut, de a logban ott van, hogy 'futok', akkor errora kell vágni a formot, hogy megjelenjen a dsm eredménye.

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.

mpety képe

Elsőnek is köszönöm szépen a segítséged, sajnos még mindig nem működ, de még nem adtam fel!

Betoltam az általad javasolt dolgokat a függvényem végére - még a template.php-ba - de továbbra is a nagy semmi az eredmény...
Se a devel nem mutat semmit, se a logban az admin/reports/dblog oldalon nem látni semmit...

Igazából azt az error-ra kell vágni részt nem értettem, de úgy gondolom hogy ebben az esetben ez tárgytalan is. Most csak megpróbálom egy külön modulba belezsúfolni a dolgot aztán úgy hátha dob valamit...
Bár azt nem tudom, hogy akkor mit kell nézzek? Mármint miután bekapcsolom a modult és elkezdek létrehozni egy új tartalmat, aminek a mezőjéhez kellene a validálás akkor látnom kellene, ha nem jó a dolog akkor is...

Meg még annyi, hogy most ugye mindegyik tartalmamnál megjelent egy devel fül, és ott van egy tokens almenü és ott látom az adott tartalomnál mikre tudok hivatkozni, jól látom ugye? Viszont ezekre így ilyen formában nyilván nem tudok hivatkozni a kódban, szóval azt akartam ebből kihozni hogy ha lefutott volna akkor is ezt láttam volna? ("Ha lefut, akkor már azokat a változókat is látod, amiket éppen elérsz.")

0
0

Üdv
Peti

szantog képe

Ez a log nem mutat semmit érdekes dolog, főleg, hogy a template.php-ba teszed csak úgy álánatur. Szintaktikai hibával fehér oldal esetleg? Vagy egy sima print "halló";?

Errorra vágni meg mindössze annyi, hogy valamilyen kötelező elemet kihagysz a formon, tehát pl node beküldésekor címet nem írsz be.

A devel fülön látod a nodehoz kapcsolódó változókat, ezeket biztosan el tudod majd érni node validateben is, csak éppen bővebben és több mindent. Amúgy dsm-el ugyanilyen csikicsuki sárga biszbaszt kell kapni ott, ahol eredetileg a drupal üzenetek jelennek meg. Hivatkozni meg úgy tudsz rájuk, hogy jó alaposan belemélyedsz a php asszociatív tömbök lelkivilágába, és hosszabb-rövidebb idő után a hangos anyázásoktól elérsz odáig, hogy fejből célzol 5-6 szint mélységű form elemet.

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.

mpety képe

Ha a template.php-ban van a függvény akkor sima print("hallo"); sem látszik, semmi! Ha "error-ra vágom" akkor se történik semmi!

Viszont áttettem külön modulba a dolgokat, így már van a log-ban egy "futok" üzenetem, meg szép hibaüzeneteket is kapok, miszerint:

* Notice: Undefined variable: node
* Notice: Trying to get property of non-object

és mindkettő (már) az első sorra utal, tehát amiben az:
if ($node->type == 'típus') {
van...

És a devel modul is beizzott, mert mindezek felett egy zöld sávban írja, hogy: ... (Array, 0 elements) és hogy a modulomban melyik sorban hívódott meg a dsm függvény.

Szóval lesz itt valami, így biztos jobb lesz, mint template-ban, ahol még hibát sem láttam...

0
0

Üdv
Peti