Como adiciono valores padrão a uma tabela de banco de dados usando hook_install ()?

9

Estou criando um módulo personalizado com seu próprio esquema de algumas tabelas. Essas tabelas precisam ter alguns valores pré-preenchidos para que o módulo funcione (locais padrão, opções de seleção etc.).

Qual é a melhor maneira de inserir valores padrão nessas tabelas durante a instalação do hook?

Como drupal_write_record não está disponível, eu posso usar o db_query, mas só quero ter certeza de que não estou violando nenhuma regra fundamental ao fazê-lo.

laranjas13
fonte

Respostas:

7

A melhor maneira é fazê-lo dentro de hook_enable () ; no momento em que o gancho é chamado, o módulo já está instalado e o esquema de seu banco de dados está disponível para o Drupal e para drupal_write_record(). Como o gancho é chamado todas as vezes que um módulo é ativado, e não apenas quando o módulo está instalado, a implementação do gancho deve verificar se ainda não adicionou essas linhas do banco de dados (por exemplo, ele deve usar uma variável Drupal contendo um valor booleano) .

Como exemplo de módulo usado hook_enable()para uma finalidade semelhante, você pode verificar forum_enable () ou php_enable () (que adiciona o formato de entrada "código 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))));
  }
}

Conforme mostrado nessas implementações de ganchos, o código pode necessariamente precisar ser executado todas as vezes que o gancho é executado; também pode ser que o código precise ser executado apenas uma vez, pois no caso os valores padrão adicionados ao banco de dados não podem ser alterados pelo usuário, que não possui uma interface com o usuário para alterar / excluir esses valores.

kiamlaluno
fonte
Se eu fizesse isso em hook_enable (), isso significa que os valores padrão seriam redefinidos toda vez que o módulo fosse ativado e desativado. Eu acho que isso é bastante comum, em vez de desinstalar e reinstalar completamente (quando é esperado que o banco de dados seja redefinido).
oranges13
1
Foi por isso que escrevi: "a implementação do gancho deve verificar se já não adicionou essas linhas do banco de dados". Isso significa que ele deve verificar se os valores já estão na tabela do banco de dados ou usar uma variável Drupal para verificar se já fez essa tarefa. A verificação da tabela do banco de dados seria feita se esses valores precisassem necessariamente estar no banco de dados; por exemplo, este é o caso se os valores forem necessários do módulo e os usuários não tiverem permissão para remover os valores padrão.
kiamlaluno
Obrigado pelo esclarecimento. Existe alguma diferença no armazenamento desses valores em minha própria tabela personalizada versus apenas o uso de variable_set para armazená-los em uma variável persistente? É apenas uma matriz de valores para caixas de seleção personalizadas.
precisa saber é o seguinte
Todos os valores definidos usando variable_set(), que não são excluídos variable_del(), são carregados na memória quando o Drupal é inicializado e salvos em uma variável global; isso significa que eles estão na memória, independentemente do módulo que estiver usando esses valores, ou não. Usando uma tabela de banco de dados customizada, você pode ter certeza de que esses valores serão carregados apenas quando o módulo realmente precisar. Você não deve usar variable_set()se a variável Drupal contiver uma matriz à qual você continua adicionando um novo índice de matriz o tempo todo, por exemplo.
kiamlaluno
Olhando para o código (D7). Eu vejo apenas duas linhas de código entre a chamada de hook_install e hook_enable: uma atualização para uma variável local e uma chamada para watchdog. Portanto, durante uma instalação real, não há diferença entre esses 2 ganchos sobre o que está disponível e registrado e o que não está. A única diferença é se esta é a primeira vez que instala ou apenas reativa o módulo.
fietserwin
4

Eu iria com db_query/ db_insert(D6 / D7) em hook_install ().

Não é considerado uma prática ruim (e ninguém nunca está forçando você a usar drupal_write_record()).

Não é incomum que as pessoas desabilitem e reativem os módulos e, nesse caso, seu código hook_enable()seria acionado a cada vez. o que não é legal.

Bojan Zivanovic
fonte