Teaser külön formázása

Den képe

Van egy oldal tartalmam. Ehhez tartozik a törzs, és külön a teaser az excerpt modul segítségével.

Van-e rá valamiféle lehetőség, hogy: amikor az oldalt kirajzoltaltom (node nézet, nem teaser), akkor a teaser-t egy külön div-be zárjam, hogy kicsit másképp lehessen formázni?
Így nézne ki:

h1: title
div class="teaser": teaser
div class="body": a body.

Kerestem példákat, hogy honnan lehetne egy működő megoldást kiollózni, de még nem találtam. A node revision-s táblában külön tárolódik a teaser a bodytól, külön mező van rá. Nekem az kellene, hogy ne vonja össze, hanem külön jöjjön át a sminknek?

Most belenéztem a template_preprocess_node()-ba. Nekem itt úgy tűnik, hogy vagy teaser, vagy body jön már át ide.

thx!

Melyik modulhoz, modulokhoz kapcsolódik a téma?: 
Fórum: 
szantog képe

preprocess_node-ba:

  if ($vars['teaser']) {
    $classes[] = 'node-teaser';
  }
0
0

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

aboros képe

full page nézetben kell neki a teaser is meg a body is, csak legyenek külön divbe. amúgy a classes nem "standard", nem minden smink használja a node.tpl.php -ban, szóval nem elég a preprocessbe nyomatnod egy classes tömböt, hanem akkor a node.tpl.php -ban ki is kell azt a tömböt szépen íratni.
(gondolom a phptemplate_body_classes volt a fejedben)

0
0

-
clear: both;

szantog képe

Fúú.. Kicsit writeonly voltam.. :)

0
0

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

aboros képe

a preprocessorba..

function MYTHEME_preprocess_node(&$vars) {
$vars['content'] = '<div class="teaser">' . $vars['node']->teaser . '</div>';
...
0
0

-
clear: both;

Den képe

Megcsináltam, amit írtál:

function mikrolift_preprocess_node(&$vars) {
  //*
  print_r('<pre>');
    print_r($vars['node']);
  print_r('</pre>');
  // */
  $vars['brief'] = 'Teaser:<div class="teaser">' . $vars['node']->teaser . '</div>';
}

A page.tpl-ben pedig ezt:

  <?php print $brief; ?>
  <hr />
  <?php print $content; ?>

A debug üzenet írja is szépen a node mezőit. De nincs a node-nak teaser tulajdonsága. A node->content['body][#value] értéke már a teljes content teaser-el, nem külön van.

Most megnéztem dev loaddal és a dev renderrel is. A node egy stdClass. Van teaser field-je, de a content-je tartalmazza a teaser-t.

Ha kikapcsolom az "Összefoglaló megjelenítése a teljes nézetben is"-t, akkor egyátalán nincs teaser.

0
0
aboros képe

lehetne még nyomozni, hogy hogyan tudnánk azt elővarázsolni. fogok is. :)

0
0

-
clear: both;

Den képe

A devel modul debug kimenete alapján.
A teaser csak egy változó: teaser módban vagyunk-e vagy sem.

De külön nincs teaser, csak "jön" a body-val együtt, ha jönnie kell... :)

0
0
aboros képe

template.php:

function playground_preprocess_node(&$vars) {
  //ha full page tekintjuk meg a nodeot, akkor akciozunk csak
  if ($vars['page'] == TRUE) {
    //ujra betoltjuk a nodeot, hogy legyen erteke a teasernek, ne csak egy kapcsolo legyen
    $node = node_load($vars['nid']);
    //ha nincs a body -ba break, azaz nincs bejelolve a show summary in full view, akkor a briefbe toljuk a teasert.
    if (strpos($node->body, '<!--break-->') === 0) {
      $vars['brief'] = check_markup($node->teaser, $node->format, FALSE);
    }
  }
}

node.tpl.php:
...
  <div class="content clear-block">
    <?php if ($brief): ?>
      <div class="brief">
        <?php print $brief; ?>
      </div>
    <?php endif; ?>
    <div class="nodebody">
      <?php print $content ?>
    </div>
  </div>
...

