2013-01-01 8 views
17

Sono con Symfony2 e SonataAdminBundle.Come aggiungere link personalizzato o pulsante per SonataAdminBundle Dashboard in Symfony2

Ho aggiunto 3 entità a SonataAdminBundle Dashboard e vengono visualizzate correttamente.

Le entità vengono visualizzate con i collegamenti predefiniti - pulsanti "Aggiungi nuovo" e "Elenco".

Voglio essere in grado di effettuare le seguenti operazioni

  1. Voglio aggiungere un terzo link per una delle entità sul cruscotto.
  2. Desidero poter aggiungere un collegamento ai pulsanti situati sopra la griglia nella pagina di elenco predefinita .
  3. Voglio essere in grado di aggiungere/personalizzare i collegamenti che appaiono sotto il modulo a modificare o creare nuova pagina

non sono stato in grado di trovare un modo per fare una di queste, cercato per ore, qualsiasi aiuto sarà molto apprezzato.

grazie.

+0

Ho usato questo http://stackoverflow.com/questions/11725476/add-custom-button-to-edit-page -of-sonata-admin-bundle? rq = 1 e utilizzato la personalizzazione dei modelli di bundle copiando il modello in app/Resources/ /views/Block/block_admin_list.html.twig più informazioni di questo collegamento http: // sonata- project.org/bundles/admin/master/doc/reference/templates.html si è rivelato utile – dagger

risposta

43

A visualizzare gli elementi personalizzati nel dashbord Sonata Admin utilizza il pacchetto Sonata Block. Per aggiungere un collegamento o un pulsante personalizzato è necessario creare un nuovo blocco utilizzando il pacchetto Sonata Block. Il modello principale (dashboard.html.twig) del pacchetto di amministrazione itera i blocchi configurati per l'esecuzione (in config.yml dell'applicazione). Still, Admin Bundle esegue l'iterazione di tutti i blocchi di entità nel modello block_admin_list.html.twig. Creando il tuo modello di blocco personalizzato è da qui che puoi prendere il layout per avvolgere i tuoi gruppi personalizzati (sezioni) e pulsanti in modo da avere la stessa sensazione di quelli dei gruppi di entità.

Ok, era l'introduzione.

per esempio vogliamo rendere sezione Newsletter personalizzata.

ci sono passi:

  1. creano nuova classe di blocco che implementa BlockBundleInterface
  2. creare un nuovo modello di blocco
  3. creare il servizio di blocco (leggere e capire quali sono i servizi in Symfony 2 biblioteca)
  4. add nuovo servizio creato per la configurazione del bundle Sonata Block
  5. aggiungi un nuovo servizio alla configurazione del bundle di Sonata Admin
  6. entrare cruscotto e godere di nuovo gruppo/pulsante/link/qualunque cosa-stuff-you-messa-in-your-block-template :)

Ad1) Crea nuova classe di blocco

Istruzioni generali sotto: http://sonata-project.org/bundles/block/master/doc/reference/your_first_block.html

il mio file è simile al seguente:

<?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); 
    } 
} 

ho aggiunto alcune righe di lettura file di codice Sonata media Bundle.

Ad2) Crea nuovo modello di blocco

layout ho preso da block_admin_list.html.twig della Sonata Admin fascio.

Il mio file è simile al seguente:

{% 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) creare il servizio di blocco

Nel vostro pacco c'è un file in cui si dichiara servizi (services.yml o admin.yml). Qualunque cosa. Ma è importante che sia collegato a config.yml dell'applicazione nella sezione "importazioni".

La mia dichiarazione di servizio simile a questa:

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

Ad4) Aggiungi nuovo servizio creato per la configurazione Sonata Block Bundle

Questa configurazione viene messo in config.yml della vostra applicazione.

mio config si presenta così:

#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) Aggiungi nuovo servizio creato per configurazione Sonata Admin Bundle

Questa configurazione viene messo in config.yml della vostra applicazione.

mio config si presenta così:

# 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) Inserisci cruscotto e godere

Dashboard si presenta così:

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

Questo è tutto. Sembra complicato, ma per essere sinceri non è così tanto. È importante che sia un modo pulito di modificare la pagina della dashboard senza sovrascrivere modelli interi senza necessità. Tutti quelli che ho imparato leggendo il codice sorgente di Admin Bundle :) Intera giornata

+0

Hai qualche problema con noi nella creazione di un libro di cucina SonataAdmin basato su questo esempio? https://github.com/sonata-project/SonataAdminBundle/issues/1551 – caponica

+1

Questo post è vecchio, ma tu hai salvato anche me. Grazie :) –

+0

prego :) –

4

Ho avuto problemi con il metodo execute (sto usando Sonata 2.3.x). Ecco il codice che funziona per me.

Nota BlockContextInterface e $ 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); 
} 
+0

My Block funziona correttamente, ma il menu laterale non funziona ora. [Screenshot] (https://ibin.co/3QUDdVIghHn7.png) Qualche suggerimento? –

Problemi correlati