src/ActivePaginateBundle/EventListener/ActivePaginatorListener.php line 37

Open in your IDE?
  1. <?php
  2. /**
  3.  * Active Publishing - All right reserved
  4.  *   Full copyright and license information is available in
  5.  *   LICENSE.md which is distributed with this source code.
  6.  *
  7.  * @copyright Copyright (c) Active Publishing (https://activepublishing.fr)
  8.  * @license Creative Common CC BY ND 4.0
  9.  * @author Active Publishing <contact@active-publishing.fr>
  10.  */
  11. namespace ActivePaginateBundle\EventListener;
  12. use ActivePaginateBundle\ActivePaginateBundle;
  13. use ActivePublishing\Tool\ApTool;
  14. use BricomanBundle\Model\DataObject\ActivePaginatorChapters;
  15. use Pimcore\Db;
  16. use Pimcore\Event\Model\ElementEventInterface;
  17. use Pimcore\Event\Model\DataObjectEvent;
  18. use Pimcore\Model\DataObject;
  19. use Pimcore\Model\DataObject\Data\ElementMetadata;
  20. use Symfony\Component\Serializer\Encoder\JsonDecode;
  21. /**
  22.  * Class ActivePaginatorListener
  23.  * @package ActivePaginateBundle\EventListener
  24.  */
  25. class ActivePaginatorListener
  26. {
  27.     // -----------------------------------------------------------------------------------------------------------------
  28.     // LISTENERS
  29.     // -----------------------------------------------------------------------------------------------------------------
  30.     /**
  31.      * @param ElementEventInterface $e
  32.      */
  33.     public function onPreUpdate (ElementEventInterface $e)
  34.     {
  35.         if ($e instanceof DataObjectEvent) {
  36.             $object $e->getObject();
  37.             if ($object instanceof DataObject\ActivePaginatorChapters) {
  38.                 $riOldData $this->getRiOldData($object);
  39.                 $riChangeData = [];
  40.                 $jsonDecode = new JsonDecode(true);
  41.                 if($_SERVER['REQUEST_METHOD'] == 'POST') {
  42.                     if (array_key_exists('data'$_POST) && is_json($_POST['data'])) {
  43.                         $riChangeData $this->getRiChangeData($jsonDecode->decode($_POST['data'], 'json'));
  44.                     }
  45.                 }elseif($_SERVER['REQUEST_METHOD'] == 'PUT') {
  46.                     $put = [];
  47.                     parse_str(file_get_contents("php://input"), $put);
  48.                     if (array_key_exists('data'$put) && is_json($put['data'])) {
  49.                         $riChangeData $this->getRiChangeData($jsonDecode->decode($put['data'], 'json'));
  50.                     }
  51.                 }
  52.                 $recoverItems = [];
  53.                 $items $object->getItems();
  54.                 $parent $object->getParent();
  55.                 if (!empty($items) && !is_null($items) && $parent instanceof DataObject\ActivePaginator) {
  56.                     $targetObjectData $parent->getBlocTarget();
  57.                     $targetObjectArray = [];
  58.                     if (!empty($targetObjectData)) {
  59.                         foreach ($targetObjectData as $targetObject) {
  60.                             $targetObjectArray[] = $targetObject['targetObject']->getData();
  61.                         }
  62.                     }
  63.                     $recoverItems $this->getRi($items$riOldData$riChangeData$targetObjectArray);
  64.                 }
  65.                 $object->setRecoverItems($recoverItems);
  66.             }
  67.         }
  68.     }
  69.     /**
  70.      * @param ElementEventInterface $e
  71.      * @throws \Exception
  72.      */
  73.     public function onPostUpdate (ElementEventInterface $e)
  74.     {
  75.         if ($e instanceof DataObjectEvent) {
  76.             $object $e->getObject();
  77.             if ($object instanceof DataObject\ActivePaginator && $object->hasChildren()) {
  78.                 foreach ($object->getChildren() as $activePaginatorChapters) {
  79.                     if ($activePaginatorChapters instanceof ActivePaginatorChapters) {
  80.                         $activePaginatorChapters->save();
  81.                     }
  82.                 }
  83.             }
  84.         }
  85.     }
  86.     // -----------------------------------------------------------------------------------------------------------------
  87.     // HELP FUNCTIONS
  88.     // -----------------------------------------------------------------------------------------------------------------
  89.     /**
  90.      * @param $items
  91.      * @param $riOldData
  92.      * @param $riChangeData
  93.      * @param $targetObjectArray
  94.      * @param array $elsMetadata
  95.      * @return array
  96.      */
  97.     private function getRi($items$riOldData$riChangeData$targetObjectArray$elsMetadata = [])
  98.     {
  99.         try {
  100.             foreach ($items as $item) {
  101.                 if ($item instanceof DataObject\Concrete && (in_array($item->getClassName(), $targetObjectArray))) {
  102.                     $elsMetadata[] = $this->createElementMetadata($item$riOldData$riChangeData);
  103.                 } elseif ($item->hasChildren()) {
  104.                     $elsMetadata $this->getRi(
  105.                         $item->getChildren(), $riOldData$riChangeData$targetObjectArray$elsMetadata
  106.                     );
  107.                 }
  108.             }
  109.         } catch (\Exception $ex) {
  110.             ApTool::log(ActivePaginateBundle::BUNDLE_ID$ex->getTraceAsString());
  111.         }
  112.         return $elsMetadata;
  113.     }
  114.     /**
  115.      * @param array $riChangeData
  116.      * @return array
  117.      */
  118.     private function getRiChangeData ($riChangeData = [])
  119.     {
  120.         $data = [];
  121.         if (array_key_exists('recoverItems'$riChangeData)) {
  122.             if (!empty($riChangeData['recoverItems'])) {
  123.                 foreach ($riChangeData['recoverItems'] as $dataItem) {
  124.                     $data[$dataItem['id']] = [
  125.                         'publish' => (bool) $dataItem['publish']
  126.                     ];
  127.                 }
  128.             }
  129.         }
  130.         return $data;
  131.     }
  132.     /**
  133.      * @param DataObject\Concrete $object
  134.      * @return array
  135.      */
  136.     private function getRiOldData (DataObject\Concrete $object)
  137.     {
  138.         $database Db::get();
  139.         $cid trim($object->getClassId());
  140.         $oid trim($object->getId());
  141.         $data = [];
  142.         if (($cid != "") && ($oid != "")) {
  143.             $fetchAll $database->fetchAll(
  144.                 "SELECT * FROM `object_metadata_$cid` WHERE o_id = $oid"
  145.                 " AND `fieldname` = 'recoverItems' AND `column` = 'publish'"
  146.             );
  147.             if (!empty($fetchAll)) {
  148.                 foreach ($fetchAll as $dataItem) {
  149.                     $data[$dataItem['dest_id']] = [
  150.                         'publish' => (bool)$dataItem['data']
  151.                     ];
  152.                 }
  153.             }
  154.         }
  155.         return $data;
  156.     }
  157.     /**
  158.      * @param DataObject\Concrete $object
  159.      * @param $riOldData
  160.      * @param $riChangeData
  161.      * @return bool|ElementMetadata
  162.      */
  163.     private function createElementMetadata (DataObject\Concrete $object$riOldData$riChangeData)
  164.     {
  165.         try {
  166.             $elementMetadata = new ElementMetadata('recoverItems', ['publish'], $object);
  167.             $publish $object->isPublished();
  168.             // Get old data
  169.             if (array_key_exists($object->getId(), $riOldData)) {
  170.                 $publish = (bool) $riOldData[$object->getId()]['publish'];
  171.             }
  172.             // Get new data
  173.             if (array_key_exists($object->getId(), $riChangeData)) {
  174.                 $publish = (bool) $riChangeData[$object->getId()]['publish'];
  175.             }
  176.             $elementMetadata->setPublish($publish);
  177.             return $elementMetadata;
  178.         } catch (\Exception $ex) {
  179.             ApTool::log(ActivePaginateBundle::BUNDLE_ID$ex->getTraceAsString());
  180.         }
  181.         return false;
  182.     }
  183. }