A cim eltuntetese

zoliky képe

Van egy oldal amely a 'page' tartalom tipusal volt letrehozva. Az oldal cime 'Services' es el szeretnem tuntetni (de csak ezen az oldalon!).

Itt lathato a kep: http://dl.getdropbox.com/u/1924024/pagetitle.jpg

Gondolom a node.tpl.php fajlot kell modositani. Egy IF ala kell rakni a kovetkezo sort? :

<h1 class="title"><a href="<?php print $node_url ?>" title="<?php print $title ?>"><?php print $title ?></a></h1>

Esetleg tudnatok egy jobb megoldast?

Fórum: 
zoliky képe

A page.tpl.php fajlot modositottam, igy:

<?php if ($title && $title != 'Services') { print '<h1 class="title">'. $title .'</h1>'; } ?>

Ha esetleg tudnatok jobb megoldast, varom!

0
0
Bálint képe

A szép megoldás az lenne, hogy lemásolod a page-tpl.php fájlod tartalmát, létrehozol egy page-node-[nid].tpl.php nevű fájlt (ahol a [nid] a Services nevű node-od id-ja), majd ebben a fájlban egyszerűen kitörlöd, ami nem kell neked.

0
0
nevergone képe

Még szebb megoldás lenne mindezt a smink preprocesszében módosítani, majd írok is mintát. És akkor a tpl.php -ket nem kell módosítani.

Szóval keresel a sminkedben egy template.php fájlt, vagy ha nincs, akkor létrehozol egyet. Ebben keresel két függvényt a SMINKEDNEVE_preprocess_page és SMINKEDNEVE_preprocess_node néven. Ha nem találsz ilyent, akkor létrehozod őket a következő módon; ha megtalálod őket, akkor a következő kódrészletekben { } jelek között szereplő részt írd a végükre.

<?php
function SMINKEDNEVE_preprocess_page(&$variables)  {
  if ($variables['node']->nid == 7404){
   unset($variables['title']);
  }
}
 
function SMINKEDNEVE_preprocess_node(&$variables)  {
  if ($variables['node']->nid == 7404){
   unset($variables['title']);
  }
}
?>

Ez a két kis apró függvény minden nézetben kitörli a 7404-es node címét a megjelenítésből, természetesen a számot arra állítsd, ahol ezt használni szeretnéd. Ha a függvények (vagy a fájl) nem léteztek, akkor ezek beírása után építsd újra a smink-cachet azzal, hogy ellátogatsz az admin/build/themes oldalra, és mindenféle állítgatás nélkül nyomsz egy mentést.

0
0
Bálint képe

De ettől még a $title változót ki fogja print-elni a template fájl, aminek ebben az esetben NULL lesz az értéke, a html kódban pedig lesz egy ilyen:

<h1 class="title"></h1>

Ez így nem csúnya?

0
0
Bálint képe

Visszavonom, elnézést. Megnéztem a Garland smink page-tpl.php-jét, óriási hülyeséget írtam, mert abban így van benne:

<?php if ($title): print '<h2'. ($tabs ? ' class="with-tabs"' : '') .'>'. $title .'</h2>'; endif; ?>

Így valóban sokkal szebb előfeldolgozóval. :)

0
0
zoliky képe

Koszonom a sok segitseget! Sokat tanultam ezen a forumon! Koszonom meg egyszer!

0
0
pp képe

Az előfeldolgozó szerintem arra való, hogy megváltoztassunk, vagy hozzáadjunk változókat nem pedig arra, hogy töröljünk. Ráadásul nevergone megoldása szerintem warningot, vagy legalább is noticet fog eredményezni, mert a $title változó nem létezik és azt használják az if-ben. Az unset() helyett tehát $title = '' lenne ebben az esetben a célravezető.

Nevergon megoldása jó lenne abban az esetben, ha a kérdező azt kérné, hogy "ne legyen cím". Persze abban az esetben is csak arra lenne jó, hogy rámutasson: tessék pontosan kérdezni. Ebben az esetben viszont a "cím éltüntetését" kérik, márpedig ennek a legjobb megoldása az amit Te adtál. Itt ugyanis pontosan az történik amit a kérdező akar. Ráadásul a későbbi fejlesztések, vagyis az oldal normális élete során is egy jobban áttekinthető és karbantartható valamit kapunk. Ha ránéz valaki a sminkre akkor pontosan fogja látni, hogy mi az ami más, hisz ez a fájl nevében kódolva van. Hogy miért más azt pedig egy diff-el könnyedén kiderítheti, nem beszélve arról, ha a spec template elejére még egy megjegyzést is beletol a készítő.

pp

0
0
nevergone képe

Ráadásul nevergone megoldása szerintem warningot, vagy legalább is noticet fog eredményezni, mert a $title változó nem létezik és azt használják az if-ben.

A $title változó létezik, és működik a megoldás, kipróbáltam előtte, azért maradt benne a node_id.

Nevergon megoldása jó lenne abban az esetben, ha a kérdező azt kérné, hogy "ne legyen cím".

