Làm cách nào để thêm giá trị mặc định vào bảng cơ sở dữ liệu bằng hook_install ()?


9

Tôi đang tạo một mô-đun tùy chỉnh với lược đồ riêng của một vài bảng. Các bảng này cần phải có một số giá trị được điền trước vào chúng để mô-đun hoạt động (vị trí mặc định, tùy chọn chọn, v.v.).

Cách thực hành tốt nhất để chèn giá trị mặc định vào các bảng này trong hook_install là gì?

Vì drupal_write_record không có sẵn, tôi có thể sử dụng db_query, nhưng tôi chỉ muốn đảm bảo rằng tôi không vi phạm bất kỳ quy tắc chính nào bằng cách làm như vậy.

Câu trả lời:


7

Cách tốt hơn là làm điều đó bên trong hook_enable () ; tại thời điểm hook được gọi, mô-đun đã được cài đặt và lược đồ cơ sở dữ liệu của nó có sẵn cho Drupal và drupal_write_record(). Vì hook được gọi tất cả các lần mô-đun được bật và không chỉ khi mô-đun được cài đặt, việc triển khai hook nên kiểm tra xem nó đã không thêm các hàng cơ sở dữ liệu đó chưa (ví dụ: nó nên sử dụng biến Drupal chứa giá trị boolean) .

Ví dụ về mô-đun sử dụng hook_enable()cho mục đích tương tự, bạn có thể kiểm tra forum_enable () hoặc php_enable () (có thêm định dạng đầu vào "mã 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))));
  }
}

Như được hiển thị từ các triển khai hook đó, mã có thể cần phải được thực thi tất cả các lần hook được thực thi; đó cũng có thể là mã cần được thực thi một lần, vì trong trường hợp các giá trị mặc định được thêm vào cơ sở dữ liệu có thể bị thay đổi từ người dùng, người không có giao diện người dùng để thay đổi / xóa các giá trị đó.


Nếu tôi đã làm điều này trong hook_enable (), điều đó có nghĩa là các giá trị mặc định sẽ được đặt lại mỗi khi mô-đun được bật và tắt. Tôi nghĩ rằng điều đó là khá phổ biến, trái ngược với việc hoàn toàn không cài đặt và cài đặt lại (tại thời điểm đó dự kiến ​​cơ sở dữ liệu sẽ được đặt lại).
cam13

1
Đó là lý do tại sao tôi viết, "việc thực hiện hook nên kiểm tra xem nó đã không thêm các hàng cơ sở dữ liệu đó chưa." Điều này có nghĩa là nó sẽ kiểm tra xem các giá trị đã có trong bảng cơ sở dữ liệu chưa, hoặc sử dụng biến Drupal để kiểm tra xem nó đã thực hiện nhiệm vụ đó chưa. Kiểm tra bảng cơ sở dữ liệu sẽ được thực hiện nếu những giá trị đó nhất thiết phải có trong cơ sở dữ liệu; ví dụ, đây là trường hợp nếu các giá trị được yêu cầu từ mô-đun và người dùng không được phép xóa các giá trị mặc định.
kiamlaluno

Cảm ơn bạn đã làm rõ. Có sự khác biệt nào trong việc lưu trữ các giá trị này trong bảng tùy chỉnh của riêng tôi so với việc chỉ sử dụng biến_set để lưu trữ chúng trong một biến liên tục không? Nó chỉ là một mảng các giá trị cho các hộp chọn tùy chỉnh.
cam13

Tất cả các giá trị được đặt bằng cách sử dụng variable_set()không bị xóa variable_del()sẽ được tải trong bộ nhớ khi bootupps Drupal và được lưu trong một biến toàn cục; điều này có nghĩa là chúng nằm trong bộ nhớ cho dù mô-đun có sử dụng các giá trị đó hay không. Sử dụng bảng cơ sở dữ liệu tùy chỉnh, bạn có thể chắc chắn rằng các giá trị đó chỉ được tải khi mô-đun thực sự cần nó. Bạn không nên sử dụng variable_set()nếu biến Drupal chứa một mảng mà bạn tiếp tục thêm một chỉ mục mảng mới mọi lúc.
kiamlaluno

Nhìn vào mã (D7). Tôi chỉ thấy 2 dòng mã giữa việc gọi hook_install và hook_enable: một bản cập nhật cho một biến cục bộ và một lệnh gọi tới watchdog. Vì vậy, trong quá trình cài đặt thực, không có sự khác biệt nào giữa 2 hook này về những gì có sẵn và đã đăng ký và những gì không. Sự khác biệt duy nhất là đây là lần đầu tiên cài đặt hay chỉ bật lại mô-đun.
fietserwin

4

Tôi sẽ đi với db_query/ db_insert(D6 / D7) trong hook_install ().

Nó không được coi là thực hành xấu (và không ai bắt buộc bạn phải sử dụng drupal_write_record()).

Không có gì lạ khi mọi người vô hiệu hóa và kích hoạt lại các mô-đun, và trong trường hợp đó, mã của bạn hook_enable()sẽ kích hoạt mỗi lần. cái nào không đẹp

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.