<?php
/**
* Active Publishing - All right reserved
* Full copyright and license information is available in
* LICENSE.md which is distributed with this source code.
*
* @copyright Copyright (c) Active Publishing (https://activepublishing.fr)
* @license Creative Common CC BY ND 4.0
* @author Active Publishing <contact@active-publishing.fr>
*/
namespace ActivePaginateBundle\EventListener;
use ActivePaginateBundle\ActivePaginateBundle;
use ActivePublishing\Tool\ApTool;
use BricomanBundle\Model\DataObject\ActivePaginatorChapters;
use Pimcore\Db;
use Pimcore\Event\Model\ElementEventInterface;
use Pimcore\Event\Model\DataObjectEvent;
use Pimcore\Model\DataObject;
use Pimcore\Model\DataObject\Data\ElementMetadata;
use Symfony\Component\Serializer\Encoder\JsonDecode;
/**
* Class ActivePaginatorListener
* @package ActivePaginateBundle\EventListener
*/
class ActivePaginatorListener
{
// -----------------------------------------------------------------------------------------------------------------
// LISTENERS
// -----------------------------------------------------------------------------------------------------------------
/**
* @param ElementEventInterface $e
*/
public function onPreUpdate (ElementEventInterface $e)
{
if ($e instanceof DataObjectEvent) {
$object = $e->getObject();
if ($object instanceof DataObject\ActivePaginatorChapters) {
$riOldData = $this->getRiOldData($object);
$riChangeData = [];
$jsonDecode = new JsonDecode(true);
if($_SERVER['REQUEST_METHOD'] == 'POST') {
if (array_key_exists('data', $_POST) && is_json($_POST['data'])) {
$riChangeData = $this->getRiChangeData($jsonDecode->decode($_POST['data'], 'json'));
}
}elseif($_SERVER['REQUEST_METHOD'] == 'PUT') {
$put = [];
parse_str(file_get_contents("php://input"), $put);
if (array_key_exists('data', $put) && is_json($put['data'])) {
$riChangeData = $this->getRiChangeData($jsonDecode->decode($put['data'], 'json'));
}
}
$recoverItems = [];
$items = $object->getItems();
$parent = $object->getParent();
if (!empty($items) && !is_null($items) && $parent instanceof DataObject\ActivePaginator) {
$targetObjectData = $parent->getBlocTarget();
$targetObjectArray = [];
if (!empty($targetObjectData)) {
foreach ($targetObjectData as $targetObject) {
$targetObjectArray[] = $targetObject['targetObject']->getData();
}
}
$recoverItems = $this->getRi($items, $riOldData, $riChangeData, $targetObjectArray);
}
$object->setRecoverItems($recoverItems);
}
}
}
/**
* @param ElementEventInterface $e
* @throws \Exception
*/
public function onPostUpdate (ElementEventInterface $e)
{
if ($e instanceof DataObjectEvent) {
$object = $e->getObject();
if ($object instanceof DataObject\ActivePaginator && $object->hasChildren()) {
foreach ($object->getChildren() as $activePaginatorChapters) {
if ($activePaginatorChapters instanceof ActivePaginatorChapters) {
$activePaginatorChapters->save();
}
}
}
}
}
// -----------------------------------------------------------------------------------------------------------------
// HELP FUNCTIONS
// -----------------------------------------------------------------------------------------------------------------
/**
* @param $items
* @param $riOldData
* @param $riChangeData
* @param $targetObjectArray
* @param array $elsMetadata
* @return array
*/
private function getRi($items, $riOldData, $riChangeData, $targetObjectArray, $elsMetadata = [])
{
try {
foreach ($items as $item) {
if ($item instanceof DataObject\Concrete && (in_array($item->getClassName(), $targetObjectArray))) {
$elsMetadata[] = $this->createElementMetadata($item, $riOldData, $riChangeData);
} elseif ($item->hasChildren()) {
$elsMetadata = $this->getRi(
$item->getChildren(), $riOldData, $riChangeData, $targetObjectArray, $elsMetadata
);
}
}
} catch (\Exception $ex) {
ApTool::log(ActivePaginateBundle::BUNDLE_ID, $ex->getTraceAsString());
}
return $elsMetadata;
}
/**
* @param array $riChangeData
* @return array
*/
private function getRiChangeData ($riChangeData = [])
{
$data = [];
if (array_key_exists('recoverItems', $riChangeData)) {
if (!empty($riChangeData['recoverItems'])) {
foreach ($riChangeData['recoverItems'] as $dataItem) {
$data[$dataItem['id']] = [
'publish' => (bool) $dataItem['publish']
];
}
}
}
return $data;
}
/**
* @param DataObject\Concrete $object
* @return array
*/
private function getRiOldData (DataObject\Concrete $object)
{
$database = Db::get();
$cid = trim($object->getClassId());
$oid = trim($object->getId());
$data = [];
if (($cid != "") && ($oid != "")) {
$fetchAll = $database->fetchAll(
"SELECT * FROM `object_metadata_$cid` WHERE o_id = $oid"
. " AND `fieldname` = 'recoverItems' AND `column` = 'publish'"
);
if (!empty($fetchAll)) {
foreach ($fetchAll as $dataItem) {
$data[$dataItem['dest_id']] = [
'publish' => (bool)$dataItem['data']
];
}
}
}
return $data;
}
/**
* @param DataObject\Concrete $object
* @param $riOldData
* @param $riChangeData
* @return bool|ElementMetadata
*/
private function createElementMetadata (DataObject\Concrete $object, $riOldData, $riChangeData)
{
try {
$elementMetadata = new ElementMetadata('recoverItems', ['publish'], $object);
$publish = $object->isPublished();
// Get old data
if (array_key_exists($object->getId(), $riOldData)) {
$publish = (bool) $riOldData[$object->getId()]['publish'];
}
// Get new data
if (array_key_exists($object->getId(), $riChangeData)) {
$publish = (bool) $riChangeData[$object->getId()]['publish'];
}
$elementMetadata->setPublish($publish);
return $elementMetadata;
} catch (\Exception $ex) {
ApTool::log(ActivePaginateBundle::BUNDLE_ID, $ex->getTraceAsString());
}
return false;
}
}