I have a custom products module called wcont_WContractProducts.
Each Product has a quantity, an id (as all modules do), and a bundle_id_c which allows me to identify a group of products.
When any product belonging to a bundle is changed to have a new quantity, all the products in the bundle have to be updated to that same quantity.
Here comes the problem.
If I do a before or after save logic hook it will loop.
I can limit the number of loops by doing an after save and making sure I don't keep updating the quantity after it's set, but it still runs through too many times and doesn't feel like a clean solution.
For example, in my somewhat slow development environment, with 2 products in the bundle it loops 10 or so times before it finally meets the condition that will stop the looping.
My after_save logic hook:
class ContractProducts_Logic { protected static $fetchedRow = array(); //allows me to use fetchedRow in after save function update_bundle_quantities($bean, $event, $arguments){ //we just saved a product, see if it's an update, if so check if it's a bundle and if quantity has changed. if(isset(self::$fetchedRow) && self::$fetchedRow['quantity']!= $bean->quantity && !empty($bean->bundle_id_c)){ // loop trough the bundle items and update quantity if it's not the same require_once('include/SugarQuery/SugarQuery.php'); $sugarQuery = new SugarQuery(); $sugarQuery->select(array('id', 'quantity')); $bp = BeanFactory::newBean('wcont_WContractProducts'); $sugarQuery->from($bp, array('team_security' => false)); $sugarQuery->where()->equals('bundle_id_c', $bean->bundle_id_c); $result = $sugarQuery->execute(); foreach($result as $bundle_product){ if($bundle_producti['quantity'] != $bean->quantity && $bundle_product['id'] != $bean->id){ $bpBean = BeanFactory::retrieveBean('wcont_WContractProducts', $bundle_product['id']); $bpBean->quantity = $bean->quantity; $bpBean->save(); //this triggers this same logic_hook again. } } } } }
I could do a direct update using sql and $db but there are other hooks on the the change in quantity that update a related module's entries so I would really like those logic_hooks to still execute.
Any thoughts on how to get out of this conundrum?
thank you,
FrancescaS
NOTE: the !emptyempty in line 05 is an artifact of the syntax highlighting it is actually !empty($bean->bundle_id_c)