Drupal - uživatelská příručka

Osobní zkušenosti s bezplatným systémem pro správu webového obsahu Drupal šířeným pod GPL licencí.

Úvod

Drupal je univerzální systém bez konkrétní oblasti zaměření umožňující vytvářet:

Proč Drupal

Drupal 6 byl vydán dne 13. února 2008.

Příprava

Předpokladem instalace je funkční lokální server, nebo webhosting (en) s podporou PHP a MySQL (PostgresSQL).

MySQL databáze

  1. Pomocí phpMyAdmin, nebo jiným způsobem, vytvořte databázi s názvem např. drupal s výchozím porovnáním utf8_general_ci. Při přihlašování k phpMyAdminu zvolte Language: Česky – Czech (utf-8).
  2. Pro bezpečnější přístup k databázi (u webhostingu máte většinou pouze jednoho uživatele databáze a další vytvářet nemůžete):
    • vytvořte uživatele např. user a přidělte mu oprávnění uvedená v souboru INSTALL.mysql.txt uloženém v aktuální verzi Drupalu, ale pouze k databázi drupal tj. oprávnění:
      • GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, INDEX, ALTER

 

Instalace

Virtualizace

Nejen pro vývojáře webu je vhodné použít virtuální obraz Quickstart pro Virtualbox obsahující:

Rychlá instalace

K rychlé instalaci je možné využít instalační profil, který provede prvotní nastavení za Vás:

  1. Stáhněte aktuální verzi Drupalu. Archiv rozbalte a obsah zkopírujte do adresáře webhostingu (případně vlastního serveru).
  2. Rozbalte vlastní nebo jiný instalační profil do adresáře /profiles/. Pokud to instalační profil vyžaduje, nakopírujte na web do příslušných adresářu požadované moduly, témata, lokalizace atd.
  3. Požadovaný instalační profil zvolte v prvním kroku instalace.

Developing installation profiles

Standardní instalace

  1. Stáhněte aktuální verzi Drupalu. Archiv rozbalte a obsah zkopírujte do adresáře webhostingu (případně vlastního serveru).
  2. Pro českou lokalizace Drupalu je potřeba český překlad Czech translation.
  3. Do adresního řádku webového prohlížeče napište adresu webhostingu (případně vlastního serveru).
  4. Zvolte jazyk instalace.
  5. Zadejte hodnoty pro přístup k databázi (v sekci Pokročilé volby je možné pro větší přehlednost v databázi (někteří poskytovatelé webhostingu nabízejí pouze jedinou databázi) zadat předponu tabulek např. "dr_").
    • U souboru sites/default/settings.php zkontrolujte, zda je pro všechny nastaveno oprávnění pouze pro čtení.
  6. Vyplňte požadované informace:
    • Informace o webu
    • Účet webové údržby
    • Nastavení serveru
  7. Zobrazte úvodní stránku Vašeho webu (odkaz Navštivte svou novou stránku).

Z bezpečnostních důvodů můžete u všech souborů (kořen webu, modules, sites, themes atd.), které mají celý název psán velkými písmeny zakázat pomocí oprávnění k souboru jejich zobrazení přes webový prohlížeč.

Nastavení

  1. V admin/config/system/site-information (Konfigurace, Informace o webu) zadejte základní údaje:
    • Site Details
      • Název
      • Slogan
      • E-mailová adresa
    • Titulní stránka
    • Error Pages
  2. Pro změnu výchozí úvodní stránky webu je nutné Přidat obsah např. Základní stránka nebo Článek.

Systém souborů

Metoda stahování

Veřejně (veřejný přístup)

Adresa odkazu u souborů ukazuje přímo na místo, kde jsou soubory na serveru umístěny.

Neveřejně (neveřejný přístup)

Umístění souborů na serveru není možné zjistit přímo z adresy odkazu, protože do adres odkazů na soubor vkládá Drupal automaticky proměnnou system.

Výhody:

  • umožňuje kontrolovat přístup ke stahovaným souborům (např. je možné zjišťovat počet stažení příloh)

Při umístění souborů mimo veřejný prostor webu je většinou nutné požádat poskytovatele webhostingu o posunutí Open_basedir restrikce.

Nastavení

  1. Přejděte do admin/config/media/file-system (Konfigurace, Systém souborů) a zvolte výchozí způsob stahování.
  2. Nastavte cestu k souborovému systému a dočasnému adresáři:
    1. Veřejná metoda stahování (veřejný přístup)
      1. Jednoduchý web (výchozí nastavení):
        • Cesta k veřejnému souborovému systému: sites/default/files
        • Cesta k neveřejnému souborovému systému: sites/default/private/files
        • Dočasný adresář: /tmp nebo sites/default/private/tmp
      2. Multisite web:
        • Cesta k veřejnému souborovému systému: sites/adresa.webu/files
        • Cesta k neveřejnému souborovému systému: sites/adresa.webu/private/files
        • Dočasný adresář: /tmp nebo sites/adresa.webu/private/tmp
    2. Neveřejná metoda stahování (neveřejný přístup):
      1. Jednoduchý web:
        1. Adresáře private/files a tmp jsou umístěny na veřejném místě webhostingu, ale znepřístupněny nastavení souboru .htaccess
          • Cesta k neveřejnému souborovému systému: sites/default/private/files
            • do souboru private/files/.htaccess doplňte
              Deny from all

              dle nastavení serveru je někdy nutné zakomentovat

              #Options None
              #Options +FollowSymLinks
              
            • pokud v neveřejném systému souborů chcete povolit přístup do nějakého adresáře např. private/files/languages/, vložte do něj soubor .htaccess obsahující
              Order Deny,Allow
          • Dočasný adresář: /tmp nebo sites/default/private/tmp
        2. Adresáře private/filestmp jsou umístěny na neveřejném místě webhostingu
          • Cesta k neveřejnému souborovému systému: dle umístění na serveru
          • Dočasný adresář: dle umístění na serveru
      2. Multisite web:
        1. Adresáře private/filestmp jsou umístěny na veřejném místě webhostingu, ale znepřístupněny nastavení souboru .htaccess
          • Cesta k neveřejnému souborovému systému: sites/adrese.webu/private/files
            • do souboru private/files/.htaccess doplňte
              Deny from all
            • pokud v neveřejném systému souborů chcete povolit přístup do nějakého adresáře např. private/files/languages/, vložte do něj soubor .htaccess obsahující
              Order Deny,Allow
          • Dočasný adresář: /tmp nebo sites/adresa.webu/private/tmp
        2. Adresáře private/filestmp jsou umístěny na neveřejném místě webhostingu
          • Cesta k souborovému systému: dle umístění na serveru
          • Dočasný adresář: dle umístění na serveru

Úpravy 

Pokdu jste již na web vložili nějaké soubory (přílohy, obrázky atd.), metodu stahování již neměňte!

Veřejně (veřejný přístup)

Pokud potřebujete změnit umístění adresáře files je třeba upravit i cesty v databázových tabulkách files, node_revisions, usersvariable.

 

Datum a čas

  1. V admin/config/regional/date-time/locale/cs/edit (Konfigurace, Datum a čas, Lokalizovat, Čeština) upravte formáty:
    • Dlouhý: Úterý, 15. Únor 2011 – 23:43
      • l, d. F Y – H:i (vlastní formát s dlouhou pomlčkou)
    • Střední: 15. Únor 2011 – 23:43
      • d. F Y – H:i (vlastní formát s dlouhou pomlčkou)
    • Krátký: 15. 02. 2011 – 23:43
      • d. m. Y – H:i (vlastní formát s dlouhou pomlčkou)

Lokalizace

  1. V admin/modules (Moduly) povolte modul Locale.
  2. V admin/config/regional/language (Konfigurace, Jazyky) zvolte výchozí jazyk.
  3. V admin/config/regional/translate/import (Konfigurace, Překlad rozhraní, Import) je možné importovat .po soubory překladů.
  4. V admin/config/regional/translate/translate (Konfigurace, Překlad rozhraní, Přeložit) je možné nepřeložené výrazy vyhledat a přeložit.

