Shopware: Eigene RiskManagement-Rule in einfach
Das Plugin
namespace HPrExampleRiskManagement;
use Shopware\Components\Plugin;
class HPrExampleRiskManagement extends Plugin{
//-- replace with our values --
private static $eventSuffixVarName = 'hpr_risk_example_event';
private static $eventSuffix = 'HPrRiskExample';
private static $extendFolder = 'hpr_risk_example';
private static $serviceName = 'hpr_risk_example.service';
//--
/**
* @return array
*/
public static function getSubscribedEvents(){
return [
'Enlight_Controller_Action_PostDispatchSecure_Backend_RiskManagement' => 'onRiskManagementBackend',
'Shopware_Modules_Admin_Execute_Risk_Rule_sRisk' . self::$eventSuffix => 'onRisk'
];
}
public function onRiskManagementBackend(\Enlight_Controller_ActionEventArgs $args){
$args->getSubject()->View()->addTemplateDir($this->getPath() . '/Resources/views');
if ($args->getSubject()->Request()->getActionName() == 'load') {
$args->getSubject()->View()->assign(self::$eventSuffixVarName, self::$eventSuffix);
$args->getSubject()->View()->extendsTemplate('backend/' . self::$extendFolder . '/store/risks.js');
}
}
/**
* @param \Enlight_Event_EventArgs $args
* @return bool
*/
public function onRisk(\Enlight_Event_EventArgs $args){
$result = false; //false == no risk
try{
$service = $this->container->get(self::$serviceName);
$result = $service->checkRule($args);
}
catch(\Exception $e){
}
return $result;
}
}
Ein Service
namespace HPrExampleRiskManagement\Components;
class RiskRuleService{
/**
* @param \Enlight_Event_EventArgs $args
* @return bool
*/
public function checkRule(\Enlight_Event_EventArgs $args){
return false;
}
}
Die services.xml
<?xml version="1.0" ?>
<container xmlns="http://symfony.com/schema/dic/services"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd">
<services>
<service id="hpr_risk_example.service" class="HPrExampleRiskManagement\Components\RiskRuleService">
<tag name="service" />
</service>
</services>
</container>
Unsere risks.js (Pfad wie in Plugin)
//{extends file='parent:backend/risk_management/store/risks.js'}
//{block name="backend/risk_management/store/risk/data"}
// {$smarty.block.parent}
{ description: '{s name=risks_store/comboBox/HPrRiskExample}HPrExample Check{/s}', value: '{$hpr_risk_example_event}' },
//{/block}
An sich macht man nichts anderes als eine JSON Key-Value Liste zu erweitern und dort ein Event einzutragen, das eine Methode auslöst, die true (is a risk) oder false (is not a risk) zurück gibt. Diese Methode sollte nur als Facade für einen Service dienen, damit man die Logik schnell und einfach austauschen kann.
Das Plugin kann man dann eben noch um alles mögliche erweitern, wie Freitextfedler für Kunden und weitere Templates. Dann den Serive vollständig implementieren, nochmal was mit dem Snippet machen und man sollte seine RiskManagement-Rule haben.