Sziasztok!
Több esetben is szükségem lenne arra, hogy egy-egy field összetett értékeiből kikotorjak egy számomra szükséges értéket, és ezt kiírassam a node-nál egy külön fieldként, és ezt a "Manage display" fülön át is tudjam rendezni, húzni.
Ahhoz hasonlóan szeretném csinálni, ahogy a Display Suite is létrehozza a Dynamic fieldeket, Code fieldeket.
Mondjuk van egy Get Locations fieldem, ez GPS-koordinátákat, kiegészítő címadatokat, ilyesmiket tárol, és ebből szeretném kiszedni csupán a GPS-koordinátákat. Ezt épp a Display Suite egy Code fieldjével oldom meg, egy textarea-ba beokádva az alábbi kódot, és bejelölve a "Display Suite code" Text formatot:
<?php $on_the_map_getlocations_field_data = $entity->field_watermill_on_the_map['und'][0]; print ' '; } } ?>
Hát ez így elég okádék, szóval ezt szeretném lecserélni olyan megoldásra, hogy mindezt modulból intézem el, normálisan, nem adatbázisban tárolva a kódot.
Másik példa: van egy Hierarchical Select fieldem, itt pl. a kiválasztott taxonómiaelem szülőjét is szeretném kiíratni egy külön fieldbe.
Előre is köszi!
Én úgy szoktam, hogy _node
Én úgy szoktam, hogy _node_preprocessben állítok változót neki, pl $vars['gps'], és egy ds preprocess fieldben adom hozzá, aminek a machine nameje gps. Ja, és moduleban a preprocesst, hogy esetleg másik sminknél ne legyen gáz. Kb ez volt idáig a legyszerűbb mód, ha ilyen kódolt nyavalyákat kellett nodebaszúrni.
----
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.
melyik DS hook?
Köszi a választ, akkor tehát első lépés: template_preprocess_node() felülbírálása modulban, aztán második lépés az, hogy "egy ds preprocess fieldben adom hozzá, aminek a machine nameje gps", de konkrétan melyik, Display Suite által kínált hookra gondolsz, amit implementálni kéne?
És így látszani fog a többi közt az admin-felületen, átpakolható lesz, meghatározva a sorrendet, stb.?
Köszi!
nem kell semmilyen ds vudu.
nem kell semmilyen ds vudu. Bármilyen változó, ami _node_preprocessből elérhető, hozzáadható preprocess fieldként dshez admin/structure/ds/fields/manage_preprocess: Ha csinálsz egy $vars['gps']-t a preprocessben, akkor itt hozzáadod, a lényeg, hogy a machine name a gps legyen, és ugyanolyan cibálható mező lesz, mint az összes többi.
----
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.
Ja hogy így! Hogy korlátozzam content type-ra?
OK, köszi, így már teljesen világos, működőképes is a dolog! Viszont az a problémám vele, hogy így nem csak adott content type-nál látszik pl. épp ez a GPS-mező, hanem ott is, ahol nem kéne (mármint persze ahol egyáltalán alkalmaztam a DS-layoutot).
Attól függetlenül, hogy mondjuk ez is bent van:
Mivel a DS-ben hozzáadtam már, mint preprocess fieldet. Ott pedig nem lehet bundle-re korlátozni, csak entity type-ra.
Pl. egy mezei article content type-nál a GPS-mező nem szükséges.
Hogyan lehet ezt még szebben megoldani?
=============================
SZERK.: Na, most látom, hogy csak a Display Suite 7.x-1.6-os változatában nem lehet korlátozni, mert nincs ott a "Limit field" mező ("Limit this field on field UI per bundles and/or view modes. The values are in the form of $bundle|$view_mode. You may use * to select all. Enter multiple values per line.") A 7.x-2.0 változatnál már ott van!
DE továbbra is érdekelne ennek a modulbeli, Display Suite NÉLKÜLI megoldása (pl. ahol nincs telepítve a DS, ott kellhet). Ha már... :)
=============================
Amit még eddig nem próbáltam, az pl. a field_attach_preprocess() függvény (persze még sok más is), ezzel, vagy valami tök más függvénnyel nem tudom ezt valahogy megoldani?
Pl. a template_preprocess_node()-ban van egy ilyen:
Lehet, hogy köze nincs ahhoz, amiről beszélek, de hátha.
Field grouppal nem jó
Ahogy tartottam tőle, mindez Field grouppal nem működik, azt valahogy a
$variables['content']['group_tökmindegy']
tömbbe kéne valahogy beletákolni.
Ez csak azért meglepő, mert a code field Field grouppal együtt is hibátlanul megy. Mondjuk gondolom ott azért megy, mert a Display Suite valahogy elintézi a fentit. Vagy a korábban a field_attach_preprocess()-t használja, majd megnézem.
Nem értem, Field grouppal ez így miért nem jó
Hát ez jó, itt lényegében ugyanazt mondják el, amiről itt beszélgetünk, kóddal illusztrálva:
http://www.lullabot.com/articles/display-suite-building-fancy-teasers-wi...
Viszont itt sem alkalmaznak semmi egyéb trükköt, tehát egyelőre betudom tényleg a Field group hibájának, bár lehet, hogy kellene mégis bevetni valami egyebet, meg lehet, hogy a module weight számít, fogalmam sincs...
Nem jut eszébe valakinek megoldás?
Most a template_preprocess_node-ban hiába adom hozzá a $variables['content']-hez is, akkor is a node legeslegvégén jelenik meg a mező értéke, de ráadásul label nélkül!
Ezt én is benyaltam.
Ezt én is benyaltam.
A lényeg, hogy a preprocess fieldnek még nincs értéke, amikor a $content állítódik össze, mivel a preprocess olyankor még nem hívódik meg.
Szóval kicsi kézzel lehet hook_ds_fields_infoba beírni:
És persze kell egy function my_function($params), ahol a $paramsban minden elérehető, ami kell.
----
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.
Jaja, köszi, én is itt
Jaja, köszi, én is itt kezdtem el utánanézni a tisztességesebb megoldásoknak (ennél a kérdésnél a D6-osra vonatkozott):
http://drupal.hu/comment/68390#comment-68390
Akkor láttam ezt a
DS_FIELD_TYPE_FUNCTION
-t.Ezenkívül találtam ezt a cikket, ami igen röviden, lényegre törően összefoglalja, miről is van szó:
Creating custom display suite fields or how I learned to stop worrying and use
hook_ds_fields_info()
http://previousnext.com.au/blog/creating-custom-display-suite-fields-or-...
Kipróbálni még nem volt időm, de mindenképp visszajelzek, ha megtörtént.
bundle-re és view mode-ra korlátozás
Még azt néztem egyébként, hogy valszeg kódból bundle-re és view mode-ra korlátozni a
'ui_limit'
kulcssal lehet:'ui_limit' => array('article|full', '*|search_index'),
innen:
hook_ds_fields_info()
http://drupalcontrib.org/api/drupal/contributions!ds!ds.api.php/function...
Tesztelve, működik!
Az előbb linkelt cikk, a hook_ds_fields_info() tanulmányozása, meg persze szantog sok tanácsa rengeteget segített abban, hogy ezek után mindössze 10 perc volt működésre bírni, amit szerettem volna, mindenféle csúnya textarea-kba behányt PHP-kódok nélkül, szépen fájlban tartva a kódot.
Nálam egy Get Locations field térképen bejelölt koordinátáinak kinyerése volt a cél egy adott bundle-nél (itt:
mytestbundle
), minden view mode-ra érvényesen (*
), annak érdekében, hogy ezt egy külön GPS-mezőként is meg tudjam mutatni, és oda húzhassam a "Manage display" fülön, a Display Suite régiói között, ahol szükségem van rá. Természetesen ellenőrizni kellett, hogy egyáltalán ez a mező be van-e állítva, vagy nincs.Figyelem, az alábbi kódban a mező nyelvsemlegessége "be van drótozva" (lásd
'und'
kulcs), tehát amennyiben valakinél a mezőfordítás be van állítva az adott mezőre, akkor ez a kód pici átalakításra szorul, tehát csak szemléltető jelleggel mutatom meg, de talán másnak is hasznos lehet. A lényeg látható belőle: az entitás egyéb mezőinek értéke is elérhető.Természetesen a
MYMODULE
helyettesítendő a saját modulunk nevével.Javítom magam: ['und'][0] és hasonlók kerülendők
Javítom magam:
Ez egy csúnya megoldás, ami elkerülhető a field_get_items() használatával.
Ehhez ezt a cikket nagyon tudom ajánlani:
http://www.computerminds.co.uk/articles/rendering-drupal-7-fields-right-way
Aki a moduljában/sminkjében fieldekkel babrál, annak itt megfontolandó tanácsok vannak, konkrétan az előbb linkelt field_get_items() és a field_view_value(), ill. a field_view_field() használata javasolt.
Tehát ami ROSSZ:
HELYETTE JÓ PÉLDÁK:
$output = field_view_field('node', $node, 'field_name');
=========================
Ezek alapján a javított kód:
(a kód első fele jó, tehát a hook_ds_fields_info() implementálása ugyanaz marad)
http://drupal.stackexchange.com/questions/45198/how-to-output-get-locati...