hook_install ()을 사용하여 데이터베이스 테이블에 기본값을 어떻게 추가합니까?


9

몇 가지 테이블의 자체 스키마를 사용하여 사용자 정의 모듈을 작성 중입니다. 이 테이블에는 모듈이 작동하기 위해 일부 값이 미리 채워져 있어야합니다 (기본 위치, 옵션 선택 등).

hook_install 중에 이러한 테이블에 기본값을 삽입하는 가장 좋은 방법은 무엇입니까?

drupal_write_record를 사용할 수 없으므로 db_query를 사용할 수 있지만 그렇게함으로써 기본 규칙을 위반하지 않도록하고 싶습니다.

답변:


7

더 좋은 방법은 hook_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))));
  }
}

이러한 후크 구현에서 알 수 있듯이 코드는 후크가 실행될 때마다 항상 실행되어야합니다. 데이터베이스에 추가 된 기본값을 사용자가 변경할 수없는 경우 (값을 변경 / 삭제할 사용자 인터페이스가없는) 코드를 한 번만 실행하면됩니다.


hook_enable () 에서이 작업을 수행하면 모듈이 활성화 및 비활성화 될 때마다 기본값이 재설정됩니다. 완전히 제거하고 다시 설치하는 대신 데이터베이스가 재설정 될 것으로 예상되는 것은 상당히 일반적이라고 생각합니다.
oranges13

1
그렇기 때문에 "후크 구현은 데이터베이스 행을 이미 추가하지 않았는지 확인해야한다"고 썼다. 이는 값이 이미 데이터베이스 테이블에 있는지 확인하거나 Drupal 변수를 사용하여 해당 작업이 이미 완료되었는지 확인해야 함을 의미합니다. 해당 값이 반드시 데이터베이스에 있어야하는 경우 데이터베이스 테이블을 점검하십시오. 예를 들어, 모듈에서 값이 필요하고 사용자가 기본값을 제거 할 수없는 경우입니다.
kiamlaluno

설명 주셔서 감사합니다. 이 값을 내 사용자 정의 테이블에 저장하는 것과 variable_set을 사용하여 지속적 변수에 저장하는 것과 다른 점이 있습니까? 맞춤 선택 상자의 값 배열 일뿐입니다.
oranges13

variable_set()삭제되지 않은을 사용하여 설정 한 모든 값 은 variable_del()Drupal 부트 스트랩시 메모리에로드되고 전역 변수에 저장됩니다. 이는 모듈이 해당 값을 사용하거나 사용하지 않고 메모리에 있음을 의미합니다. 사용자 정의 데이터베이스 테이블을 사용하면 모듈에 실제로 필요한 경우에만 해당 값이로드되도록 할 수 있습니다. 예를 들어 variable_set()Drupal 변수에 새 배열 인덱스를 계속 추가하는 배열이 포함되어 있으면 사용해서는 안됩니다 .
kiamlaluno

코드를보고 (D7). hook_install과 hook_enable의 호출 사이에는 로컬 변수에 대한 업데이트와 워치 독에 대한 호출 사이에 두 줄의 코드 만 표시됩니다. 따라서 실제 설치 중에 사용 가능하고 등록 된 것과 그렇지 않은 것에 대해 두 후크 사이에는 차이가 없습니다. 유일한 차이점은 이것이 처음 설치인지 아니면 모듈을 다시 활성화하는지입니다.
fietserwin 2016 년

4

hook_install ()에서 db_query/ db_insert(D6 / D7) 과 함께 갈 것입니다 .

그것은 나쁜 습관으로 간주되지 않습니다 (그리고 아무도 당신을 사용하도록 강요하지 않습니다 drupal_write_record()).

사람들이 모듈을 비활성화하고 다시 활성화하는 것은 드문 일이 아니며,이 경우 코드가 hook_enable()매번 실행됩니다. 좋지 않습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.