akkor működik, ha nincs bejelölve a 'show summary in full view'. azért így 'kifordítva', mert ha bejelölöd azt, akkor a teasert hozzányomja a bodyhoz. ha nem jelölöd be, akkor nem nyomja hozzá, viszont a preprocessben egy kapcsoló már csak a teaser mert a node_view() átrendezte már a dolgokat. ezért újra betöltjük a node, hogy a nekünk kellő értéke legyen a $node->teaser -nek és aztán szépen egy 'brief' változóba pakoljuk amit meg kiírunk egy külön divbe a tplben.
remélem érthető, ha valami nem világos kérdezz.. ;)

0
0

-
clear: both;

Den képe

nagyjából fogom is. El kell kezdenem tanulnom sürgősen az api-t mert enélkül nem tudom megcsinálni amit kell.

Köszönöm a kimerítő választ!

Mondjuk az nem ciki, hogy be kell mégegyszer tölteni az egész node-ot? Elég lenne csak a node aktuális teaser-jét, a body-ból meg levágni.

Gondolom, jóval bonyolultabb csak a teaser-t betölteni.

0
0
aboros képe

mivel a preprocessben vagyunk volt már egy node_load, szóval a mi 'extra' node_load -unk nem generál újabb sql kérést, hanem cacheből adja vissza a már lekért nodeot.

ha megnézed a node_load() függvényt szépen látszik, hogy ez ('plusz' egy node_load) nem kerül nekünk szinte semmibe.

...
//csak egy nid a param?
if (is_numeric($param)) {
    if ($cachable) {
      // betoltottuk mar az ilyen nidu nodeot?
      if (isset($nodes[$param])) {
        // hat akkor megegyszer nem kerdezzuk le, vissza adjuk a mar betoltottet
        return is_object($nodes[$param]) ? drupal_clone($nodes[$param]) : $nodes[$param];
      }
    }
...

ugye a para az, hogy a preprocessben lévő $vars és az abban lévő $node nem csak simán a node_load() visszatérési értéke, hanem már a node_view() -n is át lett kergetve (meg minden hook_nodeapi -n is), ami attól függően hogy teaser vagy sem, más-más értékeket pakol a body meg a content meg a teaser helyére. átalakítja a sima, node_load() által adott szerkezetet.
nézd csak:

...
 if ($teaser) {
    $node->teaser = $content;
    unset($node->body);
  }
  else {
    // itt a problema. mivel nem teaser hanem full page nezetben vagyunk, mire a preprocesshez er a node, addigra mar nincs benne a teaser.
    $node->body = $content;
    unset($node->teaser);
  }
...

ezért csinálunk mégegy node_load(), hogy a nyers node -al tudjunk mahinálni.
0
0

-
clear: both;

aboros képe

simán a preprocessből nem hiszem, hogy menni fog..
mert már a node_view() -ban eldől, hogy mi kerül a $node->teaser -be és a preprocess csak utána hívódik sajna-bajna.
gondolkodok még rajta.

alternatíva, hogy nem használod a body -t, létrehozol helyette két szövegmezőt, teaser, body. ez se lesz túl kényelmes más okok miatt sajnos.

0
0

-
clear: both;

aranyozottpatkoszeg képe

Drupal 7.x-el szintén ezen küzdök. (Teaser-ből Summary lett pl.)

template.php:

function playground_preprocess_node(&$vars) {
  //ha full page tekintjuk meg a nodeot, akkor akciozunk csak
  if ($vars['page'] == TRUE) {
 
    //ujra betoltjuk a nodeot, hogy legyen erteke a teasernek, ne csak egy kapcsolo legyen
    $node = node_load($vars['nid']);
 
    //Ha ki van tölte már a summary
    if($node->body[$node->language][0]['summary'] != '') {
	$vars['brief'] = $node->body[$node->language][0]['summary'];
    }
    // Ha nekünk kell a body-ból legyártani a summary-t
    else {
	$text = text_summary($node->body[$node->language][0]['value'], $node->body[$node->language][0]['format']);
	$vars['brief'] = check_markup($text, $node->body[$node->language][0]['format'], $node->language, FALSE);
    }
  }
}

Na, ez működik: a $brief remekül elérhető a node.tpl.php-ból.
Már "csak" az kéne, hogy a body-ból valahogy "kiszedjük" a summaryt. (Így még summary duplázás van.) Kivágnám én, de nem sikerül a body-t módosítanom. :(
Kérdeztem is ezt: D7 - preprocess_node-ban body buherálása
0
0
aranyozottpatkoszeg képe

Sikerült egy megoldást gyártanom a problémára. :)

template.php

function OWNTHEME_preprocess_node(&$vars) {
 
  if ($vars['page'] == TRUE ) {
 
    //ujra betoltjuk a nodeot, hogy legyen erteke a teasernek, ne csak egy kapcsolo legyen
    $node = node_load($vars['nid']);
 
    //csak az érdekel, ha nincs külön summary 
    if($node->body[$node->language][0]['summary'] == '')  {
        //megkérjük, hogy alkossa meg a summary-t, ahogy szereti
	$text = text_summary($node->body[$node->language][0]['value'], $node->body[$node->language][0]['format']);
        // formázza is meg szépen
	$vars['summary_x'] = check_markup($text, $node->body[$node->language][0]['format'], $node->language, FALSE);
    }
 
   // az új $vars['summar_x']-be betoltuk a kiemelendő summary-t most az új $vars['body_x']-ből kiszedjük, hogy ne legyen duplázás
   $vars['body_x'] = str_replace($vars['summary_x'],"",check_markup($node->body[$node->language][0]['value'], $node->body[$node->language][0]['format'], $node->language, FALSE));
 }
}

Most már olyan div-ekbe rakjuk, amilyenbe akarjuk

node.tpl.php:

   print("<div class='summary_x'>"); print render($summary_x); print("</div>");
   print("<div class='body_x'>"); print render($body_x); print("</div>");

Fontos még, hogy a "Manage fields"-nél beállítsuk, hogy oldal nézetben ne jelenjen meg a body.

0
0
aboros képe

nekem úgy működik a drupal 7, hogy ha egy node szerkesztésekor az edit summary -re kattintok és a summaryt kitöltöm, akkor mentés után teaser nézetben a summary jelenik meg, full nézetben a node body, summary nélkül ahogy kell. alapból így működik. vagy nem értem mi a probléma :)
node szerkesztése: https://skitch.com/aboros/rt6fm/edit-article-appellatio-virtus-seven
teaser nézet: https://skitch.com/aboros/rt6fs/seven
full nézet: https://skitch.com/aboros/rt6fu/appellatio-virtus-seven

