DIV hozzáadása a display suite régiók köré

aruna képe

A probléma: Nekem egy elválasztót (függőleges képcsík) kell raknom a left és right régiók közé egy konkrét tartalomtípus full node nézetében. Az elválasztó csíknak a hosszabbik tartalommal kellene egy hosszúságúnak lenni.

Ilyen most a kinézet (display suite default)

+---------------------------------+
| Header region                   |
+---------------------------------+
+---------------++----------------+
| Left region   || Right region   |
|               ||                |
|               ||                |
|               ||                |
+---------------+|                |
                 |                |
                 |                |
                 |                |
                 +----------------+
+---------------------------------+
| Footer region                   |
+---------------------------------+

Ez a html hozzá:

<div class="node clear-block">
	<div class="nd-region-header clear-block ">
	<div class="nd-region-left ">
	<div class="nd-region-right ">
	<div class="nd-region-footer clear-block ">
</div>

A megoldás amit találtam a left és right régió köré rakok egy plusz div-et és abba kerül az elválasztó kép. Így ehhez a plusz div-hez adva a függőlegesen ismétlődő háttérképet (repeat-y) az elválasztó csík a magasabb div-el lesz egyforma magasságú.

<div class="node clear-block">
	<div class="nd-region-header clear-block ">
	<div class="left-right-region-container">
		<div class="nd-region-left ">
		<div class="nd-region-right ">
	</div>
	<div class="nd-region-footer clear-block ">
</div>

Amilyen megoldást találtam:

Módosítom a ds modul-ban ezt függvényt:
ds/theme/theme.inc

erről:

function theme_ds_regions($object_display, $module) {
  $output = '';
 
  foreach ($object_display->themed_regions as $region_name => $region_data) {
    // ... sok-sok sor - a függvény eredeti kódja
  }
 
  return $output;
}

erre:

function theme_ds_regions($object_display, $module) {
  $output = '';
 
  foreach ($object_display->themed_regions as $region_name => $region_data) {
    if ($region_name == "left") {
      $output .= '<div class="left-right-region-container">';
    }
    // ... sok-sok sor - a függvény eredeti kódja
    if ($region_name == "right") {
      $output .= '</div>'; // end of div class="left-rigth-region-container
    }
  }
 
  return $output;
}

Ezzel a megoldással az a baj, ha frissítem a ds modult akkor a bele-hack-elt változtatás eltűnik.

Hogy érdemes csinálni? Hogy ne az eredeti modulba kerüljön a módosítás, hanem pl. a sminkbe vagy egy saját modulba.

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

Csinálj neki saját layoutot:

  1. /**
  2.  * Define layouts from code.
  3.  *
  4.  * @return $layouts
  5.  * A collection of layouts.
  6.  */
  7. function my_module_ds_layout_info() {
  8. $path = drupal_get_path('module', 'mymodule' . '/layouts');
  9.  
  10. // Layout for image and video ct.
  11. $layouts = array(
  12. 'my_layout' => array(
  13. 'label' => t('My Layout'),
  14. 'path' => $path . '/my_layout',
  15. 'regions' => array(
  16. 'header' => t('Header'),
  17. 'media' => t('Media'),
  18. 'description' => t('Description'),
  19. 'links' => t('Links'),
  20. 'pager' => t('Pager'),
  21. 'comments' => t('Comments'),
  22. ),
  23. ),
  24. );
  25. return $layouts;
  26. }

A mymodule/layouts könyvtárba meg másold be a two-column-stacked vagy mit használsz most éppen .tpl-jét, my-layout.tpl néven, aztán lehet faragni. A regions részbe persze azokat a régiókat írd be, amiket használsz.

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

aruna képe

ez jó megoldás lesz.

D6 alatt még nem találom ezeket a " two-column-stacked" vagy hasonló template fájlokat a ds modulban, amit át tudnék másolni a saját modulomba. Szóval nem világos hogy d6 alatt a default template fájlok hol vannak, már ha vannak.

Az online doksiban van egy ilyen oldal:

http://drupal.org/node/1098068

de ez valószínűleg d7-hez van leírva.

Szerk:

A D6 ds api-ban nem találtam még meg, hogy lehet-e saját layout-ot létrehozni.

Ez a comment szerint az a benyomásom, hogy D6 alatt még nem lehetett ilyen.

Viszont megtalátam a ds helyett az nd modulban a template fájlt:
nd/templates/nd.tpl.php

Amit ha bemásolok a sminkbe és átnevezek:

zen-sminkem/templates/nd-tartalomtipusazonosito.tpl.php

Akkor felül tudom írni ronda megoldással a kimenetet, azaz cserélek reguláris kifejezéssel a html-ben, a tpl ilyen lesz:

