Üdv,
a page.tpl.php-ben szeretném a $node
elemeit elérni, egészen konkrétan a csatolt fájlokat.
Odáig jól is megy a dolog, hogy ha csak 1 fájl van csatolva, akkor a
foreach($node->files as $file) { $imagePath = $file->filepath; $imageTitle = $file->description; if($imagePath != "") { print '<div class="image-attach-body"><img src="'.base_path().'/'.$imagePath.'" alt="" title="'.$imageTitle.'" class="image image-thumbnail "/></div>'; } }
jól ki is írja.
Ha több kép van csatolva, akkor csak az utolsót kapom vissza, holott a <?php print_r($node->files) ?>
kiírja, hogy benne van a tömbben mind a két kép adata.
Mit rontok el?
Fórum:
Logikai bukfenc van abban,
Logikai bukfenc van abban, hogy a page.tpl-ben akarod megjeleníteni a $node-ot, bár lehetséges. Hogyan hoztad létre a $node-ot?
Aries
http://aries.mindworks.hu
rosszul értem?
A
$node
-ból kizárólag a$node->files
-ra, vagyis a node-hoz csatolt fájlok listájára van szükségem, mert ezt a$content
-en kívül (a tartalomtól független jobb oldali mezőben) kell megjelenítenem.Az alapvető adatok innen származnak, a fájlok megjelenítésének módja pedig innen (igen, én kérdeztem ott is...).
Miért logikai bukfenc? Hogy kell jobban?
node.tpl.php
Aries alighanem arra gondolt, hogy a node-ok megjelenítését a node.tpl.php sablon segítségével ajánlott végezni, az ugyanis pont erre van kitalálva...;)
Miért akarnád mondjuk egy admin oldalon megvizsgálni, hogy van-e az (éppen nem létező) $node-ban csatolt fájl?
nem értem...
Miért akarnád mondjuk egy admin oldalon megvizsgálni, hogy van-e az (éppen nem létező) $node-ban csatolt fájl?
Speciel pl. az admin-hoz van másik smink.
Egyelőre számomra továbbra sem világos, ez most hogy függ össze a kérdésemmel.
Van egy (számomra legalábbis) igen összetett smink (huszonegynéhány egymásra float-olt div-vel, helyzetérzékeny menükkel, nagyon szigorúan -- pixelre -- kötött design-nel). Ebben vannak mozgó és vannak állandó elemek. Az állandó elemek egyike egy, a képernyő jobb oldalán megjelenő terület, ami minden oldalon jelen van, de bizonyos esetekben kell, hogy tartalmazza a node-hoz csatolt képeket. A tartalom valóban a node-ból jön, de a megjelenítés a node-nak fenntartott területen kívül kell, hogy történjen. A releváns kódrészletet másoltam be a több, mint 150 sornyi page.tpl.php-ból, illetve a hozzá szorosan tartozó mintegy 1000 sornyi CSS-ból. Gondoltam, hogy a nálam sokkal gyakorlottabb szeműek észrevesznek valami olyan hibát, amit én nem.
Eddigi olvasmányaim alapján egyetlen egy helyen sem találkoztam olyan megoldással sem itt, sem a drupal.org-on, ahol a tpl fájlok nem zárt egységet alkotnának, vagyis ahol a tpl fájl magában -- mley így bár töredékes, de -- nem lenne szintaktikailag helyes. A megrendelő által követelt design pedig, feltéve hogy az általam feszegetett problémát meg szeretném valahogy oldani, az általad "javasolt" megoldást használva, a fenti szabályt betartva nem megoldható.
Szóval, vajon a fenti kód, ha a
$node->files
2 vagy több fájl adatait tartalmazza, miért csak az utolsót jeleníti meg, vagyis hol lehet a kisördög elrejtve?Programozási hiba, nem Drupal
A probléma az, hogy a kódot nézve én nem látom a hibát, de olyan, mintha lenne egy változód, amihez nem hozzáfűzöd a tartalmat, hanem felülírod azzal. De a kódodban nincs ilyen rész, mert print-et használsz.
ha a kódod így nézne ki:
máris mondanám, hogy a
$output = ...
helyett$output .= ...
kéne használnod. De így ennyi kódból nem lehet megmondani, hogy hol a hiba, hisz amint Aires is utalt rá a leírásod nem teljesen érthető. (legalábbis én nem értem és szerintem a többiek sem.)Szóval több kódot kéne mutatnod, ha azt akarod, hogy segítsünk.
pp
Palócz István
https://palocz.hu | https://tanarurkerem.hu
Ott lehet a pont :) Azért
Ott lehet a pont :) Azért tessék megvizsgálni, hogy tömb-e a $node->files mert sok olyan oldal van, ahol $content nem node.
Aries
http://aries.mindworks.hu
hogyan használjuk a tpl fájlt
Gondolom, csak node oldalakon kell, hogy a csatolt képek megjelenjenek. Nekem ez logikailag egy blokk a jobb oszlopban, aminek a megjelenítését a block.tpl.php-ben szabályozom.
Nagyon könnyű a tpl.php fájlokban kódolási hibát, biztonsági rést hagyni. Érdemes mindig arra gondolni, hogy a template fájlok lényegében HTML fájlok, amelyekben PHP változókat íratunk ki – és nem PHP fájlok, amelyekbe itt-ott bedobunk egy kis HTML-t.
Rossz gyakorlat:
Helyes gyakorlat:
...ahol az $imagepath, $imagetitle változókat a template.php-n keresztül adod át át a tpl.php fájlnak. Tehát template fájlban nem programozunk, csak változókat íratunk ki, aztán örülünk, hogy minden biztonságos, szépen működik, tiszta, száraz érzés...:)
most érthető
Gondolom, csak node oldalakon kell, hogy a csatolt képek megjelenjenek. Nekem ez logikailag egy blokk a jobb oszlopban, aminek a megjelenítését a block.tpl.php-ben szabályozom.
OK, értem, innentől világos.
Az általad írt második példából számomra annyi használható, hogy legrosszabb esetben a template.php-ban kell ezt a tartalmat előállítanom, mert a "Helyes gyakorlat" alatti rész továbbra is csak egy kép megjelenítésére alkalmas...
Köszönöm a segítséget.
több kép megjelenítése
A template.php azért van, hogy ott programozzunk. Például ott deklarálok saját változókat és töltöm fel őket értékekkel, aztán átadom őket a template fájlok számára (a tpl.php nevű fájlok a sminkmappában), ahol ki tudom őket íratni HTML címkék közé. Ez nem "legrosszabb eset", hanem így van a rendszer kitalálva.
template.php:
sajatsablon.tpl.php:
HTML végeredmény:
Ha nem tudom a kívánt változókat a template.php segítségével átadni a template fájloknak – mert mondjuk az az érték, amivel a változómat feltölteném a $node objektumban van, ami nem érhető el a template.php-ből – akkor nem a tpl.php fájlokat kezdem el összekuszálni, hanem modult írok a feladatra.
Nem értjük, miért nem megy az általad megadott PHP kód, és el lehet kezdeni debuggolni, de szerintem gyorsabban el lehet jutni a működő megoldáshoz, ha szabályosan használjuk a Drupal template-ező rendszerét.
A template fájlok többször meghívhatók. Például a node.tpl.php, block.tpl.php is annyiszor fog meghívódni, ahány node/blokk van az oldalon.
Készítesz egy kis modult, ami lekéri az aktuális node-hoz csatolt képeket, végigmegy rajtuk egy ciklussal, theme_image függvény segítségével elkészíti a HTML kimenetet, amit végül betesz egy blokkba. A blokkot pedig beteszed a jobb oszlop régiódba.
A theme_image függvényt a template.php-ben, a blokk megjelenést a block.tpl.php-ben (vagy ennek valamelyik alváltozatában) kedvedre alakíthatod. Mindkettő pont annyiszor fog meghívódni, ahányszor szükséged van rá – és ha betartod az elnevezési konvenciókat, akkor teljesen magától.