Symfony2とSonataAdminBundleは初めてです。
SonataAdminBundleダッシュボードに3つのエンティティを追加しましたが、正常に表示されます。
エンティティはデフォルトのリンクで表示されます-「新規追加」および「リスト」ボタン。
次のことができるようになりたい
私は上記のいずれかを行う方法を見つけることができず、何時間も探していました。どんな助けも高く評価されます。
ありがとう。
ダッシュボードのカスタム要素を表示するには、Sonata AdminがSonata Block Bundleを使用します。カスタムリンクまたはボタンを追加するには、Sonata Block Bundleを使用して新しいブロックを作成する必要があります。 Admin Bundleのコアテンプレート(dashboard.html.twig)は、(アプリケーションのconfig.ymlで)実行するように構成されたブロックを反復します。それでも、Admin Bundleはテンプレートblock_admin_list.html.twig内のすべてのエンティティブロックを反復処理します。カスタムブロックテンプレートを作成するここから、レイアウトを作成してカスタムグループ(セクション)とボタンをラップし、エンティティグループと同じように感じることができます。
さて、それは紹介でした。
たとえば、カスタムニュースレターセクションを作成します。
手順があります:
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のソースコードを読むことを学びました:)終日
メソッド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);
}