Konvertierung von Drupal 6.x Module auf 7.x - Teil 2

Bild von tobiasb

Überblick der Drupal API Änderung von 6.x nach 7.x - Teil 2
Übersetzung von http://drupal.org/node/224333
Liste wird erweitert, sobald es neue Änderungen gibt und Zeit/Lust vorhanden ist.

  1. $op von hook_nodeapi, hook_user und hook_block entfernt
  2. In hook_node_info() wurde 'module' wieder auf 'base' geändert und 'node' zu 'node_content'
  3. Absolute Pfade verwenden (aufbauend vom DRUPAL_ROOT) beim Einbinden einer Datei
  4. Datei-Vorgänge, die nicht die Datenbank betrifft sind umbenannt worden
  5. Die Berechtigung „adminster nodes“ wurde aufgeteilt nach „adminster nodes“ und „bypass node access“.
  6. 4 neue Hooks hook_modules_installed, hook_modules_enabled, hook_modules_disabled, und hook_modules_uninstalled
  7. drupal_set_title() verwendet standardmäßig check_plain()
  8. Parameteränderung für drupal_add_js() und drupal_add_css()
  9. file_set_status() wurde entfernt

$op von hook_nodeapi, hook_user and hook_block

(hook_nodeapi issue, hook_user issue) Dank der Ergänzung der Registry können feinstufigere Hooks dynamisch geladen werden anstatt nur ein großen Hook mit ein operation Argument. Gábor schrieb eine Notiz in der Entwickler Mailingliste darüber, falls weiterer Informationsbedarf zum Nachlesen besteht.

Mit dieser Ergänzung kann das $op Argument entfernt werden und haben stattdessen ein Format wie hook_hookname_operationname...

Drupal 6.x:

  1. <?php
  2. /**
  3.  * Implementation of hook_nodeapi().
  4.  */
  5. function book_nodeapi(&$node, $op, $teaser, $page) {
  6.   switch ($op) {
  7.     case 'load':
  8.       // Load a book
  9.   }
  10. }
  11.  
  12. /**
  13.  * Implementation of hook_user().
  14.  */
  15. function block_user($type, $edit, &$account, $category = NULL) {
  16.   switch ($type) {
  17.     case 'form':
  18.       // Construct the user form
  19.  
  20.   }
  21. }
  22.  
  23. /**
  24.  * Implementation of hook_block().
  25.  */
  26. function system_block($op = 'list', $delta = 0, $edit = array()) {
  27.   switch ($op) {
  28.     case 'list':
  29.       // List of blocks
  30.   }
  31. }
  32. ?>

Drupal 7.x:

  1. <?php
  2. /**
  3. * Implementation of hook_nodeapi_load().
  4. */
  5. function book_nodeapi_load(&$node, $teaser, $page) {
  6.   // Load a book
  7. }
  8.  
  9. /**
  10.  * Implementation of hook_user_form().
  11.  */
  12. function block_user_form(&$edit, &$account, $category = NULL) {
  13.   // Construct the user form
  14. }
  15.  
  16. /**
  17.  * Implementation of hook_block_list().
  18.  */
  19. function system_block_list() {
  20.   // List of blocks
  21. }
  22. ?>

In hook_node_info() wurde 'module' wieder auf 'base' geändert und 'node' zu 'node_content'

(issue) zwischen Drupal 4.7 und Drupal 5 wurde das 'base' Attribute in hook_node_info() zu 'module' geändert. Jedoch war das verwirrend für Entwickler und da es keine Voraussetzung war, dass dieses Attribut mit dem Namen eines Moduls übereinstimmt und ggf. mehrere Inhaltstypen je Modul definiert werden konnte. Wurde es wieder auf 'base' zurückgesetzt.

