页面中的Sonata管理员标签

时间:2014-08-20 09:15:32

标签: symfony sonata-admin

我使用Sonata admin Generator。 我想从symfony类创建多个列表。 例如,我有一张发票清单,我想创建一个带有付款账单的选项卡,另一个带有待处理账单的选项卡和一个禁用发票的最后一个选项卡。 这个状态在课堂上。 我在Sonata演示中看到使用上下文的this page(admin / admin),但如果可能的话,我不会安装mediabundle。

1 个答案:

答案 0 :(得分:1)

没有mediabundle就可以。 “项目状态”与我有相同的用例。这些状态在我的数据库中。

需要采取以下几个步骤:

  1. 覆盖CRUDController。也许不需要这一步,但我无法弄清楚如何没有。我想将不同的状态显示为选项卡,因此我在list-template中注入了一个集合。
  2. 制作自己的CRUDController:

        namespace Your\OwnBundle\Controller;
    
        use Sonata\AdminBundle\Controller\CRUDController as Controller;
        use Symfony\Component\HttpFoundation\Response;
        use Symfony\Component\HttpFoundation\Request;
    
        class ProjectCrudController extends Controller
        {
            /**
             * {@inheritdoc}
             *
             * @param Request $request
             */
            public function render($view, array $parameters = array(), Response $response = null, Request $request = null)
            {
                $projectStatusRepo = $this->getDoctrine()->getRepository('EvinceObjectsBundle:ProjectStatus');
                // here inject the params you'll need
                // you can do it only when $parameters['action'] == 'list' if you want
                $parameters['projectStatuses'] = $projectStatusRepo->findAll();
                $parameters['activeProjectStatus'] = $request->get('status', 1);
    
                return parent::render($view, $parameters, $response);
            }
        }
    

    在services.yml(或xml)

    中注入您自己的CRUDController
        sonata.admin.project:
            class: Your\OwnBundle\Admin\ProjectAdmin
            tags:
                - { name: sonata.admin, manager_type: orm, group: "project", label: "Project" }
            arguments:
                - ~
                - Your\OwnBundle\Entity\Project
                - YourOwnBundle:ProjectCrud
            calls:
                - [ setLabelTranslatorStrategy, ["@sonata.admin.label.strategy.underscore"]]
                - [ setTemplate, [list, YourOwnBundle:ProjectAdmin:list.html.twig]]
    

    注意setTemplate-call,让我们创建你的模板

    1. 创建自己的列表模板

      {% extends 'SonataAdminBundle:CRUD:base_list.html.twig' %}
      
      {% block preview %}
      
          <ul class="nav nav-pills">
              <li><a><strong>{{ "label.select_projectstatus"|trans({}, 'SonataProjectBundle') }}</strong></a></li>
      
              {% for projectStatus in projectStatuses %}
                  {% set active = false %}
                  {% if projectStatus.id == activeProjectStatus %}
                      {% set active = true %}
                  {% endif %}
                  <li class="{% if active %}active{% endif %}" ><a href="{{ admin.generateUrl('list', {'status' : projectStatus.id }) }}">{{ projectStatus.status }}</a></li>
              {% endfor %}
          </ul>
      {% endblock %}
      
    2. 在您自己的管理类中覆盖Admin :: getFilterParameters函数。在这里,您需要根据您的requestparam设置过滤器:

      /**
       * {@inheritdoc}
       */
      public function getFilterParameters()
      {
          $parameters = parent::getFilterParameters();   
      
          return array_merge(array(
              'status'  => array(
                  'type' => '',
                  'value' => $this->getRequest()->get('status', 1),
              )
          ), $parameters);
      }