web-dev-qa-db-ja.com

SonataAdminBundle:非クラッドを表示(統計)

ソナタ管理バンドルを使用してバックエンドを生成しています。これに満足しているので、バックエンドを使用して統計も表示したいと思います。

バンドルのビュー「standard_layout.html.twig」を微調整することでそれができると思います。

問題は、例やそれについて話している人さえも見つからないので、それは可能でしょうか?単純すぎるので、人々はそれについて話していませんか?あなたはそれをしましたか ?

私は本当に単一のバックエンドが欲しいので、plsは私を啓発します!

ありがとう、copndz

26
copndz

Pulzarraiderがこれを行う1つの方法を説明したので、もう1つの方法を説明します。

ブロックバンドルの方法により、ダッシュボードを非常に強力な方法でカスタマイズできます。あなたは ブロックバンドルドキュメント を同時にフォローすることができます

1。 Copndz\MyBundle\Block\ServiceにStatisticsBlockService.phpを作成します

保存されたデータを使って数学を実行して統計を表示したい:

  • entityManagerをインポートします
  • 属性$ emをサービスに追加します
  • 親コンストラクターを呼び出すコンストラクター__constructを追加し、引数で渡されたEntityManagerで$ emを設定します
namespace Copndz\MyBundle\Block\Service;
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 Doctrine\ORM\EntityManager;

class StatisticsBlockService extends BaseBlockService
{
    private $em;
    
    /**
     * {@inheritdoc}
     */
    public function execute(BlockInterface $block, Response $response = null)
    {
        $settings = array_merge($this->getDefaultSettings(), $block->getSettings());
        
        $myentityrepository = $this->em->getRepository('CopndzMyBundle:MyEntity');
        $myentity = $myentityrepository->find('5');
        
        return $this->renderResponse('CopndzMyBundle:Block:block_statistics.html.twig', array(
            'block'     => $block,
            'settings'  => $settings,
            'myentity' => $myentity,   
        ), $response);
    }

    /**
     * {@inheritdoc}
     */
    public function validateBlock(ErrorElement $errorElement, BlockInterface $block)
    {
        // TODO: Implement validateBlock() method.
    }

    /**
     * {@inheritdoc}
     */
    public function buildEditForm(FormMapper $formMapper, BlockInterface $block)
    {
        $formMapper->add('settings', 'sonata_type_immutable_array', array(
            'keys' => array(
                array('content', 'textarea', array()),
            )
        ));
    }

    /**
     * {@inheritdoc}
     */
    public function getName()
    {
        return 'Text (core)';
    }

    /**
     * {@inheritdoc}
     */
    public function getDefaultSettings()
    {
        return array(
            'content' => 'Insert your custom content here',
        );
    }
    
    public function __construct($name, $templating, EntityManager $entityManager)
    {
            parent::__construct($name, $templating);
            $this->em = $entityManager;
    }
}

2。 MyBundle\Ressources\config\services.ymlにサービスを作成します

 sonata.block.service.statistics:
      class: Copndz\MyBundle\Block\Service\StatisticsBlockService
      tags:
        - { name: sonata.block }
      arguments:
        - "sonata.block.service.statistics"
        - @templating
        - @doctrine.orm.entity_manager

3。このサービスをconfig.ymlのsonata_blockに追加します

sonata_block:
    default_contexts: [cms]
    blocks:
        sonata.admin.block.admin_list:
            contexts:   [admin]

        sonata.block.service.text:
        sonata.block.service.rss:
        sonata.block.service.statistics:

4。 Copndz\MyBundle\Ressources\views\Blockにテンプレートblock_statistics.html.twigを作成します

{% extends sonata_block.templates.block_base %}

{% block block %}
    {{ myentity.name }}
{% endblock %}

5。そして最後に、config.ymlの管理バンドル構成でサービスを呼び出します

sonata_admin:
    dashboard:
        blocks:
            # display a dashboard block
            - { position: left, type: sonata.admin.block.admin_list }
            - { position: right, type: sonata.block.service.statistics }
19
copndz

はい、可能です。 Sonata Blockを使用するか、独自のコントローラーを使用して実行できます。