Ne haragudj, de ez butaság. A két megoldás majdnem ekvivalens az eredményt illetően, csak nálam az előfeldolgozónál kitörli a $title változót, ezért a smink meg sem próbálja kiírni. A másik megoldásnál pedig megmarad a változó, viszont a sminkfájlból lesz kitörölve. Mindenképpen van egy törlés, és az eredmény ugyanaz: a cím nem íratódik ki. Akkor hol itt a kérdés? Valahol egyszer azt olvastam, hogy lehetőség szerint mindent a preprocesszben intézzünk el, és az lenne a legszebb, ha a tpl.php fájlokban nem módosítanánk semmit. Persze ez nem mindig oldható meg, de törekedni lehet rá.

Ráadásul a későbbi fejlesztések, vagyis az oldal normális élete során is egy jobban áttekinthető és karbantartható valamit kapunk.

Pontosan, hogy nem! Gondolj bele, hogy jön az üzenet: Még húsz tartalomnál el kellene tüntetni a címet. Melyik a rugalmasabb és átláthatóbb: hússzor lemásolni a tpl.php -t, vagy egy egy darab (nyilván összetettebb) feltételben elintézni az egészet?

0
0
pp képe

És nem is azért írtam amit írtam.

A $title változó létezik, és működik a megoldás, kipróbáltam előtte, azért maradt benne a node_id.

Utánanéztem és tényleg nem nyom notice-t, mert a drupal_error_handler nem nyom notice-t. Tehát figyelmeztetés van a PHP-ban csak a Drupal lenyeli. A $title változó pedig nem létezik, szerintem ezt elírtad. Te magad törölöd ugyanis.

Ne haragudj, de ez butaság. A két megoldás majdnem ekvivalens az eredményt illetően, csak nálam az előfeldolgozónál kitörli a $title változót, ezért a smink meg sem próbálja kiírni.

Röviden: == != ===
Én nem is azt írtam, hogy az eredményben különbség lenne. Sőt azt se írtam, hogy a megoldásod ne lenne jó. Én azt írtam, hogy nem a legjobb. (tudom ez téged frusztrál. ;)) Sőt kapaszkodj meg, ha előfeldolgozó akkor is jó, sőt. Csak nem a változót kéne törölnöd, hanem a változó tartalmát, ennyi.

Egy változó létezésének ellenőrzésére Te mit használsz?

if($valtozo){...}

vagy

if(isset($valtozo)){...}

Azért írtam, hogy a szépség relatív, mert neked a preprocess tetszik, nekem meg ilyenkor a külön sminkfájl. Amit vázoltál probléma meg számtalan módon megoldható (preprocessben hozzáadunk még egy suggessiont a node-nincscim.tpl.php és a page-nincscime.tpl.php, vagy akár ezt egy modulban is megtehetjük, meg még számtalan módon.) Az egy helyre belehányt átláthatatlan if szerkezet meg nekem nem szimpatikus és soha nem fogom szép megoldásnak tartani. Megfejelve változó törléssel meg különösen nem.

pp

0
0
nevergone képe

Valóban igaz, hogy a változó törlése helyett annak a tartalmát kell törölni, még ha konkrét hibaüzenet nem is látszódik. Szóval <?php unset($title); ?> helyett <?php $title = ''; ?> a helyes megoldás.
A harag pedig, ez fel sem merült bennem, ez csak egy véleménykülönbségből fakadó vita volt, amelyből akár mások is tanulhattak valamit. Nyilván nem ugyanannak az iskolának a stílusát képviseljük, de ettől lehet új ismeretekre szert tenni. Majd egy sö mellett megbeszéljük. :)

0
0
eager képe

sziasztok, miért van ez:

A d6 default page.tpl.php-ban ez a megközelítés:

<?php if (!empty($logo)): ?> / semmi baja, ha nincs variable - /error_reporting(E_ALL); esetén sem /

A d7 default page.tpl.php-ban ez a megközelítés (Bartikban is):

<?php if ($logo): ?> / notice-t dob, ha nincs var /

Akkor miért álltak át erre? Nekem az látszik, hogy így a kód kevésbé megengedő; mi az az előny azonban, ami miatt mégis úgy döntöttek, hogy egy fejlettebb verzióban ezt éri meg használni a sminkekben?

0
0
alippai képe

Szerintem az az irányelv, hogy az is tudjon sminket készíteni, aki nem programozó, nem ismeri a php nyelvet. Az utóbbi esetben (D7) nem kell ismerned az empty függvényt (és annak elég érdekes működését).

Személyes megjegyzés: a D7-es theme system sajnos eléggé félkészre sikerült ebből a szempontból, talán majd D8 kicsit összeszedettebb lesz.

1
0

Lippai Ádám
young element

Illyés Edit képe

Az előfeldolgozó szerintem arra való, hogy megváltoztassunk, vagy hozzáadjunk változókat nem pedig arra, hogy töröljünk.

De akkor hol törölsz változót? Ezért bemászol a hook_nodeapi()-ba matatni? Vagy egyáltalán nem törölsz, hanem üres stringre állítod a változót, és tpl.php-ben vizsgálod? De az mitől szebb, mint – sminkben, vagy modulban, vagy akárhol – unset()-elni? A szép azért itt nem csak esztétikai kategória, hanem gondolom van valami objektív ok: célszerűbb így és így csinálni, ezért és ezért.

