Error message

User warning: The following theme is missing from the file system: responsive_green. For information about how to fix this, see the documentation page. in _drupal_trigger_error_with_delayed_logging() (line 1143 of /var/www/moscovie.com/includes/bootstrap.inc).

Дополнения к требованиям к серверному разработчику Drupal7

Система меню

Общая схема работы
1.Установка пути
2.Проверка в menu_router
3. Загрузка необходимых обьектов
4.Проверка доступа
5.Локализация заголовков и описания
6. Загрузка включаемых файлов
7.Выполнение обратного вызова и возврат через theme_page();

Использование аргументов
'page arguments' => array('foo','bar')

Использование обобщенных аргументов
'menu/%'
'page arguments' =>array(1);

Замена параметров в обощенных символах
'user/%user'
% - работает как обычный обобщенный аргумент + ищем функцию name+load(user_load) и передаем ей этот аргумент
Для передачи доп аргументов используют
'load_arguments' => array(2) - часть пути позиция 2

Генерация ссылок на основе путей с обобщенными аргументами
используется функция to_arg()
'user/%user'
user_to_arg()
Пример - генерация ид ноды или пользователя.

Типы меню
MENU_NORMAL_ITEM
MENU_CALLBACK
MENU_SUGGESTED_ITEM
MENU_LOCAL_TASK
MENU_DEFAULT_LOCAL_TASK

Изменение меню
hook_menu_alter()

Изменение ссылок меню из других модулей
hook_link_alter();

Управление доступом.
'access callback' => 'user access'
'access arguments' => 'foo',

В основном доступ осуществляется через функцию 'user access'
Реализация передачи аргументов осуществляется в hook_permission()
Имеет настройку в виде таблицы в админ панели

Дочерние пункты не наследуют атрибуты доступа,это не касается вкладок


Заголовок

'title callback' => 'foo'
Для разделения заголовка меню и страницы используем drupal_set_title();

Работа с базами данных

Определение параметров базы данных в settings.php

