Hook_install () kullanarak bir veritabanı tablosuna varsayılan değerleri nasıl eklerim?


9

Birkaç tablodan oluşan kendi şemasına sahip özel bir modül oluşturuyorum. Modülün çalışması için bu tabloların bazı değerlerin önceden doldurulmuş olması gerekir (varsayılan konumlar, seçim seçenekleri vb.).

Hook_install sırasında bu tablolara varsayılan değerler eklemenin en iyi yöntemleri nelerdir?

Drupal_write_record mevcut olmadığından, db_query kullanabilirim, ancak bunu yaparak herhangi bir kardinal kuralı çiğnemediğimden emin olmak istiyorum.

Yanıtlar:


7

En iyi yol bunu hook_enable () içinde yapmaktır ; kanca çağrıldığında, modül zaten kurulmuş ve veritabanının şeması Drupal ve için kullanılabilir drupal_write_record(). Kanca, modül yüklendiğinde değil, tüm modül etkinleştirildiğinde çağrıldığından, kanca uygulaması, bu veritabanı satırlarını zaten eklemediğini kontrol etmelidir (örneğin, bir boole değeri içeren bir Drupal değişkeni kullanmalıdır) .

Kullanımları bu modülün örnek olarak hook_enable()benzer bir amaç için kontrol edebilirsiniz (forum_enable) veya php_enable () ( "PHP kodu" giriş formatını ekler).

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

Bu kanca uygulamalarından gösterildiği gibi, kodun kanca her yürütüldüğünde yürütülmesi gerekebilir; veritabanına eklenen varsayılan değerlerin, bu değerleri değiştirmek / silmek için kullanıcı arabirimi olmayan kullanıcıdan değiştirilememesi durumunda, kodun yalnızca bir kez yürütülmesi de gerekebilir.


Bunu hook_enable () 'da yapmışsam, modül her etkinleştirildiğinde ve devre dışı bırakıldığında varsayılan değerlerin sıfırlanacağı anlamına gelir. Tamamen kaldırma ve yeniden yükleme aksine (bu noktada veritabanı sıfırlanması bekleniyor) oldukça yaygın olduğunu düşünüyorum.
portakal1313

1
Bu yüzden, "kanca uygulaması zaten bu veritabanı satırlarını eklememiş olup olmadığını kontrol etmelidir" yazdım. Bu, değerlerin veritabanı tablosunda olup olmadığını kontrol etmesi veya bu görevi zaten yerine getirip getirmediğini kontrol etmek için bir Drupal değişkeni kullanması gerektiği anlamına gelir. Bu değerlerin mutlaka veritabanında bulunması gerekiyorsa veritabanı tablosunun kontrol edilmesi; örneğin, değerler modülden isteniyorsa ve kullanıcıların varsayılan değerleri kaldırmasına izin verilmiyorsa durum budur.
kiamlaluno

Açıklama için teşekkürler. Bu değerleri kendi özel tablomda depolamamda, sadece kalıcı bir değişkente saklamak için değişken_set'i kullanmayla ilgili herhangi bir fark var mı? Özel seçim kutuları için sadece bir değerler dizisidir.
oranges1313

Drupal önyükleme yapılırken variable_set()silinmeyen ve kullanılarak ayarlanan tüm değerler variable_del()belleğe yüklenir ve genel bir değişkene kaydedilir; bu, modül bu değerleri kullansın ya da kullanmasın hafızada oldukları anlamına gelir. Özel bir veritabanı tablosu kullanarak, bu değerlerin yalnızca modülün gerçekten ihtiyacı olduğunda yüklendiğinden emin olabilirsiniz. variable_set()Drupal değişkeni, her zaman yeni bir dizi dizini eklemeye devam ettiğiniz bir dizi içeriyorsa kullanmamalısınız .
kiamlaluno

Koda bakarak (D7). Sadece hook_install ve hook_enable çağrılması arasında 2 kod satırı görüyorum: yerel bir değişken için bir güncelleme ve watchdog için bir çağrı. Yani, gerçek bir kurulum sırasında, bu 2 kanca arasında neyin mevcut ve neyin kayıtlı olduğu ve neyin neyin olmadığı konusunda hiçbir fark yoktur. Tek fark, bunun ilk kurulumunun veya sadece modülün yeniden etkinleştirilmesinin olmasıdır.
fietserwin

4

Ben gelirdim db_query/ ' db_inserthook_install içinde (D6 / D7) ().

Kötü uygulama olarak kabul edilmez (ve hiç kimse sizi kullanmaya zorlamaz drupal_write_record()).

İnsanların modülleri devre dışı bırakması ve yeniden etkinleştirmesi nadir değildir ve bu durumda kodunuz hook_enable()her seferinde tetiklenir. ki bu hoş değil.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.