amúgy ez már egy új kérdés, légyszi nyiss neki új témát. köszi.

0
0

-
clear: both;

aranyozottpatkoszeg képe

Olyan full nézet kell, ahol a teaser és a (teaser nélküli) body látható, de külön div-ben. (Hogy közéjük lehessen rakni valamit. Hogy a külön lehessen formázni a teaser-t.)

a) Ha azt akarom, hogy néhány nodenál a teaser csak a teaser nézetben jelenjen meg. Full nézetben pedig a body (a teaser nélkül), akkor úgy csinálom, ahogy mutattad. Külön veszem a summary-t.
b) De én sokszor a teaser-t szeretném látni a full nézetben is, csak nem egybeöntve az egészet (ahogy alapértelmezetten megy, ha szerkesztéskor "Hide summary" van), hanem külön: summary és teaser. Ez a problémás.

A b-t meg lehetne úgy oldani, hogy minden egyes node-nál külön szerkesztem a treaser-t és a body-t, ahogy a linkelt szerkesztés képen van. Majd a full nézetbe belereakom a body-t (amihez így nem tartozik a treaser) és valahogy meghívom a treaser-t.
De nem szeretném az összes régi nodeomat így átszerkeszteni. Ezért kell valami ilyesmi buherálás.

(Talán így érthetőbb.)

0
0
aboros képe

nyiss új témát kérlek.

0
0

-
clear: both;

aranyozottpatkoszeg képe

bocs. (az előbbi megjegyzésedet elvolvastam. de csak a linkekig. basszus)

nyitottam új témát: D7 - Summary és Body szétválasztása full nézetben

0
0