web-dev-qa-db-ja.com

Symfony2のSonataAdminBundleダッシュボードにカスタムリンクまたはボタンを追加する方法

Symfony2とSonataAdminBundleは初めてです。

SonataAdminBundleダッシュボードに3つのエンティティを追加しましたが、正常に表示されます。

エンティティはデフォルトのリンクで表示されます-「新規追加」および「リスト」ボタン。

次のことができるようになりたい

  1. ダッシュボードのエンティティの1つに3番目のリンクを追加します。
  2. デフォルトのリストページのグリッドの上にあるボタンへのリンクを追加できるようにしたい。
  3. [編集]または[新しいページを作成]のフォームの下に表示されるリンクを追加/カスタマイズできるようにしたい

私は上記のいずれかを行う方法を見つけることができず、何時間も探していました。どんな助けも高く評価されます。

ありがとう。

20
dagger

ダッシュボードのカスタム要素を表示するには、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管理バンドル構成に追加する
  6. ダッシュボードに移動して、新しいグループ/ボタン/リンク/ブロックテンプレートを使用してください:)

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)Create block service

バンドルには、サービスを宣言するファイルがあります(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 configuration

この設定はアプリケーションの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)ダッシュボードに入り、楽しんでください

私のダッシュボードは次のようになります:

http://img805.imageshack.us/img805/2789/immaginezuq.png

それで全部です。複雑に見えますが、誠実に言うとそれほどではありません。これは、大きな必要なしにテンプレート全体を上書きせずにダッシュボードページを変更するクリーンな方法であることが重要です。 Ilはすべて、Admin Bundleのソースコードを読むことを学びました:)終日

45
Błażej Kocik

メソッドexecuteで問題が発生しました(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);
}
4
Lisandro