Як додати значення за замовчуванням до таблиці бази даних, використовуючи приворот_install ()?


9

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

Які найкращі способи вставки значень за замовчуванням у ці таблиці під час прив’язки_установки?

Оскільки drupal_write_record недоступний, я можу використовувати db_query, але я просто хочу переконатися, що цим не порушую жодних кардинальних правил.

Відповіді:


7

Кращий спосіб - це зробити це всередині mong_enable () ; в момент виклику гака модуль вже встановлений, а схема його бази даних доступна для Drupal та drupal_write_record(). Оскільки гачок викликається кожен раз, коли модуль увімкнено, а не лише тоді, коли модуль встановлений, реалізація гака повинна перевірити, чи не додав ці рядки бази даних уже (наприклад, він повинен використовувати змінну Drupal, що містить булеве значення) .

Як приклад модуля, який використовує hook_enable()для подібної мети, ви можете перевірити forum_enable () або php_enable () (який додає формат введення «PHP-коду»).

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))));
  }
}

Як показано з цих реалізацій гака, код обов'язково повинен бути виконаний весь час, коли виконується гак; це також може бути код, який потрібно просто виконати один раз, як у випадку, якщо значення, що додаються до бази даних, за замовчуванням не можуть бути змінені користувачем, у якого немає інтерфейсу користувача, щоб змінити / видалити ці значення.


Якби я робив це в mock_enable (), це означає, що значення за замовчуванням будуть скидатися щоразу, коли модуль увімкнено та вимкнено. Я думаю, що це досить часто, на відміну від повністю видалення та перевстановлення (в цей момент очікується, що база даних буде скинута).
апельсини13

1
Ось чому я написав: "Реалізація гака повинна перевірити, чи вона вже не додала ці рядки бази даних". Це означає, що він повинен перевірити, чи є значення вже в таблиці бази даних, або використовувати змінну Drupal, щоб перевірити, чи вже виконано це завдання. Перевірка таблиці бази даних буде здійснена, якщо ці значення обов'язково повинні бути в базі даних; Наприклад, це так, якщо значення потрібні модулю, а користувачі не можуть видаляти значення за замовчуванням.
kiamlaluno

Дякуємо за роз’яснення. Чи є якась різниця у збереженні цих значень у моїй власній спеціальній таблиці порівняно з просто використанням varia_set для зберігання їх у стійкій змінній? Це просто масив значень для спеціальних вікон вибору.
апельсини13

Всі значення, встановлені за допомогою variable_set(), які не видаляються variable_del(), завантажуються в пам'ять під час завантаження Drupal та зберігаються у глобальній змінній; це означає, що вони є в пам'яті, незалежно від того, який модуль використовує ці значення, чи ні. Використовуючи власну таблицю бази даних, ви можете бути впевнені, що ці значення завантажуються лише тоді, коли модуль справді потребує цього. Не слід використовувати, variable_set()якщо змінна Drupal містить масив, до якого ви постійно додаєте новий індекс масиву, наприклад.
kiamlaluno

Дивлячись на код (D7). Я бачу лише 2 рядки коду між викликом moll_install та mok_enable: оновлення локальної змінної та викликом сторожової собаки. Отже, під час реального встановлення між цими двома гачками немає різниці щодо того, що є та що зареєстровано, а що ні. Єдина відмінність - це вперше встановити або просто повторно включити модуль.
fietserwin

4

Я б пішов з db_query/ db_insert(D6 / D7) у куку_встановити ().

Це не вважається поганою практикою (і ніхто ніколи не змушує вас використовувати drupal_write_record()).

Не рідкість, коли люди вимикають і повторно включають модулі, і в такому випадку ваш код hook_enable()буде спрацьовувати кожного разу. що не приємно.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.