[Решение] Rules D6: авто заполнение одного CCK поля (цена со скидкой) в зависимости от значений других (цена, размер скидки)

Главные вкладки

Аватар пользователя Antoniy Antoniy 26 мая 2012 в 12:49

Привет!

Все таки какой замечательный этот Rules! Сегодня провел такой эксперимент:

Задача:
Автоматически заполнять поле "цена со скидкой" вычисляемым значением в зависимости от значений полей "цена" и "размер скидки в процентах".

Выполнение: Нужны модули CCK и Rules

  1. Созданием в типе материала соответствующие поля:
    1. Стоимость услуги: field_com_services_price (тип целое число)
    2. Размер скидки в %: field_com_services_discount (тип целое число)
    3. Стоимость со скидкой: field_com_services_price_dis (тип целое число) (авто заполнение по правилам в Rules)
  1. Идем в Rules:
    1. Создаем новое правило с событием "После редактирования существующего элемента"
    2. Условие №1: Обновленное содержимое и наш тип контента.
      Условие №2: Поле было изменено 'field_com_services_discount'
    3. Действие: Заполнить поле 'field_com_services_price_dis'
      Указываем значение с помощью PHP-кода:
      <?php
      $price 
      $node->field_com_services_price[0]['value'];
      $discount $node->field_com_services_discount[0]['value'];
      $pricedis $node->field_com_services_price_dis[0]['value'];
      return array (
      => array('value' => $pricedis $price-$price*($discount/100))
      );
      ?>

Благодарности: пользователю digital_sword за код, который я потом адаптировал под вычисление скидки.

Дальнейшие планы:
Планирую это дело прикрутить к типу материала Product Ubercart. А потом присоединять товары к акциям с изменением размера скидки и заполнением цены со скидкой, как CCK-мультиполя

UPD:

Есть пока один минус в этом решении: если убрать значение в поле "размер скидки", то Rules ставит ноль в поле "цена со скидкой". А по идее, если размер скидки не внесен, то и поле "цена со скидкой" должно быть пустым и не выводится.

Добавляем в созданное правило еще одно условие:

Поле имеет значение. Выбираем 'field_com_services_discount' (Размер скидки) и ставим чекбокс "Обратить". Т. е. теперь Rules будет выполнять правило только если поле "размер скидки" не пустое.

Страница правила (img кликабелен, увеличение):
Rules

ВложениеРазмер
Иконка изображения rules_price_product_discount.png24.47 КБ

Комментарии

Аватар пользователя Айдар Айдар 26 мая 2012 в 13:19

Мощно! Спасибо! В закладки.

Вот бы еще ряд примеров для построения других вычислений ($price-$price*($discount/100)) для несмыслящих в php... Smile

Аватар пользователя Antoniy Antoniy 26 мая 2012 в 13:25

"Айдар" wrote:
Вот бы еще ряд примеров для построения других вычислений

Я порыскал по гуглу с запросом типа "вычисление процентов PHP". Нашел где-то (где не помню) примеры и адаптировал их.

Аватар пользователя Antoniy Antoniy 26 мая 2012 в 13:32

Да, надо бы создать еще поле "размер скидки в рублях" и тоже засунуть вычисление с ним в Rules.

И два чекбокса "Размер скидки в %" и "Размер скидки в рублях", чтобы по Conditional Field вылазили по ним соответствующие поля для внесения размера скидки.

Так лучше будет.

Аватар пользователя Antoniy Antoniy 26 мая 2012 в 13:47

Есть пока один минус в этом решении: если убрать значение в поле "размер скидки", то Rules ставит ноль в поле "цена со скидкой". А по идее, если размер скидки не внесен, то и поле "цена со скидкой" должно быть пустым и не выводится.

Добавляем в созданное правило еще одно условие:

Поле имеет значение. Выбираем 'field_com_services_discount' (Размер скидки) и ставим чекбокс "Обратить". Т. е. теперь Rules будет выполнять правило только если поле "размер скидки" не пустое.

Внес это в топик как UPD

Аватар пользователя Айдар Айдар 26 мая 2012 в 14:29

Круто!

У меня есть вебформа "заявка на тур", где юзер заполняет поля типа "хочу страну", "хочу отель" и т.п. - долго думал, как вывести примерную стоимость тура по результатам заявки.

Теперь думаю реализовать это не вебформой, а типом материала (еще один толчок к этому - отсутствие зависимых полей в вебформе (не смог их настроить, точнее)).

Аватар пользователя Antoniy Antoniy 26 мая 2012 в 14:33

Вообще Rules офигенная штука, его надо изучать и проводить с ним всяческие эксперименты. Видеоуроки по использованию Rules здесь: http://xandeadx.ru/blog/drupal/363 Те, что на eng, довольно понятны, если даже знание языка не на уровне.

Аватар пользователя Antoniy Antoniy 27 мая 2012 в 8:58

"Айдар" wrote:
еще один толчок к этому - отсутствие зависимых полей в вебформе (не смог их настроить, точнее

Вот тут топикастер вроде как сделал на webform, webform_validation, webform_conditional, webform_computed хорошенький калькулятор

Аватар пользователя Antoniy Antoniy 27 мая 2012 в 11:46

Хочу сделать то, что описано в топике, для Ubercert Product. Он то делается. Но мене надо, чтобы редактирование CCK полей скидок товара можно было делать в форме редактирования другого типа материала "Акция".

Уж как связать CCK поле "Размер скидки" в Акции с полем "Цена со скидкой" конкретного товара и редактирование всего этого в Акции добавляется (множится) через Multigroup - история сложная.

Есть вроде неплохой вариант - модуль Node Widget, но когда его ставишь, он напрочь отключает все Block Reference в нодах. Да и CCK Multigroup не хочет поддерживать Block Reference.

Аватар пользователя Antoniy Antoniy 27 мая 2012 в 11:51

Как можно связать CCK поле в одном типе материала с материалом, которое добавляется по Node Reference? Если так можно сделать, то и в Rules, думаю, получится, чтобы при внесения значения "Размер скидки" к товару в поле материала типа Ации шел пересчет для поля "Цена со скидкой" в материале типа "Товар", который подгружается в "Акцию" по nodereference.