Tartalmanként különböző háttérkép, sminkfüggetlenül - hogyan?

Boobaa képe

Adott egy reklam tartalomtípus, benne egy field_hatter kötelező, single-value imagefielddel. Feladat: a tartalom hátterének beállítani ezt a képet anélkül, hogy sminkhez nyúlnánk (azaz sminkváltás után is ugyanúgy működjön a dolog). IRC-n kaptam vagy öt embertől segítséget, aminek a lényege a következő:

  1. A modulomban mondjam meg a theme registrynek, hogy a node modul node.tpl.php-ja helyett a saját node-foo.tpl.php-mat szeretném használni:
    /**
     * Implementation of hook_theme().
     */
    function foo_theme($existing, $type, $theme, $path) {
      return array(
        'node' => array(
          'arguments' => array('node' => NULL, 'teaser' => FALSE, 'page' => FALSE),
          'template' => 'node-foo',
        ),
      );
    }
  2. A modul könyvtárába bemásoltam a modules/node/node.tpl.php fájlt.
  3. A modul könyvtárában létrehoztam a node-foo.tpl.php fájlt, és teleraktam debug szeméttel (hogy azonnal lássam, amint használatba kerül).
  4. A modulomat a node modul (és a content modul) utánra súlyoztam (egyelőre a {system} táblában kézzel átírva - ha majd végre működni fog, berakom az .install fájlba is).
  5. Bekapcsoltam a modult, töröltem a cache-t - mégsincs használatban a node-foo.tpl.php fájlom.
  6. Bekapcsoltam a Theme developer modult, hátha az segít (azon kívül, hogy továbbra is elrejti a sidebar blokkokat) kideríteni, mi is van a theme registryben, és nem látni nyomát a modulom hatásának.

Miért? Mit szúrok el, vagy hagyok ki?

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

function sajatmodulom_theme_registry_alter(&$theme_registry) {
  $theme_registry['node']['theme paths'][] = drupal_get_path('module', 'sajatmodulom');
}

És ettől fogva simán a node.tpl.php-t használhatod és ezt fogja a Drupal felnyalni mert ez van "legelől" a keresési listában. Ide aztán node-type.tpl.php-t is használhatod, vagy a page_preprocessben adhatsz hozzá saját node-foo.tpl.php suggestion-t és akkor azt nyalja be a Drupal.

pp
(jár a sör?)

0
0
sgabe képe

Mivel egy saját tartalom típusról van szó, amit típus szerint sminkelünk, elég az is, ha a hurokban megadjuk az útvonalat.

<?php
/**
* Implementation of hook_theme().
*/
function mymodule_theme($existing, $type, $theme, $path) {
  return array(
    'node' => array(
      'arguments' => array('node' => NULL, 'teaser' => FALSE, 'page' => FALSE),
      'template' => 'node',
      'path' => drupal_get_path('module', 'mymodule'),
    ),
  );
}
?>

Innentől kezdve elég, ha a modul mappájában ott a node-reklam.tpl.php, a reklam típusú tartalmakhoz azt fogja használni, ha a smink mappájában nincs ilyen. Az olvasottakból kiindulva nyílván nem lesz.

0
0
Boobaa képe

Legyen a „szokásos” pálinka. ;)

Btw snufkin++: eredetileg ő is ezt favorizálta, de csak most sikerült eljutnia a dolognak a tudatomig.

Hanem a template hinting valamiért nem akar összejönni - ellenben a következő (nem tudom, mennyire gurány, de) működik, és így tartalomtípustól függetlenül is meg tudom oldani a dolgot:

function mymodule_theme_registry_alter(&$data) {
  $data['node']['path'] = drupal_get_path('module', 'mymodule');
  $data['node']['template'] = 'node-mymodule';
}
0
0