Drupal 6-os smink portolása 7-es verzióra

Egy ideje nem volt időm foglalkozni a blogommal, de most már összeszedtem magam és dedikáltam időt erre is.

A téma amiről írni szeretnék számomra éppen aktuális, ugyanis a közelmúltban vágtam bele egy új projektbe, aminek a célja az, hogy egy olyan webáruházat készítsek ami prémium kategóriás Drupal sminkeket árul. Ennek hozománya, hogy első körben a drupal.org-ról letölthető ingyenes témák (Gordon, Ellington) készültek el, ezeket pedig elérhetővé tettem 6-os és 7-es verzióban is.
Mindezek fényében igazából elég végigmenni az egyik smink 6-os és 7-es verzióján és megnézni a különbségeket, de úgy gondolom hasznos lehet, ha pár, szerintem lényeges elemet kiemelek a kódkavalkádból.

Az info fájl

A Drupal 6 óta a sminkeknek is van info fájlja nem csak a moduloknak, ebben definiáljuk a smink lényeges tulajdonságait (pl core verzió), a betöltendő JavaScript és css fájlokat stb.

A core-t be kell állítani 7.x-re, azonban vannak ennél fontosabb változások is:

  • megváltoztak a régiók
  • megváltoztak a feature-ök (nem szeretem "jellemzőknek" hívni)
  • a style.css és a script.js most már nem töltődik be automatikusan

Két új régióval bővült az alaprendszer:

  • Help
  • Highlighted

és a left és right sidebar immár sidebar_first és sidebar_second elnevezést kapta.

A features listából kihúzták a mission-t és a search-öt, valamint a primary/seconday_links új neve main- és secondary_menu.

Az info fájl felépítéséről és lehetőségeiről itt olvashattok.

A page.tpl.php

Ha ránézünk a page.tpl.php fájlra akkor egyből szembetűnik egy lényeges különbség: a header és body definíciók nincsenek benne, valóban csak az oldal vázat tartalmazza.

A régiók lerenderelt tartalma nincsenek kirakva külön változóba, hanem a $page tömb kulcsaiként elérhetőek:

      <?php if ($page['sidebar_first']): ?>
        <div id="sidebar-left" class="sidebar">
          <?php print render($page['sidebar_first']); ?>
        </div> <!-- /sidebar-left -->
      <?php endif; ?>

A két menü elnevezése megváltozott $main_menu és $secondary_menu-re és a legeneráláshoz, nem a Drupal 6-ban megszokott theme('links') hívásra van szükségünk, hanem a:

          <?php if (!empty($main_menu)): ?>
            <div id="primary">
              <?php print theme('links__system_main_menu', array('links' => $main_menu, 'attributes' => array('id' => 'main-menu', 'class' => array('links', 'inline', 'primary-links')))); ?>
            </div>
          <?php endif; ?>

és a:

      <?php if (!empty($secondary_menu)): ?>
        <div id="secondary">
          <?php print theme('links__system_secondary_menu', array('links' => $secondary_menu, 'attributes' => array('id' => 'secondary-menu', 'class' => array('links', 'inline', 'secondary-links')))); ?>
        </div>
      <?php endif; ?>

Látható, hogy megváltozott a class definiálása is, ugyanis nem egy string-ként hanem tömbként kell átadni. A theme_links() fgv paraméterezése is módosult, érdemes megnézni, mert sűrűn használják sminkkészítéskor.

Szintén érdemes kiemelni a $title_prefix és $title_suffix tömböket, amelyeket a $title kiíratása előtt és után kell meghívni a reder() fgv segítségével.

A page.tpl.php elérhető változóiról itt olvashattok.

Hamár itt tartunk felmerül a kérdés, hogy hol van a body, ami eddig a page.tpl.php-ban volt? Létrejött egy új template fájl:

A html.tpl.php fájl

Sok változó átjött Drupal 6-ból: 

  • $head
  • $head_title
  • $styles
  • $scripts

Az eddigi $body_classes most már $classes és behozták a következő változókat is:

  • $attributes - a body tag attribútumai
  • $page_top - ide kerülnek azok a dolgok amiket a modulok az oldal legenerálódása előtt szeretnének elhelyezni
  • $page - a legenerált tartalom a page.tpl.php-ból
  • $page_bottom - kb a régi $closure, ebbe kerülnek azok a dolok amiket a modulok a lap legvégére akarnak rakni (JS hívások pl)

