Класс plgVmCalculationMyPlugin
Является расширением (подклассом) класса vmCalculationPlugin.
class plgVmCalculationMyPlugin extends vmCalculationPlugin { }
Ниже буду использовать обозначение “название_класса::название_метода (параметры)”, который будет обозначать лишь принадлежность метода к классу, а не вызов статического метода.
plgVmCalculationMyPlugin::__construct ($subject, $config)
Инициализирует встроенные свойства класса. На практике, для корректной работы плагина, вполне достаточно указать имена полей настроек в админке, их начальные значения и типы данных.
public function __construct ($subject, $config) { parent::__construct($subject, $config); $varsToPush = array( "discount_activate" => array(0,"int"), "discount_start_price" => array(0,"int") ); $this->setConfigParameterable("calc_params",$varsToPush); }
$subject - содержит ссылку на экзепляр объекта JDispatcher. Если посмотреть справку виртумарта по другим плагинам, то там часто можно видеть, что параметр $subject передается в конструктор по ссылке “&”. Вероятнее всего это связано с тем что документация писалась в те времена, когда объекты при передаче в метод - копировались, и чтобы этого не происходило, необходимо было указывать “&” чтобы содержимое переменной передавалось по ссылке, а не по значению. Сейчас в этом нет необходимости, начиная с php 5, все экземпляры объектов по-умолчанию передаются в метод по ссылке, поэтому указывать знак амперсанда - не обязательно.
$config - содержит массив с данными по текущему плагину. Для vmcalculation это скорее всего не представляет никакого интереса, так как кроме типа плагина и его названия - там больше ничего нет.
Обратите внимание, что обязательно необходимо выполнить вызов родительского конструктора, иначе инициализация нового объекта пройдет некорректно.
В массиве $varsToPush как раз необходимо перечислить все поля настроек плагина, указать их начальные значения и тип значения.
plgVmCalculationMyPlugin::plgVmAddMathOp (&$entryPoints)
Позволяет добавить название новой вычислительной операции в выпадающий список “операция” в панели редактирования правил расчета.
public function plgVmAddMathOp(&$entryPoints){ $entryPoints[] = array("calc_value_mathop" => "progress", "calc_value_mathop_name" => "Progressive Discount"); }
$entryPoints - содержит в себе массив уже имеющихся на данный момент в системе типов “математических” операций, которые могут быть использованы при пересчете. Обратите внимание, что значение переменной передается по ссылке. Это означает что она модифицируется и за пределами области видимости метода, и возвращать какое-либо значение - не обязательно. Индекс ‘calc_value_mathop’ - это что-то вроде ключа операции, системного названия; ‘calc_value_mathop_name’ - название операции, которое будет видно в админке пользователю.
plgVmCalculationMyPlugin::plgVmInGatherEffectRulesBill ($calculationHelper, &$testedRules)
Какую изначальную идею разработчики хотели вложить в этот метод, мне сказать трудно. Судя по названию метод должен собирать правила пересчета, наверное... Но лично я использовал метод для того, чтобы передать в корзину дополнительную информацию для отображения (цена без скидки, сумма скидки, сообщение о текущем уровне скидки и т.д...). Эти данные потом отлавливаются через ajax, и их можно вставить в модуль корзины virtuemart.
Если в файле administrator\components\com_virtuemart\helpers\calculationh.php массив $testedRules будет пустой (if(!empty($testedRules) and count($testedRules)>0){) то данная функция запускаться не будет.
public function plgVmInGatherEffectRulesBill($calculationHelper, &$testedRules) { // $calculationHelper->_cart->products - содержит массив с данными // по всем товарм добавленным в корзину. Эти данные можно использовать // чтобы уже здесь выполнить все подсчеты. // Раскомментируйте, чтобы посмотреть содержимое. // var_dump($calculationHelper->_cart->products); // А можно этот метод использовать только для передачи дополнительных // сообщений в модуль корзины. // Для этого используйте $calculationHelper->_cart->data - данный объект // содержит все информацию по корзине. В нем можно изменить значения уже имеющихся // данных и можно добавить новые. // Например, конструкция // $calculationHelper->_cart->data->discountMessage = "Ваша скидка..."; // добавляет новое свойство "discountMessage". // Раскомментируйте, чтобы посмотреть содержимое. // var_dump($calculationHelper->_cart->products); }
$calculationHelper - содержит ссылку на объект CalculationHelper, содержит довольно много информации, на мой взгляд наиболее ценной является та, что указал в блоке кода.
$testedRules - массив уже имеющихся правил пересчета, которые могут быть использованы. Обратите внимание, что там содержатся абсолютно все правила пересчета, созданные в системе магазина, а не только относящиеся к данному плагину. Массив необходимо в метод передавать по ссылке, если хотите изменить его содержание (например, удалить уже отработавшие или недействительные для текущих условий правила пересчета).
plgVmCalculationMyPlugin::plgVmInGatherEffectRulesProduct ($calculationHelper, &$testedRules)
Метод полностью аналогичен описанному выше, за тем лишь исключением, что он работает с информацией в карточке товара, тогда как передыдущий - с корзиной. С помощью этого метода можно вывести или модифицировать информацию в карточке товаров.
plgVmCalculationMyPlugin::plgVmInterpreteMathOp ($calculationHelper, $rule, $price, $revert)
В файле “administrator/components/com_virtuemart/helpers/calculationh.php” в строке 1479 формируется событие, вызывающее метод с именем “plgVmInterpreteMathOp”, при этом ожидается возврат пересчитанной стоимости. Таким образом этот метод удобнее всего использовать для непосредственных вычислений и преобразования стоимости.
public function plgVmInterpreteMathOp($calculationHelper, $rule, $price, $revert) { $rule = (object) $rule; $mathOp = $rule->calc_value_mathop; $calcValueMathOp = $rule->calc_kind; $calcParams = $this->explodeParams($rule->calc_params); $calcValue = $rule->calc_value; // цикл или блок проверки и пересчет.... return $newPrice; }
В этом методе почти наверняка будет какой-то блок проверки или цикл с блоком проверки - все перечисленные выше в коде данные, в таком случае, пригодятся точно.
$calculationHelper - ссылка на объект CalculationHelper.
$rule - массив всех правил пересчета (всех, а не только текущего плагина), если конечно его содержимое не было изменено выше.
$price - стоимость, основанная на базовой цене товаров, число с плавающей точкой.
$revert - булево значение, по смыслу связано с преобразованием знака числа.
plgVmCalculationMyPlugin::plgVmOnDisplayEdit ($calc, &$html)
Если по смыслу вашей задачи, вам явно не хватает тех полей, что уже есть в админке, то с помощью этого метода вы сможете добавить дополнительные. При этом вам необходимо сформировать данные в формате html.
public function plgVmOnDisplayEdit($calc, &$html) { // проверка существования файла шаблона // и инициализация переменных для вставки, если это необходимо ob_start(); include $path; $html = ob_get_clean(); }
Но лучше сделать вывод собственных полей вот так:
$html .= '';
Для поля select multiple
$html .='';
Где $categories это массив опций списка select
$categoryModel = VmModel::getModel('category'); $categories = false; //print_r($categoryModel->getCategories()); //создаем список категорий foreach($categoryModel->getCategories() as $value){ $selected = ''; if(is_array($calc->categories) && count($calc->categories) > 0){ if(in_array($value->virtuemart_category_id,$calc->categories)){ $selected = 'selected="selected"'; } } $categories .='<option '.$selected.' value="'.$value->virtuemart_category_id.'">'.$value->category_name.''; }
$calc - содержит ссылку на объект TableCalcs, содержит всю информацию по настройкам текущего правила пересчета, в том числе данные по дополнительным полям. Значение ранее сохраненных настроек в дополнительных полях, хранится в свойствах, имена которых полностью повторяют имена дополнительных полей.
$html - содержит строку уже ранее сформированного участка html разметки (от другого плагина vmcalculation). Обратите внимание, что строка передается в метод по ссылке.
plgVmCalculationMyPlugin::plgVmStorePluginInternalDataCalc (&$data)
Метод сохраняет введенные в админке данные в базу данных.
public function plgVmStorePluginInternalDataCalc(&$data){ if (!class_exists ("TableCalcs")) { require(JPATH_VM_ADMINISTRATOR . DS . "tables" . DS . "calcs.php"); } $db = JFactory::getDBO (); $table = new TableCalcs($db); $table->setUniqueName("calc_name"); $table->setObligatoryKeys("calc_kind"); $table->setLoggable(); $table->setParameterable ($this->_xParams, $this->_varsToPushParam); $table->bindChecknStore($data); }
plgVmOnStoreInstallPluginTable($jplugin_name,$name,$table=0)
Метод сохраняет введенные в админке данные в базу данных.
Без него не сохранит в поле calc_params
function plgVmOnStoreInstallPluginTable($jplugin_name,$name,$table=0) { //vmdebug('plgVmOnStoreInstallPluginTable',$jplugin_name,$name); $this->onStoreInstallPluginTable ($jplugin_name); $this->plgVmStorePluginInternalDataCalc($name); }
plgVmCalculationMyPlugin::plgVmGetPluginInternalDataCalc ($calcData)
Думаю, вы уже догадались по названию, что этот метод выполняет противоположную задачу - он извлекает данные из базы данных, чтобы потом их можно было подставить в управляющие поля в админке при редактировании настроек.
public function plgVmGetPluginInternalDataCalc($calcData){ $calcData->setParameterable ($this->_xParams, $this->_varsToPushParam); if (!class_exists ("VmTable")) { require(JPATH_VM_ADMINISTRATOR . DS . "helpers" . DS . "vmtable.php"); } VmTable::bindParameterable ($calcData, $this->_xParams, $this->_varsToPushParam); return TRUE; }
Прочие методы
Все перечисленные выше методы непосредственно понадобились для реализации плагина накопительной скидки. Далее идет перечисление методов, которые тоже будут вызваны из плагина типа “vmcalculation”, если они будут в нем определены. Детали использования этих методов изучать не стал, пока в этом потребности нет, а если кому нужно - без труда изучит сам.
Названия некоторых методов явно указывают на то, что они должны относиться к плагинам другого типа (например, “vmpayment”). Это действительно так, однако код в магазине virtuemart устроен так, что иногда в одном блоке кода одновременно импортируются плагины различных типов, а уже затем через JDispatcher::trigger вызываются их методы. JDispatcher::trigger при этом проходит по всем доступным плагинам. Поэтому, фактически, при одновременном импортировании происходит “перемешивание” плагинов, из-за этого и получается что из плагина типа “vmcalculation” можно вызвать метод формально относящийся к плагину типа “vmpayment”. Этим можно воспользоваться.
- plgVmCalculationMyPlugin::plgVmConfirmedOrder ($this, $orderDetails) - метод вызывается при нажатии на кнопку “отправить заказ” пользователем, после того как он полностью оформил заказ на лицевой панели сайта.
- plgVmCalculationMyPlugin::plgVmOnDisplayProductVariantFE ($productCustom, &$row, &$group) - метод вызывается при отображении в карточке товара и в категории товара, товаров с дочерними товарами.
- plgVmCalculationMyPlugin::plgVmOnUpdateOrderShipment (&$data,$old_order_status) - метод вызывается при изменении статуса заказа (в админке).
- plgVmCalculationMyPlugin::plgVmOnUpdateOrderPayment (&$data,$old_order_status) - метод вызывается при изменении статуса заказа (в админке).
- plgVmCalculationMyPlugin::plgVmOnCancelPayment (&$data,$old_order_status) - метод вызывается при отмене оформленного заказа (из админки).
- plgVmCalculationMyPlugin::plgVmOnSelfCallBE ($type, $name, &$render) - скорее всего, метод вызывается при использовании ajax в админке (не уверен).
- plgVmCalculationMyPlugin::plgVmOnSelfCallFE ($type, $name, &$render) - скорее всего, метод вызывается при использовании ajax на лицевой панели сайта (тоже не уверен)
- plgVmCalculationMyPlugin::plgVmDeleteCalculationRow ($id) - метод вызывается при удалении ранее созданного правила расчета в админке (в панели “налоги и правила расчета”). Данный метод напрямую относится к плагинам типа “vmcalculation”.
- plgVmCalculationMyPlugin::getVmPluginCreateTableSQL() - метод вызывается при установке плагина, должен вернуть готовую строку sql-запроса на созадние новой таблицы в базе данных.
Статьи по этой теме https://www.walkswithme.net/virtuemart-calculation-plugin-custom-rule
Статья написана на основе https://www.webengineer.pro/refinement-of-joomla-and-her-extensions/24-kratkaya-dokumentatsiya-plagina-gruppy-vmcalculation-dlya-virtuemart-2X?ysclid=ld0l9mcle6116465888