<?php
/**
* Created by PhpStorm.
* User: javra
* Date: 9/1/20
* Time: 2:40 PM
*/
namespace PfcPublicationBundle\EventListener\PostAdd;
use Cocur\Slugify\Slugify;
use phpDocumentor\Reflection\Types\Boolean;
use Pimcore\Model\DataObject;
use Pimcore\Model\DataObject\ClassDefinition\CustomLayout;
use Pimcore\Model\DataObject\Publication;
use Pimcore\Model\DataObject\Service;
use Pimcore\Model\Element\ValidationException;
use Pimcore\Tool;
use Symfony\Component\EventDispatcher\GenericEvent;
use Symfony\Component\Workflow\Event\Event;
use Pimcore\Event\Model\DataObjectEvent;
class WorkflowDispachListener
{
public function onPostLoad(GenericEvent $event): void
{
DataObject\Product::setGetInheritedValues(true);
$object = $event->getArgument("object");
$user = \Pimcore\Tool\Admin::getCurrentUser();
$data = $event->getArgument("data");
$data['hasPreview'] = false;
if ($object instanceof Publication) {
if ($object->isPublished()) {
$data = $this->getSettingsData($object, $data, $event);
// if (($user->getRoles()[0] == 18 and $object->getStatus() == 'close') or ($user->getRoles()[0] == 18 and $object->getStatus() == "")) {
// $customLayoutToSelect = 5;
// $data = $this->doModifyCustomLayouts($data, $object, $customLayoutToSelect, [0, 1]);
// $event->setArgument("data", $data);
// } else {
// $data = $this->getSettingsData($object, $data, $event);
//// $event->setArgument("data", $data);
// }
}
// else {
// DataObject\Product::setGetInheritedValues(true);
// $customLayoutToSelect = 5;
// $data = $this->doModifyCustomLayouts($data, $object, $customLayoutToSelect, [0, 1]);
// $event->setArgument("data", $data);
// }
}
}
private function doModifyCustomLayouts($data, $object, $customLayoutToSelect = null, $layoutsToRemove = []): array
{
if ($customLayoutToSelect != null) {
//set current layout to subcategory layout
$data['currentLayoutId'] = $customLayoutToSelect;
$customLayout = CustomLayout::getById($customLayoutToSelect);
$data['layout'] = $customLayout->getLayoutDefinitions();
Service::enrichLayoutDefinition($data["layout"], $object);
}
if (!empty($layoutsToRemove)) {
$validLayouts = $data["validLayouts"];
foreach ($validLayouts as $key => $validLayout) {
if (in_array($validLayout[6], $layoutsToRemove)) {
unset($validLayouts[$key]);
}
}
$data["validLayouts"] = array_values($validLayouts);
}
return $data;
}
public function strpos_all($layout, $key): array
{
$offset = 0;
$allpos = array();
while (($pos = strrpos($layout, $key, $offset)) !== FALSE) {
$offset = $pos + 1;
$allpos[] = $pos;
}
return $allpos;
}
private function getSettingsData(Publication $object, $data, $event): void
{
if ($object) {
$publicationSetting = DataObject\PublicationSettings::getByCode("publicationSettings", 1);
if ($publicationSetting) {
$publicationSettingObject = explode(",", trim($publicationSetting->getAttributes()));
$publicationObject = DataObject\Publication::getById($object->getId(), ['force'=>true]);
$publicationObjectFieldDefinitions = (array)$publicationObject->getClass();
$setInvisibleData = [];
foreach ($publicationObjectFieldDefinitions as $key => $publicationObjectFieldDefinition) {
if ($key == 'fieldDefinitions') {
foreach ($publicationObjectFieldDefinition as $key_field => $field) {
$publicationFieldName = $field->getName();
if ($publicationFieldName == "publicationName" || $publicationFieldName == "description" || $publicationFieldName == "status" || $publicationFieldName == "product" ||
$publicationFieldName == "en" || $publicationFieldName == "de" || $publicationFieldName == "nl" || $publicationFieldName == "it" ||
$publicationFieldName == "fr" || $publicationFieldName == "es" || $publicationFieldName == "cs" || $publicationFieldName == "da" || $publicationFieldName == "fi" ||
$publicationFieldName == "nb" || $publicationFieldName == "pl" || $publicationFieldName == "ru" || $publicationFieldName == "pt" || $publicationFieldName == "sv") {
continue;
} else {
if (!in_array($publicationFieldName, $publicationSettingObject)) {
$setName = 'set' . ucfirst(trim($publicationFieldName));
$object->$setName(filter_var(false, FILTER_VALIDATE_BOOLEAN));
$setInvisibleData[] = $publicationFieldName;
}
}
}
}
}
$object->setPublished(true);
$object->save();
$systemLanguages = Tool::getValidLanguages();
$activeLanguage = $this->getActiveLanguage($systemLanguages);
$setInvisiblepublicationSettingObject = $setInvisibleData;
//set Visible to invisible
$setDataInvisible = \GuzzleHttp\json_encode($data["layout"]);
if (is_array($setInvisiblepublicationSettingObject)) {
$from_property = 'invisible":false';
$to_property = 'invisible":true';
foreach ($setInvisiblepublicationSettingObject as $publ) {
$key = '"name":"' . trim($publ) . '"';
$poss = $this->strpos_all($setDataInvisible, $key);
foreach ($poss as $pos) {
$layout_str1 = substr($setDataInvisible, 0, trim($pos));
$layout_str2 = substr($setDataInvisible, trim($pos));
$layout_str2 = preg_replace('/' . $from_property . '/', $to_property, $layout_str2, 1);
$setDataInvisible = $layout_str1 . $layout_str2;
}
}
}
$finalData = \GuzzleHttp\json_decode($setDataInvisible);
$data['layout'] = $finalData;
$event->setArgument("data", $data);
$layout_str1 = null;
$layout_str2 = null;
$setDataInvisible = null;
$pos = null;
// set Invisible to visible
$invisibleData = \GuzzleHttp\json_encode($data["layout"]);
if (is_array($publicationSettingObject)) {
$from_property = 'invisible":true';
$to_property = 'invisible":false';
foreach (array_merge($publicationSettingObject, $activeLanguage) as $publ) {
$key = '"name":"' . trim($publ) . '"';
$poss = $this->strpos_all($invisibleData, $key);
foreach ($poss as $pos) {
$layout_str1 = substr($invisibleData, 0, trim($pos));
$layout_str2 = substr($invisibleData, trim($pos));
$layout_str2 = preg_replace('/' . $from_property . '/', $to_property, $layout_str2, 1);
$invisibleData = $layout_str1 . $layout_str2;
}
}
}
$finalData = \GuzzleHttp\json_decode($invisibleData);
$data['layout'] = $finalData;
$event->setArgument("data", $data);
// return $data;
}
}
}
/**
* @param array $languageNames
* @param $publicationObject
* @return array
*/
public
function getActiveLanguage($systemLanguages): array
{
$activeLanguage = [];
foreach ($systemLanguages as $systemLanguage) {
$name [] = $systemLanguage;
}
return $name;
}
}