Обновить цену товара - PullRequest
0 голосов
/ 21 мая 2019

в основном у меня есть два модуля aos_products и fsubscription, и я хочу обновить цены на продукты в модуле fsubscription, когда цены в модуле aos_products изменены или обновлены.

вот что я пытался собрать вместечерез некоторый пример кода с использованием логического хука для достижения этой цели, но он все еще не работает.Что мне здесь не хватает?

ОБНОВЛЕНО

    class UpdateProductPrices
    {

        function do_UpdateProductPrices($bean, $events, $args)
        {
            global $db;

            $package_price = "SELECT price FROM aos_products WHERE deleted = 0 AND parent_type = 'FSUBSCRIPTIONS' AND parent_id = '{$this->bean->id}'";
            $GLOBALS['log']->fatal($package_price);

            $package_price = is_numeric($package_price) ? (float)$package_price : 0;

            if(!empty($package_price)){
                $bean->product_product_unit_price0 = $package_price->price;
                $bean->product_product_unit_price1 = $package_price->price;

            } else {
                $GLOBALS['log']->fatal('Product not found.');
            }
         }
      }

Я изменил цену до $ 150 в aos_products: enter image description here

ноздесь в модуле fsubscription он не меняется, он по-прежнему составляет 100 долларов: enter image description here

1 Ответ

1 голос
/ 22 мая 2019

first $package_price - это определение запроса, которое никогда не выполняется, поэтому данных там не будет.

Во-вторых, вам действительно следует рассмотреть возможность использования suitecrm pQuery с подготовленным массивом операторов в качестве аргументов и не использовать егонепосредственно на запрос (инъекция sql).Выдает что-то вроде этого pQuery($query, ["arg1", "arg2"]), и запрос будет содержать ? символов, в которых вы хотите заменить аргументы (порядок соблюден).

Если вы хотите запустить обновление aos_products, тогда вам нужна логика after_saveхук для модуля aos_products, так как он редактируется.

Это означает, что do_UpdateProductPrices($bean, $events, $args) аргумент $ bean в этой строке будет представлять ПРОДУКТ, а не fsubscription.

Третий, вам нужно будет проверить, обновлена ​​ли цена if($bean->fetched_row['price']!=$bean->price){ перед обновлением.Наконец, давайте попробуем этот код (пожалуйста, измените, поскольку я не знаю имени компонента)

        function do_UpdateProductPrices($bean, $events, $args)
        {
            global $db;
            if($bean->fetched_row['price']!=$bean->price){
            //means that the price has changed
                $fsubscriptionBean = new fsubscription();
                $fsubscriptionBean->retrieve($bean->parent_id);
                $fsubscriptionBean->product_product_unit_price0 = $bean->price;
                $fsubscriptionBean->product_product_unit_price1 = $bean->price;

         }
...