Browse Source

Add SettingsBundle

Julio 9 years ago
parent
commit
09a91b3354

+ 14 - 0
src/Chamilo/SettingsBundle/ChamiloSettingsBundle.php

@@ -0,0 +1,14 @@
+<?php
+/* For licensing terms, see /license.txt */
+
+namespace Chamilo\SettingsBundle;
+
+use Symfony\Component\HttpKernel\Bundle\Bundle;
+
+class ChamiloSettingsBundle extends Bundle
+{
+    public function getParent()
+    {
+        return 'SyliusSettingsBundle';
+    }
+}

+ 84 - 0
src/Chamilo/SettingsBundle/Controller/SettingsController.php

@@ -0,0 +1,84 @@
+<?php
+/* For licensing terms, see /license.txt */
+
+namespace Chamilo\SettingsBundle\Controller;
+
+use Sylius\Bundle\SettingsBundle\Controller\SettingsController as SyliusSettingsController;
+use Symfony\Component\HttpFoundation\Request;
+use Symfony\Component\HttpFoundation\Response;
+use Symfony\Component\Validator\Exception\ValidatorException;
+use Sensio\Bundle\FrameworkExtraBundle\Configuration\Security;
+use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
+use Sensio\Bundle\FrameworkExtraBundle\Configuration\Method;
+use Chamilo\SettingsBundle\Manager\SettingsManager;
+use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
+
+/**
+ * Class SettingsController
+ * @package Chamilo\SettingsBundle\Controller
+ */
+class SettingsController extends SyliusSettingsController
+{
+    /**
+     * @Security("has_role('ROLE_ADMIN')")
+     * @Template
+     * @return array
+     */
+    public function indexAction()
+    {
+        $manager = $this->getSettingsManager();
+        $schemas = $manager->getSchemas();
+        return array('schemas' => $schemas);
+    }
+
+    /**
+     * Edit configuration with given namespace.
+     * @Security("has_role('ROLE_ADMIN')")
+     * @param Request $request
+     * @param string  $namespace
+     *
+     * @return Response
+     */
+    public function updateAction(Request $request, $namespace)
+    {
+        $manager = $this->getSettingsManager();
+        $settings = $manager->loadSettings($namespace);
+
+        $form = $this
+            ->getSettingsFormFactory()
+            ->create($namespace)
+        ;
+
+        $form->setData($settings);
+        if ($form->handleRequest($request)->isValid()) {
+            $messageType = 'success';
+            try {
+                $manager->saveSettings($namespace, $form->getData());
+                $message = $this->getTranslator()->trans('sylius.settings.update', array(), 'flashes');
+            } catch (ValidatorException $exception) {
+                $message = $this->getTranslator()->trans($exception->getMessage(), array(), 'validators');
+                $messageType = 'error';
+            }
+            $request->getSession()->getBag('flashes')->add($messageType, $message);
+
+            if ($request->headers->has('referer')) {
+                return $this->redirect($request->headers->get('referer'));
+            }
+        }
+        return $this->render(
+            'ChamiloSettingsBundle:Settings:default.html.twig',
+            array(
+                'settings' => $settings,
+                'form'     => $form->createView()
+            )
+        );
+    }
+
+    /**
+     * @return SettingsManager
+     */
+    protected function getSettingsManager()
+    {
+        return $this->get('chamilo.settings.manager');
+    }
+}

+ 26 - 0
src/Chamilo/SettingsBundle/DependencyInjection/ChamiloSettingsExtension.php

@@ -0,0 +1,26 @@
+<?php
+/* For licensing terms, see /license.txt */
+
+namespace Chamilo\SettingsBundle\DependencyInjection;
+
+use Symfony\Component\DependencyInjection\ContainerBuilder;
+use Symfony\Component\Config\FileLocator;
+use Symfony\Component\HttpKernel\DependencyInjection\Extension;
+use Symfony\Component\DependencyInjection\Loader;
+
+/**
+ * This is the class that loads and manages your bundle configuration
+ *
+ * To learn more see {@link http://symfony.com/doc/current/cookbook/bundles/extension.html}
+ */
+class ChamiloSettingsExtension extends Extension
+{
+    /**
+     * {@inheritDoc}
+     */
+    public function load(array $configs, ContainerBuilder $container)
+    {
+        $loader = new Loader\XmlFileLoader($container, new FileLocator(__DIR__.'/../Resources/config'));
+        $loader->load('services.xml');
+    }
+}

+ 30 - 0
src/Chamilo/SettingsBundle/DependencyInjection/Configuration.php

