Drupal inside out

57
Drupal inside out Es geht hier nicht um die Module, sondern um den Kern von Drupal Verstehen wie Drupal im Inneren funktioniert!

Transcript of 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

Teil 1 Die Daten

(als Einleitung für spannendere Themen)

Drupal ist tabellenbasiertApache Server

Datenbank, etwa mysql

Php als ZugriffsspracheWebseite

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

Teil 2 Berechtigungen

Berechtigungen

Kombination aus 2 Komponenten:

• Rolle• Aufgabe

Berechtigung = „diese Rolle darf diese Aufgabe ausführen“

Beispiele

Angemeldeter Benutzer darf „delete own page“

Administrator darf „Blöcke verwalten“

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

Teil 3 Das Menüsystem

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.

Teil 4 Erweiterungen in

Drupal:Hooks und Module

Module sind die Einheit der Erweiterung bei Drupal

Wie genau greifen sie ins System ein?

Durch sogenannte Hooks

Diese werden bei Drupal-Events gerufen.

Bei jedem Drupal Event können sich beliebig viele Module melden und

einhängen.

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

Effekt:

Es gibt etwa 50 Hooks in Drupal 6

Aufbau der Hooks

hook_objekt ($op, ....)

Objekt + „Operation“ = Event

Beispiel hook_user ($op, ...)

Operationen: login, logout, register, update, view, ...

Fazit

Module können sich an fast allen Stellen ins Drupal-Geschehen einklinken.

Teil 5 InternationaliserungKlippe für Seiten mit Defaultsprache ≠ Englisch

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

Teil 6 Fazit und

Zusammenfassung

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

Manchmal sollte man Module redesignen

Zusatzfolien (Internationalisierung)

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

MenüsMenu_router und menu_links haben beide keine Sprache als Feld

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!