Подключение к базе данных и апи базы данных с помощью автономного скрипта
include_once('./includes/bootstrap.inc');
drupal_bootstrap(DRUPAL_BOOTSTRAP_DATABASE');

Два вида синтаксиса запросов.
Первый с заполнителями
Второй - боле новый с обьектом запросов

Обновление и вставка данных с помошью drupal_write_record() для тех таблиц которые имеют схему данных
Создание схемы базы данных
hook_schema()
Обновление схемы с помошью hook_update()
Удаление таблиц
hook_uninstall()

Изменение данных в таблице и изменение схемы
hook_install()
hook_schema_alter()


Изменение запросов других модулей

hook_query_alter()
Для идентификации запроса помечайте его
$query->addTag('foo');
Реализация хука
function mymodule_query_alter($query){
if($query->hasTag('foo')){
//actions
}

}


Подключение к нескольким базам данных

Инициализация в settings.php
Работа с базой путем переключения на ее db_set_active('foo')
Закончили рабоать переключаемся на базу по умолчанию - всегда drupal db_set_active('default');

Использование временных таблиц
$table = db_query_temporary($query,$arguments,$options);
$result = db_query('Select foo from '.$table);

Работа с пользователями

Обьект пользователя
Создается обьект пользователя. Если пользователь не вошел создается анонимный пользователь

function drupal_anonymous_user() {
$user = variable_get('drupal_anonymous_user_object', new stdClass);
$user->uid = 0;
$user->hostname = ip_address();
$user->roles = array();
$user->roles [DRUPAL_ANONYMOUS_RID] = 'anonymous user';
$user->cache = 0;
return $user;
}

Если пользователь залогинился то обьект создаеться соединением таблиц users - user_roles - sessions
hook_user_view($account, $view_mode)

Дополнение данных с помошью модуля profile


Процесс регистрации пользователя

Используется два хука
load и login
hook_user_load($users
hook_user_login(&$edit, $account))

Внешняя авторизация

Ноды

Создание своего типа ноды
Определние прав доступа
hook_permission()
hook_node_access($node, $op, $account)
hook_node_grants($account, $op)


Настройка формы для типа ноды

Стандартная форма создания ноды

function mymodule_form($node, $form_state){
return node_content_form($node, $form_state);
}

Проверка данных
hook_validate($node, $form, &$form_state)


Сохранение данных

hook_node_insert($node)


Обновление данных

hook_update($node)

Очистка данных
Удаление типа ноды
hook_delete($node)

Изменение нод определенного типа
hook_load($nodes)


Вывод информации добавленной при изменении

hook_view($node, $view_mode, $langcode = NULL)

Работа со всеми типами нод
hook_node_insert($node)
hook_node_load($nodes, $types)
hook_node_update($node)
hook_node_delete($node)
hook_node_prepare($node)
hook_node_presave($node)
hook_node_access($node, $op, $account)
hook_node_grants_alter(&$grants, $account, $op)

Последовательность отображения ноды

  1. field_attach_load($entity_type, $entities, $age = FIELD_LOAD_CURRENT, $options = array())
  2. hook_entity_load($entities, $type)
  3. hook_node_load($nodes, $types)
  4. hook_node_view($node, $view_mode, $langcode)

Ограничение доступа к нодам
hook_node_grants($account, $op)
hook_node_access_records($node)

Доступные действия

  1. Просмотр
  2. Обновление
  3. Удаление

Значения таблицы
nid gid realm grant_view grant_update grant_delete
Realm - строка,позволяет нескольким модулям доступа разделить доступ
Gid - разделение по идентификаторам,для данного Realm

Система тем

Добавление параметров в тему
Создаем массив в info файле
settings['font_family] = 'xxx';
settings['font_size'] = 'yyyy';
Создаем файл theme-settings.php

Функция для построения элементов управления в теме hook_form_system_theme_settings_alter(&$form, &$form_state)
Далее создаем template.php
Определяем функцию theme_process_html(&$vars){
$foo = theme_get_setting('font_family'];
$bar = theme_get_settings('font_size'];
}

Функция theme()
Принцип работы
1.Система меню Drupal получает запрос и передает управление модулю ноды.
2.После создания структуры данных вызывается theme('node','variables') Находит нужную функцию темы,определяет переменные ,после чего получает html вывод.
3.Структура html возвращается в виде переменной $return в файле index.php и снова передает theme('page', $return).
4.Вывод блоков с помошью вызова theme('blocks', $region)
5.Определение переменных шаблона и применяет этот шаблон страницы.

Переопределение элементов определяющих темизацию
https://api.drupal.org/api/drupal/modules!system!theme.api.php/group/themeable/7
Переопределение с помошью шаблонных файлов

Формы

Любой элемент формы можно отобразить на любую функцию темы.

Вызов формы по идентификатору
$output = drupal_get_form ('user_register');
Сбор всех возможных определений элемента формы

Затем вызывается функция _element_info(). Она запускает хук hook_element_info()
на всех модулях, в которых он реализован.

Модули реализуют этот хук, если хотят определить собственные типы элемента.

Пример форма голосования fivestar

Поиск функции проверки достоверности

Можно здать множество функций одной форме
$form['#validate'][] = 'foo_validate';
$form['#validate'][] = 'bar_validate';

Если в форме нет свойства с именем #validate, следующий шаг состоит в поиске
функции с именем, состоящим из идентификатора формы плюс _validate.

Поиск функции отправки
Можно задать множество функций
$form['#submit'][] = 'my_special_submit_function';
// Также вызвать my_second_submit_function().
$form['#submit'][] = 'my_second_submit_function';

Если нет свойства с именем #submit , Drupal пытается найти функцию с име-
нем, образованным из идентификатора формы, дополненного _submit .

Изменение перед построением
hook_form_alter()

Построение формы
form_builder(),
#after_build
. — необязательный массив функций, которые должны быть вызваны, как только будет построен текущий элемент формы.

Обнаружение функции темы для формы

$form['#theme']

Разрешение модулям изменять форму перед ее визуализацией
Любая функция, определенная в свойстве form['#pre_render'], вызывается и получает форму,
подлежащую визуализации.


Визуализация формы

Вызов drupal_render();

1. Выясняет, был ли определен элемент #children (ассоциированный с контентом,
сгенерированным для этого элемента); в противном случае отображает дочерний
элемент этой ноды дерева следующим образом.

  1. Выясняет, определена ли функция #theme для этого элемента.
  2. Если функция #theme определена, временно устанавливает #type этого эле-
    мента в состояние markup (разметка). Затем передает этот элемент функции
    темы и возвращает элемент в состояние, которое было раньше.
  3. Если никакого контента не генерировалось (либо из-за того, что не было функ-
    ций #theme, определенных для этого элемента, либо потому, что в результате
    вызова функции #theme ничего не возвращалось), каждый из дочерних элемен-
    тов этого элемента отображается поочередно (т.е. передачей дочернего элемен-
    та функции drupal_render()).
  4. С другой стороны, если контент был сгенерирован функцией #theme, он запо-
    минается в свойстве #children этого элемента.

2.Если этот элемент еще не был сгенерирован, вызывается функция темы по умол-
чанию для #type этого элемента. Например, если этот элемент — текстовое поле
в форме (т.е. свойство #type установлено в textfield в определении формы), то
функцией темы по умолчанию будет theme_textfield(). Если #type этого эле-
мента не был установлен, по умолчанию принимается markup. Функции темы
по умолчанию для таких основных элементов, как текстовое поле, находятся в
includes/form.inc.
3.Если контент был сгенерирован для этого элемента, и в свойстве #post_renderer
указано одно или более имен функций, каждая из них вызывается с передачей ей
контента и элемента. Функции #post_renderer должны возвращать финальный
контент.
4.Присоединяет к контенту спереди #prefix и сзади #suffix, после чего возвра-
щает его из функции.


Перенаправление пользователя

$form_state['redirect']
Пример
$form['#redirect'] = array('node/1',$query_string,$named_anchor).

Свойство #action определено в system_element_info() и
по умолчанию принимает значение результата выполнения функции request_uri().

Для более длинного доступа к элементам $form_state
$form ['#tree'] = TRUE;

Темизация форм

Использование #prefix, #suffix и #markup

Разметку HTML можно даже объявить как тип #markup в форме (хотя это использу-
ется нечасто). Любой элемент формы без свойства #type по умолчанию преобразуется
в #markup.

Использование функции темы

function formexample_theme() {
return array(
'formexample_nameform' => array(
'render element' => 'form',
'template' => 'formexample-nameform',
),
);
}

Указание Drupal, какую функцию темы использовать
$form['#theme'] = 'foo';

Или же можно предложить Drupal использовать особую функцию темы только для
одного элемента формы:
// Темизировать этот элемент набора полей с помощью
// theme_formexample_coloredfieldset().
$form['color'] = array(
'#title' => t('Color'),
'#type' => 'fieldset',
'#theme' => 'formexample_coloredfieldset'

);

Спецификация функций проверки достоверности
и отправки формы с помощью hook_forms()


Порядок вызова функций тем, проверки достоверности и отправки

Использование для передачи данных form_set_value()

Категория: 
The code has been tested and works

Add new comment

Filtered HTML

  • Web page addresses and e-mail addresses turn into links automatically.
  • Allowed HTML tags: <a> <em> <strong> <cite> <blockquote> <code> <ul> <ol> <li> <dl> <dt> <dd>
  • Lines and paragraphs break automatically.

Plain text

  • No HTML tags allowed.
  • Web page addresses and e-mail addresses turn into links automatically.
  • Lines and paragraphs break automatically.