Summary és Body szétválasztása full nézetben

aranyozottpatkoszeg képe

Feladat: Full nézeteben szeretném külön formázni (két külön div) a summaryt (régi teaser) és a (summary mentes) bodyt

Bonyodalom: Full nézetben egyetlen bodyban van minden (a summary is). Ezt kéne szétszedni.
Ha szerkesztéskor külön kezelem a summaryt és bodyt, az már valami, de mivel sok-sok régi noderól is szó van, ez a megoldás nem tetszik.

Egy megoldás fel: a Teaser külön formázása témából tanulva és abba belekontárkodva elindultam egy úton:
- template.php-ban a THEME_preprocess_node()-ban újra betöltöm a node-ot (node_load), majd abból legyártatot a summary (text_summary). Így az már megvan.
- ugyanitt az alapértelmezett body-ból kivonom a summaryt (str_replace(summary,"",body)). Így az is megvan.
- Átadom az új summaryt és bodyt a node.tpl.php-nak, ahol beállítom, hogy a body field hidden legyen és beszúrom a render ($uj summary)-t és render ($uj body)-t.

Ez azért elég csúnya, mert pl. "lefejezi a mező megjelenítéseket". Itt tanulok:D7 - preprocess_node-ban body buherálása

Drupal verzió: 
Fórum: 
aranyozottpatkoszeg képe

Sikerült egy megoldást gyártanom, de elég csúf

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.

Itt még nem vettem figyelembe ezt: ezzel lefejezed a mező megjelenítéséket

0
0
aboros képe

új nekem még ez a render dolog, szóval hirtelen így tudnám megcsinálni, lehet láma, szóljatok és behúzom ircen az lct.

function SMINKNEVE_preprocess_node(&$vars) {
  unset($vars['content']['body'][0]);
  $summary = $vars['content']['body']['#items'][0]['safe_summary'];
  $value = $vars['content']['body']['#items'][0]['safe_value'];
  $vars['content']['body'][0]['#markup'] =  $summary;
  $vars['content']['body'][0]['#markup'] .=  $value;
}

működik, de nem tetszik nekem így. ennél egyszerűbben is mennie kell hetesben.
0
0

-
clear: both;

aboros képe

ezt találtam hasznosnak (a meglévő írásos doksikon kívül) a témában:
http://sf2010.drupal.org/conference/sessions/page-render-drill-down-drup...

template.php

function SMINKNEVE_preprocess_node(&$vars) {
  #ha nem teaser van es van summary
  if (!$vars['teaser'] && isset($vars['content']['body']['#items'][0]['safe_summary'])) {
    $summary = $vars['content']['body']['#items'][0]['safe_summary'];
    #bevagjuk a bodyba prefixnek
    $vars['content']['body'][0]['#prefix'] =  '<div class="summary">' . $summary . '</div>';
  }
}
0
0

-
clear: both;

aranyozottpatkoszeg képe

Hű, sajnos azt hiszem nem jól fejeztem ki magam. (És tényleg le vagyok nyűgözve, hogy így belásol az én problémámba.)

Szóval épp az okozza a gondot, hogy a $vars['content']['body']['#items'][0]['safe_summary'] ÜRES. Az adatbázisban is üres. Az esetek 90%-ban. Így készült szinte minden node: a summary-ra sosem figyeltem, automatikusan kb. jó helyen vágta el.

A teaser nézetben természetesen van summary, de full nézetben üres. Igaz, hogy a full nézet body-jában minden benne van. ($vars['content']['body']['#items'][0]['safe_value'];

Vagyis én azt szeretném szépen, hogy full nézetben, ha üres a summary, akkor a full nézet bodyjából szedje ki az általában legyártott summary-t, hogy azt külön formázhassam. (Jaaj, talán még ígysem érthető.)

(De az utolsó sor sokat segít.)

0
0
aranyozottpatkoszeg képe

Ez a $vars['content']['body'][0]['#prefix'] tetszik.

Bár gondolkozom abban, hogy full nézetbe lévő summary (amit külön akarok formázni) egy külön fieldbe kerüljön. Mert így a field managementben könnyen tudom majd ki-bekapcsolni esetleg, meg formázni meg minden. Szóval létrehozok egy field-et, amit weben keresztül üresen hagyok, de preprocessben beletöltöm ezt a full nézetes summary-t. De ez talán már más téma lesz.

0
0