open-orchestra/open-orchestra-cms-bundle

View on GitHub
Backoffice/EventSubscriber/NodeTemplateSelectionSubscriber.php

Summary

Maintainability
A
1 hr
Test Coverage
<?php

namespace OpenOrchestra\Backoffice\EventSubscriber;

use OpenOrchestra\Backoffice\Context\ContextBackOfficeInterface;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\Form\FormEvent;
use Symfony\Component\Form\FormEvents;
use OpenOrchestra\Backoffice\Manager\NodeManager;
use OpenOrchestra\ModelInterface\Repository\SiteRepositoryInterface;
use OpenOrchestra\Backoffice\Manager\TemplateManager;

/**
 * Class NodeTemplateSelectionSubscriber
 */
class NodeTemplateSelectionSubscriber implements EventSubscriberInterface
{
    protected $nodeManager;
    protected $contextManager;
    protected $siteRepository;
    protected $templateManager;

    /**
     * @param NodeManager                $nodeManager
     * @param ContextBackOfficeInterface $contextManager
     * @param SiteRepositoryInterface    $siteRepository
     * @param TemplateManager            $templateManager
     */
    public function __construct(
        NodeManager $nodeManager,
        ContextBackOfficeInterface $contextManager,
        SiteRepositoryInterface $siteRepository,
        TemplateManager $templateManager
    ) {
        $this->nodeManager = $nodeManager;
        $this->contextManager = $contextManager;
        $this->siteRepository = $siteRepository;
        $this->templateManager = $templateManager;
    }

    /**
     * @param FormEvent $event
     */
    public function preSubmit(FormEvent $event)
    {
        $form = $event->getForm();
        $formData = $form->getData();
        $data = $event->getData();

        if (
            array_key_exists('nodeTemplateSelection', $data) &&
            null === $formData->getId() &&
            array_key_exists('nodeSource', $data['nodeTemplateSelection']) &&
            '' != $data['nodeTemplateSelection']['nodeSource']
        ) {
            $this->nodeManager->hydrateNodeFromNodeId($formData, $data['nodeTemplateSelection']['nodeSource']);
            $data['nodeTemplateSelection']['template'] = $formData->getTemplate();
            $event->setData($data);
        }
    }

    /**
     * @param FormEvent $event
     */
    public function preSetData(FormEvent $event)
    {
        $form = $event->getForm();
        $data = $event->getData();
        if (null === $data->getId()) {
            $form->add('nodeTemplateSelection', 'form', array(
                'virtual' => true,
                'label' => false,
                'mapped' => false,
                'group_id' => 'properties',
                'sub_group_id' => 'style'
            ));
            $form->get('nodeTemplateSelection')->add('template', 'choice', array(
                'choices' => $this->getTemplateChoices(),
                'required' => true,
                'label' => 'open_orchestra_backoffice.form.node.template'
            ));

            $form->get('nodeTemplateSelection')->add('nodeSource', 'oo_node_choice', array(
                'required' => false,
                'mapped' => false,
                'label' => 'open_orchestra_backoffice.form.node.node_source',
            ));
        } else {
            $form->add('template', 'choice', array(
                'choices' => $this->getTemplateChoices(),
                'required' => true,
                'label' => 'open_orchestra_backoffice.form.node.template',
                'group_id' => 'properties',
                'sub_group_id' => 'style'
            ));
        }
    }

    /**
     * @return array The event names to listen to
     */
    public static function getSubscribedEvents()
    {
        return array(
            FormEvents::PRE_SUBMIT => 'preSubmit',
            FormEvents::PRE_SET_DATA => 'preSetData'
        );
    }

    /**
     *
     * @return array
     */
    protected function getTemplateChoices()
    {
        $siteId = $this->contextManager->getSiteId();
        $site = $this->siteRepository->findOneBySiteId($siteId);
        $templateSetId = $site->getTemplateSet();
        $templateSetParameters = $this->templateManager->getTemplateSetParameters();
        $choices = array();
        foreach ($templateSetParameters[$templateSetId]['templates'] as $key => $template) {
            $choices[$key] = $template['label'];
        }

        return $choices;
    }
}