Лучше всего сделать это внутри hook_enable () ; в тот момент, когда вызывается ловушка, модуль уже установлен, и схема его базы данных доступна как для Drupal, так и для drupal_write_record()
. Поскольку ловушка вызывается каждый раз, когда модуль включен, а не только когда модуль установлен, реализация ловушки должна проверять, не добавила ли она уже те строки базы данных (например, она должна использовать переменную Drupal, содержащую логическое значение) ,
В качестве примера модуля, который использует hook_enable()
для аналогичной цели, вы можете проверить forum_enable () или php_enable () (который добавляет формат ввода «PHP code»).
function php_enable() {
$format_exists = (bool) db_query_range('SELECT 1 FROM {filter_format} WHERE name = :name', 0, 1, array(':name' => 'PHP code'))->fetchField();
// Add a PHP code text format, if it does not exist. Do this only for the
// first install (or if the format has been manually deleted) as there is no
// reliable method to identify the format in an uninstall hook or in
// subsequent clean installs.
if (!$format_exists) {
$php_format = array(
'format' => 'php_code',
'name' => 'PHP code',
// 'Plain text' format is installed with a weight of 10 by default. Use a
// higher weight here to ensure that this format will not be the default
// format for anyone.
'weight' => 11,
'filters' => array(
// Enable the PHP evaluator filter.
'php_code' => array(
'weight' => 0,
'status' => 1,
),
),
);
$php_format = (object) $php_format;
filter_format_save($php_format);
drupal_set_message(t('A <a href="@php-code">PHP code</a> text format has been created.', array('@php-code' => url('admin/config/content/formats/' . $php_format->format))));
}
}
Как показано из этих реализаций ловушек, код должен обязательно выполняться каждый раз, когда ловушка выполняется; это также может быть то, что код нужно просто выполнить один раз, так как в случае, если значения по умолчанию, добавленные в базу данных, не могут быть изменены пользователем, у которого нет пользовательского интерфейса для изменения / удаления этих значений.
variable_set()
, которые не удаляются с помощьюvariable_del()
, загружаются в память при загрузке Drupal и сохраняются в глобальной переменной; это означает, что они находятся в памяти независимо от того, использует модуль эти значения или нет. Используя пользовательскую таблицу базы данных, вы можете быть уверены, что эти значения загружаются только тогда, когда модуль действительно в этом нуждается. Не следует использовать,variable_set()
если переменная Drupal содержит массив, к которому вы, например, постоянно добавляете новый индекс массива.Я бы пошел с
db_query
/db_insert
(D6 / D7) в hook_install ().Это не считается плохой практикой (и никто никогда не заставляет вас использовать
drupal_write_record()
).Люди нередко отключают и снова включают модули, и в этом случае ваш код
hook_enable()
будет срабатывать каждый раз. что не приятно.источник