controllerを使用する場合、デフォルトのCRUDコントローラーから(1つ以上の)アクションをオーバーロードでき、レンダリングされた結果がどのように表示されるかはユーザーによって異なります。

  1. デフォルトのコントローラー_SonataAdminBundle:CRUD_をコントローラーに置き換えます管理サービスの定義でAcmeDemoAdminBundle:ProductStatisticsAdminおよびエンティティの削除 CRUD操作なしで統計をレンダリングしようとするため。

    _<service id="acme_demo_admin.product_statistics" class="Acme\Bundle\DemoAdminBundle\Admin\ProductStatisticsAdmin">
        <tag name="sonata.admin" manager_type="orm" group="statistics_group" label_catalogue="admin" label="Product Statistics" />
        <argument />
        <argument />
        <argument>AcmeDemoAdminBundle:ProductStatisticsAdmin</argument>
    </service>
    _
  2. 管理サービスの作成ProductStatisticsAdmin in _Acme/Bundle/DemoAdminBundle/Admin/ProductStatisticsAdmin.php_。 listアクションのみが必要で、他のCRUD操作は必要ないため、クラスは非常に単純になります。

    _<?php
    namespace Acme\Bundle\DemoAdminBundle\Admin;
    
    use Sonata\AdminBundle\Admin\Admin;
    use Sonata\AdminBundle\Route\RouteCollection;
    
    class ProductStatisticsAdmin extends Admin
    {
        protected $baseRoutePattern = 'product-statistics';
        protected $baseRouteName = 'productStatistics';
    
        protected function configureRoutes(RouteCollection $collection)
        {
            $collection->clearExcept(array('list'));
        }
    }
    _
  3. コントローラーを作成 _Acme/Bundle/DemoAdminBundle/Controller/ProductStatisticsAdminController.php_のProductStatisticsAdminControllerと、SonataのCRUDControllerからlistAction()をオーバーロードします。このアクション内で、DBを呼び出して統計を取得し、テンプレートを使用してそれらをレンダリングできます。

    _<?php
    
    namespace Acme\Bundle\DemoAdminBundle\Controller;
    
    use Sonata\AdminBundle\Controller\CRUDController as Controller;
    use Symfony\Component\Security\Core\Exception\AccessDeniedException;
    
    class ProductStatisticsAdminController extends Controller
    {
        public function listAction()
        {
            if (false === $this->admin->isGranted('LIST')) {
                throw new AccessDeniedException();
            }
    
            //... use any methods or services to get statistics data
            $statisticsData = ...
    
           return $this->render('AcmeDemoAdminBundle:ProductStatistics:product_statistics.html.twig', array(
                        'statistics_data'  => $statisticsData,
                    ));
        }
    }
    _
  4. テンプレートの作成 _product_statistics.html.twig_グラフを生成し、_Acme/Bundle/DemoAdminBundle/Resources/views/ProductStatistics/product_statistics.html.twig_で統計を表示します

    _{% extends base_template %}
    
    {% block javascripts %}
        {{ parent() }}
        {# put links to javascript libraries here if you need any #}
    {% endblock %}
    
    {% block content %}
        {# put some html code to display statistics data or use some javascript library to generate cool graphs #}
    {% endblock %}
    _
37
pulzarraider

実際にブロックを使用することと別々のページを作成することは少し異なります。 OPはsonataadmin内に別のページを作成しようとしていると思います。

  1. コントローラを作成し、そのルートをrouting.ymlファイルで構成し、URLをsonata adminのように表示する場合は、sonataadminのプレフィックスと同じプレフィックスを設定します。

  2. テンプレートをレンダリングします。ここには2つのトリックがあります。

    まず、sonataadminの「レイアウト」テンプレートから拡張する必要があります。 config.ymlで変更した場合は、それに応じてコードを更新してください。 参照

    {% extends "SonataAdminBundle::standard_layout.html.twig" %}
    

    これで、ソナタ管理者のメニューバーとフッターがこの新しいページに表示されます。しかし、メニューは空です。メニューを表示するには、コントローラーからテンプレートにadmin_poolを渡す必要があります。

    $admin_pool = $this->get('sonata.admin.pool');
    
    return array(
        'admin_pool' => $admin_pool,
        // Other variables to pass to template
    );
    
14
Sarim

これがあなたの問題に対する別の解決策です: http://blog.eike.se/2014/03/custom-page-controller-in-sonata-admin.html

1
eikes

あなたが達成しようとしていることは、Sonata AdminBundleのSonataBlockBundle部分を使用して実行できると思います。

Sonata管理ダッシュボードのドキュメント http://sonata-project.org/bundles/admin/2-1/doc/reference/dashboard.html

私はそれを自分でやったことはありません。

0
Viktor