deblan.tv/vendor/trinity/src/Trinity/Bundle/VarsEditorBundle/Controller/VarsAdminController.php
2015-09-14 14:53:34 +02:00

203 lines
7.7 KiB
PHP

<?php
namespace Trinity\Bundle\VarsEditorBundle\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Yaml\Yaml;
use Symfony\Component\Yaml\Dumper;
use Symfony\Component\Filesystem\Filesystem;
use Symfony\Component\Filesystem\Exception\IOException;
/**
* @Route("/admin")
*/
class VarsAdminController extends Controller
{
/**
* @Route("/editor", name="TrinityVarsEditorBundleVarsAdmin_index")
* @Template()
*/
public function indexAction(Request $request)
{
// $this->get('trinity_vars_editor.config'); // appDevDebugProjectContainer
$file = $this->container->getParameter('trinity_vars_editor.file');
$message = null;
$fieldsets = array();
$form = $this->createFormBuilder();
$fs = new Filesystem();
if (empty($file)) {
$message = 'error.configuration';
} else {
if (!$fs->exists($file)) {
$message = 'error.notFound';
} else {
$fieldsets = $this->getConfiguration($file, $form);
}
}
$form = $form->getForm();
if ($request->isMethod('POST') && empty($message)) {
$form = $this->processForm($form, $fieldsets, $file, $request);
}
return array(
'message' => $message,
'fieldsets' => $fieldsets,
'form' => $form->createView(),
);
}
protected function processForm($form, $fieldsets, $file, Request $request)
{
$form->bind($request);
$post = $request->request->get($form->getName());
$config = Yaml::parse($file);
$dumper = new Dumper();
foreach ($config['fieldsets'] as $k => $fieldset) {
if (isset($fieldset['vars'])) {
foreach ($fieldset['vars'] as $l => $var) {
$config['fieldsets'][$k]['vars'][$l]['value'] = $post[$var['key']];
}
} elseif (isset($fieldset['tabs'])) {
foreach ($fieldset['tabs'] as $l => $tab) {
foreach ($tab['vars'] as $m => $var) {
$config['fieldsets'][$k]['tabs'][$l]['vars'][$m]['value'] = $post[$l.'_'.$var['key']];
}
}
}
}
$fs = new Filesystem();
if (is_writable($file)) {
file_put_contents($file, $dumper->dump($config, 7));
} else {
throw new IOException(sprintf('The file "%s" is not writable.', $file));
}
return $form;
}
protected function getConfiguration($file, &$form)
{
$fieldsets = array();
$config = Yaml::parse($file);
if (isset($config['fieldsets']) && is_array($config['fieldsets'])) {
foreach ($config['fieldsets'] as $fieldset) {
if (isset($fieldset['tabs']) && is_array($fieldset['tabs'])) {
$title = isset($fieldset['title']) ? $fieldset['title'] : null;
$appendTemplate = isset($fieldset['append_template']) ? $fieldset['append_template'] : null;
$prependTemplate = isset($fieldset['prepend_template']) ? $fieldset['prepend_template'] : null;
$title = isset($fieldset['title']) ? $fieldset['title'] : null;
$tabs = array();
foreach ($fieldset['tabs'] as $key => $tab) {
$fields = array();
$tab_title = isset($tab['title']) ? $tab['title'] : 'tab'.$key;
foreach ($tab['vars'] as $var) {
if (!is_array($var)) {
continue;
}
if (!isset($var['key'])) {
continue;
}
$help = isset($var['help']) ? array('data-help' => $this->get('translator')->trans($var['help'])) : array();
$options = isset($var['options']) ? $var['options'] : array();
$configuration = isset($var['configuration']) ? $var['configuration'] : array();
$configuration['attr'] = array_merge(
isset($configuration['attr']) ? $configuration['attr'] : array(),
array_merge($options, $help)
);
$type = isset($var['type']) ? $var['type'] : 'text';
$name = $key.'_'.$var['key'];
$configuration['label'] = isset($var['label']) ? $var['label'] : $name;
$configuration['data'] = isset($var['value']) ? $var['value'] : null;
$form->add(
$name,
$type,
$configuration
);
$fields[] = $name;
}
$tabs[$key] = array(
'title' => $tab_title,
'fields' => $fields
);
}
$fieldsets[] = array(
'title' => $title,
'tabs' => $tabs,
'prepend_template' => $prependTemplate,
'append_template' => $appendTemplate,
);
} elseif (isset($fieldset['vars']) && is_array($fieldset['vars'])) {
$title = isset($fieldset['title']) ? $fieldset['title'] : null;
$appendTemplate = isset($fieldset['append_template']) ? $fieldset['append_template'] : null;
$prependTemplate = isset($fieldset['prepend_template']) ? $fieldset['prepend_template'] : null;
$fields = array();
foreach ($fieldset['vars'] as $var) {
if (!is_array($var)) {
continue;
}
if (!isset($var['key'])) {
continue;
}
$help = isset($var['help']) ? array('data-help' => $this->get('translator')->trans($var['help'])) : array();
$options = isset($var['options']) ? $var['options'] : array();
$configuration = isset($var['configuration']) ? $var['configuration'] : array();
$configuration['attr'] = array_merge(
isset($configuration['attr']) ? $configuration['attr'] : array(),
array_merge($options, $help)
);
$type = isset($var['type']) ? $var['type'] : 'text';
$name = $var['key'];
$configuration['label'] = isset($var['label']) ? $var['label'] : $name;
$configuration['data'] = isset($var['value']) ? $var['value'] : null;
$form->add(
$name,
$type,
$configuration
);
$fields[] = $name;
}
$fieldsets[] = array(
'title' => $title,
'fields' => $fields,
'prepend_template' => $prependTemplate,
'append_template' => $appendTemplate,
);
}
}
}
return $fieldsets;
}
}