Apa cara yang benar untuk memperbarui aturan modul yang ada secara terprogram?

8

Saya ingin memberikan pembaruan untuk modul khusus saya, yang juga memiliki beberapa aturan yang disediakan melalui hook_default_rules_configuration.

Sekarang, bagaimana saya bisa memperbarui aturan yang ada? Bisakah saya mengimpor kembali? Timpa mereka entah bagaimana? Saya tidak dapat menemukan apa pun tentang ini di film dokumenter atau kait masing-masing .

Tampaknya ada kaitan untuk menanggapi aturan yang diperbarui, jadi saya kira pasti ada cara untuk menyediakan pembaruan untuk aturan khusus ...

Pada awalnya saya pikir itu hook_default_rules_configuration_alter tetapi tampaknya tidak berfungsi seperti yang diharapkan karena saya hanya ingin mengimpor JSON.

Misalnya, dengan menggunakan tampilan, saya cukup memuat semua .incfile dan menyimpannya views_save_view seperti dalam pertanyaan ini - bukankah ada cara yang serupa dalam aturan?

Alex
sumber

Jawaban:

7

Anda dapat mengekspor konfigurasi aturan melalui UI Aturan dan kemudian menerapkan hook_default_rules_configuration_alter () seperti ini:

/**
 * 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" ] } }
        ]
      }
    }');
  }
}

Cukup ubah instance $data['commerce_cart_add_to_cart_message']untuk menggunakan nama mesin aturan Anda dan ganti string ekspor dengan milik Anda.

Anda juga dapat menggunakan rules_import () sebagai ganti entitas_import () . Keduanya bisa diterima.

Karena modul rules memuat aturan default dari kode ke dalam database dan sejak saat itu memuatnya dari database, itu tidak akan segera mengambil alih Anda. Untuk membuatnya, navigasikan ke UI Aturan dan kembalikan aturan. Ini akan kembali ke kode default, yang akan menimpa Anda.

Untuk mengembalikan aturan secara terprogram Anda dapat melakukan ini (lagi-lagi mengganti nama mesin aturan):

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

Contoh penggunaan yang mungkin untuk melakukannya selama fungsi pembaruan untuk modul khusus.

Mungkin kelihatannya diperingatkan untuk menghapusnya tetapi menghapus dan mengembalikan setara dengan aturan yang disediakan oleh kode karena delete berarti menghapus dari basis data. Jika ini adalah aturan yang dibuat melalui UI maka itu akan hilang, namun aturan dari kode hanya akan menghapus dari DB dan kemudian membaca lagi dari kode.

Sayangnya saat ini hanya ada perintah drush untuk mengaktifkan / menonaktifkan aturan. Ada permintaan fitur untuk perintah delete / revert di https://www.drupal.org/node/2507187

jorok
sumber
itulah yang saya coba tetapi tampaknya tidak berhasil. Saya akan mencoba lagi.
Alex
Saya menambahkan bagian di akhir tentang mengembalikan. Mungkin itu info yang hilang.
rooby
poin yang menarik! jadi ketika saya memperbarui aturan saya di hook_default_rules_configurationsaya dapat mengembalikan aturan sehingga setiap pembaruan diterapkan. itu cerdas, tetapi: dapatkah saya memaksa pengembalian berdasarkan aturan? dapatkah saya melakukan ini secara terprogram?
Alex
Yap, saya menambahkan info ke bagian bawah jawaban.
rooby
Saya sampai pada kesimpulan yang sangat mirip dengan melihat ke ui.forms.inc, fungsi rules_ui_confirm_operation_apply. Di sini Anda juga dapat mengaktifkan dan menonaktifkan. Terima kasih atas bantuan Anda! Saya akan mencoba sedikit dan menerima jawaban Anda dalam satu menit
Alex
2

Untuk memperbarui aturan modul secara terprogram, Anda dapat memuatnya dan mengubahnya. Contoh menghapus satu tindakan :

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

Jika satu kali diubah, tambahkan ke hook_update.

Lihat: RulesPlugin untuk API.

kenorb
sumber