Block az image-ek alá

KOKA képe

Azt szeretném, hogy egy block (melyben egy link van a Vendégkönyvre) minden image (festmény) alatt megjelenjen.
A blokk szerkesztésénél be lehet állítani, hogy csak bizonyos oldalakon jelenjen meg. Fölsorolhatnám ide a festményes node-ok számait, de ez elég macerás, ráadásul minden újonan fölkerülő képnél bővíteni kéne a listát.
Oda van írva egy példa: blog/* - s így az összes blognál megjelenik
Ennek mintájára odaírtam, hogy image/*, de így persze nem az egyes image-ek alatt jelenik meg, hanem az image gallery-nél.
Hogy lehetne megoldani, hogy minden egyes kép alá odakerüljön?

Segítségeteket előre is köszönöm!

Kóka

Melyik modulhoz, modulokhoz kapcsolódik a téma?: 
Balogh Zoltán képe

A node típusa lesz a kulcs, de dengeteg módszer létezik erre:

  • Pathautoval generálod az aliast, melyben szerepljen a node típusa. Tehát minden kép útvonala mondjuk kep/ -el kezdődjön, és akkor tudod a blokkot úgy megjeleníteni, hogy csak a kep/* útvonalon jelenjen meg.
  • lemásolod a node.tpl.php-t node-image.tpl.php névre (smink gyorstár ürítés), és ebben direktben megjeleníted a blokkot a kívánt helyen: $block = module_invoke('block', 'block', 'view', 10); print $block['content'];
  • PHP kóddal állítod be a blokk megjelenését azt vizsgálva, hogy az aktuális path minimum 2 elemből áll, az első elem 'node', a második szám, betöltöd a node-ot, és a típusát vizsgálod: return count(arg()) == 2 and arg(0) == 'node' and is_numeric(arg(1)) and $node = node_load(arg(1)) and $node->type == 'image'; De ez feleslegesen erőforrásigényes.

Az első hatékony, de kell hozzá a pathauto, a második a legdrupálosabb, a harmadikhoz nem kell semmi, de kókler, erőforráspazarló megoldás.

0
0
aboros képe

így szoktam:

if (arg(0) == 'node' && is_numeric(arg(1)) && count(arg()) == 2) {
  $node = node_load(arg(1));
  if ($node->type == 'image') {
    return TRUE;
  }
}

és akkor nem erőforrásigényes, mert biztos node oldalon vagyunk amikor betöltjük és ilyenkor már be van töltve amúgy is szóval zéró sql query fut. okos drupal. ;)
0
0

-
clear: both;

Balogh Zoltán képe

A PHP is okos, és mivel a sok-sok "and" balról jobbra értékelődik ki az első hamisnál megáll a végrehajtás, és nem fut a node_load() akkor sem, ha egy return utasítás az egész. Tehát a Tiéd szebb, de erőforrás szempontjából ekvivalens egy egysoros return-al. Az erőforrásigény arra vonatkozott részemről, hogy kell egy plusz node_load annak eldöntéséhez, hogy meg kell-e jeleníteni a blokkot. Ez az első 2 módszerrel elkerülhető.

0
0
KOKA képe

valóban sikerült.
És ebből egy (számomra) még bonyolultabb kérdés következik, de ehhez új topic-ot nyitok, hiszen úgy illik :)

Nagyon szépen köszönöm!

Kóka

0
0
aboros képe

azt hittem egybe fogja vizsgálni az összes feltételt.
így viszont nem erőforrásigényes, azt tanultam pptől, hogy ha vizsgálom, hogy node oldalon vagyunk már és akkor kérek node_load -ot az arg(1) -re, akkor már valami más helyről jön, nem futnak sql queryk, az erőforrásigénye minimális, elhanyagolható.

0
0

-
clear: both;

Balogh Zoltán képe

Valószínűleg az a titok nyitja, hogy ha már egy lekéréskor futott a node_load() az adott nid-re (mert mondjuk épp az jelenik meg), akkor egy másik node_load() ugyanarra a nid-re már sql nélkül lefut. Ez valószínűleg így van, és akkor valóban nem plusz erőforrásigényes, tehát én is benéztem a dolgot.

De mivel balról jobbra megy a kiértékelés, és előbb vizsgálod azt, hogy is_numeric-e az arg(1), és a count()-al azt csak utána, hogy egyáltalán van-e arg(1), warning veszélyt érzek az erőben. :) :)

0
0
pp képe

Többek között ezért is jó a nyílt forrás.

node_load static gyorstárat használ (mint az a drupal programozó kézikönyvében le van írva, ez utóbbiért is jó a nyílt forrás. :)) ezért a sok sql lekérés csak egyszer fut le: http://api.drupal.org/api/function/node_load/6

miért is lenne warning? az arg(1) kifejezésnek mindig van értéke. Ha más nem akkor az, hogy FALSE, az meg nem numeric és csókolom. :)

pp

0
0
Balogh Zoltán képe

No hát, nem FALSE-t ad vissza az arg(), hanem NULL-t, ha túlindexeljük, de igazad van, egykutya, mert az if-ben a NULL is hamis. Való igaz tehát, hogy pont az arg() hivása esetén tökmindegy a sorrend, de általában az ilyen "tömbös" dolgoknál azért mindig az a jobb, ha első a count(), és csak aztán jön a kérdéses elem vizsgálata. Ez ilyen programozói zsiger, bár a konkrét példában ismét tévedtem.

0
0