Nabízí se dva různé způsoby překladu vícejazyčného obsahu:

  1. Původní způsob po celých uzlech viz modul Content translation.
  2. Nový způsob po samostatnch entitách viz modul Entity translation.

Odkazy

Poznámka:
Příloha obsahuje oficiální překlady jádra sloučené do jediného souboru.

PřílohaVelikost
cs-6.x-1.8-2008-Apr-27.zip195.78 KB

Cron

Některé moduly vyžadují službu cron. Zvolte si proto jednu z následujících možností:

Vestavěný Cron

Je spouštěn na základě návštěv uživatelů webu. V admin/config/system/cron (Konfigurace, Cron) je možné nastavit pravidelnost opakování.

Webhosting

Většina poskytovatelů nabízí zapnutí služby cron v administraci webhostingu. Po nastavení této služby vypněte spouštění vestavěného cronu v konfiguraci Drupalu.

Poormanscron

Použijte modul Drupalu s názvem Poormanscron.

WebCron

Zaregistrujte se na stránkách www.webcron.org a vytvořte si novou úlohu pro Váš web.

Server

Spouštění každých 30 minut

Do souboru /etc/crontab vložte (YOURKEY je možné zjistit v admin/reports/status (Logy, Hlášení stavu)

0,30 * * * * root /usr/bin/wget -O - -q http://example.com/cron.php?cron_key=YOURKEY

Spouštění každou hodinu

Do souboru /etc/crontab vložte

0 * * * * root /usr/bin/wget -O - -q http://example.com/cron.php?cron_key=YOURKEY

Jiný způsob:

  1. Pro spouštění skriptu cron.php jednou za hodinu vytvořte v /etc/cron.hourly soubor s názvem např. script a oprávněním:
    Oprávnění souboru script
      Čtení Zápis Spouštění
    Vlastník Ano Ano Ano
    Skupina Ano Ne Ano
    Ostatni Ano Ne Ano
  2. Do souboru vložte níže uvedené řádky a upravte adresu Vašeho webu:
    #!/bin/sh
    /usr/bin/wget -O - -q http://example.com/cron.php?cron_key=YOURKEY

    Pokud máte přístup k serveru omezen pouze na některé IP adresy, je vhodné příkazu wget nařídit použití lokálního rozhraní:

    #!/bin/sh
    /usr/bin/wget -O - -q --bind-address=127.0.0.1
     http://example.com/cron.php?cron_key=YOURKEY

PHP

  1. Pro spouštění cronu pomocí PHP vytvořte soubor např. script.php s oprávněním:
    Oprávnění souboru script.php
      Čtení Zápis Spouštění
    Vlastník Ano Ano Ano
    Skupina Ne Ne Ne
    Ostatni Ne Ne Ne
  2. Do souboru vložte níže uvedené řádky a upravte adresu Vašeho webu:
    <?php
      require('http://example.com/cron.php?cron_key=YOURKEY');
    ?>

    nebo (záleži na webhostingu)

    <?php
      $spustcron = file_get_contents('http://example.com/cron.php?cron_key=YOURKEY');
      echo $spustcron;
    ?>

Windows

Configuring cron jobs on Windows

Toolkit pro práci s obrázky

V admin/config/media/image-toolkit (Konfigurace, Toolkit pro práci s obrázky) nastavte kvalitu JPEG obrázků na 80 %.

Vstupní formáty

V admin/config/content/formats (Konfigurace, Formáty textu) určuje první řádek výchozí filtr:

  • v nastavení filtru Full HTML povolte uživatelské role s oprávněním plné editace HTML obsahu (např. vytváření a úprava tabulek, flash animace atd.)
    • Role: administrator
  • Filtered HTML
    • tento vstupní formát odstraňuje nepovolené (X)HTML značky a všechny atributy style
    • v nastavení filtru Limit povolených HTML značek můžete upravit Povolené HTML značky:
      <a> <p> <span> <div> <h3> <h4> <h5> <h6> <img> <hr> <br> <br /> <ul> <ol> <li> <dl> <dt> <dd> <em> <strong> <del> <ins> <sub> <sup> <quote> <blockquote> <pre> <address> <code> <cite>
    • Role: přihlášený uživatel, administrator
  • Plain text
    • Role: všechny
  • další vstupní formáty je možné vytvořit pomocí modulů:
    • PHP filter
    • WYSIWYG Filter – jednoduchá installace, nevyžaduje knihovny třetích stran
    • HTML Purifier – populární, mocný, ale může být pomalý
    • htmLawed – méně populární

Pokud používáte modul CKEditor (FCKeditor) je doporučeno pro lepší kontrolu nad konci řádků vypnout u všech vstupních formátů filtr Převést odřádkování do HTML (tj. <br> a <p>).

Vzhled

  1. V admin/appearance (Vzhled) je možné určit výchozí a dostupná témata.
  2. Více témat vzhledu je možné získat na http://drupal.org/project/Themes (většinu z nich si můžete prohlédnou na Theme Garden).
    1. Témata vzhledu umísťujte do adresáře sites/all/themes/. Toto umístění je vhodnější pro případný upgrade systému na nvou verzi. Navíc zde uvístěná témata vzhledu jsou společná pro všechny subdomény (multisite web).
  3. Výchozí nastavení témat je možné upravit v admin/appearance/settings (Vzhled, Nastavení).

 

Primární odkazy

  1. V admin/build/menu-customize/primary-links (Administrace, Prvky webu, Menu, Primární odkazy) je možné vytvářet a upravovat primární odkazy např.:
    • Nadpis odkazu menu: Přihlášení
    • Cesta: user

 

Bloky

Bloky sdružují obsah, který lze na stránce volně přemisťovat:

  • v admin/structure/block (Struktura, Bloky) je možné upravovat rozmístění a nastavení jednotlivých bloků
  • pokud si omylem vypnete blok pro přihlášení je možné se přihlásit zadáním adresy:

Tip: pro statistiky stránek, reklamu atd. je vhodné vytvořit samostatné bloky (nevkládejte je přímo do používaného tématu vzhledu)

Obsah

Node (uzel, jednotka) je obecný objekt reprezentující libovolný obsah. Každý node má jedinečné číslo (nid), verzi (vid), metadata, název (title) a obsah (většinou body).

Výchozí hodnoty pro jednotlivé typy obsahu

V admin/structure/types (Struktura, Typy obsahu) je možné nastavit výchozí hodnoty pro jednotlivé typy obsahu:

  • popisek pro pole nadpis
  • zobrazovaní na titulní straně
  • nastavení komentářů
    • nezobrazovat formulář pro odpověď na stránce s komentáři
  • nastavení výchozí pozice menu při zadávání nového obsahu

Titulní strana

V admin/config/system/site-information (Konfigurace, Informace o webu) je možné upravit:

  • počet příspěvků na úvodní stránce
  • výchozí titulní stranu

Informace o revizi

Při vytváření obsahu můžete pomocí revizí vytvářet různé verze (ukládat historii) stejného obsahu a sledovat rozdíly mezi jednotlivými verzemi.

 

Uživatelé

  1. V admin/people (Uživatelé):
    • upravte nastavení vlastního účtu (1. vytvořený účet nemá žádná omezení):
    • obrázek uživatele
    • časová zóna
      • můžete vytvořit účet pro webmastra (1. vytvořený účet bez omezení používat jen pokud je to nutné)
      • v případě potřeby přidejte další uživatele
  2. V admin/people/permissions/roles (Uživatelé, Role) můžete upravovat uživatelské role, např. vytvořit roli webmaster.
  3. V admin/people/permissions (Uživatelé, Oprávnění) je možné upravovat oprávnění uživatelských rolí.

Uživatelské nastavení

V admin/config/people/accounts (Konfigurace, Nastavení účtu) je možné nastavit způsob registrace, podpisy, podporu obrázků uživatelů a upozorňovací e-maily:

  • můžete povolit podpisy
  • podpora obrázků uživatelů:
    • adresář pro obrázky: pictures/users
    • můžete upravit texty e-mailů

Zobrazení autora

V admin/structure/types (Struktura, Typy obsahu) je možné zvolit u kterého typu obsahu se bude zobrazovat autor (případně i jeho obrázek). Viz sekce Nastavení zobrazení.

 

Čistá URL

Viz nastavení modulu Path.

Menu

Viz nastavení modulu Menu.

Cookie

Pokud v souboru /sites/default/settings.php odkomentujete níže uvedenou proměnnou, může být uživatel přihlášen při přechodu mezi všemi doménami multisite webu.

$cookie_domain = 'example.com';

 

Výkon

V admin/config/development/performance (Konfigurace, Výkon) je možné nastavit:

  • cache stránek pro anonymní uživatele
    • při zapnutí se nepřihlášeným uživatelům mohou zobrazovat neaktuální informace (např. u modulů CoundownEvent) –  řešení nabízí např. modul CacheExclude
    • při úpravách tématu vzhledu je vhodné cache stránek dočasně vypnout
    • nepovolujte pokud http hlavičky vracejí údaj Transfer-Encoding: gzip (deflate) – v tomto případě provádí komprimaci již server
  • optimalizaci přenosu dat (pouze pokud máte nastaven systém souborů na veřejný)

Výkon Drupalu je možné zvýšit moduly:

  • Ad memcache
  • Cache Router
  • Memcache API and Integration
  • Path Cache
  • Authcache
  • Advanced cache

Výkon web serveru je možné zvýšit:

  • použitím PHP op-code cache / accelerators (XCache, APC, eAccelerator, Alternative PHP Cache, Zend Optimizer, ionCube PHP Accelerator, Turck MMCache, Nusphere PhpExpress atd.)
  • konfigurací dedikovaného web serveru pro statické stránky
  • instalací PHP memcache (debian memcached)
  • replikací MySQL databází pro čtení (více slave strojů), pro čtecí servery pak použijte load-balencery

 

Vlastní vzhled

Při vytváření vlastního vzhledu je vhodné vycházet z některého ze základních témat vzhledu, které jsou uloženy v adresáři themes a z příručky Theme Guide (en). Pro výuku jsou také vhodná témata Zen (nejepší dokumentace) a Basic (jdenoduché).

  1. V sites/all/themes vytvořte adresář vlastního vzhledu např. my_own_theme.
    • název adresáře (tématu) nesmí kolidovat s názvy modulů a nesmí začínat číslem
  2. V adresáři vlastního vzhledu vytvořte vhodnou adresářovou strukturu např.:
    • color
    • design
    • fonts
    • scripts
    • translations
  3. Adresář vlastního vzhledu může obsahovat soubory:
    • my_own_theme.info (vyžadovaný)
      • od Drupalu 7 není pomlčka (-) v názvu .info souboru akceptována (téma není přístupné v administraci) 
    • styles.css - použije se pro všechna média
    • logo.png
    • screenshot.png – náhled vzhledu
    • page.tpl.php
    • box.tpl.php – obal komentářů
    • comment.tpl.php
    • template.php
    • maintenance-page.tpl.php
    • fckstyles.xml – úprava výchozího nastavení stylů (elementů a atributů) modulu fckeditor
    • node.tpl.php – výchozí zobrazení všech typů obsahů
    • node-xxx.tpl.php – upřesnění zobrazení konkrétního typu obsahu (book, image, page, story, blog atd.)
    • comment-xxx.tpl.php – upřesnění zobrazení komentáře u konkrétního typu obsahu (book, image, page, story, blog atd.)
    • block-xxx.tpl.php – upřesnění zobrazení bloku (region, module atd.)
    • page-xxx.tpl.php – upřesnění zobrazení stránky (front, node, node-edit atd.)
    • block.tpl.php – zobrazení bloků
    • ...

 

.info

Konfigurační soubor .info (en) obsahuje základní informace a je vyžadován u každého tématu vzhledu. Název souboru musí být shodný s názvem adresáře.

Soubor musí obsahovat klíče:

name = Moje vlastní téma vzhledu
core = 6.x

Příklad:

name = Moje vlastní téma vzhledu
description = Popis tématu<br /><a href="http://tomas.dankovi.info/">Tomáš Daněk</a>
core = 6.x
engine = phptemplate
stylesheets[all][] = styles/all.css
stylesheets[screen, projection][] = styles/layout.css
stylesheets[screen, projection][] = styles/decoration.css
stylesheets[screen, projection][] = styles/modules.css
stylesheets[screen, projection][] = styles/fckeditor.css
stylesheets[print][] = styles/print.css

Další regiony viz regions.

html.tpl.php

Soubor modules/system/html.tpl.php obsahuje základní HTML strukturu stránky.

page.tpl.php

Soubor modules/system/page.tpl.php obsahuje šablonu stránky.

Promměnné souboru page.tp.php
Drupal 5 Drupal 6 Poznámky
Globální proměnné
  $base_path Adresa instalace Drupalu (vetšinou /)
  $css Pole CSS souborů aktuální stránky
  $directory Adresář aktuálního tématu vzhledu
  $is_front TRUE pokud je aktuální stránka úvodní stránkou (používá se společně s $mission)
  $logged_in TRUE pokud je uživatel přihlášen
  $is_admin TRUE pokud má uživatel oprávnění přístupu k administrační stránce
Metadata stránky
$language $language->language Textová reprezentace jazyka (en, cs...)
$language->dir Směr textu (ltr, rtl)
  $head_title Modifikovaná verze názvu stránky pro použití v elementu <title>
  $head Metadata, klíčová slova atd.
  $styles Připojení všech CSS stylů stránky (moduly, téma vzhledu atd.)
  $scripts Načtení JavaScript souborů a nastavení stránky

$body_classes Aktuální CSS třídy stránky: front / not-front,  logged-in / not-logged-in, page-... (node, admin, user...), node-type-... (page, story...), two-sidebars / one-sidebar sidebar-left / one-sidebar sidebar-right / no-sidebars
Identita stránky
$base_path $front_page Adresa úvodní stránky
  $logo Cesta k logu webu
  $site_name Název webu (zobrazení je možné povolit / zakázat v nastavení tématu vzhledu)
  $site_slogan Slogan webu (zobrazení je možné povolit / zakázat v nastavení tématu vzhledu)
  $mission Poslání webu (zobrazení je možné povolit / zakázat v nastavení tématu vzhledu)
Navigace
  $search_box Vyhledávací formulář (zobrazení je možné povolit / zakázat v nastavení tématu vzhledu)
  $primary_links Primární odkazy navigace (pokud jsou nastaveny)
  $secondary_links Sekundární odkazy navigace (pokud jsou nastaveny)
$sidebar_left $left Levý postranní pruh
$sidebar_right $right Pravý postranní pruh
Obsah stránky
  $header Identifikace bloku hlavičky
  $breadcrumb "Drobečková" navigace aktuální stránky
  $tabs Záložky s možnostmi aktuální stránky (např. Zobrazit, Upravit...)
  $tabs2  
  $title Název aktuální stránky

$show_messages  
  $messages Stav a chybová hlášení (zvýrazněte pomocí CSS)
  $help Dynamický text nápovědy (většinou pro stránky administrace)
  $content Hlavní obsah aktuální stránky
  $feed_icons Řetězec všech ikonek aktuální stránky (např. Syndikovaný obsah RSS)
Patička
  $footer_message Zápatí webu definované v administraci stránek (Informace o webu)

$footer Oblast zápatí webu
Uzavírací data
  $closure Závěrečná uzavírací značka pro všechny moduly, které mění stránku (uvádějte až za veškerým dynamickým obsahem)

Poznámka:
Pomocí snippetů můžete např. zobrazit uvítání uživatele, nebo upozornit na to, že uživatel ještě není registrován. 

template.php

Šablona template.php (en) umožňuje předefinovat výchozí a vytvářet vlastních funkce.

Odpovídající funkce je možné vyhledat na stránkce Default theme implementations (en).

Potlačení CSS souborů definovaných jádrem a moduly

Téma vzheldu může nahradit CSS soubory definované jádrem a moduly přidáním stylopisu stejného jména a použitím funkce drupal_add_css(). Toto umožňuje tématům potlačit veškeré CSS soubory pokud je to nutné.

Například pokud chcete styl modules/system/system-menus.css definovaný jádrem nahradit (potlačit pro určitá média) vlastním:

  1. V používaném tématu vzhledu vytvořte např. v adresáři styles soubor system-menus.css s požadovanými styly.
  2. V používaném tématu vzhledu vytvořte (upravte) souboru template.php, do kterého vložte:
    <?php
      drupal_add_css(path_to_theme() .'/styles/system-menus.css', 'theme', 'screen, projection', TRUE);
    ?>
    

Výše uvedený příklad se načte pouze pro dané téma, tj. nenačte se pro případná podtémata. Pokud potřebujete používat přepis stylu i v podtématech přidejte jej přímo do .info souboru.

Funkce vzhledu

Všechny funkce začínající slovem theme (např. theme_username) vytvářejí HTML výstup a je možné je upravit pomocí souboru template.php.

Obecný posutp

  1. Najděte požadovanou funkci (přímo v Drupalu nebo na api.drupal.org).
  2. Zkopírujte funci do template.php, přejmenujte její název např. z theme_... nebo template_... nejlépe na název používaného tématu MYTHEMENAME_..., což je zhlediska výkonu nejlepší a upravte dle libosti.
  3. Pro zjištění hodnot pole je vhodné do funkce vložit např. funkci kpr() s požadovaným polem
    • kpr($variables);
  4. Po úpravách template.php je důležité obnovit cache tématu vzhledu!
    • Přejděte na stránku s tématy vzhledu a aktuální stav uložte.

Příklad: Úprava délky zobrazovaného uživatelského jména

Drupal 7:

  1. Funkce, která mimo jiné ořezává délku uživatelského jména se jmenuje template_preprocess_username.
  2. Tuto funkci je vhodé doplnit ještě o možnost zobrazení úplného jména pomocí modulu RealName a nově vytvořeného pole field_fullname.
  3. Výsledná funkce může vypadat třeba takto
    • /**
       * Implements hook_preprocess_username().
      */
      function MYTHEMENAME_preprocess_username(&$variables) {
      $account = $variables['account'];

      $variables['extra'] = '';
      if (empty($account->uid)) {
      $variables['uid'] = 0;
      if (theme_get_setting('toggle_comment_user_verification')) {
      $variables['extra'] = ' (' . t('not verified') . ')';
      }
      }
      else {
      $variables['uid'] = (int) $account->uid;
      $user = user_load($account->uid);
      if (isset($user->field_fullname['und'][0]['value'])) {
      $name = $variables['name_raw'] = $user->field_fullname ['und'][0]['safe_value'];
      } else {
      // Set the name to a formatted name that is safe for printing and
      // that won't break tables by being too long. Keep an unshortened,
      // unsanitized version, in case other preprocess functions want to implement
      // their own shortening logic or add markup. If they do so, they must ensure
      // that $variables['name'] is safe for printing.
      $name = $variables['name_raw'] = format_username($account);
      }
      }

      if (drupal_strlen($name) > 20) {
      //$name = drupal_substr($name, 0, 15) . '...';
      }
      $variables['name'] = check_plain($name);

      $variables['profile_access'] = user_access('access user profiles');
      $variables['link_attributes'] = array();
      // Populate link path and attributes if appropriate.
      if ($variables['uid'] && $variables['profile_access']) {
      // We are linking to a local user.
      $variables['link_attributes'] = array('title' => t('View user profile.'));
      $variables['link_path'] = 'user/' . $variables['uid'];
      }
      elseif (!empty($account->homepage)) {
      // Like the 'class' attribute, the 'rel' attribute can hold a
      // space-separated set of values, so initialize it as an array to make it
      // easier for other preprocess functions to append to it.
      $variables['link_attributes'] = array('rel' => array('nofollow'));
      $variables['link_path'] = $account->homepage;
      $variables['homepage'] = $account->homepage;
      }
      // We do not want the l() function to check_plain() a second time.
      $variables['link_options']['html'] = TRUE;
      // Set a default class.
      $variables['attributes_array'] = array('class' => array('username'));
      }

Drupal 6:

  1. Funkce, která mimo jiné ořezává délku uživatelského jména je v souboru includes/thhme.inc a jmenuje se theme_username.
  2. Funkci zkopírujte do template.php, přejmenujte její název z theme_username na název vašeho tématu MYTHEMENAME_username a upravte požadovanou část jejího kódu:
    function theme_username($object) {
      if ($object->uid && $object->name) {
        // Shorten the name when it is too long or it will break many tables.
        if (drupal_strlen($object->name) > 20) {
          $name = drupal_substr($object->name, 0, 15) .'...';
        }
    ...

    např. na:

    function MYTHEMENAME_username($object) {
      if ($object->uid && $object->name) {
        // Shorten the name when it is too long or it will break many tables.
        if (drupal_strlen($object->name) > 30) {
          $name = drupal_substr($object->name, 0, 25) .'...';
        }
    ...

    Místo phptemplate je z hlediska výkonu vhodnější psát název tématu. 

  3. Přejděte na stránku s tématy vzhledu a aktální stav uložte.

 

Vlastní funkce

Připojení CSS pro Internet Explorer:

/**
 * Generates IE CSS links for LTR and RTL languages.
 */
function phptemplate_get_ie_styles() {
  global $language;
  $iecss = "\n";
  $iecss .= '<!--[if (lte IE 7)&(gte IE 5)]>'."\n  ";
  $iecss .= '<link type="text/css" rel="stylesheet" media="screen,
   projection" href="'. base_path() . path_to_theme()
   .'/styles/ie-7.css" />'."\n  ";
  if (defined('LANGUAGE_RTL') && $language->direction ==
   LANGUAGE_RTL) {
    $iecss .= '<link type="text/css" rel="stylesheet" media="screen,
     projection" href="'. base_path() . path_to_theme()
     .'/styles/ie-7-rtl.css" />'."\n  ";
  }
  $iecss .= '<![if lt IE 7]>'."\n    ";
  $iecss .= '<link type="text/css" rel="stylesheet" media="screen, 
   projection" href="'. base_path() . path_to_theme()
   .'/styles/ie-6.css" />'."\n    ";
  if (defined('LANGUAGE_RTL') && $language->direction ==
   LANGUAGE_RTL) {
    $iecss .= '<link type="text/css" rel="stylesheet" media="screen,
     projection" href="'. base_path() . path_to_theme()
      .'/styles/ie-6-rtl.css" />'."\n    ";
  }
  $iecss .= '<![if lt IE 6]>'."\n      ";
  $iecss .= '<link type="text/css" rel="stylesheet" media="screen,
   projection" href="'. base_path() . path_to_theme()
    .'/styles/ie-5.5.css" />'."\n      ";
  if (defined('LANGUAGE_RTL') && $language->direction ==
   LANGUAGE_RTL) {
    $iecss .= '<link type="text/css" rel="stylesheet" media="screen,
     projection" href="'. base_path() . path_to_theme()
     .'/styles/ie-5.5-rtl.css" />'."\n      ";
  }
  $iecss .= '<![if lt IE 5.5]>'."\n        ";
  $iecss .= '<link type="text/css" rel="stylesheet" media="screen, 
   projection" href="'. base_path() . path_to_theme()
   .'/styles/ie-5.css" />'."\n      ";
  if (defined('LANGUAGE_RTL') && $language->direction ==
   LANGUAGE_RTL) {
    $iecss .= "  ".'<link type="text/css" rel="stylesheet"
     media="screen, projection" href="'. base_path() .
      path_to_theme() .'/styles/ie-5-rtl.css" />'."\n      ";
  }
  $iecss .= '<![endif]>'."\n    ";
  $iecss .= '<![endif]>'."\n  ";
  $iecss .= '<![endif]>'."\n";
  $iecss .= '<![endif]-->'."\n";
  return $iecss;
}

 

Úprava formulářů

V používaném tématu vzhledu vytvořte (upravte) soubor template.php, do kterého vložte požadovanou funkci nalezenou přímo v Drupalu nebo na api.drupal.org:

  • /**
    * Implements HOOK_form_alter()
    */
    function MYTHEMENAME_form_alter(&$form, &$form_state, $form_id) {
    //echo $form_id .", ";
    }
  • nebo ještě lépe
  • /**
    * Implements HOOK_form_FORM_ID_alter()
    */
    function MYTHEMENAME_form_search_block_form_alter(&$form, &$form_state, $form_id) {
    //kpr(); // require Devel modul
    //var_dump($form);
    }

 

Date

 Odstranění (úprava) popisu "celý den" u pole datum modulu Date:

/**
* Theme the way an 'all day' label will look.
*/
function phptemplate_date_all_day_label() {
  return '';
}

 Místo phptemplate je z hlediska výkonu vhodnější psát název tématu. 

comment.tpl.php

Soubor comment.tpl.php obsahuje šablonu komentáře

Příklad:

<div class="comment2<?php print ($comment->new) ? ' comment-new' : ''; print ' '. $status; print ' '. $zebra; ?>">
  <div class="clear-block">
  <?php if ($submitted): ?>
    <span class="submitted"><?php print $submitted; ?></span>
  <?php endif; ?>
  <?php if ($comment->new) : ?>
    <span class="new"><?php print drupal_ucfirst($new) ?></span>
  <?php endif; ?>
  <?php print $picture ?>

    <h3><?php print $title ?></h3>
    <div class="content">
      <?php print $content ?>
      <?php
        if ($signature):
        // You can use the following to prevent double-display of signatures on old posts (converting Drupal 5 to Drupal 6)
        // if ($signature && $comment->cid > 3443): // The highest comment ID before upgrading to Drupal 6
      ?>

        <div class="user-signature clear-block">
          <div>—</div>
          <?php print $signature ?>

        </div>
      <?php endif; ?>

    </div>
  </div>
  <?php if ($links): ?>

    <div class="links"><?php print $links ?></div>
  <?php endif; ?>

</div>

 

maintenance-page.tpl.php

Vlastní vzhled webu v offline režimu.

  1. V adresáři vlastního vzhledu vytvořte soubor maintenance-page.tpl.php např. zkopírováním souboru page.tpl.php.
  2. V sites/default/settings.php odkomentujte (i záčátek a konec pole) a definujte téma pro offline režim např.:
    $conf = array(
      'maintenance_theme' => 'my-owns-theme'
    );

 

Úprava vzhledu modulu pomocí šablony .tpl.php

Bližší informace o šablonách naleznete v Template Suggestions.

Příklad upravy úvodní stránky:

  • Drupal 7
    • page.tpl.php (základní šablona je vyžadována vždy )
    • page--front.tpl.php 
  • Drupal 6
    • page.tpl.php (základní šablona je vyžadována vždy )
    • page-front.tpl.php 

Příklad změny vzhledu uživatelského profilu:

  1. Z adresáře modules/user/ zkopírujte do svého tématu vzhledu soubor user-profile.tpl.php.
  2. A admin/settings/performance (Administrace, Nastavení webu, Výkon) vyčistěte Cache.
  3. Upravte zkopírovaný soubor user-profile.tpl.php dle potřeb.

 

CSS

Kaskádové styly (CSS)

Podpora jazyků s tokem textu zprava doleva

Kaskádové styly je možné vytvářet v párech. Ve stejném adresáři může být např. soubor style.css s výchozím určením pro tok textu zleva doprava (left to right) a style-rtl.css určený pro tok textu zprava doleva (right to left) např. pro Arabštinu, Hebrejštinu atd.

Soubor style-rtl.css může potlačit určené deklarace souboru style.css. Dle dohody jsou odlišnosti v toku textu označeny /* LTR */ komentářem v originálním souboru style.css, aby bylo jasné které deklarace je nutné modifikovat v souboru style-rtl.css (přehlednost při pozdějších úpravách).

Soubor style-rtl.css je uplatněn pouze v případě použití jazyka (zobrazení stránek) s tokem textu zprava doleva a potlačuje tak určené deklarace souboru style.css.

Příklad:

Výpis části souboru modules/system/defaults.css:

th {
  text-align: left; /* LTR */
  padding-right: 1em; /* LTR */
  border-bottom: 3px solid #ccc;
}

Výpis části souboru modules/system/defaults-rtl.css:

th {
  text-align: right;
  padding-right: inherit;
  padding-left: 1em;
}

 

Odvozený vzhled

Adresář se vzhledem může obsahovat několik odvozených (podobných) témat vzhledů.

  1. V adresáři se vzhledem vytvořte požadovanou strukturu. Např.: adresář sub-themes a v něm adresář s názvem odvozeného vzhledu.
  2. Při vytváření odvozeného vzhledu postupujte stejně jako při vytváření vlastního vzhledu (do adresáře s odvozeným vzhledem umisťujte soubory a adresáře), přičemž práci si ulehčíte tím, že budete vkládat pouze odlišné soubory od "základního" vzhledu.
  3. Odvozený vzhled musí obsahovat alespoň soubor s příponou .info např. my-derived-theme.info.
  4. Odvozený vzhled nesdílí theme-settings.php, logo, color a některá nastavení z .info souboru.

Příklad:

name = Odvozené téma vzhledu
description = Popis odvozeného tématu
core = 6.x
engine = phptemplate
base theme = nazev-zakladniho-tematu
stylesheets[screen, projection][] = styles/my-derived-styles.css

Název odvozeného tématu je uložen v proměnné $theme_key (hodí se např. při úpravách cest k obrázkům nebo pro třídy CSS):

<?php
  global $theme_key;
  print $theme_key;
?>

 

Doporučení

  • každý z vícenásobných CSS selektorů psát na samostatný řádek 
  • barevné nastavení vzhledu (barvy textů, pozadí, rámečků, stínů, obrázky na pozadí) psát do samostatného souboru např. color.css
  • výchozí formátování HTML prvků psát do samostatného souboru např. html.css

 

jQuery

Příklad použití jQuery – zobrazující se text Text... ve vyhledávacím poli:

  1. V tématu vzhledu vytvořte adresář scripts/ obsahující soubory jquery.autofill.jsjavascript.js (z přiložených souborů odstraňte příponu .txt).
  2. Do .info souboru tématu vzhledu přidejte řádky:
    scripts[] = scripts/javascript.js
    scripts[] = scripts/jquery.autofill.js
  3. Zobrazte blok Search a vyzkoušejte výsledek.

 

PřílohaVelikost
jquery.autofill.js.txt1.97 KB
javascript.js.txt157 bajtů

API

Díky aplikačnímu rozhraní API (Application Programming Interface) nemusíte zasahovat do zdrojového kódu Drupalu a tudíž nebudete mít problémy při pozdější aktualizaci. API se hodí zejména při úpravách vzhledu a vývoji vlastních modulů.

drupal_get_breadcrumb

Popis

Získá odkazy drobečkové navigace pro aktuální stránku.

Definice

drupal_get_breadcrumb()

includes/common.inc, line 95

Výstup

Řetězec obsahující odkazy drobečkové navigace.

Příklad

Vlastní úprava drobečkové navigace:

<?php
  // if ($breadcrumb) print $breadcrumb;
  if ($breadcrumb) {
    $subtheme_start_page = "<a href=\"/views/news\"
      title=\"Úvodní stránka novinek\">Novinky</a>";
    $crumbs = drupal_get_breadcrumb();
    $home_page = array_shift($crumbs);
    array_unshift($crumbs, $home_page, $subtheme_start_page);
    print theme_breadcrumb($crumbs);
  }
?>

l

Popis

Formátuje vnitřní odkaz.

Funkce l správně manipuluje s odkazy, které mohou mít vytvořené aliasy a umožňuje upravovat jejich vlastnosti. Všechny vnitřní odkazy výstupů modulů by měly být generovány touto funkcí.

Definice

l($text, $path, $options = array())

includes/common.inc, řádek 1534


Níže jsou uvedena data pro Drupal 5!

Parametry

$text – text, který bude uzavřen v odkazu

Veškerý text, který může člověk přečíst a má být zobrazen na stránce by měl být zobrazován funkcí t().

$path – cesta odkazu

Může být externí nebo interní:

  • při zadání úplné cesty bude považována za externí

  • při zadání pouze cesty např. "admin/content/node" bude považována za interní

    • v tomto případě musí být systémovou cestou, aby mohl být generován případný alias pomocí funkce url()

$attributes – asociativní pole HTML atributů aplikovaných u elementu odkazu

$query – řetězec přidaný k odkazu za otazníkem (& parametr)

$fragment – identifikátor přidaný k odkazu (# kotva)

$absolute – vynutit absolutní odkaz začínající http:

Užitečné pro odkazy, které budou zobrazovány mimo web, jako například RSS kanály.

$html – podporovat HTML elementy

Hodnota TRUE je např. nutná pro zobrazení obrázku, jinak se místo obrázku zobrazí v odkazu prostý text (případně HTML entity).

Příklad

<?php
  l(t('Home'), 'node/', array('title' => $site_name, 'class' =>
   'link', 'id' => 'home'), NULL, NULL, FALSE, FALSE)
?>

Výstup

HTML řetězec obsahující odkaz na určenou cestu.

module_exists

Popis

Zjišťuje existenci modulu.

Definice

module_exists($module)

Parametr

$module – název modulu

Příklad

<?php if(module_exists('themer')) print ' '. themer_body_class(); ?>

Výstup

Logická hodnota TRUE, pokud je modul nainstalován a povolen.

t

Popis

Překládá řetězce do jazyka stránky nebo určeného jazyka.

Veškerý text, který může člověk přečíst a má být zobrazen na stránce by měl být zobrazován touto funkcí.

Definice

t($string, $args = array(), $langcode = NULL)

includes/common.inc, řádek 734

Parametry

$string – řetězec obsahující anglický text k přeložení.

$args – asociativní pole náhrad vytvořených po překladu. Všechny výskyty každého klíče v tomto poli jsou nahrazeny odpovídající hodnotou.

Klíče se speciálním významem:

  • !variable – vloženo tak jak je
  • @variable – převede čístý text do HTML (funkce check_plain)
  • %variable – převede text do HTML a přidá formátovací element (funkce check_plain + theme_placeholder)

$langcode  – volitelný kód jazyka překladu odlišný od jazyka stránky

Výstup

Přeložený řetězec.

theme

Popis

Vrací nastylovaný výstup.

Příklad

<?php
  print theme('username', $node);
?>

theme_breadcrumb

Popis

Vrací nastylovanou drobečkovou navigaci.

Definice

theme_breadcrumb($breadcrumb)

includes/theme.inc, line 1226

Parametr

$breadcrumb – pole obsahující odkazy drobečkové navigace

Výstup

Řetězec obsahující drobečkovou navigaci.

Příklad

Vlastní úprava drobečkové navigace:

<?php
  // if ($breadcrumb) print $breadcrumb;
  if ($breadcrumb) {
    $subtheme_start_page = "<a href=\"/views/news\"
      title=\"Úvodní stránka novinek\">Novinky</a>";
    $crumbs = drupal_get_breadcrumb();
    $home_page = array_shift($crumbs);
    array_unshift($crumbs, $home_page, $subtheme_start_page);
    print theme_breadcrumb($crumbs);
  }
?>

 

theme_get_setting

Popis

Funkce získá nastavení z aktuálního tématu, která byla zadána v administraci webu.

Definice

theme_get_setting($setting_name, $refresh = FALSE))

includes/theme.inc, řádek 900

Parametry

$setting_name  – název nastavení, které má být získáno.

$refresh - zda obnovit nastavení cache.

Výstup

Hodnota požadovaného nastavení, NULL jestliže nastavení neexistuje.

Příklad

Zobrazení poslání webu jako meta informace v hlavičce stránky:

<?php
  $my_description = theme_get_setting('mission', false);
  if ($my_description) {
    print '<meta name="description" content="'. $my_description
     .'" />';
  }
?>

 

Snippety

Snippet je malý znovupoužitelný kus programového kódu, který může např.:

Přístup k databázi

Příklad zobrazení požadovaných údajů přímo z databáze:

<?php
  $sql = "SELECT title FROM node ORDER BY node.vid DESC LIMIT 10";
  $result = db_query($sql);
  while ($node = db_fetch_object($result)) {
    $output .= $node->title ." ";
  }
  return $output;
?>

Pro zobrazení je možné využít např. vestavěný PHP filtr obsahu nebo bloku.

Drupal 5

Snippety pro Drupal 5:

Navigace v galerii obrázků

Popis

Doplnění textové navigace do galerie obrázků modulu Image.

Jako základ bylo použito řešení Add a << first < previous next > last >> Pager to Image Nodes Within a Gallery doplněné o lokalizaci.

Postup

  1. Do suboru template.php používaného vzhledu přidejte funkci:
    /**
     * Image Gallery Pager
     */
    function custom_pager($current_nid, $class = NULL) {
      $tid = reset(array_keys(taxonomy_node_get_terms($current_nid)));
      $result = db_query(db_rewrite_sql('SELECT n.nid, n.title FROM {node} n INNER JOIN {term_node} tn ON n.nid = tn.nid WHERE tn.tid = %s AND n.status = 1 ORDER BY n.sticky DESC, n.created DESC, n.nid DESC'), $tid);
      while ($node = db_fetch_object($result)) {
        $nodes[++$i] = $node;
        if ($node->nid == $current_nid) $x = $i;
      }
      if($x > 1) {
        $output .= l(t('« first'), 'node/'. $nodes[1]->nid, array('title' => check_plain($nodes[1]->title), 'class' => $class), NULL, NULL, FALSE, TRUE);
        $output .= l(t('‹ previous'), 'node/'. $nodes[$x-1]->nid, array('title' => check_plain($nodes[$x-1]->title), 'class' => $class), NULL, NULL, FALSE, TRUE);
      }
      else {
        // not required
        // $output .= '<span class="">' . t(t('« first')) . ' </span>' . '<span class="">' . t('‹ previous') . ' </span>';
      }
      $output .= $x .' ('. $i .')';
      if($x < $i) {
        $output .= l(t('next ›'), 'node/'. $nodes[$x+1]->nid, array('title' => check_plain($nodes[$x+1]->title), 'class' => $class), NULL, NULL, FALSE, TRUE);
        $output .= l(t('last »'), 'node/'. $nodes[$i]->nid, array('title' => check_plain($nodes[$i]->title), 'class' => $class), NULL, NULL, FALSE, TRUE);
      }
      else {
        // not required
        // $output .= '<span class="">' . t(t('next ›')) . ' </span>' . '<span class="">' . t(t('last »')) . ' </span>';
      }
      return $output; 
    }
  2. Pokud v adresáři používaného vzhledu nemáte soubor node-image.tpl.php:
    • Zkopírujte např. soubor themes/garland/node.tpl.php do adresáře používaného vzhledu a přejmenujte jej na node-image.tpl.php.
  3. Do souboru node-image.tpl.php přidejte na vhodné místo (nejlépe před "obsah"):
    <!-- Image Gallery Pager -->
    <div class="pager">
      <?php if ($page != 0 && $terms) { print custom_pager($node->nid); } ?>
    </div>

 

Navigace v galerii obrázků s náhledy

Doplnění navigace s náhledy do galerie obrázků u modulu Image.

Jako základ bylo použito řešení Pager with thumbnails doplněné o lokalizaci, číslování a velikosti náhledů.

  1. Do suboru template.php používaného vzhledu přidejte funkci:
    /**
     * Image Gallery Pager with thumbnails
     */
    function custom_pager_thumbnails($current_nid, $class = NULL) {
      $tid = reset(array_keys(taxonomy_node_get_terms($current_nid)));
      $result = db_query(db_rewrite_sql('SELECT n.nid, n.title, f.filepath FROM {node} n INNER JOIN {term_node} tn INNER JOIN {files} f ON n.nid = tn.nid AND n.nid = f.nid WHERE tn.tid = %s AND n.status = 1 AND f.filename = \'%s\' ORDER BY n.sticky DESC, n.created DESC, n.nid DESC'), $tid, 'thumbnail');
      while ($node = db_fetch_object($result)) {
        $nodes[++$i] = $node;
        if ($node->nid == $current_nid) $x = $i;
        // image size
        $image_info = image_get_info($nodes[$i]->filepath);
        $image_width[$i] = $image_info['width'];
        $image_height[$i] = $image_info['height'];
      }
      if ($i < 6) {
        while (++$j <= $i) {
          $output .= l('<img src="' . check_url(url('system/files/' . $nodes[$j]->filepath)) . '" alt="'. check_plain($nodes[$j]->title) . '" width="'. $image_width[$j] .'" height="'. $image_height[$j] .'" />', 'node/'. $nodes[$j]->nid, array('title' => check_plain($nodes[$j]->title), 'class' => $class), NULL, NULL, FALSE, TRUE);
        }
      }
      else {
        switch ($x) {
          case 1:
            // first image
            $y = array($i-1, $i, 1, 2, 3);
            break;
          case 2:
            // second image
            $y = array($i, 1, 2, 3, 4);
            break;
          case $i-1:
            // penultimate image
            $y = array($x-2, $x-1, $x, $i, 1);
            break;
          case $i:
            // last image
            $y = array($x-2, $x-1, $x, 1, 2);
            break;
          default:
            $y = array($x-2, $x-1, $x, $x+1, $x+2);
        }
        foreach($y as $index => $z) {
          if ($index != 2) {
            $output .= l('<img src="' . check_url(url('system/files/' . $nodes[$z]->filepath)) . '" alt="'. check_plain($nodes[$z]->title) . '" width="'. $image_width[$z] .'" height="'. $image_height[$z] .'" />', 'node/'. $nodes[$z]->nid, array('title' => '('. ($z) .') '. check_plain($nodes[$z]->title), 'class' => $class), NULL, NULL, FALSE, TRUE);
          }
          else {
            $output .= '<span class="active" title="('. ($z) .') '. check_plain($nodes[$z]->title) .'"><img src="' . check_url(url('system/files/' . $nodes[$z]->filepath)) . '" alt="'. check_plain($nodes[$z]->title) . '" width="'. $image_width[$z] .'" height="'. $image_height[$z] .'" /></span>';
          }
        }
      }
      return $output;
    }
  2. Pokud v adresáři používaného vzhledu nemáte soubor node-image.tpl.php:
    • Zkopírujte např. soubor themes/garland/node.tpl.php do adresáře používaného vzhledu a přejmenujte jej na node-image.tpl.php.
  3. Do souboru node-image.tpl.php přidejte na vhodné místo (nejlépe před "obsah"):
    <!-- Image Gallery Pager with thumbnails -->
    <div class="pager">
      <?php if ($page != 0 && $terms) { print custom_pager_thumbnails($node->nid); } ?>
    </div>
  4. Do souboru s kaskádovými styly používaného vzhledu (style.css) můžete vložit např.:
    /* Theme snippet: Image Gallery Pager with thumbnails */
    #content .pager {
      margin-top: 3px;
      margin-bottom: 3px;
    }
    #content .pager img {
      margin-bottom: 3px;
      vertical-align: middle;
    }
    #content .pager .active img {
      border: 5px solid #f93;
      margin-bottom: 0;
    }

 

Testování

  1. Vytvořte si druhou doménu, databázi a uživatele pro testování.
  2. Nasměřujte testovací doménu na stejný webový server.
  3. Vytvořte testovací adresář např. /site/test.mujweb.cz s konfiguračním souborem.
  4. Přejděte na testovací adresu a dokončete instalaci.
  5. Nyní můžete instalovat nové moduly a testovat web bez zásahu do oficiální verze.

Moduly

Výchozí instalace Drupalu obsahuje pouze základní funkčnost, kterou však lze velmi snadno rozšířit pomocí externích modulů dle konkrétních potřeb webu.

Hledání a výběr modulů mohou usnadnit statistiky:

Video návody:

Porovnání modulů

 

Vlastní moduly

Vytvoření vlastního mini modulu

Minimální adresářová strura:

  • my_module/
    • my_module.info
    • my_module.module (seznam vhodných hooks)
    • (my_module.install – použije se pouze při prvním zapnutí modulu)

Uvědomte se rozdíly mezi pojmy:

  1. instalace modulu – aplikuje se pouze při prvním zapnutí modulu (např. vytovří tabulky v databázi)
  2. zapnutí modulu – umožňuje modul používat a upravovat jeho nastavení
  3. vypnutí modulu – zachová nastavené hodnoty
  4. odinstalace modulu – umožňuje např. odstranit tabulky v databázi

Hooks

Hooks (háčky) můžeme chápat např. jako speciálně pojmenované PHP funkce. U vyhledané funkce nahraďte slovo hook_... za název modulu např. my_module_... např.:

hook_install() => my_module_install()
hook_enable() => my_module_enable()
hook_disable() => my_module_disable()

Bloky

Pro vytvořeního vlastního modulu, který má zobrazovat nějaký blok(y) jsou třeba minimálně dva hooky:

hook_block_info() => my_module_info()
hook_block_view() => my_module_view()

Při tvorbě bloku pomocí modulu je vhodné projít si demonstrační kód viz block_example.module.

Pro jednoduché uložení a získání dat je možné využít databázovou tabulku variable a funkce variable_set()variable_get().

Globálné proměnné např. o uživateli je možné získat zápisem:

global $user;

Textové řetězce je nutné zapisovat do funkce t().

Formátování zdrojového kódu

  • funkce se zapisují malými písmeny
  • počátení { se píše za názvem funkce, ukončující } se píše smostatn na novém řádku
  • pro odsazení se používají 2 znaky

Upgrade Drupalu verze 5 na 6

Příprava

  1. Zkontrolujte, zda Váš webhosting splňuje minimální požadavky.
  2. Zjistěte si, zda jsou k dispozici všechny Vámi používané moduly v požadované verzi (nejsnadněji instalací modulu Upgrade status).
    • Mohou nastat tyto situace:
      1. používaný modul může být již součástí jádra nové verze Drupalu
        • např. modul Update status (před upgradem je nutné jej odinstalovat)
      2. používaný modul může být již součástí jiného modulu
      3. některé moduly zatím nejsou kompatibilní s novou verzí Drupalu
        • např. modul Upgrade status (před upgradem je nutné jej odinstalovat)
  3. Stáhněte si nové verze modulů, které chcete po upgradu nadále používat, případně si převeďte vlastní moduly do nové verze.
    • Podívejte se na stránky modulů, zda tam nejsou důležité informace pro upgrade, případně si přečtěte instrukce v textových souborech modulů:
      • Image 5.x-1.9
        • u této verze je nutné před upgradem na Drupal 6.9 s Image 6.x-1.0-alpha4 ručně spustit níže uvedené SQL příkazy:
          CREATE TABLE image (`nid` INTEGER UNSIGNED NOT NULL, 
          `fid` INTEGER UNSIGNED NOT NULL, `image_size` VARCHAR(32) NOT NULL, 
          PRIMARY KEY (`nid`, `image_size`), INDEX image_fid(`fid`)) 
          /*!40100 DEFAULT CHARACTER SET utf8 */;
          INSERT INTO image SELECT DISTINCT f.nid, f.fid, f.filename
          FROM files f INNER JOIN node n ON f.nid = n.nid
          WHERE n.type='image' AND f.filename IN ('_original', 'thumbnail', 'preview')
          DELETE FROM file_revisions
          WHERE EXISTS (SELECT * FROM image WHERE image.fid = file_revisions.fid)
        • po převodu na Drupal 6.9 s Image 6.x-1.0-alpha4 tímto způsobem funguje hromadný image import obrázků (zobrazuje se výběr galerie), ale není možné vytvářet typ obsahu Image
      • Image 5.x-2.0-alpha3
        • po převodu na Drupal 6.9 s Image 6.x-1.0-alpha4 nefunguje hromadný image import (není vidět výběr galerie), ani vytváření typu obsahu Image
      • Image 5.x-2.x-dev (2009-Jan-23)
        • po převodu na Drupal 6.9 s Image 6.x-1.0-alpha4 nefunguje hromadný image import (není vidět výběr galerie), ani vytváření typu obsahu Image
      • Custom filter 5.x-1.2
        • po převodu na Drupal 6.9 s Custom filter 6.x-1.x-dev nefungují stávající a není možné importovat nové filtry
        • doporučuji odinstalovat a po upgradu na verzi 6 naistalovat, pak vše funguje
  4. Stáhněte nebo si převeďte používané téma do nové verze.
  5. Stáhněte si novou verzi Drupalu a přečtěte si instrukce v souboru UPGRADE.txt.

Převod

Celý postup nejprve vyzkoušejte nejlépe na kopii webu!

  1. Přihlaste se jako administrátor (uživatel s ID=1). Pokud se jako uživatel s ID=1 přihlásit nemůžete, nezavírejte prohlížeč do ukončení upgradu!
  2. Zkontrolujte logy, hlášení stavu a dostupné aktualizace – web by měl být "aktuální".
  3. Přepněte web do off-line módu (např. z logu zjistěte zda není nějaký uživatel přihlášen – neprovádí úpravy).
  4. Zazálohujte si existující web (soubory i databázi).
    • Určitě se Vám vyplatí zálohu souborů rozbalit a zkontrolovat, zda je úplná (např. pomocí Krusaderu a nástroje Synchronizovat adresáře). Exportu databáze budete muset věřit :)
  5. V admin/settings/performance vypněte optimalizaci přenosu dat CSS a JavaScript
  6. Přepněte téma na Garland (Bluemarine).
  7. Vytiskněte si aktuální stav modulů!
  8. Vypněte moduly, které nejsou součástí jádra (neodinstalovávejte je, ani je nemažte jinak přijdete o jejich nastavení).
  9. Pokud je to možné, odinstalujte všechny moduly, které ještě nejsou k dispozici v nové verzi, které jsou již integrovány do jádra Drupalu nebo jiných modulů, nebo ty které již dále nechcete používat:
    • update status
  10. Na webu smažte všechny soubory (databázi nemažte) kromě:
    • adresáře files (neměňte jeho umístění)
  11. Na web nakopírujte:
    • novou verzi Drupalu
      • vytvořte kopii souboru /sites/default/default.settings.php jako soubor s názvem /sites/default/settings.php
    • pro českou lokalizace Drupalu rozbalte archiv Czech translation do adresáře webu
    • používané moduly v nové verzi
    • novou nebo převedenou verzi tématu vzhledu
    • (na localhostu je potřeba nahraným souborům nastavit správné vlastníky a oprávnění)
  12. Porovnejte aktuální soubory se zálohovanými a upravte potřebné sekce:
    • .htaccess
    • robts.txt
    • (favicon.ico)
    • sites/default/settings.php
  13. Spusťte update.php skript (adresa-vaseho-webu/update.php).
    • pokud skript není možné spustit:
      • upravte v souboru settings.php proměnnou: $update_free_access = FALSE;
      • na: $update_free_access = TRUE;
      • spusťte update.php
      • po spuštění skriptu vraťte proměnnou do původního stavu
  14. Zkontrolujte hlášení stavu, logy, nastavení a funkčnost jádra webu.
  15. Povolte požadované moduly a spusťte opět update.php skript.
  16. Zkontrolujte oprávnění uživatelů.
  17. Zvolte požadované téma vzhledu.
  18. V admin/settings/performance můžete zapnout optimalizaci přenosu dat CSS a JavaScript
  19. Pro kompletní import lokalizace je vhodné odstranit a znovu přidat zvolený jazyk např. Czech.
  20. Z bezpečnostních důvodů můžete u všech souborů (kořen webu, modules, sites, themes atd.), které mají celý název psán velkými písmeny zakázat pomocí oprávnění k souboru jejich zobrazení přes webový prohlížeč.
  21. Volitelná nastavení:
    • naimportujte češtinu Drupalu (viz příloha lokalizace) a používaných modulů
    • přeindexace vyhledávání
    • kontrola aliasů (dávkové vygenerování aliasů u obsahu, který ještě žádný alias nemá)
  22. Zkontrolujte hlášení stavu, logy, nastavení a funkčnost celého webu.
  23. Přepněte web do on-line módu.
  24. Jestliže na testovací kopii webu proběhlo vše úspěšně, můžete výsledek zkopírovat na "ostrý" web (případně celý postup opakovat na "ostrém" webu).

Úspěšné převody Drupalu 5 na 6

  1. "problém" s modulem Image viz výše: Drupal 5.15 -> 6.9, Image 1.9 -> 1.0-alpha4, Comment Mail 1.1 -> 1.0-beta1, Countdown 1.1 -> 1.0, FCKeditor 2.1 -> 1.3-rc7, Pathauto 2.3 -> 1.0, Poormanscron 1.1 -> 1.0, Taxonomy breadcrumb 1.4 -> 1.0, Token 1.11 -> 1.11, SWF tools 2.2 -> 1.3, Captcha 3.2 -> 1.0-rc2
  2. Drupal 5.16 -> 6.10, Comment Mail 1.1 -> 1.0-beta1, FCKeditor 2.1 -> 1.3-rc7, IMCE 1.2 -> 1.2, Pathauto 2.3 -> 1.1, Site map 1.2 -> 1.0, Taxonomy breadcrumb 1.4 -> 1.0, Token 1.11 -> 1.11, Captcha 3.2 -> 1.0-rc2

Prevent file not found errors
After you upgrade your site you should check your site for bad links, to prevent the file not found errors. The http error number for these pages is 404. You can use a simple tool to check the links on your site. You will see errors in you Drupal Administrator logs as well as your web server error logs. Perform the following commands through the administrator menu on your site:

From a command line on a computer connected to the Internet run wget with the following options:

The cookie this command is referring to is the cookie downloaded from your browser when you last logged into your Drupal site as an admin.

wget -r --delete-after --cookies=off --header='Cookie: PHPSESSID=xxx' http://example.com

-r to recursively crawl the site. --delete-after, --cookies=off tells the crawler not to use a cookie. --header=’Cookie: PHPSESSID=XXXX’ tells the Drupal site that session information will be passed in the http header. This should be repeated 2 more times; once for a regular userid, and once for an anonymous userid. After the link check is done check your Drupal admin logs and your webserver error logs. Look in your browser preferences to see what cookies you have for your url.