【问题标题】:How to add custom link or button to SonataAdminBundle Dashboard in Symfony2如何在 Symfony2 中向 SonataAdminBundle 仪表板添加自定义链接或按钮
【发布时间】:2013-01-01 18:54:27
【问题描述】:

我是 symfony2 和 SonataAdminBundle 的新手。

我已将 3 个实体添加到 SonataAdminBundle 仪表板,它们已成功显示。

实体出现时带有默认链接 - “添加新”和“列表”按钮。

我希望能够做到以下几点

  1. 我想向仪表板上的其中一个实体添加第三个链接。
  2. 我希望能够向位于网格上方的按钮添加链接 默认列表页面。
  3. 我希望能够添加/自定义出现在“编辑”或“创建新页面”的表单下的链接

我一直无法找到执行上述任何操作的方法,已经搜索了几个小时,我们将不胜感激。

谢谢。

【问题讨论】:

  • 我用过这个stackoverflow.com/questions/11725476/…,并通过将模板复制到app/Resources//views/Block/block_admin_list.html.twig加上这个链接的信息@ 987654322@ 被证明是有用的

标签: symfony sonata-admin


【解决方案1】:

在仪表板 Sonata Admin 中显示自定义元素,请使用 Sonata Block Bundle。 要添加自定义链接或按钮,您需要使用 Sonata Block Bundle 创建一个新块。 Admin Bundle 的核心模板 (dashboard.html.twig) 迭代配置为运行的块(在应用程序的 config.yml 中)。 尽管如此,Admin Bundle 仍会迭代模板 block_admin_list.html.twig 中的所有实体块。创建您的自定义块模板,您可以从这里进行布局来包装您的自定义组(部分)和按钮,以便它们与实体组具有相同的感觉。

好的,这是介绍。

例如,我们要制作自定义时事通讯部分。

有步骤:

  1. 创建实现 BlockBundleInterface 的新块类
  2. 创建新的块模板
  3. 创建块服务(阅读并了解 Symfony 2 库中的服务是什么)
  4. 将新创建的服务添加到 Sonata Block Bundle 配置中
  5. 将新创建的服务添加到 Sonata Admin Bundle 配置中
  6. 进入仪表板并享受新的组/按钮/链接/whatever-stuff-you-put-in-your-block-template :)

Ad1) 创建新的块类

一般说明下:http://sonata-project.org/bundles/block/master/doc/reference/your_first_block.html

我的文件如下所示:

<?php

namespace InstitutoStorico\Bundle\NewsletterBundle\Block;

use Symfony\Component\HttpFoundation\Response;

use Sonata\AdminBundle\Form\FormMapper;
use Sonata\AdminBundle\Validator\ErrorElement;

use Sonata\BlockBundle\Model\BlockInterface;
use Sonata\BlockBundle\Block\BaseBlockService;

class NewsletterBlockService extends BaseBlockService
{
    public function getName()
    {
        return 'My Newsletter';
    }

    public function getDefaultSettings()
    {
        return array();
    }

    public function validateBlock(ErrorElement $errorElement, BlockInterface $block)
    {
    }

    public function buildEditForm(FormMapper $formMapper, BlockInterface $block)
    {
    }

    public function execute(BlockInterface $block, Response $response = null)
    {
        // merge settings
        $settings = array_merge($this->getDefaultSettings(), $block->getSettings());

        return $this->renderResponse('InstitutoStoricoNewsletterBundle:Block:block_my_newsletter.html.twig', array(
            'block'     => $block,
            'settings'  => $settings
            ), $response);
    }
}

我添加了一些读取 Sonata Media Bundle 代码文件的行。

Ad2) 创建新的块模板

我从 Sonata Admin 包的 block_admin_list.html.twig 中获取的布局。

我的文件如下所示:

{% extends 'SonataBlockBundle:Block:block_base.html.twig' %}

{% block block %}
<table class="table table-bordered table-striped sonata-ba-list">
    <thead>
        <tr>
            <th colspan="3">Newsletter - inviare</th>
        </tr>
    </thead>

    <tbody>
        <tr>
            <td>
                <div class="btn-group" align="center">
                    <a class="btn btn-small" href="#">Servizio Newsletter</a>
                </div>
            </td>
        </tr>
    </tbody>
</table>
{% endblock %}

Ad3) 创建屏蔽服务

在您的包中有一个文件,您可以在其中声明服务(services.yml 或 admin.yml)。任何。但重要的是,它必须在“imports”部分插入到应用程序的 config.yml 中。

我的服务声明如下所示:

sonata.block.service.newsletter:
    class: InstitutoStorico\Bundle\NewsletterBundle\Block\NewsletterBlockService
    arguments: [ "sonata.block.service.newsletter", @templating ]
    tags:
        - { name: sonata.block }

Ad4) 将新创建的服务添加到 Sonata Block Bundle 配置

这个配置被放到你应用的config.yml中。

我的配置如下所示:

#Sonata Block Bundle
sonata_block:
    default_contexts: [cms]
    blocks:
        sonata.admin.block.admin_list:
            contexts:   [admin]
        sonata.block.service.text: ~
        sonata.block.service.action: ~
        sonata.block.service.rss: ~
        sonata.block.service.newsletter: ~

Ad5) 将新创建的服务添加到 Sonata Admin Bundle 配置

这个配置被放到你应用的config.yml中。

我的配置如下所示:

# Sonata Admin Generator
sonata_admin:
    ...
    dashboard:
        blocks:
            # display a dashboard block
            - { position: left, type: sonata.admin.block.admin_list }
            - { position: left, type: sonata.block.service.newsletter}

Ad6) 进入仪表板并享受

就是这样。看起来很复杂,但说实话并不复杂。重要的是,它是一种修改仪表板页面的简洁方式,无需重写整个模板。 所有这些我都学会了阅读 Admin Bundle 的源代码 :) 全天

【讨论】:

【解决方案2】:

我在执行方法时遇到了麻烦(我使用的是 Sonata 2.3.x)。 这是适合我的代码。

注意 BlockContextInterface 和 $blockContext->getBlock() :

 public function execute(BlockContextInterface $blockContext, Response $response = null)
{
    // merge settings
    $settings = array_merge($this->getDefaultSettings(), $blockContext->getSettings());

    return $this->renderResponse('bundleName:Block:templateName.html.twig', array(
        'block'     => $blockContext->getBlock(),
        'settings'  => $settings
        ), $response);
}

【讨论】:

  • 我的块工作正常,但侧边菜单现在不工作。 Screenshot 有什么建议吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-02-15
  • 1970-01-01
  • 1970-01-01
  • 2014-01-13
  • 2014-02-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多