Cách chính xác để cập nhật các quy tắc của mô-đun hiện có là gì?


8

Tôi muốn cung cấp một bản cập nhật cho mô-đun tùy chỉnh của mình, cũng có một số quy tắc được cung cấp thông qua hook_default_rules_configuration.

Bây giờ, làm thế nào tôi có thể cập nhật các quy tắc hiện có? Tôi có thể nhập lại chúng không? Ghi đè chúng bằng cách nào đó? Tôi không thể tìm thấy bất cứ điều gì về điều này trong phim tài liệu hoặc một cái móc tương ứng .

Dường như có một cái móc để đáp ứng các quy tắc đang được cập nhật, vì vậy tôi đoán phải có cách cung cấp cập nhật cho các quy tắc tùy chỉnh ...

Lúc đầu, tôi nghĩ đó là hook_default_rules_configuration_alter nhưng dường như nó không hoạt động như mong đợi vì tôi chỉ muốn nhập JSON.

Chẳng hạn, bằng cách sử dụng các khung nhìn, tôi chỉ có thể tải tất cả .inccác tệp và lưu chúng thông qua views_save_view như trong câu hỏi này - không có cách nào tương tự trong các quy tắc?

Câu trả lời:


7

Bạn có thể xuất cấu hình quy tắc thông qua UI Rules và sau đó triển khai hook_default_rules_configuration_alter () như thế này:

/**
 * Implements hook_default_rules_configuration_alter().
 */
function MODULENAME_default_rules_configuration_alter(&$data) {
  if (isset($data['commerce_cart_add_to_cart_message'])) {
    $data['commerce_cart_add_to_cart_message'] = entity_import('rules_config', '{ "commerce_cart_add_to_cart_message" : {
        "LABEL" : "Display an Add to Cart message",
        "PLUGIN" : "reaction rule",
        "OWNER" : "rules",
        "TAGS" : [ "Commerce Cart" ],
        "REQUIRES" : [ "rules", "commerce_cart" ],
        "ON" : { "commerce_cart_product_add" : [] },
        "IF" : [
          { "data_is" : { "data" : [ "commerce-order:commerce-nocart" ], "value" : "0" } }
        ],
        "DO" : [
          { "commerce_cart_add_to_cart_message" : { "commerce_product" : [ "commerce-product" ] } }
        ]
      }
    }');
  }
}

Chỉ cần thay đổi phiên bản $data['commerce_cart_add_to_cart_message']để sử dụng tên máy quy tắc của bạn và thay thế chuỗi xuất bằng tên của riêng bạn.

Bạn cũng có thể sử dụng Rules_import () thay vì entity_import () . Hoặc là chấp nhận được.

Vì mô-đun quy tắc tải các quy tắc mặc định từ mã vào cơ sở dữ liệu và từ đó tải chúng từ cơ sở dữ liệu, nó sẽ không nhận ngay lập tức ghi đè của bạn. Để thực hiện điều đó, hãy điều hướng đến UI UI và hoàn nguyên quy tắc. Nó sẽ trở lại mã mặc định, đây sẽ là phần ghi đè của bạn.

Để lập trình lại quy tắc, bạn có thể thực hiện việc này (một lần nữa thay thế tên máy quy tắc):

if ($rules_config = rules_config_load('commerce_cart_add_to_cart_message')) {
  $rules_config->delete();
}

Một ví dụ sử dụng có thể là để thực hiện điều đó trong một chức năng cập nhật cho một mô-đun tùy chỉnh.

Có vẻ như vắt để xóa nó nhưng xóa và hoàn nguyên là tương đương với các quy tắc được cung cấp bởi mã bởi vì xóa có nghĩa là xóa khỏi cơ sở dữ liệu. Nếu đây là quy tắc được tạo thông qua UI thì nó sẽ biến mất, tuy nhiên quy tắc từ mã sẽ chỉ xóa khỏi DB và sau đó đọc lại từ mã.

Thật không may, hiện tại chỉ có các lệnh drush để bật / tắt các quy tắc. Có một yêu cầu tính năng cho lệnh xóa / hoàn nguyên tại https://www.drupal.org/node/2507187


đó chính xác là những gì tôi đã thử nhưng dường như nó không hoạt động. Tôi sẽ thử lại lần nữa.
Alex

Tôi đã thêm một phần vào cuối về hoàn nguyên. Có thể đó là thông tin còn thiếu.
rooby

điểm thú vị! vì vậy khi tôi cập nhật các quy tắc của mình trong hook_default_rules_configurationtôi có thể hoàn nguyên các quy tắc để mọi cập nhật được áp dụng. đó là thông minh, nhưng: tôi có thể buộc hoàn nguyên theo quy tắc không? Tôi có thể làm điều này theo chương trình không?
Alex

Đúng, tôi đã thêm thông tin vào cuối câu trả lời.
rooby

Tôi đã đi đến một kết luận rất giống nhau bằng cách xem xét hàm ui.forms.inc rules_ui_confirm_operation_apply. Tại đây bạn cũng có thể kích hoạt và vô hiệu hóa. Cảm ơn vì sự giúp đỡ tuyệt vời của bạn! Tôi sẽ cố gắng một chút và chấp nhận câu trả lời của bạn sau một phút
Alex

2

Để cập nhật các quy tắc của mô-đun theo chương trình, bạn có thể tải chúng và thay đổi chúng. Ví dụ về loại bỏ hành động đơn lẻ :

$rule = rules_config_load("some_rule");
foreach ($rule->actions() as $action) {
  if (strpos($action->getPluginName(), 'drupal_message') !== FALSE) {
    $action->delete();
  }
}
$rule->save();

Nếu nó thay đổi một lần, hãy thêm nó vào hook_update.

Xem: RulesPlugin cho API.

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.