lexxpavlov/settingsbundle

Symfony2/3/4 设置包提供灵活的设置(布尔值、整数、浮点数、字符串、文本、HTML),可轻松与 Sonata Admin 配置

1.5.2 2021-03-25 07:01 UTC

This package is auto-updated.

Last update: 2024-09-25 14:35:54 UTC


README

此包帮助您在 Symfony2/3/4 项目中管理设置。

设置具有以下类型之一:布尔值、整数、浮点数、字符串、文本、HTML。您可以获取一个具体的设置或获取一组设置。设置的获取可能被项目中使用的缓存提供程序缓存。

通过 SonataAdminBundle 提供设置管理。在其他情况下,您可以通过使用特殊函数或预定义表单通过代码管理设置。

安装

Composer

将 LexxpavlovSettingsBundle 和其依赖项下载到 vendor 目录。

您可以使用 Composer 自动执行此过程

$ composer require lexxpavlov/settingsbundle

或手动将包链接添加到您的 composer.json 并运行 $ composer update

{
    "require" : {
        "lexxpavlov/settingsbundle": "~1.2"
    }
}

Composer 将将包安装到 vendor/lexxpavlov/settingsbundle 目录。

将包添加到您的应用程序内核

// app/AppKernel.php

public function registerBundles()
{
    $bundles = array(
        // ...
        new Lexxpavlov\SettingsBundle\LexxpavlovSettingsBundle(),
        // ...
    );
}

配置

包不需要任何必需的参数,并且将在不更改 config.yml 的情况下工作。但您可能需要配置一些参数,请参阅下面的内容。

现在您需要在您的数据库中创建表

$ php bin/console doctrine:schema:update --dump-sql

或在使用 Symfony2

$ php app/console doctrine:schema:update --dump-sql

这将在数据库中创建表时显示 SQL 查询。您可以手动运行这些查询。

注意。您还可以执行 php bin/console doctrine:schema:update --force 命令,Doctrine 将为您创建所需的表。但我强烈建议您首先执行 --dump-sql 并检查 Doctrine 将执行的 SQL。

注意。如果您使用的是 1.1.* 版本的包,您需要更新数据库。

使用方法

使用 SonataAdminBundle 来管理您的设置。否则,请使用预定义的表单。如果您使用数据库工具(phpMyAdmin 或其他)或通过在代码中调用特殊函数配置设置,则可以自由使用此包。

您可以将设置放入组中或不在组中。组可用于在一次查询中检索多个设置。

设置检索支持在 twig 模板或控制器中(或在任何注入设置服务的脚本中)。

例如,您创建了 3 个设置

  • page_title 没有组
  • descriptionkeywordsmeta 组中。
在控制器中使用
namespace App\YourBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;

class DefaultController extends Controller
{
    /**
     * @Route("/")
     * @Template()
     */
    public function indexAction()
    {
        $settings = $this->get('settings');

        $title = $settings->get('page_title');
        $meta = $settings->group('meta');

        return array(
            'title' => $title,
            'meta_description' => $meta['description'],
            'meta_keywords' => $meta['keywords'],
        );
    }
}
在模板中使用
{% extends '::base.html.twig'%}

{% block meta %}
<title>{{ settings('page_title') }}</title>
<meta name="description" content="{{ settings('meta', 'description') }}">
<meta name="keywords" content="{{ settings('meta', 'keywords') }}">
{% endblock %}

高级使用

完整配置

以下是包的默认配置(所有参数都是可选的)

lexxpavlov_settings:
    enable_short_service: true  # default true, use false for disable registering 'settings' service
    html_widget: ckeditor       # default null, valid values are 'null', 'ckeditor'
    cache_provider: cache.app   # default null, for enable database caching set up name of caching service
    use_category_comment: false # default false, use category comment as its title in settings list (in SettingsAdmin)
    ckeditor:                   # set parameters of ckeditor. Not need if IvoryCKEditorBundle is installed
        base_path: /ckeditor/            
        js_path: /ckeditor/ckeditor.js

ckeditor 表单类型可以由 IvoryCKEditorBundle 添加。如果您在没有 IvoryCKEditorBundle 的情况下使用 CKEditor,您必须指定 base_pathjs_path 参数。