Én sem vagyok híve annak, hogy a tartalmakat nagy tételben smink preprocesszben manipuláljuk. De ha csak pár egyszerű eset van – mint itt, hogy egy bizonyos node-nál ki kell lőni egy változót – akkor a legjobban kezelhető módszer a preprocessz. Ha több tpl.php fájl van a sminkben, én attól mindig depressziós leszek. Például szeretnék egy plusz divet a page.tpl.php-be, akkor annyi fájlt kell módosítani, ahány page(-xxx).tpl.php fájlom van.

0
0
pp képe

Akkor még egyszer.
Egy:
Nekem az volt a problémám, hogy töröltük magát a változót. Ha megnézed a sminket akkor abba ott le van írva, hogy ha nincs tartalma a címnek, vagyis a cím üres, vagyis nincs cím akkor nem rak ki div-et. Az az if nem azt vizsgálja, hogy létezik-e a változó, hanem azt, hogy a változó üres-e. (HF: Próbáljuk meg a 0 szöveget adni egy node címének). Képzeljük el a szituációt, hogy tesztelni szeretnénk valami egész mást az oldalon, mert van egy hibánk. Szépen beállítunk mindent, hogy még a figyelmeztetéseket is mutassa nekünk a rendszer, hátha abból több infonk lesz. Ezután nézzük az error logot és már zsibbad is az ujjunk a sok lefelé tekeréstől. ;))
Kettő:
Én azt mondtam ez a megoldás egyből következően nem a legszebb, hisz szebb lenne, ha a tartalmát törölné és nem magát a változót. Senki nem mondta, hogy ez ebben az esetben nem jó megoldás.

Talán nem árt azonban rámutatni arra, hogy ez a fajta megoldás nem jó. Miért műxik ez a "preprocessben unsettelem a változót" ebben az esetben?
1. a smink, vagyis a template fel van készülve arra, hogy üres sztring esetén a burkoló htmlt se írja ki.
2. a Drupal hibakezelője lenyeli a figyelmeztetéseket.

A Bálint által bemutatott megoldás viszont a fenti két feltételtől függetlenül is jól működik. Még akkor is amikor mondjuk a name_and_slogan div-et akarod törölni. Itt ugyanis hiába unsetteled a változókat és hiába is törlöd az értéküket.


De ha csak pár egyszerű eset van – mint itt, hogy egy bizonyos node-nál ki kell lőni egy változót – akkor a legjobban kezelhető módszer a preprocessz.

Helyes használat és a fenti egyes feltétel esetén igen. Tehát lehet a preprocesst erre használni, sőt jó is, csak megfelelően használjuk. Nekem a preprocessel nincs bajom.


Ha több tpl.php fájl van a sminkben, én attól mindig depressziós leszek. Például szeretnék egy plusz divet a page.tpl.php-be, akkor annyi fájlt kell módosítani, ahány page(-xxx).tpl.php fájlom van.

Akkor Te ne használd ezt a fantasztikus lehetőséget. Azért érdemes itt is belegondolni, mi lesz egy fél év múlva. Mi van, ha akkor kell beszúrni azt a div-et. Ott van az egy darab tpl.php-d beletolod megnézed egy helyen és hátradőlve mosolyogsz: ez műxik. Aztán egy nap múlva szólnak, hogy ja itt szétesett. Azt javítod, eltelik még egy nap, megint szólnak, ja itt is szétesik. Aztán szépen ritkulnak az időpontok, és közben keverednek a módosításaid. Ezzel szemben, ha már eleve látod, hogy 6 különböző .tpl.php-t kell módosítanod, akkor 6 különböző helyet is fogsz tesztelni. Ekkor szerintem jóval nagyobb az esélye annak, hogy jó munkát adsz ki a kezeid közül. Nyilván megvannak a praktikáid, hogy ezeket a problémákat kikerüld. Nekem ez segít, lehet neked nem.
De visszakanyarodva az eredeti problémára, nekem az volt a bajom, hogy egy figyelmeztetéseket dobó megoldást legszebbnek neveztünk. Nem több.

pp

0
0
Illyés Edit képe

Ezzel szemben, ha már eleve látod, hogy 6 különböző .tpl.php-t kell módosítanod, akkor 6 különböző helyet is fogsz tesztelni. Ekkor szerintem jóval nagyobb az esélye annak, hogy jó munkát adsz ki a kezeid közül. Nyilván megvannak a praktikáid, hogy ezeket a problémákat kikerüld.

A praktika annyi, hogy nagyon részletesen kommentezem a template.php-t. Rögtön látom, hogy 6 helyen volt módosítás, és még azt is, hogy pontosan micsoda.

De visszakanyarodva az eredeti problémára, nekem az volt a bajom, hogy egy figyelmeztetéseket dobó megoldást legszebbnek neveztünk.

Igen, ez jogos.

0
0
nevergone képe