¿Cómo agrego valores predeterminados a una tabla de base de datos usando Hook_install ()?

drupal.stackexchange https://drupal.stackexchange.com/questions/9462

  •  16-10-2019
  •  | 
  •  

Pregunta

Estoy creando un módulo personalizado con su propio esquema de algunas tablas. Estas tablas deben tener algunos valores prepoblados en ellas para que el módulo funcione (ubicaciones predeterminadas, opciones de selección, etc.).

¿Cuál es la mejor forma de prácticas de insertar valores predeterminados en estas tablas durante Hook_install?

Dado que Drupal_Write_record no está disponible, puedo usar DB_Query, pero solo quiero asegurarme de no romper ninguna regla cardinal al hacerlo.

¿Fue útil?

Solución

La mejor manera es hacerlo por dentro Hook_enable (); En el momento en que se invoca el gancho, el módulo ya está instalado y el esquema de su base de datos está disponible para Drupal y para drupal_write_record(). Como se invoca el gancho en todos los tiempos, un módulo está habilitado, y no solo cuando el módulo está instalado, la implementación del gancho debe verificar si ya no agregó esas filas de la base de datos (por ejemplo, debe usar una variable drupal que contenga un valor booleano) .

Como ejemplo de módulo que usa hook_enable() Para un propósito similar, puede verificar foro_enable (), o php_enable () (que agrega el 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))));
  }
}

Como se muestra en esas implementaciones de gancho, el código necesariamente podría ser ejecutado en todas las veces que se ejecuta el gancho; También podría ser que el código sea solo ejecutar una vez, ya que en el caso de los valores predeterminados agregados a la base de datos no se pueden alterar del usuario, que no tiene una interfaz de usuario para alterar/eliminar esos valores.

Otros consejos

Yo iría con db_query / db_insert (D6 / D7) en Hook_Install ().

No se considera una mala práctica (y nadie te está obligando a usar drupal_write_record()).

No es raro que las personas desactiven y vuelvan a habilitar módulos, y en ese caso su código en hook_enable() dispararía cada vez. que no es agradable.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a drupal.stackexchange
scroll top