2014-06-15 24 views

回答

9

當您創建奏鳴曲一個新塊,你必須聲明它像一個服務,讓你可以注入doctrine.orm.entity_manager。 我可以告訴你,我注入實體管理器塊的例子:你在services.yml阻止

//My\Bundle\Block\MyBlockService 

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; 
use Sonata\BlockBundle\Block\BlockContextInterface; 

class MyBlockService extends BaseBlockService 
{ 
    protected $em; 

    public function __construct($type, $templating, $em) 
    { 
     $this->type = $type; 
     $this->templating = $templating; 
     $this->em = $em; 
    } 

    public function getName() 
    { 
     return 'MyBlock'; 
    } 

    public function getDefaultSettings() 
    { 
     return array(); 
    } 

    public function validateBlock(ErrorElement $errorElement, BlockInterface $block) 
    { 
    } 

    public function buildEditForm(FormMapper $formMapper, BlockInterface $block) 
    { 
    } 

    public function execute(BlockContextInterface $blockContext, Response $response = null) 
    { 
     $settings = array_merge($this->getDefaultSettings(), $blockContext->getBlock()->getSettings()); 

     $data = count($this->em->getRepository("MyBundle:Entity")->findAll()); 

     return $this->renderResponse('MyBundle::myblock.html.twig', array(
      'block' => $blockContext->getBlock(), 
      'settings' => $settings, 
      'data' => $data, 
     ), $response); 
    } 
} 

聲明,並注入任何你需要:

//services.yml 
sonata.block.service.myblock: 
     class: My\Bundle\Block\MyBlockService 
     arguments: [ "sonata.block.service.myblock", @templating, @doctrine.orm.entity_manager ] 
     tags: 
      - { name: sonata.block } 

聲明你的配置塊。陽明: //config.yml

sonata_block: 
    default_contexts: [cms] 
    blocks: 
    # Enable the SonataAdminBundle block 
    sonata.admin.block.admin_list: 
     contexts: [admin] 
    sonata.block.service.myblock: ~ 

然後,當然,你必須創建塊模板:

{# myblock.html.twig #} 
{% extends 'SonataBlockBundle:Block:block_base.html.twig' %} 


{% block block %} 
    <p>{{ data }}</p> 
{% endblock %}