/**
  * Perform the error node action
  */
 public function indexAction(Cms $cms, $locale, $site, $revision)
 {
     $node = $site;
     if (!$cms->resolveNode($site, $revision, $node, null, true)) {
         return;
     }
     $cms->setLastAction(self::NAME);
     $this->setContentLocale($locale);
     $translator = $this->getTranslator();
     $referer = $this->request->getQueryParameter('referer');
     $nodeList = $cms->getNodeList($node, $locale);
     $data = array('node404' => $site->get('error.404'), 'node403' => $site->get('error.403'));
     $form = $this->createFormBuilder($data);
     $form->addRow('node404', 'select', array('label' => $translator->translate('label.node.404'), 'options' => $nodeList));
     $form->addRow('node403', 'select', array('label' => $translator->translate('label.node.403'), 'options' => $nodeList));
     $form = $form->build();
     if ($form->isSubmitted()) {
         try {
             $form->validate();
             $data = $form->getData();
             foreach ($data as $statusCode => $errorNode) {
                 $statusCode = str_replace('node', '', $statusCode);
                 $site->set('error.' . $statusCode, $errorNode);
             }
             $cms->saveNode($site, "Set error pages for " . $site->getName());
             $this->addSuccess('success.node.saved', array('node' => $site->getName($locale)));
             $url = $this->getUrl(self::ROUTE, array('site' => $site->getId(), 'revision' => $node->getRevision(), 'locale' => $locale, 'node' => $node->getId()));
             if ($referer) {
                 $url .= '?referer=' . urlencode($referer);
             }
             $this->response->setRedirect($url);
             return;
         } catch (ValidationException $validationException) {
             $this->setValidationException($validationException, $form);
         }
     }
     $this->setTemplateView('cms/backend/site.error', array('site' => $site, 'node' => $node, 'form' => $form->getView(), 'referer' => $referer, 'locale' => $locale, 'locales' => $cms->getLocales()));
 }
 /**
  * Action to manage the trash of a site
  * @param \ride\web\cms\Cms $cms Facade to the CMS
  * @param string $site Id of the site
  * @param string $revision Name of the revision to work with
  * @param string $locale Code of the locale
  * @return null
  */
 public function trashAction(Cms $cms, $site, $revision, $locale)
 {
     if (!$cms->resolveNode($site, $revision)) {
         return;
     }
     $this->setContentLocale($locale);
     $translator = $this->getTranslator();
     $referer = $this->request->getQueryParameter('referer');
     $trashNodeOptions = array();
     $trashNodes = $cms->getTrashNodes($site->getId());
     foreach ($trashNodes as $trashNodeId => $trashNode) {
         $trashNodeOptions[$trashNodeId] = $trashNode->getNode()->getName($locale) . ' (' . date('Y-m-d H:i:s', $trashNode->getDate()) . ')';
     }
     $form = $this->createFormBuilder();
     $form->addRow('nodes', 'option', array('label' => $translator->translate('label.nodes.trash'), 'description' => $translator->translate('label.nodes.trash.description'), 'options' => $trashNodeOptions, 'multiple' => true, 'validators' => array('required' => array())));
     $form->addRow('destination', 'select', array('label' => $translator->translate('label.destination'), 'description' => $translator->translate('label.destination.restore.description'), 'options' => $cms->getNodeList($site, $locale, true)));
     $form = $form->build();
     if ($form->isSubmitted()) {
         try {
             $form->validate();
             $data = $form->getData();
             $restoreNodes = array();
             foreach ($data['nodes'] as $trashNodeId => $trashNodeName) {
                 $restoreNodes[] = $trashNodes[$trashNodeId];
             }
             $cms->restoreTrashNodes($site, $restoreNodes, $data['destination']);
             $this->response->setRedirect($referer);
             return;
         } catch (ValidationException $exception) {
             $this->setValidationException($exception, $form);
         }
     }
     $this->setTemplateView('cms/backend/site.trash', array('referer' => $referer, 'site' => $site, 'node' => $site, 'form' => $form->getView(), 'trashNodes' => $trashNodes, 'locale' => $locale, 'locales' => $cms->getLocales()));
 }
 /**
  * Action to handle and show the properties of this widget
  * @return null
  */
 public function propertiesAction(ValidationFactory $validationFactory)
 {
     $translator = $this->getTranslator();
     $node = $this->properties->getNode();
     $rootNodeId = $node->getRootNodeId();
     $site = $this->cms->getNode($rootNodeId, $node->getRevision(), $rootNodeId, null, true);
     $levels = $this->cms->getChildrenLevels($site) - 1;
     $nodeList = $this->cms->getNodeList($site, $this->locale, true, true, false);
     $nodeList[self::PARENT_CURRENT] = $translator->translate('label.menu.parent.current');
     for ($i = 1; $i <= $levels; $i++) {
         $nodeList[self::PARENT_ABSOLUTE . $i] = $translator->translate('label.menu.parent.absolute', array('level' => $i));
     }
     for ($i = 0; $i < $levels; $i++) {
         $level = $i + 1;
         $nodeList[self::PARENT_RELATIVE . $level] = $translator->translate('label.menu.parent.relative', array('level' => '-' . $level));
     }
     $depths = array();
     for ($i = 1, $j = $levels + 1; $i <= $j; $i++) {
         $depths[$i] = $i;
     }
     $title = $this->properties->getWidgetProperty(self::PROPERTY_TITLE);
     if ($title) {
         $showTitle = true;
         $title = $title == 1 ? '' : $title;
     } else {
         $showTitle = false;
         $title = null;
     }
     $data = array(self::PROPERTY_PARENT => $this->getParent(false), self::PROPERTY_NODES => $this->getNodeIds(), self::PROPERTY_DEPTH => $this->getDepth(), self::PROPERTY_TITLE . '-show' => $showTitle, self::PROPERTY_TITLE => $title, self::PROPERTY_TEMPLATE => $this->getTemplate(static::TEMPLATE_NAMESPACE . '/default'));
     if ($data[self::PROPERTY_NODES]) {
         $data[self::PROPERTY_PARENT . '-select'] = self::PROPERTY_NODES;
     } else {
         $data[self::PROPERTY_PARENT . '-select'] = self::PROPERTY_PARENT;
     }
     $form = $this->createFormBuilder($data);
     $form->addRow(self::PROPERTY_PARENT . '-select', 'option', array('label' => $translator->translate('label.menu.base'), 'default' => 'parent', 'options' => array(self::PROPERTY_PARENT => $translator->translate('label.menu.parent'), self::PROPERTY_NODES => $translator->translate('label.menu.nodes')), 'attributes' => array('data-toggle-dependant' => 'option-node-select'), 'validators' => array('required' => array())));
     $form->addRow(self::PROPERTY_PARENT, 'select', array('label' => $translator->translate('label.menu.parent'), 'description' => $translator->translate('label.menu.parent.description'), 'options' => $nodeList, 'attributes' => array('class' => 'option-node-select option-node-select-' . self::PROPERTY_PARENT), 'hide-optional' => true));
     $form->addRow(self::PROPERTY_NODES, 'select', array('label' => $translator->translate('label.menu.nodes'), 'description' => $translator->translate('label.menu.nodes.description'), 'options' => $nodeList, 'attributes' => array('class' => 'option-node-select option-node-select-' . self::PROPERTY_NODES), 'multiple' => true, 'hide-optional' => true));
     $form->addRow(self::PROPERTY_DEPTH, 'select', array('label' => $translator->translate('label.menu.depth'), 'description' => $translator->translate('label.menu.depth.description'), 'options' => $depths));
     $form->addRow(self::PROPERTY_TITLE . '-show', 'option', array('label' => $translator->translate('label.title.show'), 'description' => $translator->translate('label.menu.title.show.description'), 'attributes' => array('data-toggle-dependant' => 'option-title')));
     $form->addRow(self::PROPERTY_TITLE, 'string', array('label' => $translator->translate('label.title'), 'description' => $translator->translate('label.menu.title.description'), 'attributes' => array('class' => 'option-title option-title-1')));
     $form->addRow(self::PROPERTY_TEMPLATE, 'select', array('label' => $translator->translate('label.template'), 'options' => $this->getAvailableTemplates(static::TEMPLATE_NAMESPACE), 'validators' => array('required' => array())));
     $requiredValidator = $validationFactory->createValidator('required', array());
     $urlRequired = new ConditionalConstraint();
     $urlRequired->addValueCondition(self::PROPERTY_PARENT . '-select', self::PROPERTY_PARENT);
     $urlRequired->addValidator($requiredValidator, self::PROPERTY_PARENT);
     $fileRequired = new ConditionalConstraint();
     $fileRequired->addValueCondition(self::PROPERTY_PARENT . '-select', self::PROPERTY_NODES);
     $fileRequired->addValidator($requiredValidator, self::PROPERTY_NODES);
     $form->addValidationConstraint($urlRequired);
     $form->addValidationConstraint($fileRequired);
     $form = $form->build();
     if ($form->isSubmitted()) {
         if ($this->request->getBodyParameter('cancel')) {
             return false;
         }
         try {
             $form->validate();
             $data = $form->getData();
             if ($data[self::PROPERTY_TITLE]) {
                 $title = $data[self::PROPERTY_TITLE];
             } elseif ($data[self::PROPERTY_TITLE . '-show']) {
                 $title = '1';
             } else {
                 $title = null;
             }
             if ($data[self::PROPERTY_PARENT . '-select'] == self::PROPERTY_PARENT) {
                 $this->properties->setWidgetProperty(self::PROPERTY_PARENT, $data[self::PROPERTY_PARENT]);
                 $this->properties->setWidgetProperty(self::PROPERTY_NODES);
             } else {
                 $this->properties->setWidgetProperty(self::PROPERTY_PARENT);
                 $this->properties->setWidgetProperty(self::PROPERTY_NODES, implode(',', $data[self::PROPERTY_NODES]));
             }
             $this->properties->setWidgetProperty(self::PROPERTY_DEPTH, $data[self::PROPERTY_DEPTH]);
             $this->properties->setWidgetProperty(self::PROPERTY_TITLE, $title);
             $this->setTemplate($data[self::PROPERTY_TEMPLATE]);
             return true;
         } catch (ValidationException $exception) {
             $this->setValidationException($exception, $form);
         }
     }
     $view = $this->setTemplateView(static::TEMPLATE_NAMESPACE . '/properties', array('form' => $form->getView()));
     $view->addJavascript('js/form.js');
     $form->processView($view);
     return false;
 }
 public function formAction(Cms $cms, $locale, $site, $revision = null, $node = null)
 {
     if ($node) {
         if (!$cms->resolveNode($site, $revision, $node, 'redirect')) {
             return;
         }
         $cms->setLastAction('edit');
     } else {
         if (!$cms->resolveNode($site, $revision)) {
             return;
         }
         $node = $cms->createNode('redirect', $site);
     }
     $this->setContentLocale($locale);
     $translator = $this->getTranslator();
     $locales = $cms->getLocales();
     $referer = $this->request->getQueryParameter('referer');
     // get available nodes
     $nodeList = $cms->getNodeList($site, $locale, true, false);
     if ($node && isset($nodeList[$node->getId()])) {
         unset($nodeList[$node->getId()]);
     }
     // gather data
     $data = array('name' => $node->getName($locale), 'redirect-node' => $node->getRedirectNode($locale), 'redirect-url' => $node->getRedirectUrl($locale), 'route' => $node->getRoute($locale, false), 'availableLocales' => $this->getLocalesValueFromNode($node));
     if ($data['redirect-url']) {
         $data['redirect-type'] = 'url';
     } else {
         $data['redirect-type'] = 'node';
     }
     // build form
     $form = $this->createFormBuilder($data);
     $form->addRow('name', 'string', array('label' => $translator->translate('label.redirect'), 'description' => $translator->translate('label.redirect.name.description'), 'filters' => array('trim' => array()), 'validators' => array('required' => array())));
     $form->addRow('redirect-type', 'option', array('label' => $translator->translate('label.redirect.to'), 'options' => array('node' => $translator->translate('label.node'), 'url' => $translator->translate('label.url')), 'validators' => array('required' => array())));
     $form->addRow('redirect-node', 'select', array('label' => $translator->translate('label.redirect.node'), 'description' => $translator->translate('label.redirect.node.description'), 'options' => $nodeList));
     $form->addRow('redirect-url', 'string', array('label' => $translator->translate('label.redirect.url'), 'description' => $translator->translate('label.redirect.url.description'), 'filters' => array('trim' => array())));
     $form->addRow('route', 'string', array('label' => $translator->translate('label.route'), 'description' => $translator->translate('label.route.description'), 'filters' => array('trim' => array())));
     if ($site->isLocalizationMethodCopy()) {
         $form->addRow('availableLocales', 'select', array('label' => $translator->translate('label.locales'), 'description' => $translator->translate('label.locales.available.description'), 'options' => $this->getLocalesOptions($node, $translator, $locales), 'multiple' => true, 'validators' => array('required' => array())));
     }
     // process form
     $form = $form->build();
     if ($form->isSubmitted()) {
         try {
             $form->validate();
             $data = $form->getData();
             $node->setName($locale, $data['name']);
             $node->setRoute($locale, $data['route']);
             if ($site->isLocalizationMethodCopy()) {
                 $node->setAvailableLocales($this->getOptionValueFromForm($data['availableLocales']));
             } else {
                 $node->setAvailableLocales($locale);
             }
             if ($data['redirect-type'] == 'node') {
                 $node->setRedirectNode($locale, $data['redirect-node']);
                 $node->setRedirectUrl($locale, null);
             } else {
                 $node->setRedirectNode($locale, null);
                 $node->setRedirectUrl($locale, $data['redirect-url']);
             }
             $cms->saveNode($node, (!$node->getId() ? 'Created new redirect ' : 'Updated redirect ') . $node->getName());
             $this->addSuccess('success.node.saved', array('node' => $node->getName($locale)));
             $url = $this->getUrl('cms.redirect.edit', array('locale' => $locale, 'site' => $site->getId(), 'revision' => $node->getRevision(), 'node' => $node->getId()));
             if ($referer) {
                 $url .= '?referer=' . urlencode($referer);
             }
             $this->response->setRedirect($url);
             return;
         } catch (ValidationException $validationException) {
             $this->setValidationException($validationException, $form);
         }
     }
     // show view
     $this->setTemplateView('cms/backend/redirect.form', array('site' => $site, 'node' => $node, 'referer' => $referer, 'form' => $form->getView(), 'locale' => $locale, 'locales' => $locales));
 }