Количество изменений в D7, с точки зрения девелопера

Конвертим модули друпал 5 в друпал 6 - http://drupal.org/update/modules/5/6 - статья в ~1500 символов

Конвертим модули друпал 6 в друпал 7 - http://drupal.org/update/modules/6/7 - ~3200 символов

Знаковые изменения

  1. DB API - работа с базой сильно изменилась. В положительную сторону.

    db_rewrite хуки со страшными регулярками ушли в прошлое. Теперь у нас есть метод addTag(), который говорит ядру "Этот селект относится к разделу такому-то, хуки заинтересованные в изменении - встаем в очередь".

    Правда, все эти конструкторы, по-моему, уменьшают читабельность сложных селектов, и с непривычки, наверное, сильно увеличат время написания sql запросов.
    http://drupal.org/node/310069 - полное описание DB API
    <?php
    // Drupal 6
    db_query("INSERT INTO {mytable} (intvar, stringvar, floatvar) VALUES (%d, '%s', %f)", 5, 'hello world', 3.14);
    $id = db_last_insert_id();

    // Drupal 7
    $id = db_insert('mytable')
      ->fields(array(
        'intvar' => 5,
        'stringvar' => 'hello world',
        'floatvar' => 3.14,
      ))
      ->execute();

    // а вот - селекты
    // Drupal 6
    function _blog_post_exists($account) {
      return (bool)db_result(db_query_range(db_rewrite_sql("SELECT 1 FROM {node} n WHERE n.type = 'blog' AND n.uid = %d AND n.status = 1"), $account->uid, 0, 1));
    }

    // Drupal 7
    function _blog_post_exists($account) {
      return (bool)db_select('node', 'n')
        ->fields('n', array('nid'))
        ->condition('type', 'blog')
        ->condition('uid', $account->uid)
        ->condition('status', 1)
        ->range(0, 1)
        ->addTag('node_access')
        ->execute()
        ->fetchField();
    }
    ?>

  2. Хуки hook_block, hook_nodeapi, hook_user, hook_node_type - теперь разбиты на много хуков, нода создается - один хук, нода удаляется - другой хук.
  3. Появилось центральное место для наложения изменений на текущую страницу. http://api.drupal.org/api/function/hook_page_alter/7

    Можно отрендерить в какой-то регион блок, можно какой-то блок удалить, можно отсюда же в рендерящуюся форму залезть и что-то там изменить. Звучит круто, посмотрим как будет на практике.

    Кстати, drupal_get_form теперь возвращает массив, а не уже отрендеренную форму.
  4. Фреймворк для автоматизированного тестирования в ядре - simpletest.

Общие мысли после беглого просмотра кода
ООП

Если в D6 ООП было в совсем зачаточном состоянии, то в D7 ООП запустило свои ручонки в код Друпала достаточно серьезно.

Если честно, мне смесь процедурного и объектного подхода не очень импонирует. Вот так это примерно выглядит в node.module:

<?php
function node_unpublish_by_keyword_action_submit($form, $form_state) {
...
}
function node_unpublish_by_keyword_action($node, $context) {
...
}

class

NodeController extends DrupalDefaultEntityController {
  protected function attachLoad(&$nodes) {
}
...
}
?>

код баз данных - ООП:

<?php
class DatabaseConnection_mysql extends DatabaseConnection {
...
}
?>

опять же, интересное название класса, мне оно кажется миксом CamelCase и старого Друпального стиля с подчеркиваниями.

Ну да ладно, жить сильно не помешает, а в Друпал 8, глядишь, будет чистый ООП.

Fields

Еще больше года назад Дриис говорил, что основной вектор в развитии D7 - "вся власть полям". CCK теперь нет, теперь у нас в ядре модуль Field и Field UI.

Поля - это гибко, это молодежно, это быстрое прототипирование и развертывание сайтов. (Еще бы производительность была хоть какая-то).

Так вот, вышеупомянутая строчка class NodeController extends DrupalDefaultEntityController как бы говорит нам "Нода это объект к которому цеплять поля можно!"

Такие же строчки можно встретить в:

  1. comment.module
  2. taxonomy.module
  3. user.module

Так что, я думаю, всем понятно, что основные объекты в D7 (юзеры, категории таксономии, комменты, ноды) можно расширять так же, как в D6 с помощью CCK можно было расширять только ноды.

Taxonomy

Изменения в таксономии в D7 можно охарактеризовать двумя основными действиями - 1) упростить 2) засунуть в Fields

Все эти действия проделал некий фрилансер Benjamin Doherty. (пруфлинк: http://www.lullabot.com/drupal-voices/drupal-voices-59-benjamin-doherty-...)

По-моему, это все очень хорошо. Если раньше таксономия как-то в идеологию CCK нифига не вписывалась (можно было, конечно, использовать content_taxonomy, но ядро-то аттачило таксономию к нодам своим "родным" способом), то теперь таксономия - это просто еще одно поле, с такими же правами как поле текстовое или файловое. Это значит, что, например, темизировать ноды теперь проще. Раньше я думал как оттемизировать таксономию, cck, и "родные" поля (title и body). Теперь я думаю только о том, чтобы оформить fields. (body в ноде теперь тоже - поле).

Relative terms из ядра убрали. Не знаю как другим, мне не жалко.

Внимание! Итак, таксономия - это field. В то же время, термин таксономии можно расширять через Fields API. Рекурсия получается, господа :) Посмотрим как на практике все это выглядит, пока я даже не нашел, как добавлять к таксономии поля.

Blog categories: Drupal