lib/composer/BartBundle/src/VisualMedia/ComponentBundle/Element/widgets/ComponentsComponent.php line 32

Open in your IDE?
  1. <?php
  2. namespace VisualMedia\ComponentBundle\Element\widgets;
  3. use VisualMedia\ComponentBundle\Element\Component;
  4. use VisualMedia\PageBundle\Entity\BasePage;
  5. use VisualMedia\BartBundle\Element\backend\layout\ButtonElement;
  6. use VisualMedia\ComponentBundle\Element\widgets\page\RowComponent;
  7. use VisualMedia\ComponentBundle\Element\widgets\page\ColumnComponent;
  8. use VisualMedia\BartBundle\Entity\RootEntity;
  9. use VisualMedia\ComponentBundle\Element\Element;
  10. use VisualMedia\ComponentBundle\Model\ComponentEntityModel;
  11. use VisualMedia\ComponentBundle\Element\WidgetHolder;
  12. use VisualMedia\ComponentBundle\Element\WidgetComponent;
  13. use VisualMedia\ComponentBundle\Element\widgets\page\GlobalComponent;
  14. use VisualMedia\BartBundle\Controller\RootController;
  15. use VisualMedia\ComponentBundle\Element\components\ui\FlashMessageElement;
  16. use VisualMedia\ComponentBundle\Element\components\backend\AdminToolbarElement;
  17. class ComponentsComponent extends Component{
  18.     public $entity false;
  19.     protected $components = array();
  20.     protected static $widgets false;
  21.     public $componentType "group";
  22.     public $added = [];
  23.     public $componentField "components";
  24.     public $message false;
  25.     public $admintoolbar false;
  26.     public $modus "client";
  27.     public $hasChanges false;
  28.     public static $page false;
  29.     public function initialize(){
  30.         if(RootController::isPermitted('ROLE_SUPER_ADMIN')){
  31.             $this->modus RootController::getSession()->get("edit_components_modus") ?? "super_admin";
  32.         }
  33.     }
  34.     public function setPage($entity){
  35.         if(get_class($entity)== BasePage::class){
  36.             static::$page $entity;
  37.         }
  38.         else{
  39.             static::$page false;
  40.         }
  41.     }
  42.     public static function createComponents($entity$componentField false){
  43.         
  44.         //$entity->components = str_replace("BartPageBundle","ComponentBundle",$entity->components);
  45.         $component = new ComponentsComponent();
  46.         $component->setPage($entity);
  47.         if($componentField$component->componentField $componentField;
  48.         if(strpos(get_class($entity),"BasePage")>0){
  49.             $component->componentType "page";
  50.         }
  51.         $component->id "components_".$entity->id;
  52.         $component->object $entity;
  53.         $component->entity $entity;
  54.         $components = [];
  55.         if($entity->{$component->componentField}){
  56.             $components json_decode($entity->{$component->componentField},true);
  57.             $components Element::fromArray($components);
  58.             if(!is_array($components)) $components = [$components];
  59.             //dd($components);
  60.             $component->elements $components;
  61.         }
  62.         else{
  63.             //$component->fillDummy();
  64.             //$entity->{$component->componentField} = json_encode($component->elements);
  65.             //$em = RootEntity::$doctrine->getManager();
  66.             //$em->persist($entity);
  67.             //$em->flush();
  68.             
  69.         }
  70.         //dd($components);
  71.         return $component;
  72.     }
  73.     public function loadEntity($entity false){
  74.         if($entity$this->entity $entity;
  75.         if($this->entity->{$this->componentField}){
  76.             $components json_decode($this->entity->{$this->componentField},true);
  77.             $components Element::fromArray($components);
  78.             if(!is_array($components)) $components = [$components];
  79.             $this->elements $components;
  80.         }
  81.     }
  82.     public function editElement($id){
  83.         $element $this->getElement($id);
  84.         dd($element);
  85.     }
  86.     public function getElement($id){
  87.         if(count($this->components)==0){
  88.             $this->explodeComponents();
  89.         }
  90.         if(isset($this->components[$id])){
  91.             return $this->components[$id];
  92.         }
  93.         return false;
  94.     }
  95.     public function deleteElement($id){
  96.         foreach($this->elements as $rowkey => $row){
  97.             if($row->id == $id){
  98.                 array_splice($this->elements,$rowkey,1);
  99.                 return;
  100.             }
  101.             else{
  102.                 foreach($row->elements as $colkey => $col){
  103.                     if($col->id == $id){
  104.                         array_splice($row->elements,$colkey,1);
  105.                         return;
  106.                     }
  107.                     else{
  108.                         foreach($col->elements as $compkey => $comp){
  109.                             if($comp->id==$id){
  110.                                 array_splice($col->elements,$compkey,1);
  111.                                 return;
  112.                             }
  113.                             else{
  114.                                 foreach($comp->elements as $compkey1 => $comp1){
  115.                                     if($comp1->id==$id){
  116.                                         array_splice($comp->elements,$compkey1,1);
  117.                                         return;
  118.                                     }
  119.                                     else{
  120.                                     }
  121.                                 }
  122.                             }
  123.                         }
  124.                     }
  125.                 }
  126.             }
  127.         }
  128.     }
  129.     public static function getWidgets(){
  130.         if(!static::$widgets){
  131.             static::$widgets ComponentEntityModel::getAllComponents(false);
  132.         }
  133.         return static::$widgets;
  134.     }
  135.     public function setComponents($components){
  136.         //dd($components);
  137.         $elements $this->getEmptyComponents();
  138.         $this->elements = [];
  139.         foreach($components as $rowItem){
  140.             if($rowItem->id != "new"){
  141.                 //dd($this->components);
  142.                 $row $this->components[$rowItem->id];
  143.                 foreach($rowItem->elements as $colItem){
  144.                     if($colItem->id!="new"){
  145.                         $col $this->components[$colItem->id];
  146.                         foreach($colItem->elements as $compItem){
  147.                             if($compItem->id!="new"){
  148.                                 $comp $this->components[$compItem->id];
  149.                                 $col->elements[] = $comp;
  150.                             }
  151.                             else{
  152.                                 $this->addNew($compItem$col);
  153.                             }
  154.                         }
  155.                         $row->elements[] = $col;
  156.                     }
  157.                     else{
  158.                         $this->addNew($colItem$row);
  159.                     }
  160.                 }
  161.                 $this->elements[] = $row;
  162.             }
  163.             else{
  164.                 $this->addNew($rowItem$this);
  165.             }
  166.         }
  167.         return $this->elements;
  168.     }
  169.     public function addComponents($components$elements false$item false){
  170.         $added = [];
  171.         $root false;
  172.         if(!$item){
  173.             $item $this;
  174.             $root true;
  175.         }
  176.         if(!$elements){
  177.             $elements $this->getEmptyComponents();
  178.             $this->elements = [];
  179.         }
  180.         foreach($components as $comp){
  181.             if($comp->id!="new"){
  182.                 //dd($components,$this->components);
  183.                 if(!isset($this->components[$comp->id])){
  184.                     //dd($comp->id, $comp);
  185.                 }
  186.                 $component $this->components[$comp->id];
  187.                 $this->addComponents($comp->elements,$elements,$component);
  188.                 $item->elements[] = $component;
  189.             }
  190.             else{
  191.                 $adding $this->addNew($comp,$item);
  192.                 $added[] = $adding->id;
  193.             }
  194.         }
  195.         if($root){
  196.             return $this->elements;
  197.         }
  198.     }
  199.     public function addNew($element$parent false){
  200.         $widget = static::getWidgets()[$element->type];
  201.         //dd($widget);
  202.         $cls $widget->classname;
  203.         $el = new $cls();
  204.         if($parent){
  205.             if($element->type=="Group"){
  206.                 if(isset($parent->behaviour)){
  207.                     switch($parent->behaviour){
  208.                         case "row":
  209.                             $el->behaviour "col";
  210.                             break;
  211.                         case "col":
  212.                             $el->behaviour "component";
  213.                             break;
  214.                         default:
  215.                             $el->behaviour "row";
  216.                     }
  217.                 }
  218.                 else{
  219.                     $el->behaviour "container";
  220.                 }
  221.             }
  222.             $parent->elements[] = $el;
  223.         }
  224.         $this->fillDefault($el$element);
  225.         $this->added[] = $el->id;
  226.         return $el;
  227.     }
  228.     public function fillDefault($element$data false){
  229.         switch($element->type){
  230.             case "ContainerComponent":
  231.                 $child = new RowComponent();
  232.                 $this->fillDefault($child);
  233.                 $element->elements[] = $child;
  234.                 break;
  235.             case "RowComponent":
  236.                 if($data && isset($data->data) && strpos($data->data,"_")>0){
  237.                     $cols explode("_",$data->data);
  238.                     foreach($cols as $width){
  239.                         $child = new ColumnComponent();
  240.                         $child->setWidth($width);
  241.                         $this->fillDefault($child);
  242.                         $element->elements[] = $child;
  243.                     }
  244.                 }
  245.                 else{
  246.                     $child = new ColumnComponent();
  247.                     $this->fillDefault($child);
  248.                     $element->elements[] = $child;
  249.                 }
  250.                 break;
  251.         }
  252.     }
  253.     public function explodeComponents($element false){
  254.         $root false;
  255.         if($element===false){
  256.             $root true;
  257.             $element $this;
  258.             $this->components = [];
  259.         }
  260.         else{
  261.             $this->components[$element->id] = $element;
  262.         }
  263.         foreach($element->elements as $component){
  264.             $this->explodeComponents($component);
  265.         }
  266.         return  $this->components;
  267.     }
  268.     public function getEmptyComponents(){
  269.         $comps $this->explodeComponents();
  270.         $result = [];
  271.         foreach($comps as $id => $comp){
  272.             $comp->elements = [];
  273.             $result[$id] = $comp;
  274.         }
  275.         return $result;
  276.     }
  277.     public function fillDummy(){
  278.         //for($i = 0;$i<1;$i++){
  279.         //    $row = new RowComponent();
  280.         //    for($j=0;$j<1;$j++){
  281.         //        $column = new ColumnComponent();
  282.         //        //$element = new Component();
  283.         //        //$column->addElement($element);
  284.         //        $row->addElement($column);
  285.         //    }
  286.         //    $this->addElement($row);
  287.         //}
  288.     }
  289.     public function manageHtml(){
  290.         //$this->getBuffer();
  291.         return $this->manageTwig();
  292.     }
  293.     public static function addToForm(&$form, &$entity$componentsComponent false){
  294.         $form->addFormField("tab_components","Componenten",'tab');
  295.         if($componentsComponent){
  296.             $components $componentsComponent;
  297.         }
  298.         else{
  299.             $components ComponentsComponent::createComponents($entity);
  300.         }
  301.         //$children = $components->getComponents();
  302.         $items ComponentEntityModel::getAllComponents();
  303.         $holder = new WidgetHolder();
  304.         //dd($this->getModus());
  305.         //$holder->modus = $this->getModus();
  306.         $holder->addWidgets($items);
  307.         $components->widgetHolder $holder;
  308.         $html $components->manageTwig();
  309.         $form->addFormField("components_row","Componenten","htmlrow", ["value" => $html]);
  310.     }
  311.     public function process(){
  312.         if(isset($_POST['components_action'])){
  313.             $action $_POST['components_action'];
  314.             if($action=="drop"){
  315.                 $components json_decode($_POST['components']);
  316.                 $this->addComponents($components);
  317.                 //dd($this);
  318.             }
  319.             else if($action=="delete"){
  320.                 $this->deleteElement($_POST['component']);
  321.             }
  322.             else if($action=="save_data"){
  323.                 $component $this->findElement($_POST['components_id']);
  324.                 if($component->type=="GlobalComponent" && isset($_POST['global_id']) && $_POST['global_id']=="dissolve"){
  325.                     $data GlobalComponent::getContents($component->global_id);
  326.                     $data->id uniqid();
  327.                     $this->replaceElement($data,$component);
  328.                 }
  329.                 else{
  330.                     $ignore = ["components_"];
  331.                     foreach($_POST as $key => $value){
  332.                         $ignoreMe false;
  333.                         foreach($ignore as $not){
  334.                             if(substr($key,0,strlen($not))===$not)$ignoreMe true;
  335.                         }
  336.                         if(!$ignoreMe && $key){
  337.                             //dump($key, $value, $component, $_POST);
  338.                             $component->$key $value;
  339.                         }
  340.                     }
  341.                 }
  342.                 $edited $this->findElement($_POST['components_id']);
  343.             }
  344.             else if($action=="edit_element"){
  345.                 $component $this->findElement($_POST['id']);
  346.                 if($component && isset($_POST['field']) && isset($_POST['value'])){
  347.                     $component->{$_POST['field']} = $_POST['value'];
  348.                 }
  349.                 //$this->replaceElement($component);
  350.                 $edited $this->findElement($_POST['id']);
  351.                 //dd($edited);
  352.             }
  353.             else if($action=="config_component"){
  354.                 $component $this->findElement($_POST['components_id']);
  355.                 //dd($_POST, $component);
  356.                 if($_POST['template_name']){
  357.                     //create as static template
  358.                     $template GlobalComponent::findGlobalComponentByName($_POST['template_name'],true);
  359.                     $template->setComponent($component);
  360.                     //dd($template->getComponent());
  361.                     $template->saveToDatabase();
  362.                     $this->replaceElement($template,$component);
  363.                     //dd($template);
  364.                 }
  365.                 else if(substr($_POST['className'],1)!=$component->className){
  366.                     $component $component->changeType($_POST['className']);
  367.                     $this->replaceElement($component);
  368.                 }
  369.             }
  370.             $this->entity->components json_encode($this->elements);
  371.             //dd($this->entity);
  372.             $this->setBuffer();
  373.         }
  374.     }
  375.     public function manageTwig(){
  376.         $this->admintoolbar = new AdminToolbarElement(["componentsComponent" => $this]);
  377.         $this->getBuffer();
  378.         //dd($this->admintoolbar);
  379.         //dd($this);
  380.         return parent::manageTwig();
  381.     }
  382.     public function setModus(){
  383.     }
  384.     public function getBuffer(){
  385.         //return;
  386.         $buffer ComponentBuffer::get($this->entity);
  387.         if($buffer){
  388.             if($this->entity->components !== $buffer->componentString || $this->hasChanges){
  389.                 $this->hasChanges true;
  390.                 if($this->admintoolbar){
  391.                     $this->admintoolbar->addButton("?action=Origineel herstellen","Origineel herstellen",'','a',["secondaryClass" => "btn-delete"]);
  392.                     $this->admintoolbar->message "Er zijn onopgeslagen wijzigingen";
  393.                     $this->admintoolbar->classes[] = "alert alert-danger";
  394.                 }
  395.                 $this->entity->components $buffer->componentString;
  396.                 $this->loadEntity();
  397.             }
  398.         }
  399.         else{
  400.             ComponentBuffer::set($this->entity);
  401.         }
  402.     }
  403.     public function setBuffer(){
  404.         ComponentBuffer::set($this->entity);
  405.     }
  406.     public function saveBuffer($manager null){
  407.         if(isset($this->entity) && isset($this->entity->id) && $this->entity->id>0){
  408.             if(!$manager){
  409.                 $manager RootEntity::$doctrine->getManagerForClass(get_class($this->entity));
  410.             }
  411.             $this->getBuffer();
  412.             $manager->persist($this->entity);
  413.             $this->setBuffer();
  414.             $manager->flush();
  415.         }
  416.     }
  417.     public static function processPost(&$entity$componentsComponent false$manager false){
  418.         //dd(":p");
  419.         if(isset($_POST['components_action'])){
  420.             $action $_POST['components_action'];
  421.             if($componentsComponent){
  422.                 $pc $componentsComponent;
  423.             }
  424.             else{
  425.                 $pc = static::createComponents($entity);
  426.             }
  427.             if($action=="drop"){
  428.                 $components json_decode($_POST['components']);
  429.                 //dd($components);
  430.                 $pc->addComponents($components);
  431.             }
  432.             else if($action=="delete"){
  433.                 $pc->deleteElement($_POST['component']);
  434.             }
  435.             else if($action=="save_data"){
  436.                 $component $pc->findElement($_POST['components_id']);
  437.                 if($component->type=="GlobalComponent" && isset($_POST['global_id']) && $_POST['global_id']=="dissolve"){
  438.                     $data GlobalComponent::getContents($component->global_id);
  439.                     $data->id uniqid();
  440.                     $pc->replaceElement($data,$component);
  441.                 }
  442.                 else{
  443.                     $ignore = ["components_"];
  444.                     foreach($_POST as $key => $value){
  445.                         $ignoreMe false;
  446.                         foreach($ignore as $not){
  447.                             if(substr($key,0,strlen($not))===$not)$ignoreMe true;
  448.                         }
  449.                         if(!$ignoreMe && $key){
  450.                             //dump($key, $value, $component, $_POST);
  451.                             $component->$key $value;
  452.                         }
  453.                     }
  454.                 }
  455.                 $edited $pc->findElement($_POST['components_id']);
  456.             }
  457.             else if($action=="config_component"){
  458.                 $component $pc->findElement($_POST['components_id']);
  459.                 if($_POST['template_name']){
  460.                     //create as static template
  461.                     $template GlobalComponent::findGlobalComponentByName($_POST['template_name'],true);
  462.                     $template->setComponent($component);
  463.                     $template->saveToDatabase();
  464.                     $pc->replaceElement($template,$component);
  465.                 }
  466.                 else if(substr($_POST['className'],1)!=$component->className){
  467.                     $component $component->changeType($_POST['className']);
  468.                     $pc->replaceElement($component);
  469.                 }
  470.             }
  471.             //dd($entity);
  472.             $entity->components json_encode($pc->elements);
  473.             if(!$manager){
  474.                 $manager RootEntity::$doctrine->getManager();
  475.             }
  476.             $manager->persist($entity);
  477.             $manager->getUnitOfWork()->scheduleForUpdate($entity);
  478.             $manager->flush();
  479.             return true;
  480.         }
  481.         return false;
  482.     }
  483. }
  484. class ComponentBuffer{
  485.     public $entityName;
  486.     public $entityId;
  487.     public $componentString;
  488.     public function __construct($entity$componentField "components"){
  489.         $this->entityName get_class($entity);
  490.         $this->entityId $entity->id;
  491.         $this->componentString $entity->{$componentField};
  492.     }
  493.     public static function set($entity){
  494.         $item = new ComponentBuffer($entity);
  495.         RootController::$requestStack->getSession()->set("edit_components"json_encode($item));
  496.         return $item;
  497.     }
  498.     public static function get($entity){
  499.         $item = new ComponentBuffer($entity);
  500.         $buffer RootController::$requestStack->getSession()->get("edit_components");
  501.         $buffer json_decode($buffer,true);
  502.         if(isset($buffer['entityId']) && $buffer['entityId']==$entity->id && isset($buffer['entityName']) && $buffer['entityName']===get_class($entity)){
  503.             $item->componentString $buffer['componentString'];
  504.             return $item;
  505.         }
  506.         //dump($buffer);
  507.         return false;
  508.     }
  509. }
  510. ?>