diff --git a/commerce_price_table.info b/commerce_price_table.info index c70d678..485d058 100644 --- a/commerce_price_table.info +++ b/commerce_price_table.info @@ -5,6 +5,7 @@ core = 7.x dependencies[] = commerce_product dependencies[] = commerce_price +dependencies[] = rules ; Simple tests -files[] = tests/commerce_price_table.test \ No newline at end of file +files[] = tests/commerce_price_table.test diff --git a/commerce_price_table.module b/commerce_price_table.module index d4ab244..1cc5c3d 100644 --- a/commerce_price_table.module +++ b/commerce_price_table.module @@ -502,6 +502,43 @@ function commerce_price_table_sort_by_qty($a, $b) { } /** + * Implements hook_field_create_instance(). Triggers rebuild of rules' cache. + * hook_field_create_field() is invoked to early for + * commerce_price_table_default_rules_configuration(). + */ +function commerce_price_table_field_create_instance($instance) { + if (isset($instance['entity_type']) && $instance['entity_type'] == 'commerce_product') { + $field = field_read_field($instance['field_name']); + commerce_price_table_field_delete_field($field); + } +} + +/** + * Implements hook_field_delete_field(). Triggers rebuild of rules' cache. + */ +function commerce_price_table_field_delete_field($field) { + if ($field['type'] == 'commerce_price_table') { + // Clear entity's and rules' caches + rules_clear_cache(); + + $cache_tables = array(); + $tables = module_invoke('entity', 'flush_caches'); + if (!empty($tables) && is_array($tables)) { + $cache_tables = array_merge($cache_tables, $tables); + } + + $tables = module_invoke('rules', 'flush_caches'); + if (!empty($tables) && is_array($tables)) { + $cache_tables = array_merge($cache_tables, $tables); + } + + foreach ($cache_tables as $table) { + cache_clear_all('*', $table, TRUE); + } + } +} + +/** * Return the settings of all the price table field of a bundle. */ function commerce_price_table_get_field_instance_settings($entity_type = 'commerce_product', $bundle = 'product') { diff --git a/commerce_price_table.rules_defaults.inc b/commerce_price_table.rules_defaults.inc index 9a1f754..8a5cdaa 100644 --- a/commerce_price_table.rules_defaults.inc +++ b/commerce_price_table.rules_defaults.inc @@ -11,32 +11,42 @@ function commerce_price_table_default_rules_configuration() { $rules = array(); - // Add a reaction rule to update a shopping cart order's status to "Shopping - // cart" when a product is added to or removed from the order. - $rule = rules_reaction_rule(); - - $rule->label = t('Override price with price table'); - $rule->active = TRUE; - - $rule - ->event('commerce_product_calculate_sell_price') - ->condition('entity_has_field', array( - 'entity:select' => 'commerce-line-item', - 'field' => 'commerce_product', - )) - ->condition('entity_has_field', array( - 'entity:select' => 'commerce-line-item:commerce-product', - 'field' => 'field_price_table', - )) - ->action('commerce_price_table_set_price', array( - 'commerce_line_item:select' => 'commerce-line-item', - 'quantity:select' => 'commerce-line-item:quantity', - 'price_table:select' => 'commerce-line-item:commerce-product:field-price-table', - )); - - $rule->weight = -10; - - $rules['commerce_price_table_override_price'] = $rule; + $fields = commerce_info_fields('commerce_price_table', 'commerce_product'); + if (!empty($fields) && is_array($fields)) { + foreach ($fields as $field) { + // Add a reaction rule to update a shopping cart order's status to "Shopping + // cart" when a product is added to or removed from the order. + $rule = rules_reaction_rule(); + + $rule->label = t('Override price with price table value from !field', array('!field' => $field['field_name'])); + $rule->active = TRUE; + + $rule + ->event('commerce_product_calculate_sell_price') + ->condition('entity_has_field', array( + 'entity:select' => 'commerce-line-item', + 'field' => 'commerce_product', + )) + ->condition('entity_has_field', array( + 'entity:select' => 'commerce-line-item:commerce-product', + 'field' => $field['field_name'], + )) + ->action('commerce_price_table_set_price', array( + 'commerce_line_item:select' => 'commerce-line-item', + 'quantity:select' => 'commerce-line-item:quantity', + 'price_table:select' => 'commerce-line-item:commerce-product:'.strtr($field['field_name'], '_', '-') + )); + + $rule->weight = -10; + + if ($field['field_name'] == 'field_price_table') { + // Retain compatibility with 7.x-1.1 configuration. + $rules['commerce_price_table_override_price'] = $rule; + } else { + $rules['commerce_price_table_override_price_'.$field['field_name']] = $rule; + } + } + } return $rules; }