SlideShare ist ein Scribd-Unternehmen logo
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 um Ueberraschungsmomente  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 tabellenbasiert Apache Server Datenbank, etwa mysql Php als Zugriffssprache Webseite
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 Drupal inhaltliche 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) 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 , ... ) Node/ 22 /edit node/%/edit,   node_page_edit,  a:1 node_page_edit  (22) Beispiele menu_router callback URL
Viewaufruf menu_router  ( path ,  page_callback ,  page_arguments , .... ) a uthors authors,  views_page,  a:2{... authors_all .?...   }   menu_router views_page  (authors_all, ?) callback URL View „authors_all“ Pfad: authors
Menüreiter „Local Task“ menu_router  ( path ,  page_callback ,  page_arguments , ... . tab_parent   ) menu_router callback URL authors/germany a uthors/germany,  views_page,  a:2   {... authors_germany ..?..   } ,   authors   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 acc ess_callback l oad_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_menu Drupal aktualisiert die Einträge der Module in menu_router
Modul „menufun“   Implementierung von hook_menu ; $Id$ name= Menu Fun description = Learning package = Pro Drupal core = 6.x <?php // $Id$ //Implementierung von hook_menu function  menufun_menu  (){ $items[' menufun '] = array ( 'page callback' => ' menufun_hello ', 'access callback' => TRUE, 'type' => MENU_CALLBACK, ); return $items; } function  menufun_hello  () { return t('Hello'); } menufun.info menufun.module 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  Internationaliserung Klippe für Seiten mit Defaultsprache ≠ Englisch
Locale Module  („the good guy“) Sprachen können zugefügt werden Defaultsprache und Sprachverhandlung konfigurierbar ( z.B. Defaultsprache  deutsch,  Language Negotiations:  path with fallback ) Sprachschalter Inhalte können übersetzt werden 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 ... v function  menufun_hello  () { return t(‘ Guten Tag '); ..... hook_menu
t() kennt keine Defaultsprache t() übersetzt immer von Deutsch Englisch ... v function  menufun_hello  () { return t(‘ Have a good day '); ..... 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 definierbar Braucht 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  variables i18n_variables merkt sich welche Sprache Blöcke haben i18n_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 ) t erm_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 Internationalisierung Die Internationalisierung hat nicht die Klarheit von Drupal Core Konflikte mit anderen Modulen
Bis dahin: Rezept für eine internationale Seite: Englisch    Deutsch Defaultsprache: englisch Menü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ärken Klare 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 ( t id , vid (vokabular),  name , language, ....) (60, 10,  Ungarn ,  ,  t erm_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üs Menu_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) L ocales_source L ocales_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!

Weitere ähnliche Inhalte

Ähnlich wie Drupal inside out

Modulsystem in Drupal
Modulsystem in DrupalModulsystem in Drupal
Modulsystem in Drupal
Johannes Haseitl
 
Vielfalt vs. Abstraktion - Der Jakobsweg der modellbasierten GUI-Entwicklung
Vielfalt vs. Abstraktion - Der Jakobsweg der modellbasierten GUI-EntwicklungVielfalt vs. Abstraktion - Der Jakobsweg der modellbasierten GUI-Entwicklung
Vielfalt vs. Abstraktion - Der Jakobsweg der modellbasierten GUI-Entwicklung
Benjamin Schmid
 
The Lotus Code Cookbook
The Lotus Code CookbookThe Lotus Code Cookbook
The Lotus Code Cookbook
Ulrich Krause
 
Grundlagen der Kommandozeile unter Unix/Linux (Handout)
Grundlagen der Kommandozeile unter Unix/Linux (Handout)Grundlagen der Kommandozeile unter Unix/Linux (Handout)
Grundlagen der Kommandozeile unter Unix/Linux (Handout)
Kerstin Puschke
 
SQL Developer 4.x - Tipps für "faule" Entwickler
SQL Developer 4.x - Tipps für "faule" EntwicklerSQL Developer 4.x - Tipps für "faule" Entwickler
SQL Developer 4.x - Tipps für "faule" Entwickler
syntegris information solutions GmbH
 
Dart (Teil II der Tour de Dart)
Dart (Teil II der Tour de Dart)Dart (Teil II der Tour de Dart)
Dart (Teil II der Tour de Dart)
Nane Kratzke
 
Object-orientied way of using mysqli interface - Workshop
Object-orientied way of using mysqli interface - WorkshopObject-orientied way of using mysqli interface - Workshop
Object-orientied way of using mysqli interface - Workshop
Waldemar Dell
 
Web Entwicklung mit PHP - Teil 3 Beta
Web Entwicklung mit PHP - Teil 3 BetaWeb Entwicklung mit PHP - Teil 3 Beta
Web Entwicklung mit PHP - Teil 3 Beta
Hans-Joachim Piepereit
 
Metaprogrammierung und Reflection
Metaprogrammierung und ReflectionMetaprogrammierung und Reflection
Metaprogrammierung und Reflection
Stefan Marr
 
Internationalization by dominik-jais
Internationalization by dominik-jaisInternationalization by dominik-jais
Internationalization by dominik-jais
Dominik
 
Neues Rtf Dokument
Neues Rtf DokumentNeues Rtf Dokument
Neues Rtf Dokument
guest0bb754
 
C/ C++ for Notes & Domino Developers
C/ C++ for Notes & Domino DevelopersC/ C++ for Notes & Domino Developers
C/ C++ for Notes & Domino Developers
Ulrich Krause
 
Entwickeln mit Wordpress
Entwickeln mit WordpressEntwickeln mit Wordpress
Entwickeln mit Wordpress
Blogwerk AG
 
Domain Driven Design in Rails
Domain Driven Design in RailsDomain Driven Design in Rails
Domain Driven Design in Rails
Angelo Maron
 
AdminCamp2010, Closing General Session
AdminCamp2010, Closing General SessionAdminCamp2010, Closing General Session
AdminCamp2010, Closing General Session
Ulrich Krause
 
Dokumentenorientiere Datenbanken am Beispiel CouchDB
Dokumentenorientiere Datenbanken am Beispiel CouchDBDokumentenorientiere Datenbanken am Beispiel CouchDB
Dokumentenorientiere Datenbanken am Beispiel CouchDB
Mario Müller
 
WordPress Plugins und Themes übersetzbar machen - WP Camp 2012 Berlin
WordPress Plugins und Themes übersetzbar machen - WP Camp 2012 BerlinWordPress Plugins und Themes übersetzbar machen - WP Camp 2012 Berlin
WordPress Plugins und Themes übersetzbar machen - WP Camp 2012 Berlin
David Decker
 
Hadoop aus IT-Operations-Sicht - Teil 1 (Hadoop-Grundlagen)
Hadoop aus IT-Operations-Sicht - Teil 1 (Hadoop-Grundlagen)Hadoop aus IT-Operations-Sicht - Teil 1 (Hadoop-Grundlagen)
Hadoop aus IT-Operations-Sicht - Teil 1 (Hadoop-Grundlagen)
inovex GmbH
 
ICS UserGroup - 2015 - Eclipse and Notes - Love/Hate Relationships
ICS UserGroup - 2015 - Eclipse and Notes - Love/Hate RelationshipsICS UserGroup - 2015 - Eclipse and Notes - Love/Hate Relationships
ICS UserGroup - 2015 - Eclipse and Notes - Love/Hate Relationships
Christoph Adler
 

Ähnlich wie Drupal inside out (20)

Modulsystem in Drupal
Modulsystem in DrupalModulsystem in Drupal
Modulsystem in Drupal
 
Vielfalt vs. Abstraktion - Der Jakobsweg der modellbasierten GUI-Entwicklung
Vielfalt vs. Abstraktion - Der Jakobsweg der modellbasierten GUI-EntwicklungVielfalt vs. Abstraktion - Der Jakobsweg der modellbasierten GUI-Entwicklung
Vielfalt vs. Abstraktion - Der Jakobsweg der modellbasierten GUI-Entwicklung
 
The Lotus Code Cookbook
The Lotus Code CookbookThe Lotus Code Cookbook
The Lotus Code Cookbook
 
Grundlagen der Kommandozeile unter Unix/Linux (Handout)
Grundlagen der Kommandozeile unter Unix/Linux (Handout)Grundlagen der Kommandozeile unter Unix/Linux (Handout)
Grundlagen der Kommandozeile unter Unix/Linux (Handout)
 
SQL Developer 4.x - Tipps für "faule" Entwickler
SQL Developer 4.x - Tipps für "faule" EntwicklerSQL Developer 4.x - Tipps für "faule" Entwickler
SQL Developer 4.x - Tipps für "faule" Entwickler
 
Dart (Teil II der Tour de Dart)
Dart (Teil II der Tour de Dart)Dart (Teil II der Tour de Dart)
Dart (Teil II der Tour de Dart)
 
Object-orientied way of using mysqli interface - Workshop
Object-orientied way of using mysqli interface - WorkshopObject-orientied way of using mysqli interface - Workshop
Object-orientied way of using mysqli interface - Workshop
 
Web Entwicklung mit PHP - Teil 3 Beta
Web Entwicklung mit PHP - Teil 3 BetaWeb Entwicklung mit PHP - Teil 3 Beta
Web Entwicklung mit PHP - Teil 3 Beta
 
Daisy
DaisyDaisy
Daisy
 
Metaprogrammierung und Reflection
Metaprogrammierung und ReflectionMetaprogrammierung und Reflection
Metaprogrammierung und Reflection
 
Internationalization by dominik-jais
Internationalization by dominik-jaisInternationalization by dominik-jais
Internationalization by dominik-jais
 
Neues Rtf Dokument
Neues Rtf DokumentNeues Rtf Dokument
Neues Rtf Dokument
 
C/ C++ for Notes & Domino Developers
C/ C++ for Notes & Domino DevelopersC/ C++ for Notes & Domino Developers
C/ C++ for Notes & Domino Developers
 
Entwickeln mit Wordpress
Entwickeln mit WordpressEntwickeln mit Wordpress
Entwickeln mit Wordpress
 
Domain Driven Design in Rails
Domain Driven Design in RailsDomain Driven Design in Rails
Domain Driven Design in Rails
 
AdminCamp2010, Closing General Session
AdminCamp2010, Closing General SessionAdminCamp2010, Closing General Session
AdminCamp2010, Closing General Session
 
Dokumentenorientiere Datenbanken am Beispiel CouchDB
Dokumentenorientiere Datenbanken am Beispiel CouchDBDokumentenorientiere Datenbanken am Beispiel CouchDB
Dokumentenorientiere Datenbanken am Beispiel CouchDB
 
WordPress Plugins und Themes übersetzbar machen - WP Camp 2012 Berlin
WordPress Plugins und Themes übersetzbar machen - WP Camp 2012 BerlinWordPress Plugins und Themes übersetzbar machen - WP Camp 2012 Berlin
WordPress Plugins und Themes übersetzbar machen - WP Camp 2012 Berlin
 
Hadoop aus IT-Operations-Sicht - Teil 1 (Hadoop-Grundlagen)
Hadoop aus IT-Operations-Sicht - Teil 1 (Hadoop-Grundlagen)Hadoop aus IT-Operations-Sicht - Teil 1 (Hadoop-Grundlagen)
Hadoop aus IT-Operations-Sicht - Teil 1 (Hadoop-Grundlagen)
 
ICS UserGroup - 2015 - Eclipse and Notes - Love/Hate Relationships
ICS UserGroup - 2015 - Eclipse and Notes - Love/Hate RelationshipsICS UserGroup - 2015 - Eclipse and Notes - Love/Hate Relationships
ICS UserGroup - 2015 - Eclipse and Notes - Love/Hate Relationships
 

Drupal inside out

  • 1. Drupal inside out Es geht hier nicht um die Module, sondern um den Kern von Drupal Verstehen wie Drupal im Inneren funktioniert!
  • 2. Im Inneren ist Drupal ziemlich logisch Das Innere von Drupal besteht aus den Tabellen, in denen der Aufbau der Webseite komplett abgelegt ist.
  • 3. Es geht mir in meinem Vortrag um Ueberraschungsmomente 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
  • 4. Teil 1 Die Daten (als Einleitung für spannendere Themen)
  • 5. Drupal ist tabellenbasiert Apache Server Datenbank, etwa mysql Php als Zugriffssprache Webseite
  • 6. 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
  • 7. Organisation der Daten bei node node ( nid , prozedurale Daten ) node_revisions ( nid, vid , inhaltliche Daten ) node_type node_access
  • 8. Organisation der User-Daten userroles User ( uid , Konto-Daten ) profilevalues ( nid, fid , inhaltliche Daten ) profilefields
  • 9. Auch ein Merkmal von Drupal Auf Tabellen – Ebene unterscheidet Drupal inhaltliche Daten und prozedurale Daten
  • 10. Teil 2 Berechtigungen
  • 11. Berechtigungen Kombination aus 2 Komponenten: Rolle Aufgabe Berechtigung = „diese Rolle darf diese Aufgabe ausführen“
  • 12. Beispiele Angemeldeter Benutzer darf „delete own page“ Administrator darf „Blöcke verwalten“
  • 13. userroles ( uid , Rolle) permissions (pid , Rolle , Aufgabenliste ) /Benutzerverwaltung/Berechtigungen Rollen Berechtigungen
  • 14. 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
  • 15. Teil 3 Das Menüsystem
  • 16. 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!
  • 17. Was sind Menüs dann für Drupal? URL Callback (argument) Menu = URL + CALLBACK menu_router
  • 18. 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
  • 19. menu_router ( path , page_callback , page_arguments , ... ) Node/ 22 /edit node/%/edit, node_page_edit, a:1 node_page_edit (22) Beispiele menu_router callback URL
  • 20. Viewaufruf menu_router ( path , page_callback , page_arguments , .... ) a uthors authors, views_page, a:2{... authors_all .?... } menu_router views_page (authors_all, ?) callback URL View „authors_all“ Pfad: authors
  • 21. Menüreiter „Local Task“ menu_router ( path , page_callback , page_arguments , ... . tab_parent ) menu_router callback URL authors/germany a uthors/germany, views_page, a:2 {... authors_germany ..?.. } , authors 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
  • 22. Es ist eigentlich noch etwas komplizierter ... Weitere Felder in menu_router title_callback acc ess_callback l oad_functions to_arg_functions type
  • 23. 2 stufiges Vorgehen bei Drupals Menüpunkten Pfad mit Callback einrichten (Substanz) Einhängen ins Menüsystem als primary-link, etc.
  • 24. Teil 4 Erweiterungen in Drupal: Hooks und Module
  • 25. Module sind die Einheit der Erweiterung bei Drupal Wie genau greifen sie ins System ein? Durch sogenannte Hooks Diese werden bei Drupal-Events gerufen.
  • 26. Bei jedem Drupal Event können sich beliebig viele Module melden und einhängen.
  • 27. Beispiel: hook_menu Drupal Event: Laden der Modultabelle hook_menu Drupal aktualisiert die Einträge der Module in menu_router
  • 28. Modul „menufun“ Implementierung von hook_menu ; $Id$ name= Menu Fun description = Learning package = Pro Drupal core = 6.x <?php // $Id$ //Implementierung von hook_menu function menufun_menu (){ $items[' menufun '] = array ( 'page callback' => ' menufun_hello ', 'access callback' => TRUE, 'type' => MENU_CALLBACK, ); return $items; } function menufun_hello () { return t('Hello'); } menufun.info menufun.module menufun, menufun_hello , ... menu_router Hook_menu
  • 30. Es gibt etwa 50 Hooks in Drupal 6
  • 31. Aufbau der Hooks hook_objekt ( $op , ....) Objekt + „Operation“ = Event
  • 32. Beispiel hook_user ( $op , ...) Operationen: login, logout, register, update, view, ...
  • 33. Fazit Module können sich an fast allen Stellen ins Drupal-Geschehen einklinken.
  • 34. Teil 5 Internationaliserung Klippe für Seiten mit Defaultsprache ≠ Englisch
  • 35. Locale Module („the good guy“) Sprachen können zugefügt werden Defaultsprache und Sprachverhandlung konfigurierbar ( z.B. Defaultsprache deutsch, Language Negotiations: path with fallback ) Sprachschalter Inhalte können übersetzt werden t() übersetzt Ausgabefelder in Programmen
  • 36. t() ( lid , location, textgroup, source, ...) (4191, menufun/, default, „Guten Tag“) Locales_source ( lid , translation, language, ...) (432, „Have a good day“, de, ... ) Locales_target ... v function menufun_hello () { return t(‘ Guten Tag '); ..... hook_menu
  • 37. t() kennt keine Defaultsprache t() übersetzt immer von Deutsch Englisch ... v function menufun_hello () { return t(‘ Have a good day '); ..... also .....
  • 38. 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 definierbar Braucht keine Defaultsprache!
  • 39. 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
  • 40. 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.
  • 41. Internationalization Uebersetzung von Sitevariablen wie site-mission aus variables i18n_variables merkt sich welche Sprache Blöcke haben i18n_blocks Datenbankfelder bekommen eine lid für locales-Tabellen i18n_strings
  • 42. Taxonomy hat eine Sprache! (tid, vid (Vokabular), name, language, trid) (60, 10, Ungarn , de, 6 ) (61, 10, Hungary , en, 6 ) t erm_data Es gibt eine saubere Lösung, wenn man nicht „lokalisiert“ , sondern „übersetzt“
  • 43. 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
  • 44. 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)
  • 45. Fazit Internationalisierung Die Internationalisierung hat nicht die Klarheit von Drupal Core Konflikte mit anderen Modulen
  • 46. Bis dahin: Rezept für eine internationale Seite: Englisch  Deutsch Defaultsprache: englisch Menü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
  • 47. Teil 6 Fazit und Zusammenfassung
  • 48. 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
  • 49. Drupals Stärken Klare Konzeption, die auch und vor allem in der Datenbasis sichtbar ist Hohe Flexibilität, durch Offenlegung aller Events mit einfachen Schnittstellen ( hooks )
  • 50. Damit Module sich nicht gegenseitig stören ... ... müssen sie diese Klarheit respektieren und weiterbauen
  • 51. Manchmal sollte man Module redesignen
  • 53. Warum man lokalisieren bei Taxonomy vermeiden sollte ( t id , vid (vokabular), name , language, ....) (60, 10, Ungarn , , t erm_data ( lid , object_id, type , property) ( 4200 , 49, term , name ) i18n:_strings
  • 54. 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
  • 55. Menüs Menu_router und menu_links haben beide keine Sprache als Feld
  • 56. 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) L ocales_source L ocales_target
  • 57. 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!