Download - Drupal inside out
Drupal inside out
Es geht hier nicht um die Module, sondern um den Kern von Drupal
Verstehen wie Drupal im Inneren funktioniert!
Im Inneren ist Drupal ziemlich logisch
Das Innere von Drupal besteht aus den Tabellen, in denen der Aufbau der Webseite komplett abgelegt ist.
Es geht mir in meinem Vortrag umUeberraschungsmomente und Klippen bei Drupal
• Teil 1: Die Daten• Teil 2: Berechtigungen• Teil 3: Das Menüsystem• Teil 4: Erweiterungen: Hooks und Module• Teil 5: Internationalisierung
(eine Klippe für Nicht Englischsprachige)
• Teil 6: Fazit und Zusammenfassung
Gliederung
Drupals „Datentöpfe“
node (nid, prozedurale Daten des Node)
user (uid, prozedurale Daten des Users)
comments (cid, pid wenn Antwort, nid)
term (tid, Begriff)Taxonomy
Artikel
Benutzer
Kommentare
Organisation der Daten bei node
node (nid, prozedurale Daten)
node_revisions (nid, vid, inhaltliche Daten)
node_type
node_access
Organisation der User-Daten
userroles
User (uid, Konto-Daten)
profilevalues (nid, fid, inhaltliche Daten)
profilefields
Auch ein Merkmal von Drupal
Auf Tabellen – Ebene unterscheidet Drupalinhaltliche Daten
und
prozedurale Daten
Berechtigungen
Kombination aus 2 Komponenten:
• Rolle• Aufgabe
Berechtigung = „diese Rolle darf diese Aufgabe ausführen“
userroles (uid, Rolle)
permissions (pid, Rolle, Aufgabenliste)
/Benutzerverwaltung/Berechtigungen
Rollen
Berechtigungen
Am Rande bemerkt: Wie Views Berechtigungskonzept nutzt
„Klaut“ es Aufgaben anderer Module
Statt selbst Aufgaben zu definieren .....
Man kann eine View berechtigen:Berechtigung = Rolle
oder
Berechtigung = Aufgabe
Das Menüsystem
„Das Menüsystem in Drupal kann leicht missverstanden werden“
Das Menüsystem vermittelt eine Illusion.
Warum?
Drupals Daten kennen keine Schubladen oder Hierarchien!
Was sind Menüs dann für Drupal?
URL Callback(argument)Callback(argument)
Menu = URL + CALLBACK
menu_router
Menüpunkt anlegen in Drupal
Drupal verlangt einen bekannten Pfad
Eintrag in menu_router muss vorliegen
Erst dann kann der Menüpunkt an der Oberfläche eingehängt werden
menu_router
menu_links
menu_router(path, page_callback, page_arguments, ... )
menu_router(path, page_callback, page_arguments, ... )
Node/22/edit node/%/edit, node_page_edit, a:1node/%/edit, node_page_edit, a:1 node_page_edit (22)node_page_edit (22)
Beispiele
menu_router callbackURL
Viewaufruf
menu_router (path, page_callback, page_arguments, .... ) menu_router (path, page_callback, page_arguments, .... )
authors authors, views_page, a:2{... authors_all .?... } authors, views_page, a:2{... authors_all .?... }
menu_router
views_page (authors_all, ?)views_page (authors_all, ?)
callbackURL
View „authors_all“Pfad: authors
Menüreiter „Local Task“
menu_router (path, page_callback, page_arguments, ....tab_parent ) menu_router (path, page_callback, page_arguments, ....tab_parent )
menu_router callbackURL
authors/germany authors/germany, views_page, a:2 {... authors_germany ..?.. }, authors authors/germany, views_page, a:2 {... authors_germany ..?.. }, authors
views_page(authors_germany,?)views_page(authors_germany,?)
Wird als Tab bei authors angezeigt
Kein Menüpunkt an der Oberfläche, kein Eintrag in menu_links
View „authors_germany“Pfad: authors/germany
Es ist eigentlich noch etwas komplizierter ...
Weitere Felder in menu_router
title_callback
access_callback
load_functions
to_arg_functions
type
2 stufiges Vorgehen bei Drupals Menüpunkten
Pfad mit Callback einrichten (Substanz)
Einhängen ins Menüsystem als primary-link, etc.
Module sind die Einheit der Erweiterung bei Drupal
Wie genau greifen sie ins System ein?
Durch sogenannte Hooks
Diese werden bei Drupal-Events gerufen.
Beispiel: hook_menu
Drupal Event:Laden der Modultabelle
hook_menuDrupal aktualisiert die Einträge der Module in menu_router
Modul „menufun“ Implementierung von hook_menu
; $Id$name= Menu Fundescription = Learningpackage = Pro Drupalcore = 6.x
<?php// $Id$//Implementierung von hook_menufunction menufun_menu (){ $items['menufun'] = array ( 'page callback' => 'menufun_hello', 'access callback' => TRUE, 'type' => MENU_CALLBACK,
); return $items;}
function menufun_hello (){ return t('Hello');}
menufun.infomenufun.info
menufun.modulemenufun.module
menufun, menufun_hello, ...menufun, menufun_hello, ...
menu_router
Hook_menu
Locale Module („the good guy“)
1.Sprachen können zugefügt werden2.Defaultsprache und Sprachverhandlung konfigurierbar( z.B. Defaultsprache deutsch, Language Negotiations: path with fallback)3.Sprachschalter4.Inhalte können übersetzt werden5.t() übersetzt Ausgabefelder in Programmen
t()
(lid, location, textgroup, source, ...) (4191, menufun/, default, „Guten Tag“)
Locales_source
(lid, translation, language, ...) (432, „Have a good day“, de, ... )
Locales_target
...vfunction menufun_hello (){ return t(‘Guten Tag'); .....
hook_menu
t() kennt keine Defaultsprache
t() übersetzt immer vonDeutschEnglisch
...vfunction menufun_hello (){ return t(‘Have a good day'); .....
also .....also .....
Nodes übersetzen (geht viel besser)
(nid, language, title, tid, translate)
(13, de, Joe Trippi, 13, 0)(14, en, Joe Trippi, 13, 0)
node
Beispiel
Orginal unabhängig von Defaultsprache definierbarBraucht keine Defaultsprache!
Wo t() scheitert
Drupal speichert viele Texte in der Datenbank:Bei Nodes, die eine Sprache haben ist das kein Problem,
aber Blöcke, Menüs, etc. haben keine Sprache!
Modulblock Internationalization i18n
Internationalization („the bad guy“)
Hier hört der Drupal Kern und die Drupal Ordnung auf und der Drupal-Dschungel von Module, die die Datenbank irgendwie bentzen fängt an.
Internationalization
Uebersetzung von Sitevariablen wie site-mission
aus variablesi18n_variables
merkt sich welche Sprache Blöcke habeni18n_blocks
Datenbankfelder bekommen eine lid für locales-Tabellen
i18n_strings
Taxonomy hat eine Sprache!
(tid, vid (Vokabular), name, language, trid)(60, 10, Ungarn, de, 6)(61, 10, Hungary, en, 6)
term_data
Es gibt eine saubere Lösung, wenn man nicht „lokalisiert“, sondern „übersetzt“
Menüs
Menüs haben in der Datenbank kein Sprache, obwohl an der Oberfläche eine einstellbar ist.
Bei Defaultsprache Englisch: lokalisieren okay.
Defaultsprache Englisch zur Zeit erforderlich für die Lokalisierung von primary links
Blöcke (bid,delta, ...)
Defaultsprache nicht nötig
Blöcke haben in der Datenbank kein Sprache, obwohl an der Oberfläche eine einstellbar ist.
i18n_blocks (ibid)
Fazit InternationalisierungDie Internationalisierung hat nicht die Klarheit von Drupal Core
Konflikte mit anderen Modulen
Bis dahin: Rezept für eine internationale Seite:Englisch Deutsch
Defaultsprache: englischMenüsystem auf Englisch und übersetzen
Inhalte: Deutsch später übersetzen
Taxonomien würde ich pro Sprache machen und gelegentlich übersetzen, nicht lokalisieren
Blöcke kann man pro Sprachen machen, erstmal Deutsch
Drupals Besonderheit
„demokratische Nodes“, keine Hirarchien der Daten
Dafür Taxonomy als starkes Keywort-System zur Organisation der Daten
Menüsystem als weiteres loses Netz zur Gliederung der Seite
Drupals StärkenKlare Konzeption, die auch und vor allem in der Datenbasis sichtbar ist
Hohe Flexibilität, durch Offenlegung aller Events mit einfachen Schnittstellen (hooks)
Damit Module sich nicht gegenseitig stören ...
... müssen sie diese Klarheit respektieren und weiterbauen
Warum man lokalisieren bei Taxonomy vermeiden sollte
(tid, vid (vokabular), name, language, ....) (60, 10, Ungarn, ,
term_data
(lid, object_id, type, property) (4200, 49, term, name)
i18n:_strings
Uebersetzungen stehen nicht in target sondern in source?
(lid, location, textgroup, source, ...) (4200, 49:term:name, taxonomy, „Ungarn “?)
Locales_source
(lid, location, textgroup, source, ...) (4201, /de/admin/content/taxonomy/10, default, „Hungary“?)
Locales_target
Locales_source
2 Beispiele primary link „Zeitschriften“ zeigt auf node/29 Navigation menufun (Einhängen unseres Moduls)
(menu_name, mlid, link_path, router_path, link_title...)(primary-links, 781, node/29, node/%, Zeitschriften, ...)(navigation, 757, menufun, menufun, Menufun, ..)
menu_link
i18n_strings (lid, object_id, type, property) (4207, 781, item, title) (4206, 757, item, title)
Locales_source
Locales_target
Ergebnis– Navigationslink „Menufun“ wird in beiden Sprachen
korrekt angezeigt ✓
– Primary Link „Zeitschriften“ wird nicht übersetzt ?!?
Das Einzige was ich finden konnte: Solange die Defaultsprache Englisch ist, kann man Primary Menus übersetzen, und sie werden korrekt
angezeigt. Das Umstellen der Defaultsprache führt zu Problemen!