Node elemei a page.tpl.php-ben

Pál úr képe

Ü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: 
aries képe

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

0
0
Pál úr képe

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?

0
0
Illyés Edit képe

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?

0
0
Pál úr képe

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?

0
0
pp képe

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:

foreach($node->files as $file)
     {
        $imagePath = $file->filepath;
        $imageTitle = $file->description;
       if($imagePath != "") {
          $output = '<div class="image-attach-body"><img src="'.base_path().'/'.$imagePath.'" alt="" title="'.$imageTitle.'"  class="image image-thumbnail "/></div>';
       }
     }  
return $output;

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

0
0
aries képe

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

0
0
Illyés Edit képe

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.

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.

Egyelőre számomra továbbra sem világos, ez most hogy függ össze a kérdésemmel.

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:

<?php
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>';
       }
     }  
?>

Helyes gyakorlat:

<div class="image-attach-body">
<img src="<?php print $base_path; ?>/<?php print $imagepath; ?>" alt="" title="<?php print $imagetitle; ?>"  class="image image-thumbnail "/>
</div>

...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...:)

0
0
Pál úr képe

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.

0
0
Illyés Edit képe

legrosszabb esetben a template.php-ban kell ezt a tartalmat előállítanom

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:

<?php
function  _phptemplate_variables($hook, $vars) {
   switch($hook) {
     case 'sajatsablon' :
        $vars['egyikvaltozo'] = 'izé';
        $vars['masikvaltozo'] = 'valami';
        break;
   }
   return $vars;
}
?>

sajatsablon.tpl.php:

<h1><?php print $egyikvaltozo; ?></h1>
<p><?php print $masikvaltozo; ?></p>

HTML végeredmény:

<h1>izé</h1>
<p>valami</p>

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 "Helyes gyakorlat" alatti rész továbbra is csak egy kép megjelenítésére alkalmas...

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.

0
0