A html.tpl.php elérhető változóiról itt olvashattok.

Új template fájl elnevezések

Úgy gondolom itt érdemes megemlíteni, hogy a template fájlok elnevezési formulája megváltozott és két kötőjelre cserélődött. Így most már ha azt akarjuk, hogy a nyitólapon más page.tpl.php fusson le, vagy hogy egyedi blokk megjelenést kapjon a user login block akkor

  • a page-front.tpl.php helyett a page--front.tpl.php
  • és a block-user-0.tpl.php helyett a block--user--login.tpl.php

fájlokat kell létrehoznunk.
Kiemelném, hogy a delta az eddigi integerről string-re változott, így most már érthetőbb hogy melyik blokkot is módosítjuk template szinten.

Bővebben az elnevezésekről itt olvashattok.

A node.tpl.php és a comment.tpl.php fájlok

Ezt a két fájlt összevontam, mert a comment.tpl.php fájl módosításai gyakorlatilag megegyeznek a node.tpl.php fájlban találtakkal, ezért elegendő megmutatni a node.tpl.php változásait.

Még Drupal 6-ban manuálisan állítottuk össze a node osztályait attól függően, hogy kiemelt, publikus stb, ezt most már nem nekünk kell megtenni, ugyanis it is, mint a többi templage fájlban elérhető a $classes és az $attributes változó, emelyek segítségével testreszabhatjuk a megjelenést.

Akárcsak a page.tpl.php-ban, itt is elárhetőek a $title_prefix és $title_sufix tömbök amiket a reder() fgv-nyel kell megjeleníttetni, viszont bevezettek két fontos változót is ezeken kívül:

  • $title_attributes
  • $content_attributes
  <?php print render($title_prefix); ?>
  <?php if (!$page): ?>
    <h2<?php print $title_attributes; ?>><a href="<?php print $node_url; ?>"><?php print $title; ?></a></h2>
  <?php endif; ?>
  <?php print render($title_suffix); ?>
 
 
  <div class="content"<?php print $content_attributes; ?>>
  ...
  </div>

Fontos változás, hogy a $content, most már nem egy legenerált html-t tartalmazó string, hanem egy asszociatív tömb, amelynek az elemeit egyesével is renderelhetjük. Így pl. ha a $content-ből külön szeretném választani a liknekeket és a hozzászólásokat, akkor azt a kettőt először elrejtem a hide() fgv segítségével, majd amikor szükségem van rá, lerenderelem azokat is.

    <?php
    // We hide the comments and links now so that we can render them later.
    hide($content['comments']);
    hide($content['links']);
    print render($content);
    ?>

A node.tpl.php és a comment.tpl.php elérehtő változóiról itt és itt ovlashattok.

A block.tpl.php fájl

Ebben a template fájlban is történt néhány módosítás. Szerintem két legfontosabb:

  • $block_html_id változóban benne van a blokknak szánt ID
  • itt is megjelnnek a $classes, $attributes, $title_prefix, $title_suffix változók

A template.php

A tepmplate.php-ban van két nagyon fontos változás a 6-os verzióhoz képest

A theme-settings.php fájl

Itt lényegi változás az, hogy eltűnt a themehook_settings() és helyette a hook_form_system_theme_settings_alter()-t kell implementálni ahhoz, hogy a sminkünknek saját beállítási felülete legyen. Az alapértlemezett érték megadásához az info fájlba kell megadnunk egy sort:

settings[theme_setting_name] = default_value

Nagyon jó leírás, ez alapján

Nagyon jó leírás, ez alapján már el fogok tudni indulni a saját sablonom portolásával is.

Egy apró hiba:

"Az eddigi $blody_classes most már $classes és behozták a következő változókat is:"
A valtozo neve $body_classes volt.

page--front-tpl.php

Nagyon hasznos írás!
Talán ez is hibás, úgy gondolnám, hogy page--front.tpl.php lenne a helyes (page--front-tpl.php helyett):
a page-front.tpl.php helyett a page--front-tpl.php
és a block-user-0.tpl.php helyett a block--user--login.tpl.php

Köszönöm szépen, a két

Köszönöm szépen, a két helyesírási hibát javítottam.