Как добавить значения по умолчанию в таблицу базы данных с помощью hook_install ()?

9

Я создаю собственный модуль с собственной схемой из нескольких таблиц. Эти таблицы должны иметь некоторые значения, предварительно введенные в них для работы модуля (расположение по умолчанию, выбор параметров и т. Д.).

Каков наилучший способ вставить значения по умолчанию в эти таблицы во время hook_install?

Поскольку drupal_write_record недоступен, я могу использовать db_query, но я просто хочу убедиться, что я не нарушаю никаких кардинальных правил.

oranges13
источник

Ответы:

7

Лучше всего сделать это внутри 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))));
  }
}

Как показано из этих реализаций ловушек, код должен обязательно выполняться каждый раз, когда ловушка выполняется; это также может быть то, что код нужно просто выполнить один раз, так как в случае, если значения по умолчанию, добавленные в базу данных, не могут быть изменены пользователем, у которого нет пользовательского интерфейса для изменения / удаления этих значений.

киамлалуно
источник
Если я сделал это в hook_enable (), это означает, что значения по умолчанию будут сбрасываться каждый раз, когда модуль включен и отключен. Я думаю, что это довольно распространено, в отличие от полной деинсталляции и переустановки (в этот момент ожидается, что база данных будет сброшена).
oranges13
1
Вот почему я написал, «реализация ловушки должна проверять, не добавила ли она уже те строки базы данных». Это означает, что он должен проверить, есть ли значения в таблице базы данных, или использовать переменную Drupal, чтобы проверить, выполнил ли он уже эту задачу. Проверка таблицы базы данных будет выполнена, если эти значения обязательно должны быть в базе данных; например, это тот случай, если значения требуются от модуля, и пользователям не разрешается удалять значения по умолчанию.
kiamlaluno
Благодарю за разъяснение. Есть ли разница в хранении этих значений в моей собственной пользовательской таблице по сравнению с простым использованием variable_set для хранения их в постоянной переменной? Это просто массив значений для пользовательских блоков выбора.
oranges13
Все значения, установленные с помощью variable_set(), которые не удаляются с помощью variable_del(), загружаются в память при загрузке Drupal и сохраняются в глобальной переменной; это означает, что они находятся в памяти независимо от того, использует модуль эти значения или нет. Используя пользовательскую таблицу базы данных, вы можете быть уверены, что эти значения загружаются только тогда, когда модуль действительно в этом нуждается. Не следует использовать, variable_set()если переменная Drupal содержит массив, к которому вы, например, постоянно добавляете новый индекс массива.
kiamlaluno
Глядя на код (D7). Я вижу только 2 строки кода между вызовом hook_install и hook_enable: обновление локальной переменной и вызов watchdog. Таким образом, во время реальной установки нет никакой разницы между этими двумя хуками о том, что доступно и зарегистрировано, а что нет. Единственная разница заключается в том, выполняется ли установка в первый раз или просто повторно включается модуль.
fietserwin
4

Я бы пошел с db_query/ db_insert(D6 / D7) в hook_install ().

Это не считается плохой практикой (и никто никогда не заставляет вас использовать drupal_write_record()).

Люди нередко отключают и снова включают модули, и в этом случае ваш код hook_enable()будет срабатывать каждый раз. что не приятно.

Боян Живанович
источник