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

  1. je veux ajouter un troisième lien de l'une des entités sur le tableau de bord.
  2. je veux pouvoir ajouter un lien vers les boutons situés au-dessus de la grille le page de liste par défaut.
  3. 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.

19
demandé sur dagger 2013-01-01 22:54:27

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:

  1. créer un nouveau bloc de la classe qui implémente BlockBundleInterface
  2. créer un nouveau modèle de bloc
  3. créer un service de bloc (lire et comprendre ce que sont les services dans Symfony 2 la bibliothèque)
  4. ajouter le service nouvellement créé à la configuration du bloc Sonata
  5. ajouter le service nouvellement créé à la configuration de Sonata Admin Bundle
  6. 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

44
répondu Błażej Kocik 2013-03-01 21:50:36

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);
}
4
répondu Lisandro 2014-10-20 21:15:26