设置组

要从一个组中检索多个设置,您可以使用以下两种情况之一

$param1 = $settings->get('category', 'param1');
$param2 = $settings->get('category', 'param2');
// or
$cat = $settings->group('category');
$param1 = $cat['param1'];
$param2 = $cat['param2'];

这两种情况具有相同的性能 - 在第一次访问时将检索整个组,数据检索只会进行一次。

在 twig 中使用默认值

{% extends '::base.html.twig'%}

{% block meta %}
<title>{{ settings('page_title', null, 'My default title') }}</title>
<meta name="description" content="{{ settings('meta', 'description', 'My default description') }}">
<meta name="keywords" content="{{ settings('meta', 'keywords', 'keywords1, keywords2') }}">
{% endblock %}

在 twig 中使用组

{% set params = settings_group('category') %}

<ul>
<li>{{ params.param1 }}</li>
<li>{{ params['param-2'] }}</li>
</ul>

使用设置组示例

以下是一个使用组的示例 - 适用于后端和前端的设置。多个设置放置在 client 组中,并将其包含到模板中

{# app/Resources/views/base.html.twig #}

{# ... #}

<script>
{% block javascript_inline %}
window.settings = {{ settings_group('client')|json_encode(constant('JSON_NUMERIC_CHECK'))|raw }};
{% endblock %}
</script>

</body></html>

性能和缓存

使用缓存以提高设置检索。如果您尚未使用缓存,现在是完美的时机!这非常简单!

# app/config/services.yml
services:
    cache.app:
        class: Symfony\Component\Cache\Adapter\FilesystemAdapter

# app/config/config.yml
lexxpavlov_settings:
    cache_provider: cache.app

该组件将使用已注册的服务cache.app来存储缓存数据。缓存提供者可能包括以下之一:Doctrine缓存Symfony缓存 - PSR-6缓存(Symfony 3.1)或PSR-16简单缓存(Symfony 3.3)。

在SonataAdminBundle中安排设置管理员组

SonataAdminBundle通过在AppKernel::registerBundles()中注册的包来安排管理组。如果将LexxpavlovSettingsBundle添加到您的应用包之上,那么设置组将是菜单中的第一个组(在您的内容或服务组之前,这些组是在您的包中创建的)。如果您希望设置组是最后一个组(在您的组之下),您需要在AppKernel::registerBundles()中将LexxpavlovSettingsBundle添加到您的包之后。

// app/AppKernel.php

public function registerBundles()
{
    $bundles = array(
        // ...
        new AppBundle\AppBundle(),
        new Lexxpavlov\SettingsBundle\LexxpavlovSettingsBundle(),
    );
}

在不使用Sonata Admin的情况下管理设置

如果您在项目中不使用SonataAdminBundle,您可以使用预定义的表单或特殊函数。

使用预定义的表单(在控制器中)

保存设置

$form = $this->createForm('lexxpavlov_settings');
// $form->setData($setting); // use for edit of existed setting
if ($request->isMethod('POST')) {
    $form->handleRequest($request);
    if ($form->isValid()) {
        $this->get('settings')->save($form->getData());
    }
}
return array( 'form' => $form->createView() );

保存组

$form = $this->createForm('lexxpavlov_settings_category');
if ($request->isMethod('POST')) {
    $form->handleRequest($request);
    if ($form->isValid()) {
        $this->get('settings')->saveGroup($form->getData());
    }
}
return array( 'form' => $form->createView() );

要使用预定义的表单,您需要添加表单主题

# app/config/config.yml
twig:
    # ...
    form_themes:
        - 'LexxpavlovSettingsBundle:Form:setting_value_edit.html.twig'
手动创建和更新设置
use Lexxpavlov\SettingsBundle\DBAL\SettingsType;

// In controller:

// Get service from container
$settings = $this->get('settings');

// Update a existed setting
$settings->update('param', 'new value');
$settings->update('category', 'param_in_cat', 'new value');

// Create a new setting
$settings->create(null, 'new.1', SettingsType::Boolean, true, 'comment - setting w/o group');
$settings->create('test', 'new.2', SettingsType::Text, 'test text', 'comment - setting in group');

// Create a new empty group
$settings->createGroup('new-cat', 'comment of group');