Darüber hinaus hatten die Inhaltstypen, die durch das Node-Modul verwaltet wurden ein 'module' (jetzt 'base') Attribut von 'node'. Jedoch, um Konflikte mit den Node-Moduls eigenen Hooks zu vermeiden wurde dies gezielt verändert, wenn Hooks 'node_content' aufriefen. Zum Beispiel, haben sie immer node_content_form() verwendet. Durch einfaches zuordnen des 'base'-Attribut von solchen Typen auf 'node_content' in der Datenbank, kann die Fehleranfälligkeit dieser Attribute beseitig werden bei einem Hook-Aufruf.

Die Hilfs-Funktion _node_type_set_defaults() ist nun eine weitere nützliche öffentliche Funktion node_type_set_defaults().

Drupal 6.x:

  1. <?php
  2. /**
  3.  * Implementation of hook_node_info().
  4.  */
  5. function blog_node_info() {
  6.   return array(
  7.     'blog' => array(
  8.       'name' => t('Blog entry'),
  9.       'module' => 'blog',
  10.       'description' => t('A <em>blog entry</em> is a single post to an online journal.'),
  11.      );
  12. }
  13. ?>

Drupal 7.x:

  1. <?php
  2. /**
  3. * Implementation of hook_node_info().
  4. */
  5. function blog_node_info() {
  6.   return array(
  7.     'blog' => array(
  8.       'name' => t('Blog entry'),
  9.       'base' => 'blog',
  10.       'description' => t('A <em>blog entry</em> is a single post to an online journal.'),
  11.      );
  12. }
  13. ?>

Speichern eines Inhaltstyp, der durch das Node-Module verwaltet wird, in der Datenbank:
Drupal 6.x:

  1. <?php
  2. function _book_install_type_create() {
  3.   $book_node_type = array(
  4.     'type' => 'book',
  5.     'name' => t('Book page'),
  6.     'module' => 'node',
  7.     'description' => t('A <em>book page</em>.'),
  8.     'custom' => TRUE,
  9.     'modified' => TRUE,
  10.     'locked' => FALSE,
  11.   );
  12.  
  13.   $book_node_type = (object)_node_type_set_defaults($book_node_type);
  14.   node_type_save($book_node_type);
  15. }
  16. ?>

Drupal 7.x:

  1. <?php
  2. function _book_install_type_create() {
  3.   $book_node_type = array(
  4.     'type' => 'book',
  5.     'name' => t('Book page'),
  6.     'base' => 'node_content',
  7.     'description' => t('A <em>book page</em>.'),
  8.     'custom' => 1,
  9.     'modified' => 1,
  10.     'locked' => 0,
  11.   );
  12.  
  13.   $book_node_type = node_type_set_defaults($book_node_type);
  14.   node_type_save($book_node_type);
  15. }
  16. ?>

Absolute Pfade verwenden (aufbauend vom DRUPAL_ROOT) beim Einbinden einer Datei

(issue) Beim Einbinden einer Datei (via include(), include_once(), require() oder require_once()) muss der absolute Pfad angegeben werden zu der Datei, durch Verwendung der Konstante DRUPAL_ROOT, um den absoluten Pfad zum Root der Drupal Installation anzugeben.

Drupal 6.x:

  1. <?php
  2. // Allow specifying special cache handlers in settings.php, like
  3. // using memcached or files for storing cache information.
  4. require_once variable_get('cache_inc', './includes/cache.inc');
  5. ?>

Drupal 7.x:

  1. <?php
  2. // Allow specifying special cache handlers in settings.php, like
  3. // using memcached or files for storing cache information.
  4. require_once DRUPAL_ROOT . '/' . variable_get('cache_inc', 'includes/cache.inc');
  5. ?>

Ein einzelnes Script, dass Zugriff auf Drupal benötigt, muss DRUPAL_ROOT definieren bevor bootstrap.inc eingebunden und drupal_bootstrap() aufgerufen wird. Z.B. für ein Script, dass sich im Drupal Root Ordner befindet:

  1. <?php
  2. /**
  3. * Root directory of Drupal installation.
  4. */
  5. define('DRUPAL_ROOT', dirname(realpath(__FILE__)));
  6. ?>

Dies mussen entsprechend geändert werden für ein Skript, das außerhalb des Drupal Stammordner liegt.

Datei-Vorgänge, die nicht die Datenbank betrifft sind umbenannt worden

(issue) Die file_copy(), file_move(), file_delete() und file_save_data() Funktionen aus Drupal 6 sind zu file_unmanaged_copy(), file_unmanaged_move(), file_unmanaged_delete() and file_unmanaged_save_data() umbenannt worden.

file_copy() und file_move() geben jetzt den neuen Pfad zurück anstatt by Reference zu übergeben.

Zusammenfassung der File API Änderungen

Drupal 6 Drupal 7 Beschreibung
file_copy() file_unmananged_copy() Kopiert eine Datei zu einem neuen Ort ohne ein Eintrag in die Datenbank zuspeichern.
n/a file_copy() Kopiert eine Datei zu einem neuen Ort und fügt ein Dateieintrag zu der Datenbank hinzu. Zudem wird hook_file_copy() aufgerufen, damit andere Module den Kopiervorgang beeinflussen können.
file_move() file_unmananged_move() Verschiebt eine Datei zu einem neuen Ort ohne ein Änderungen in die Datenbank.
n/a file_move() Verschiebt eine Datei zu einem neuen Ort und aktualisiert den Datenbankeintrag der Datei. Zudem wird hook_file_move() aufgerufen, damit andere Module den Verschiebevorgang beeinflussen können.
file_delete() file_unmananged_delete() Löscht eine Datei.
n/a file_delete() Löscht eine Datei und deren Datenbankeintrag. Außerdem wird hook_file_delete() aufgerufen, so das andere Module diesen Vorgang beeinflussen können, wenn eine Datei gelöscht wird.
file_save_data() file_unmananged_save_data() Speichern eine Zeichenfolge zum angegebene Ziel, aber macht keine Änderungen an der Datenbank.
n/a file_save_data() Speichern eine Zeichenfolge zum angegebene Ziel und erstellt ein Datenbankeintrag.
n/a file_load() Ladet ein Datei-Object aus der Datenbank. Außerdem wird hook_file_load() aufgerufen, damit andere Module mit der geladene Datei etwas machen können.
n/a file_validate() Überprüft, ob die Datei mit den angegebenen Kriterien vom Validator übereinstimmt. Akzeptiert ein assoziatives Array von Callback-Funktionen, um die Datei zu überprüfen. Außerdem wird hook_file_validate() aufgerufen, damit andere die Überprüfung der neuen Datei beeinflussen können.
n/a file_save() Speichert ein Datei-Object in die Dateibank. Rufe entweder hook_file_insert() oder hook_file_update() auf, abhängig ob ein $file->fid angeben ist.

file_copy()

Drupal 6.x:

  1. <?php
  2. file_copy($source, $paths['target'] . $base);
  3. $paths['files'][] = $source;
  4. ?>

Drupal 7.x:

  1. <?php
  2. $filepath = file_unmanaged_copy($source, $paths['target'] . $base);
  3. $paths['files'][] = $filepath;
  4. ?>

file_delete()

Drupal 6.x:

  1. <?php
  2. file_delete($file_path);
  3. ?>

Drupal 7.x:

  1. <?php
  2. file_unmanaged_delete($file_path);
  3. ?>

file_save_data()

Drupal 6.x:

  1. <?php
  2. if (file_save_data($data, $dest)) {
  3.   $language->javascript = $data_hash;
  4.   $status = ($status == 'deleted') ? 'updated' : 'created';
  5. }
  6. ?>

Drupal 7.x:

  1. <?php
  2. if (file_unmanaged_save_data($data, $dest)) {
  3.   $language->javascript = $data_hash;
  4.   $status = ($status == 'deleted') ? 'updated' : 'created';
  5. }
  6. ?>

Die Berechtigung „adminster nodes“ wurde aufgeteilt nach „adminster nodes“ und „bypass node access“.

(issue) Wobei Rollen mit „adminster nodes“ alle Daten eines Nodes (Beitrag) verändern können. (Menu, Path etc.) und bei „bypass node access“ kann die Rolle ein Node erstellen, bearbeiten oder löschen. (berechtigungen für die Einstellung innerhalb eines Nodes müssen getrennt zugeteilt werden) Ohne das ein Zugriffsüberprüfung seitens eines Moduls durch hook_access oder das Node-access-System geschieht.

Beim Upgrade von 6.x auf 7.x werden die Rollen mit „adminster nodes“ automatisch Der Berechtigung „bypass node access“ zugewiesen.

(Issue)
4 neue Hooks zur Einflussnahme für Module auf den Status eines anderen Moduls. Siehe Dokumention.

drupal_set_title() verwendet standardmäßig check_plain()

(Issue) Die Funktion drupal_set_title() überprüft jetzt standardmäßig mit check_plain() den Text eines Titels. Um ein Titel als schon überprüft zumarkieren (zb bei den Platzhalter %,@ in t()) muss eine Konstante PASS_THROUGH als Paramter mit gegeben werden, um doppeltes escaping zu vermeiden.

Drupal 6.x

  1. <?php
  2.     drupal_set_title(check_plain($node->title));
  3. ?>

Drupal 7.x

  1. <?php
  2.     drupal_set_title($node->title);
  3. ?>

Drupal 6.x

  1. <?php
  2.   drupal_set_title(t("@name's blog", array('@name' => $account->name)));
  3. ?>

Drupal 7.x

  1. <?php
  2.   drupal_set_title(t("@name's blog", array('@name' => $account->name)), PASS_THROUGH);
  3. ?>

Parameteränderung für drupal_add_js() und drupal_add_css()

(drupal_add_js() issue, drupal_add_css() issue) Die drupal_add_js() und drupal_add_css() Funktionen nehmen entweder den Typ als String von dem die Datei stammt oder ein Array als Parameter auf. Der neue Funktionsaufbau sieht wie folgt aus:

  1. <?php
  2. drupal_add_js($data = NULL, $options = NULL);
  3. drupal_add_css($path = NULL, $options = NULL);
  4. ?>

Dabei kann $options ein String sein, der den Typ bestimmt zb modules, themes, settings usw. oder ein Array mit den Typ und zusätzlichen Angaben ('type', 'scope', 'defer', 'cache', 'preprocess', 'media'), die vom Standard abweichen.

Drupal 6.x

  1. <?php
  2. drupal_add_js('misc/collapse.js', 'module');
  3. drupal_add_js('misc/collapse.js', 'module', 'footer');
  4. drupal_add_js('misc/collapse.js', 'module', 'header', FALSE, TRUE, FALSE);
  5. drupal_add_css('/modules/devel/devel.css', 'module');
  6. drupal_add_css('/modules/devel/devel.css', 'module', 'screen');
  7. drupal_add_css('/modules/devel/devel.css', 'module', 'all', FALSE);
  8. ?>

Drupal 7.x

  1. <?php
  2. drupal_add_js('misc/collapse.js', 'module');
  3. drupal_add_js('misc/collapse.js', array('type' => 'module', 'scope' => 'footer'));
  4. drupal_add_js('misc/collapse.js', array('preprocess' => FALSE));
  5. drupal_add_css('/modules/devel/devel.css', 'module');
  6. drupal_add_css('/modules/devel/devel.css', array('media' => 'screen'));
  7. drupal_add_css('/modules/devel/devel.css', array('preprocess' => FALSE));
  8. ?>

Moduleänderungen sollten nur notwendig sein, wenn die CSS/JS-Datei mehr als den Typ bisher angegeben hat.

file_set_status wurde entfernt

(Issue) Die Funktion file_set_status, welche hauptsächlich dazu genutzt wurde, um eine tempöräre Datei als permanent zu markieren. Stattdessen muss jetzt file_save() verwendet werden.

Drupal 6.x

Drupal 7.x

  1. <?php
  2. $file->status |= FILE_STATUS_PERMANENT;
  3. $file = file_save($file);
  4. ?>