Класс 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 .= '
'.vmText::_('Рассчет скидки для корзины').''; $html .= VmHTML::row('checkbox','Чегонибудь включить','activated',$calc->activated); $html .= VmHTML::row('input','Id товаров например','products',$calc->products); $html .= '
'; $html .= vmText::_('Здесь будет описание').'
';

 

Для поля 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

Друзья!!!
Спасибо Вам всем большое за поддержку проекта. Если не сложно при переводе пишите в комментарий свой email. Я буду знать от кого и мне очень приятно будет оказать посильную помощь этому человеку.

Если кому нужен другой по функционалу плагин, модуль или еще что то пишите в комментариях.