Osobní zkušenosti s bezplatným systémem pro správu webového obsahu Drupal šířeným pod GPL licencí.
Drupal je univerzální systém bez konkrétní oblasti zaměření umožňující vytvářet:
node/nid)Drupal 6 byl vydán dne 13. února 2008.
Předpokladem instalace je funkční lokální server, nebo webhosting (en) s podporou PHP a MySQL (PostgresSQL).
Nejen pro vývojáře webu je vhodné použít virtuální obraz Quickstart pro Virtualbox obsahující:

K rychlé instalaci je možné využít instalační profil, který provede prvotní nastavení za Vás:
/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.Developing installation profiles
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č.
Adresa odkazu u souborů ukazuje přímo na místo, kde jsou soubory na serveru umístěny.
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:
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.
Deny from all
dle nastavení serveru je někdy nutné zakomentovat
#Options None #Options +FollowSymLinks
Order Deny,Allow
Deny from all
Order Deny,Allow
Pokdu jste již na web vložili nějaké soubory (přílohy, obrázky atd.), metodu stahování již neměňte!
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, users a variable.
Nabízí se dva různé způsoby překladu vícejazyčného obsahu:
Poznámka:
Příloha obsahuje oficiální překlady jádra sloučené do jediného souboru.
| Příloha | Velikost |
|---|---|
| cs-6.x-1.8-2008-Apr-27.zip | 195.78 KB |
Některé moduly vyžadují službu cron. Zvolte si proto jednu z následujících možností:
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í.
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.
Použijte modul Drupalu s názvem Poormanscron.
Zaregistrujte se na stránkách www.webcron.org a vytvořte si novou úlohu pro Váš web.
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=YOURKEYDo souboru /etc/crontab vložte
0 * * * * root /usr/bin/wget -O - -q http://example.com/cron.php?cron_key=YOURKEYJiný způsob:
| Čtení | Zápis | Spouštění | |
|---|---|---|---|
| Vlastník | Ano | Ano | Ano |
| Skupina | Ano | Ne | Ano |
| Ostatni | Ano | Ne | Ano |
#!/bin/sh
/usr/bin/wget -O - -q http://example.com/cron.php?cron_key=YOURKEYPokud 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| Čtení | Zápis | Spouštění | |
|---|---|---|---|
| Vlastník | Ano | Ano | Ano |
| Skupina | Ne | Ne | Ne |
| Ostatni | Ne | Ne | Ne |
<?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;
?>V admin/config/media/image-toolkit (Konfigurace, Toolkit pro práci s obrázky) nastavte kvalitu JPEG obrázků na 80 %.
V admin/config/content/formats (Konfigurace, Formáty textu) určuje první řádek výchozí filtr:
style 
<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>
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>).
Bloky sdružují obsah, který lze na stránce volně přemisťovat:
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) 
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 admin/structure/types (Struktura, Typy obsahu) je možné nastavit výchozí hodnoty pro jednotlivé typy obsahu:
V admin/config/system/site-information (Konfigurace, Informace o webu) je možné upravit:
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.
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:
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í.
Viz nastavení modulu Path.
Viz nastavení modulu Menu.
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 admin/config/development/performance (Konfigurace, Výkon) je možné nastavit:
Výkon Drupalu je možné zvýšit moduly:
Výkon web serveru je možné zvýšit:
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é).

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.
Soubor modules/system/html.tpl.php obsahuje základní HTML strukturu stránky.
Soubor modules/system/page.tpl.php obsahuje šablonu stránky.
| 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.
Š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).
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:
<?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.
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.
kpr($variables);
Drupal 7:
/**
* 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:
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. 
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;
}
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 .", ";
}
/**
* 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);
}
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. 
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>
Vlastní vzhled webu v offline režimu.
$conf = array( 'maintenance_theme' => 'my-owns-theme' );
Bližší informace o šablonách naleznete v Template Suggestions.
Příklad upravy úvodní stránky:
page.tpl.php (základní šablona je vyžadována vždy
)page--front.tpl.php 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:
modules/user/ zkopírujte do svého tématu vzhledu soubor user-profile.tpl.php.user-profile.tpl.php dle potřeb.
Kaskádové styly (CSS)
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;
}
Adresář se vzhledem může obsahovat několik odvozených (podobných) témat vzhledů.
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; ?>
Příklad použití jQuery – zobrazující se text Text... ve vyhledávacím poli:
scripts/ obsahující soubory jquery.autofill.js a javascript.js (z přiložených souborů odstraňte příponu .txt).scripts[] = scripts/javascript.js scripts[] = scripts/jquery.autofill.js
| Příloha | Velikost |
|---|---|
| jquery.autofill.js.txt | 1.97 KB |
| javascript.js.txt | 157 bajtů |
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ů.
Získá odkazy drobečkové navigace pro aktuální stránku.
drupal_get_breadcrumb()
includes/common.inc, line 95
Řetězec obsahující odkazy drobečkové navigace.
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);
}
?>
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í.
l($text, $path, $options = array())
includes/common.inc, řádek 1534
Níže jsou uvedena data pro Drupal 5!
$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).
<?php
l(t('Home'), 'node/', array('title' => $site_name, 'class' =>
'link', 'id' => 'home'), NULL, NULL, FALSE, FALSE)
?>
HTML řetězec obsahující odkaz na určenou cestu.
Zjišťuje existenci modulu.
module_exists($module)
$module – název modulu
<?php if(module_exists('themer')) print ' '. themer_body_class(); ?>
Logická hodnota TRUE, pokud je modul nainstalován a povolen.
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í.
t($string, $args = array(), $langcode = NULL)
includes/common.inc, řádek 734
$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:
$langcode – volitelný kód jazyka překladu odlišný od jazyka stránky
Přeložený řetězec.
Vrací nastylovaný výstup.
<?php
print theme('username', $node);
?>
Vrací nastylovanou drobečkovou navigaci.
theme_breadcrumb($breadcrumb)
includes/theme.inc, line 1226
$breadcrumb – pole obsahující odkazy drobečkové navigace
Řetězec obsahující drobečkovou navigaci.
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);
}
?>
Funkce získá nastavení z aktuálního tématu, která byla zadána v administraci webu.
theme_get_setting($setting_name, $refresh = FALSE))
includes/theme.inc, řádek 900
$setting_name – název nastavení, které má být získáno.
$refresh - zda obnovit nastavení cache.
Hodnota požadovaného nastavení, NULL jestliže nastavení neexistuje.
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
.'" />';
}
?>
Snippet je malý znovupoužitelný kus programového kódu, který může např.:
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.
Snippety pro Drupal 5:
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.
/**
* 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;
}
<!-- Image Gallery Pager -->
<div class="pager">
<?php if ($page != 0 && $terms) { print custom_pager($node->nid); } ?>
</div>
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ů.
/**
* 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;
}
<!-- Image Gallery Pager with thumbnails -->
<div class="pager">
<?php if ($page != 0 && $terms) { print custom_pager_thumbnails($node->nid); } ?>
</div>
/* 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;
}
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:
| Menu 1 (položka menu) 2 (položka menu) Stránka |
Kategorie A (termín) B (termín) C (termín) |
Kategorie A (termín) B (termín) C (termín) Článek |
|
| Drupal 6 | Domů | Domů > A > B | Domů |
| Menu Breadcrumb | Domů > 1 > 2 | Domů > A > B | Domů |
| Menu Trails (ruční zařazení kategorií |
Domů > 1 > 2 > Stránka (obsahuje název uzlu |
Domů > A > B | Domů > Kategorie > A (x) > B (x) |
| Node breadcrumb (málo možností nastavení pravidel |
Domů > 1 > 2 | Domů > A > B | Domů (nastavená pravidla) |
| Taxonomy breadcrumb | Domů | Domů > A > B > C | Domů > A > B > C |
| Custom breadcrumb | Domů | Domů > A > B | Domů > Termín s nejvyšší váhou |
| Menu Breadcrumb + Taxonomy Breadcrumb | Domů ![]() |
Domů > A > B > C | Domů > A > B > C |
| Menu Trails (bez ručního zařazení kategorií |
Domů > 1 > 2 > Stránka (obsahuje název uzlu |
Domů > A > B > C | Domů > A > B > C |
Minimální adresářová strura:
Uvědomte se rozdíly mezi pojmy:
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()
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() a 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().
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)
Celý postup nejprve vyzkoušejte nejlépe na kopii webu!

$update_free_access = FALSE;$update_free_access = TRUE;Úspěšné převody Drupalu 5 na 6
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.