<?php
namespace App\EventListener;
use Pimcore\Model\Element\ValidationException;
use Pimcore\Model\DataObject\Model;
use Pimcore\Event\Model\ElementEventInterface;
use Pimcore\Event\Model\DataObjectEvent;
use Symfony\Component\EventDispatcher\GenericEvent;
use Pimcore\Model\DataObject;
use Pimcore\Event\BundleManager\PathsEvent;
class ModelListener
{
/**
* @param ElementEventInterface $event
*/
public function onPreUpdate(ElementEventInterface $event)
{
if ($event instanceof DataObjectEvent) {
$object = $event->getObject();
if (!$object instanceof Model) {
return;
}
// Called to check validation
$this->mandatoryValidation($object);
$this->addModelWithStore($object);
}
}
public function addModelWithStore($object) {
$modelId = $object->getId();
$modelName = $object->getName();
$stores = new DataObject\Store\Listing();
$stores->setCondition("o_published = ?", [true]);
$stores->load();
$db = \Pimcore\Db::getConnection('writer');
foreach ($stores as $store) {
$storeId = $store->getId();
$sql = "SELECT model FROM `app_model_store` WHERE storeId = :storeId AND modelId = :modelId";
$stmt = $db->prepare($sql);
$stmt->execute([':storeId' => $storeId, ':modelId' => $modelId]);
$result = $stmt->fetchColumn();
if (!$result) {
$sql = "INSERT INTO `app_model_store` (storeId, modelId, model) VALUES (:storeId, :modelId, :model)";
$stmt = $db->prepare($sql);
$stmt->execute([':storeId' => $storeId, ':modelId' => $modelId, ':model' => $modelName]);
}
}
}
/**
* Event trigger when post delete
* @param ElementEventInterface $event
*/
public function onPostDelete(ElementEventInterface $event)
{
if ($event instanceof DataObjectEvent) {
$object = $event->getObject();
if (!$object instanceof Model) {
return;
}
$modelId = $object->getId();
$db = \Pimcore\Db::getConnection('writer');
$sql = "DELETE FROM `app_model_store` WHERE modelId = :modelId";
$stmt = $db->prepare($sql);
$stmt->execute([':modelId' => $modelId]);
}
}
/**
* @param ElementEventInterface $event
*/
public function onPreAdd(ElementEventInterface $event)
{
if ($event instanceof DataObjectEvent) {
$object = $event->getObject();
$currentUser = \Pimcore\Tool\Admin::getCurrentUser();
if (!$object instanceof Model || $currentUser) {
return;
}
// Called to check validation
$this->mandatoryValidationPreAdd($object);
}
}
/**
* @param object $object
*/
public function mandatoryValidationPreAdd($object)
{
$errors = [];
if(empty($object->getName())) {
$errors[] = 'Name is mandatory';
}
if($errors) {
throw new ValidationException(implode('<br>', $errors));
}
}
/**
* @param object $object
*/
public function mandatoryValidation($object)
{
$errors = [];
if(empty($object->getName())) {
$errors[] = 'Name is mandatory';
}
if($errors) {
throw new ValidationException(implode('<br>', $errors));
}
if(!isset($_GET['task'])){
return;
}
$errors = [];
if (!empty($object->getName()) && strlen($object->getName()) < 4) {
$errors[] ='Name must be more 4 characters or more.';
}
$brand = $object->getBrand();
if(!empty($brand)) {
if($brand instanceof DataObject\Brand) {
if(!$brand->isPublished()) {
$errors[] = 'Please select a published Brand';
}
}
} else {
$errors[] ='Brand is mandatory';
}
if (!empty($object->getHeaderDescription()) && strlen($object->getHeaderDescription()) < 10)
{
$errors[] ='Header description must be more than 10 characters.';
}
if (!empty($object->getFooterDescription()) && strlen($object->getFooterDescription()) < 10)
{
$errors[] ='Footer description must be more than 10 characters.';
}
if($errors) {
throw new ValidationException(implode('<br>', $errors));
}
}
/**
* @param GenericEvent $event
*/
public function objectListBeforeListLoad(GenericEvent $event)
{
$list = $event->getArgument('list');
$context = $event->getArgument('context');
if(array_key_exists('class', $context) && $context['class'] == "Brand") {
$list->addConditionParam("id IN (SELECT oo_id FROM `object_BRD` WHERE o_published = 1)");
}
$event->setArgument('list', $list);
}
public function addJSFiles(PathsEvent $event)
{
$event->setPaths(
array_merge(
$event->getPaths(),
[
'/admin-static/model/model.js'
]
)
);
}
public function addCSSFiles(PathsEvent $event)
{
$event->setPaths(
array_merge(
$event->getPaths(),
[
'/admin-static/product/product.css'
]
)
);
}
}