加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

php – symfony每个块都没有空间

发布时间:2020-12-13 17:21:40 所属栏目:PHP教程 来源:网络整理
导读:如何用无空间来包装每个块代码来从我的twig / html中裁剪空白 例如现在我有: {% block content %} div class="box clearfix clearall" div class="ct colcontainer" div class="col-1" div class="chars" table class="layout data-char" theadblabla{% end
如何用无空间来包装每个块代码来从我的twig / html中裁剪空白

例如现在我有:

{% block content %}

    <div class="box clearfix clearall">
        <div class="ct colcontainer">
            <div class="col-1">
                <div class="chars">
                    <table class="layout data-char">
                        <thead>

blabla

{% endblock %}

当symfony尝试渲染它时,我希望symfony看到它

{% block content %}
{% spaceless %}
    <div class="box clearfix clearall">
        <div class="ct colcontainer">
            <div class="col-1">
                <div class="chars">
                    <table class="layout data-char">
                        <thead>

blabla
{% endspaceless %}
{% endblock %}

解决方法

定义自定义Twig标记(复制粘贴方式)

您可以定义一个自定义的Twig标签spacelessblock,它结合了blockspaceless.然后您可以在模板中使用{%spacelessblock xyz%} … {%endspacelessblock%}.以下是快速和脏(复制和粘贴)方式的方法.

一个新的Twig节点

首先,定义一个类Twig_Node_SpacelessBlock(例如在包的Extension目录中):

class Twig_Node_SpacelessBlock extends Twig_Node_Block
{
    public function __construct($name,Twig_NodeInterface $body,$lineno,$tag = null)
    {
        parent::__construct(array('body' => $body),array('name' => $name),$tag);
    }

    public function compile(Twig_Compiler $compiler)
    {
        // top part of Block.compile
        $compiler
            ->addDebugInfo($this)
            ->write(sprintf("public function block_%s($context,array $blocks = array())n",$this->getAttribute('name')),"{n")
            ->indent()
        ;

        // the content of the body is treated like in Spaceless.compile
        $compiler
            ->write("ob_start();n")
            ->subcompile($this->getNode('body'))
            ->write("echo trim(preg_replace('/>s+</','><',ob_get_clean()));n")
        ;

        // bottom part of Block.compile
        $compiler
            ->outdent()
            ->write("}nn")
        ;
    }
}

一个新的Twig令牌解析器

每当Twig在模板中找到{%spacelessblock xyz%}时,我们需要在某处构建新的Twig节点.为此,我们需要一个令牌解析器,我们称之为Twig_TokenParser_SpacelessBlock.我们基本上复制并粘贴Twig_TokenParser_Block

class Twig_TokenParser_SpacelessBlock extends Twig_TokenParser
{
    public function parse(Twig_Token $token)
    {
        // …
        $this->parser->setBlock($name,$block = new Twig_Node_SpacelessBlock($name,new Twig_Node(array()),$lineno));
        // …
    }

    public function decideBlockEnd(Twig_Token $token)
    {
        return $token->test('endspacelessblock');
    }

    public function getTag()
    {
        return 'spacelessblock';
    }
}

告诉Twig

在您的扩展类中:

class Extension extends Twig_Extension
{
    public function getTokenParsers()
    {
        return array(
            new Twig_TokenParser_SpacelessBlock(),);
    }
}

告诉Symfony

如果尚未完成,请将以下内容添加到您的services.yml中:

services:
    # …
    my.extension:
        class:     AcmeMyBundleExtensionExtension
        tags:
          - { name: twig.extension }

更好的选择

预处理器

更好的方法是使用预处理器来简单地替换

{% spacelessblock xyz %}
…
{% endspacelessblock %}

通过

{% block xyz %}{% spaceless %}
…
{% endspaceless %}{% endblock %}

它重用了已经在Twig项目中编写的所有代码,包括可能的更改.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读