La meilleure façon est de le faire dans hook_enable () ; au moment où le hook est invoqué, le module est déjà installé et le schéma de sa base de données est disponible pour Drupal et pour drupal_write_record()
. Comme le hook est invoqué à chaque fois qu'un module est activé, et pas seulement lorsque le module est installé, l'implémentation du hook doit vérifier si elle n'a pas déjà ajouté ces lignes de base de données (par exemple, elle doit utiliser une variable Drupal contenant une valeur booléenne) .
Comme exemple de module qui utilise hook_enable()
dans un but similaire, vous pouvez vérifier forum_enable () , ou php_enable () (qui ajoute le format d'entrée "code 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))));
}
}
Comme le montrent ces implémentations de hook, le code peut nécessairement avoir besoin d'être exécuté à chaque fois que le hook est exécuté; il peut également être nécessaire d'exécuter le code une seule fois, car dans le cas où les valeurs par défaut ajoutées à la base de données ne peuvent pas être modifiées par l'utilisateur, qui n'a pas d'interface utilisateur pour modifier / supprimer ces valeurs.
variable_set()
, qui ne sont pas supprimées avecvariable_del()
, sont chargées en mémoire lors du démarrage de Drupal et enregistrées dans une variable globale; cela signifie qu'ils sont en mémoire quel que soit le module qui utilise ces valeurs, ou non. À l'aide d'une table de base de données personnalisée, vous pouvez être sûr que ces valeurs ne sont chargées que lorsque le module en a vraiment besoin. Vous ne devez pas utiliservariable_set()
si la variable Drupal contient un tableau auquel vous continuez d'ajouter un nouvel index de tableau à tout moment, par exemple.J'irais avec
db_query
/db_insert
(D6 / D7) dans hook_install ().Ce n'est pas considéré comme une mauvaise pratique (et personne ne vous oblige à l'utiliser
drupal_write_record()
).Il n'est pas rare que les gens désactivent et réactivent les modules, et dans ce cas, votre code
hook_enable()
se déclencherait à chaque fois. ce qui n'est pas sympa.la source