<div class="buildmode-<?php print $node->build_mode; ?>">
  <div class="node node-type-<?php print $node->type; ?> <?php if (isset($node_classes)): print $node_classes; endif; ?><?php if ($sticky && $node->build_mode == 'sticky'): print ' sticky'; endif; ?><?php if (!$status): print ' node-unpublished'; endif; ?> clear-block">
 
    <?php 
    $pattern = '/<div\ class="nd-region-left/';
    $replacement = '<div class="left-right-region-container"><div class="nd-region-left';
    $content = preg_replace($pattern, $replacement, $content);
    $pattern = '/<div\ class="nd-region-footer/';
    $replacement = '</div><div class="nd-region-footer';
    $content = preg_replace($pattern, $replacement, $content);
    print($content);
    ?>
  </div> <!-- /node -->
</div> <!-- /buildmode -->
0
0
Sk8erPeter képe

Remélem, azért ezt a regexpes "megoldást" nem használod éles oldalon.....igazából az sem tiszta, miért van szükség ilyen szinten csúnya megoldásra.

0
0
aruna képe

néztem a template_preprocess_node()-ot, de ott még tömb minden, aztán nem néztem tovább.

Szóval komoly, igaz még csak localhost-on. :)

0
0
Sk8erPeter képe

most látom, hogy az eredeti hozzászólásodban éppen a theme_ds_regions() függvényt említed, amit most akartam javasolni... akkor viszont nem értem, mi a probléma!
Azt írod, hogy minden frissítésnél felülíródik... dehát mióta módosítjuk a theme_ függvényeket VAGY BÁRMI MÁST a modul kódjában?? Ahogy core-t sem hekkelünk, úgy contrib modulokat sem, csakis végszükség esetén, de most a legrosszabb esetet említetted, mert a theme_ függvényeknek épp az a lényege, hogy saját sminkből felüldefiniálhatók!

kimásolva az eredeti hozzászólásodból:

  1. function SAJATSMINKEDNEVE_ds_regions($object_display, $module) {
  2. $output = '';
  3.  
  4. foreach ($object_display->themed_regions as $region_name => $region_data) {
  5. if ($region_name == "left") {
  6. $output .= '<div class="left-right-region-container">';
  7. }
  8. // ... sok-sok sor - a függvény eredeti kódja
  9. if ($region_name == "right") {
  10. $output .= '</div>'; // end of div class="left-rigth-region-container
  11. }
  12. }
  13.  
  14. return $output;
  15. }

Nyilván SAJATSMINKEDNEVE helyettesítendő a saját sminked nevével... és a saját sminked template.php fájljába pakold!

Alapszabály, hogy ha már regexppel kell legenerált outputot módosítani, akkor valamit rosszul csinálsz... :)

1
0
aruna képe

"theme_ függvényeknek épp az a lényege, hogy saját sminkből felüldefiniálhatók"

Ezt nem tudtam ^^^.

Találtam egy jó leírást:

http://drupalsn.com/learn-drupal/drupal-tutorials/drupal-theme-function-...

0
0
Sk8erPeter képe

Akkor elég fontos dolgot nem tudtál még :)

Szerintem annyira nem jó a leírás, mert egy elavult dolgot mutat be, a phptemplate_ használatát.

Amit így gyorsan tudni érdemes (a teljesség igénye nélkül!), anélkül, hogy hosszú cikkeket kellene elolvasnod:

  • theme_ kezdetű függvények felülbírálhatók sminkből, úgy, hogy
    1. LEMÁSOLOD az eredeti függvényt,
    2. berakod a sminked template.php fájljába,
    3. a "theme" részt kicseréled a saját sminked machine name-jére
    4. cache-t törölsz (theme registry cache-t, Drush-ból drush cc theme-registry)

    Példa:
    theme_ds_regions függvényt lemásolod, berakod a template.php fájlodba, majd a theme részt kicseréled a sminked nevére, módosítod, ahogy neked tetszik - ez nem is fog felülíródni sosem az update-ek idején, mivel a saját sminkedben van (lehetőleg alsmink).

    Ez a theme-függvény felülbírálására vonatkozó dolog MINDEN theme_ kezdetűre igaz, tehát ezzel akár az összes core-ban lévő theme-függvény kimenetét is felülbírálhatod. De fontos, hogy az eredetit előbb másold le, és úgy csináld ezeket a módosításokat, hogy ne vágja tönkre a megjelenést.

  • így érdemes hívni a theme_ kezdetű függvényeket például modulból/sminkből: theme('valami', ...).
    itt láthatsz példát a theme_username meghívására:
    http://api.drupal.org/api/drupal/modules!node!node.module/function/node_...
    theme('username', $node)
    ha neked van egy saját SAJATSMINKED_username implementációd, akkor az fog meghívódni (ha a tiéd az éppen aktív smink)
  • te is definiálhatsz ilyen theme_ kezdetű függvényeket a hook_theme() implementálásával (modulból VAGY sminkből):
    http://api.drupal.org/api/drupal/developer!hooks!core.php/function/hook_...
2
0