simonoche/white-label-bundle

一个简单的针对 Symfony2 的白标品牌化套餐

安装次数: 5,741

依赖: 1

建议者: 0

安全: 0

星标: 7

关注者: 2

分支: 0

公开问题: 0

类型:symfony-bundle

v2.0.2 2017-04-03 21:27 UTC

This package is not auto-updated.

Last update: 2020-10-29 19:57:53 UTC


README

警告 - 版本 1.0 和 2.0 之间有很多变化,升级前请仔细阅读文档!

一个基本的、高效的针对 Symfony2(2.7+)的白标品牌化套餐,允许您轻松覆盖 twig 模板(包括 PHP 模板)和 twig 全局变量。

本套餐受到 https://github.com/alexandresalome/multisite-bundle 的启发。其中一部分已被复制和/或修改。

要求

  • FrameworkExtraBundle
  • TwigBundle

功能

  • 按站点覆盖模板
  • 按站点扩展模板
  • 按站点特定配置
  • 按站点覆盖全局变量
  • 加载远程部分(头部、底部),并缓存它们
  • 声明多个匹配主机(例如,一个用于开发,一个用于生产)

安装

通过 composer 下载套餐

php composer.phar require simonoche/white-label-bundle

简单地在您的 AppKernel.php 中加载套餐

# app/AppKernel.php

public function registerBundles()
{
    $bundles = array(

        // your other bundles....

        /* White Label Bundle */
        new Slame\WhiteLabelBundle\SlameWhiteLabelBundle(),

    );
}

配置

将此部分添加到您的 app/config/config.yml 文件中

# app/config/config.yml
slame_white_label:
    # Enable/Disable the bundle globally
    enabled: true
    # Your partner list
    partners:
        # Partner 1
        partner1:
            # Enable or disable only this partner
            enable: true
            # Hosts to match
            hosts: [ 'mypartner.website.dev', 'mypartner.mysite.com' ]
            # Parts & Cache
            parts_cache: 86400 # (seconds) 1 day
            remote_parts:
                footer: "http://www.mypartner.com/?template_part=footer"
                header: "http://www.mypartner.com/?template_part=header"
                localfile:  "%kernel.root_dir%/../web/static/partner/test-local.html"
            # The partner's namespace
            namespace: partner1
            # Twig Global Overrides
            globals:
                phone: "08 00 00 00 00"
            # Partner's custom config, accessible via the service @site_context in templates or controllers
            locals:
                register: true
                foor: bar

Twig - 获取远程部分

# AcmeDemoBundle::partner1/example_parts.html.twig

{# Get the whole file #}
{{ slame_getRemotePart('header')|raw }}

{# Get a specific DOM node #}
{{ slame_getRemotePart('header', 'body')|raw }}

<div id="container">
    {% block testblock %}
        bla bla
    {% endblock %}
</div>

{# Get the whole file #}
{{ slame_getRemotePart('footer')|raw }}

Twig 全局变量覆盖

在每个合作伙伴的章节中,您可以定义当系统找到匹配的合作伙伴时想要被替换的 twig 全局变量。

假设您的 twig 配置是

# app/config/config.yml
twig:
    # ...
    globals:
        phone: 1234
        name: %example_parameter%
        foo: bar
        gaid: ABCD-1234

如果访客正在浏览您的合作伙伴的网站(主机名) - 因此在 http://partner1.mywebsite.com,twig 全局变量将自动替换为合作伙伴的全局变量的值(在这种情况下,{{ phone }} 现在将显示:"08 00 00 00 00")

您不需要复制每个 "root" 全局变量。只需您想要自动覆盖的那些即可;

Twig 模板覆盖

如果您想为特定站点更改一个模板,创建一个具有品牌选项的类似命名的文件

假设您的模板是 AcmeDemoBundle::contact.html.twig

您可以通过将文件复制到以合作伙伴命名空间命名的子目录中来用品牌覆盖它

  • AcmeDemoBundle::partner1/contact.html.twig

只需创建该文件,它将自动替换之前的文件。

此方法适用于任何类型的 twig 模板(布局、包含等)。例如,假设您的基模板(通用布局)是 ::layout.html.twig(位于 app/view/layout.html.twig)。

您可以通过将文件复制到以合作伙伴命名空间命名的子目录中来轻松用品牌覆盖它

  • ::partner1/layout.html.twig

Twig 模板扩展

如果您只想为特定网站扩展模板,因为您只需要覆盖几个块、变量等,那么只需创建一个同名文件,并在其中包含品牌选项

假设您的模板是 AcmeDemoBundle::test.html.twig

您可以通过将文件复制到以合作伙伴命名空间命名的子目录中来用品牌覆盖它

  • AcmeDemoBundle::partner1/test.html.twig

只需创建该文件,它将自动替换之前的文件。

然后,您需要扩展原始模板。所以只需扩展模板,并别忘了在您的模板文件名前加上一个井号 #。这个井号表示您希望加载原始文件。

# AcmeDemoBundle::partner1/test.html.twig

{# Force extending the original file #}
{% extends "#AcmeDemoBundle::test.html.twig" %}

{# Overriding only some blocks, etc... #}
{% block sidebar %}
    {% set foo = bar %}
    Overriding the sidebar contents...
{% endblock %}

{% block body %}
    The partner's body, etc...
{% endblock %}

阅读网站上下文

在模板中,使用全局变量 site_context,它返回一个 Slame\WhiteLabelBundle\Branding\SiteContext 实例

Get the whole partner's configuraton {{ site_context.getContext }}

您还可以使用以下方式读取配置选项:这些选项对应于您的合作伙伴(在 config.yml 中的)"locals" 部分

The option register is {{ site_context.option('register') ? 'enabled': 'not enabled' }}

在您的控制器中,使用服务 site_context

public function indexAction()
{
    $this->get('site_context')->getOption('register');
}

警告

当与包含和扩展一起玩耍时,请注意,如果不注意您所做的事情,您可能会很快陷入一个非终结循环。如果需要,请阅读 Twig 模板扩展 部分。