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:
Srovnání možností podobných modulů:
Umístění modulů (knihoven a témat vzhledu):
Moduly:
Vyloučení modulu z aktualizace
Automatické aktualizace viz Drush.
Komerční moduly:
Více viz Comparison of Breadcrumb Customizing modules.
| 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 |
Dokumentace:
Nástroje:
Tipy:
Při vytváření modulů bývá velmi užitečným pomocníkem modul Devel.
Váhy základních fází průběhu zpracovávání v Drupalu (bližší informace viz např. funkce theme):
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().
stylesheets[all][] = my_module.css stylesheets[screen][] = my_module_screen.css stylesheets[print][] = my_module_print.css
scripts[] = my_module.js
/**
* Implementation of hook_init().
*/
function my_module_init() {
$path = drupal_get_path('module', 'my_module');
drupal_add_css($path . '/my_module.css');
drupal_add_js($path . '/my_module.js');
}/**
* Implementation of hook_init().
*/
function my_module_init() {
drupal_add_css('body {background: #ccc;}', array('group' => CSS_THEME, 'type' => 'inline'));
}
Tipy:
/**
* Implements hook_preprocess_block()
*/
function <your-module-name>_preprocess_block(&$vars) {
/* Set shortcut variables. Hooray for less typing! */
$block_id = $vars['block']->module . '-' . $vars['block']->delta;
$classes = &$vars['classes_array'];
$title_classes = &$vars['title_attributes_array']['class'];
$content_classes = &$vars['content_attributes_array']['class'];
/* Add global classes to all blocks */
$title_classes[] = 'block-title';
$content_classes[] = 'block-content';
/* Uncomment the line below to see variables you can use to target a field */
#print $block_id . '<br/>';
/* Add classes based on the block delta. */
switch ($block_id) {
/* System Navigation block */
case 'system-navigation':
$classes[] = 'block-rounded';
$title_classes[] = 'block-fancy-title';
$content_classes[] = 'block-fancy-content';
break;
/* Main Content block */
case 'system-main':
$classes[] = 'clearfix';
break;
// Adding the same classes to more blocks – Grouping cases togheter
/* Main Menu block */
case 'system-main-menu':
/* User Login block */
case 'user-login':
$title_classes[] = 'element-invisible';
break;
}
}/**
* Implements HOOK_entity_view().
* Limit Teaser to display only the first image of a multiple field.
*/
function <your-module-name>_entity_view($entity, $type, $view_mode, $langcode) {
if($entity->type == 'story' && $view_mode == 'teaser') {
//kpr($entity);
$entity->content['field_image']['#items'] = array_slice($entity->content['field_image']['#items'], 0, 1);
}
}/**
* Implements hook_form_FORM_ID_alter().
*/
function <your-module-name>_form_node_form_alter(&$form, $form_state) {
// Set “Publishing options” vertical tab as default for node edit page.
$form['additional_settings']['#default_tab'] = 'edit-options'; // Where 'edit-options' is fieldset ID.
}function <your-module-name>_node_presave($node) {
if (user_is_anonymous()) $node->status = FALSE; // means unpublished
}$inline_script = "
<!-- My JavaScript -->
<script>
// JS Content
</script>
<noscript>
// No Script
</noscript>
<!-- End My JavaScript -->
";
$element = array(
'#type' => 'markup',
'#markup' => $inline_script,
);
drupal_add_html_head($element, 'my-javasript');