@@ -0,0 +1,30 @@
+<?php
+/* For licensing terms, see /license.txt */
+
+namespace Chamilo\SettingsBundle\DependencyInjection;
+
+use Symfony\Component\Config\Definition\Builder\TreeBuilder;
+use Symfony\Component\Config\Definition\ConfigurationInterface;
+
+/**
+ * This is the class that validates and merges configuration from your app/config files
+ *
+ * To learn more see {@link http://symfony.com/doc/current/cookbook/bundles/extension.html#cookbook-bundles-extension-config-class}
+ */
+class Configuration implements ConfigurationInterface
+{
+    /**
+     * {@inheritDoc}
+     */
+    public function getConfigTreeBuilder()
+    {
+        $treeBuilder = new TreeBuilder();
+        $rootNode = $treeBuilder->root('chamilo_settings');
+
+        // Here you should define the parameters that are allowed to
+        // configure your bundle. See the documentation linked above for
+        // more information on that topic.
+
+        return $treeBuilder;
+    }
+}

+ 196 - 0
src/Chamilo/SettingsBundle/Manager/SettingsManager.php

@@ -0,0 +1,196 @@
+<?php
+/* For licensing terms, see /license.txt */
+
+namespace Chamilo\SettingsBundle\Manager;
+
+use Chamilo\CoreBundle\Entity\AccessUrl;
+use Doctrine\Common\Cache\Cache;
+use Doctrine\Common\Persistence\ObjectManager;
+use Sylius\Bundle\SettingsBundle\Model\Settings;
+use Sylius\Bundle\SettingsBundle\Schema\SchemaRegistryInterface;
+use Sylius\Bundle\SettingsBundle\Schema\SettingsBuilder;
+use Sylius\Component\Resource\Repository\RepositoryInterface;
+use Symfony\Component\Validator\ConstraintViolationListInterface;
+use Symfony\Component\Validator\Exception\ValidatorException;
+use Symfony\Component\Validator\ValidatorInterface;
+use Sylius\Bundle\SettingsBundle\Manager\SettingsManager as SyliusSettingsManager;
+use Chamilo\CoreBundle\Entity\SettingsCurrent;
+
+/**
+ * Class SettingsManager
+ * @package Chamilo\SettingsBundle\Manager
+ */
+class SettingsManager extends SyliusSettingsManager
+{
+    private $url;
+
+    /**
+     * @return AccessUrl
+     */
+    public function getUrl()
+    {
+        return $this->url;
+    }
+
+    /**
+     * @param AccessUrl $url
+     */
+    public function setUrl(AccessUrl $url)
+    {
+        $this->url = $url;
+    }
+
+    /**
+     * @param AccessUrl $url
+     */
+    public function installSchemas(AccessUrl $url)
+    {
+        $this->url = $url;
+
+        $schemas = $this->getSchemas();
+        $schemas = array_keys($schemas);
+        /**
+         * @var string $key
+         * @var \Sylius\Bundle\SettingsBundle\Schema\SchemaInterface $schema
+         */
+        foreach ($schemas as $schema) {
+            $settings = $this->loadSettings($schema);
+            $this->saveSettings($schema, $settings);
+        }
+    }
+
+    /**
+     * @return array
+     */
+    public function getSchemas()
+    {
+        return $this->schemaRegistry->getSchemas();
+    }
+
+    /**
+     * @param $name
+     * @return mixed
+     * @throws \InvalidArgumentException
+     */
+    public function getSetting($name)
+    {
+        if (false === strpos($name, '.')) {
+            throw new \InvalidArgumentException(sprintf('Parameter must be in format "namespace.name", "%s" given.', $name));
+        }
+
+        list($namespace, $name) = explode('.', $name);
+
+        $settings = $this->loadSettings($namespace);
+
+        return $settings->get($name);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function loadSettings($namespace)
+    {
+        if (isset($this->resolvedSettings[$namespace])) {
+            return $this->resolvedSettings[$namespace];
+        }
+
+        if ($this->cache->contains($namespace)) {
+            $parameters = $this->cache->fetch($namespace);
+        } else {
+            $parameters = $this->getParameters($namespace);
+        }
+
+        $schema = $this->schemaRegistry->getSchema($namespace);
+
+        $settingsBuilder = new SettingsBuilder();
+        $schema->buildSettings($settingsBuilder);
+
+        foreach ($settingsBuilder->getTransformers() as $parameter => $transformer) {
+            if (array_key_exists($parameter, $parameters)) {
+                $parameters[$parameter] = $transformer->reverseTransform($parameters[$parameter]);
+            }
+        }
+
+        $parameters = $settingsBuilder->resolve($parameters);
+
+        return $this->resolvedSettings[$namespace] = new Settings($parameters);
+    }
+
+    /**
+     * {@inheritdoc}
+     * @throws ValidatorException
+     */
+    public function saveSettings($namespace, Settings $settings)
+    {
+        $schema = $this->schemaRegistry->getSchema($namespace);
+
+        $settingsBuilder = new SettingsBuilder();
+        $schema->buildSettings($settingsBuilder);
+
+        $parameters = $settingsBuilder->resolve($settings->getParameters());
+
+        foreach ($settingsBuilder->getTransformers() as $parameter => $transformer) {
+            if (array_key_exists($parameter, $parameters)) {
+                $parameters[$parameter] = $transformer->transform($parameters[$parameter]);
+            }
+        }
+
+        if (isset($this->resolvedSettings[$namespace])) {
+            $this->resolvedSettings[$namespace]->setParameters($parameters);
+        }
+
+        $persistedParameters = $this->parameterRepository->findBy(array('category' => $namespace));
+        $persistedParametersMap = array();
+
+        foreach ($persistedParameters as $parameter) {
+            $persistedParametersMap[$parameter->getName()] = $parameter;
+        }
+
+        foreach ($parameters as $name => $value) {
+            if (isset($persistedParametersMap[$name])) {
+                $persistedParametersMap[$name]->setValue($value);
+            } else {
+                /** @var SettingsCurrent $parameter */
+                $parameter = $this->parameterRepository->createNew();
+
+                $parameter
+                    ->setNamespace($namespace)
+                    ->setName($name)
+                    ->setValue($value)
+                    ->setUrl($this->getUrl())
+                    ->setAccessUrlChangeable(1)
+                ;
+
+                /* @var $errors ConstraintViolationListInterface */
+                $errors = $this->validator->validate($parameter);
+                if (0 < $errors->count()) {
+                    throw new ValidatorException($errors->get(0)->getMessage());
+                }
+
+                $this->parameterManager->persist($parameter);
+            }
+        }
+
+        $this->parameterManager->flush();
+
+        $this->cache->save($namespace, $parameters);
+    }
+
+    /**
+     * Load parameter from database.
+     *
+     * @param string $namespace
+     *
+     * @return array
+     */
+    private function getParameters($namespace)
+    {
+        $parameters = array();
+
+        foreach ($this->parameterRepository->findBy(array('category' => $namespace)) as $parameter) {
+            $parameters[$parameter->getName()] = $parameter->getValue();
+        }
+
+        return $parameters;
+    }
+}

+ 41 - 0
src/Chamilo/SettingsBundle/Resources/config/services.xml

@@ -0,0 +1,41 @@
+<?xml version="1.0" ?>
+
+<container xmlns="http://symfony.com/schema/dic/services"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xsi:schemaLocation="http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd">
+
+    <parameters>
+        <parameter key="chamilo_settings.settings.manager.class">Chamilo\SettingsBundle\Manager\SettingsManager</parameter>
+        <parameter key="chamilo_settings.repository.parameter.class">Chamilo\CoreBundle\Entity\Repository\SettingsCurrentRepository</parameter>
+        <parameter key="chamilo_settings.repository.parameter.entity.class">Chamilo\CoreBundle\Entity\SettingsCurrent</parameter>
+        <parameter key="chamilo_settings.twig.extension.settings.class">Chamilo\SettingsBundle\Twig\SettingsExtension</parameter>
+        <parameter key="chamilo_settings.templating.helper.settings.class">Chamilo\SettingsBundle\Templating\Helper\SettingsHelper</parameter>
+    </parameters>
+
+    <services>
+        <service id="chamilo_settings.repository.parameter" class="%chamilo_settings.repository.parameter.class%" factory-service="doctrine.orm.entity_manager" factory-method="getRepository" >
+            <argument>%chamilo_settings.repository.parameter.entity.class%</argument>
+        </service>
+
+        <service id="chamilo.settings.manager" class="%chamilo_settings.settings.manager.class%">
+            <argument type="service" id="sylius.settings.schema_registry" />
+            <argument type="service" id="sylius.manager.parameter" />
+            <argument type="service" id="chamilo_settings.repository.parameter" />
+            <argument type="service" id="sylius.settings.cache" />
+            <argument type="service" id="validator" />
+            <argument type="service" id="event_dispatcher" />
+        </service>
+
+        <service id="chamilo_settings.templating.helper.settings" class
+                ="%chamilo_settings.templating.helper.settings.class%">
+            <argument type="service" id="chamilo.settings.manager" />
+            <tag name="templating.helper" alias="chamilo_settings" />
+        </service>
+
+        <service id="chamilo.twig.extension.settings" class ="%chamilo_settings.twig.extension.settings.class%" public="false">
+            <argument type="service" id="chamilo_settings.templating.helper.settings" />
+            <tag name="twig.extension" />
+        </service>
+    </services>
+
+</container>

+ 28 - 0
src/Chamilo/SettingsBundle/Resources/views/Settings/default.html.twig

@@ -0,0 +1,28 @@
+{% extends "::layout.html.twig" %}
+{% from 'SyliusResourceBundle:Macros:actions.html.twig' import update %}
+
+{% set namespace = app.request.get('namespace') %}
+
+{% block page_title %}
+    {{ namespace }}
+{% endblock %}
+
+{% block page_subtitle %}
+    {{ 'Settings' | trans }}
+{% endblock %}
+
+{% block main_content %}
+    <div class="row">
+        <div class="col-md-12">
+            <div class="box box-primary">
+                <div class="box-body">
+                    {{ form_errors(form) }}
+                        <form action="{{ path('chamilo_platform_settings', { 'namespace': namespace}) }}" method="post" novalidate>
+                        {{ form_rest(form) }}
+                        {{ update() }}
+                    </form>
+                </div>
+            </div>
+        </div>
+    </div>
+{% endblock %}

+ 20 - 0
src/Chamilo/SettingsBundle/Resources/views/Settings/index.html.twig

@@ -0,0 +1,20 @@
+{% extends "::layout.html.twig" %}
+
+{% block page_title %}
+    {{ 'Settings' | trans }}
+{% endblock %}
+
+{% block page_subtitle %}
+{% endblock %}
+
+{% block main_content %}
+    <ul>
+    {% for namespace in schemas|keys %}
+        <li>
+            <a href="{{ path('chamilo_platform_settings', { 'namespace': namespace}) }}">
+            {{ namespace }}
+            </a>
+        </li>
+    {% endfor %}
+    </ul>
+{% endblock%}

+ 18 - 0
src/Chamilo/SettingsBundle/Templating/Helper/SettingsHelper.php

@@ -0,0 +1,18 @@
+<?php
+/* For licensing terms, see /license.txt */
+
+namespace Chamilo\SettingsBundle\Templating\Helper;
+
+use Sylius\Bundle\SettingsBundle\Templating\Helper\SettingsHelper as
+    SyliusHelper;
+
+class SettingsHelper extends SyliusHelper
+{
+    /**
+     * {@inheritdoc}
+     */
+    public function getName()
+    {
+        return 'chamilo_settings';
+    }
+}

+ 72 - 0
src/Chamilo/SettingsBundle/Twig/SettingsExtension.php

@@ -0,0 +1,72 @@
+<?php
+/* For licensing terms, see /license.txt */
+
+namespace Chamilo\SettingsBundle\Twig;
+
+use Sylius\Bundle\SettingsBundle\Templating\Helper\SettingsHelper;
+
+/**
+ * Sylius settings extension for Twig.
+ *
+ * @author Paweł Jędrzejewski <pawel@sylius.org>
+ */
+class SettingsExtension extends \Twig_Extension
+{
+    /**
+     * @var SettingsHelper
+     */
+    private $helper;
+
+    /**
+     * @param SettingsHelper $helper
+     */
+    public function __construct(SettingsHelper $helper)
+    {
+        $this->helper = $helper;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getFunctions()
+    {
+        return array(
+             new \Twig_SimpleFunction('chamilo_settings_all', array($this,
+                     'getSettings')),
+             new \Twig_SimpleFunction('chamilo_settings_get', array($this,
+                     'getSettingsParameter')),
+        );
+    }
+
+    /**
+     * Load settings from given namespace.
+     *
+     * @param string $namespace
+     *
+     * @return array
+     */
+    public function getSettings($namespace)
+    {
+        return $this->helper->getSettings($namespace);
+    }
+
+    /**
+     * Load settings parameter for given namespace and name.
+     *
+     * @param string $name
+     *
+     * @return mixed
+     */
+    public function getSettingsParameter($name)
+    {
+        return $this->helper->getSettingsParameter($name);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getName()
+    {
+        return 'chamilo_settings';
+    }
+}

+ 1 - 8
tests/translations/translate_all_languages_array_to_po.php

@@ -42,7 +42,6 @@ foreach ($iterator as $folder) {
             $po = file($phpFilePath);
             $translations = array();
 
-
             $englishFile = $englishDir.'/'.$phpFile->getBasename();
             echo $englishFile.PHP_EOL;
             foreach ($po as $line) {
@@ -74,13 +73,7 @@ foreach ($iterator as $folder) {
             $fp = fopen($new_po_file, 'w');
             foreach ($translations as $item) {
                 $line = 'msgid "'.$item['msgid'].'"'."\n";
-                $line .= 'msgstr "'.nl2br(
-                        str_replace(
-                            array("\r\n", "\n"),
-                            "",
-                            addcslashes($item['msgstr'], "'")
-                        )
-                    ).'"'."\n\n";
+                $line .= 'msgstr "'.nl2br(str_replace(array("\r\n", "\n"), "<br />", addcslashes($item['msgstr'], '"'))).'"'."\n\n";
                 fwrite($fp, $line);
             }
             fclose($fp);