Comment ajouter un lien personnalisé ou un bouton à Sonataadminbundle Dashboard en Symfony2
je suis nouveau avec symfony2 et SonataAdminBundle.
j'ai ajouté 3 entités au tableau de bord SonataAdminBundle et elles apparaissent avec succès.
les entités apparaissent avec les liens par défaut - boutons "Add new" et "List".
je veux être en mesure de faire ce qui suit
- je veux ajouter un troisième lien de l'une des entités sur le tableau de bord.
- je veux pouvoir ajouter un lien vers les boutons situés au-dessus de la grille le page de liste par défaut.
- je veux pouvoir ajouter/personnaliser des liens apparaissant sous le formulaire sur Éditer ou créer une nouvelle page
Je n'ai pas été en mesure de trouver un moyen de faire l'un des ci-dessus, été à la recherche des heures, toute aide sera très apprécié.
merci.
2 réponses
afficher les éléments personnalisés dans le dashbord Sonata Admin utilise un bloc de sonates. Pour ajouter un lien ou un bouton personnalisé, vous devez créer un nouveau bloc en utilisant Sonata Block Bundle. Le modèle de base (tableau de bord.HTML.twig) du paquet administrateur itère les blocs configurés pour être exécutés (dans config.yml de l'application). Cependant, Admin Bundle itère tous vos blocs d'entités dans le modèle block_admin_list.HTML.rameau. Créer votre modèle de bloc personnalisé c'est d'ici que vous pouvez prendre layout pour envelopper vos groupes personnalisés (sections) et les boutons afin qu'ils aient la même sensation que ceux des groupes entities.
Ok, c'était une introduction.
par exemple, nous voulons créer une section de newsletter personnalisée.
Il y a des étapes:
- créer un nouveau bloc de la classe qui implémente BlockBundleInterface
- créer un nouveau modèle de bloc
- créer un service de bloc (lire et comprendre ce que sont les services dans Symfony 2 la bibliothèque)
- ajouter le service nouvellement créé à la configuration du bloc Sonata
- ajouter le service nouvellement créé à la configuration de Sonata Admin Bundle
- entrée de tableau de bord et profiter d'un nouveau groupe/bouton/lien/autre-trucs-vous-mettre-dans-votre-bloc-modèle :)
Ad1)Créer un nouveau bloc de la classe
instruction générale sous: http://sonata-project.org/bundles/block/master/doc/reference/your_first_block.html
Mon fichier ressemble à ceci:
<?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);
}
}
j'ai ajouté quelques lignes lisant les fichiers de code du paquet média Sonata.
Ad2)Créer un nouveau modèle de bloc
Mise en page, j'ai pris de block_admin_list.HTML.brindille de paquet Admin Sonata.
Mon fichier ressemble à ceci:
{% 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 %}
après jc3) Créer un bloc service
dans votre forfait il y a un fichier où vous déclarez des services (services.yml ou admin.yml). Quoi. Mais il est important qu'il soit branché à config.yml de votre demande dans les "importations".
Mon service de déclaration ressemble à ceci:
sonata.block.service.newsletter:
class: InstitutoStorico\Bundle\NewsletterBundle\Block\NewsletterBlockService
arguments: [ "sonata.block.service.newsletter", @templating ]
tags:
- { name: sonata.block }
Ad4) ajouter le service nouvellement créé à Sonata Bloc de Faisceau de configuration
cette configuration est mise dans config.yml de votre application.
Mon config ressemble à ceci:
#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) ajouter le service nouvellement créé à Sonata Admin Bundle configuration
cette configuration est mise dans config.yml de votre application.
Ma config ressemble à ceci:
# 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) entrez dans le tableau de bord et profitez
Mon tableau de bord ressemble à ceci:
http://img805.imageshack.us/img805/2789/immaginezuq.png
C'est tout. Ressemble compliqué, mais pour être sincère, ce n'est pas tellement. C'est important c'est une façon propre de modifier votre page de tableau de bord sans passer outre des gabarits entiers sans grand besoin. Tous ceux Qu'Il a appris à lire le code source de Admin Bundle:) toute la journée
j'ai eu des problèmes avec method execute (J'utilise Sonata 2.3.x). Voici le code qui fonctionne pour moi.
Note BlockContextInterface and $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);
}