Соната админ - детский админ класс - PullRequest
7 голосов
/ 12 января 2012

У меня есть сущность Order, с которой может быть связано несколько сущностей LineItem.

Я создал класс Admin для Order и класс Admin для LineItem. Но мне нужно, чтобы класс LineItem Admin был дочерним по отношению к классу Order Admin.

В классе LineItemAdmin я установил protected $parentAssociationMapping = 'order';.

Кроме того, в методе configureFormFields класса OrderAdmin я добавил ->add('lineItems', 'sonata_type_model').

Однако, это все еще не работает. Список позиций в форме заказа не кликабелен, поэтому я не вижу, как получить из формы администратора заказа, чтобы сказать страницу списка администратора LineItem.

Есть ли маршруты, которые необходимо настроить? Есть ли какие-то изменения в поле формы lineItems, которые мне нужно внести?

Было очень трудно найти хорошую документацию по комплекту Sonata Admin, поэтому любая помощь будет принята с благодарностью.

PS. Даже прохождение кода SonataAdminBundle не помогло, поскольку из-за его сложности очень трудно следовать коду.

Ответы [ 2 ]

5 голосов
/ 28 ноября 2012

Только что прошли те же проблемы с недокументированной функциональностью, единственные шаги, которые вы пропустили, это вызов addChild и configureSideMenu в родительском классе OrderAdmin.

Это решение создаст отдельную страницу из бокового меню, которое будет содержать lineItems, они не будут встроены в форму OrderAdmin (я не уверен, что это возможно).

ТамНе нужно настраивать какие-либо маршруты, так как SonataAdmin обрабатывает это для вас.

Вот пример родительского класса администратора с использованием аннотаций:

namespace YourVendor\YourBundle\Admin;

use JMS\DiExtraBundle\Annotation\Service;
use JMS\DiExtraBundle\Annotation\Tag;
use JMS\DiExtraBundle\Annotation\Inject;
use JMS\DiExtraBundle\Annotation\InjectParams;

use Knp\Menu\ItemInterface as MenuItemInterface;

use Sonata\AdminBundle\Admin\Admin;
use Sonata\AdminBundle\Admin\AdminInterface;

/**
 * @Service("sonata.admin.order")
 * @Tag("sonata.admin", attributes={"manager_type"="orm", "group"="Orders", "label"="Orders"})
 */
class OrderAdmin extends Admin
{
    /**
     * @InjectParams({
     *     "code" = @Inject("%your.parameters.code%"),
     *     "class" = @Inject("%your.parameters.class%"),
     *     "baseControllerName" = @Inject("%your.parameters.controller%"),
     *     "lineItems" = @Inject("sonata.admin.line_item")
     * })
     */
    public function __construct($code, $class, $baseControllerName, $lineItems)
    {
        parent::__construct($code, $class, $baseControllerName);

        $this->addChild($lineItems);
    }

    protected function configureSideMenu(MenuItemInterface $menu, $action, AdminInterface $childAdmin = null)
    {
        if (!$childAdmin && !in_array($action, array('edit', 'show'))) { return; }

        $admin = $this->isChild() ? $this->getParent() : $this;
        $id = $admin->getRequest()->get('id');

        $menu->addChild('Show Order', array('uri' => $admin->generateUrl('show', array('id' => $id))));
        $menu->addChild('Edit Order', array('uri' => $admin->generateUrl('edit', array('id' => $id))));
        $menu->addChild('Line items', array('uri' => $admin->generateUrl('sonata.admin.line_item.list', array('id' => $id))));
    }
}

Если вы используете XML или YML для своих сервисоввам, вероятно, не понадобится метод __construct, поскольку вызовы addChild могут входить в определение сервиса.

На момент написания статьи был открыт выпуск с пакетом JMS DiExtra Bundle с запросом извлечения для выделенной аннотации @Admin, которая также может обойти это требование.Хотя пару недель было тихо.

1 голос
/ 03 августа 2013

Вы можете к следующему:

// Order Entity
/**
 * @ORM\OneToMany(targetEntity="OrderItem", mappedBy="invoice", cascade={"persist", "remove"}, orphanRemoval=true)
 * 
 */
protected $items;
...



// OrderAdmin.php
protected function configureFormFields(FormMapper $formMapper)
{
        $formMapper
        ->with('Order Items')
            ->add('items', 'sonata_type_collection', array('required' => true,
                                                           'by_reference' => false,
                                                           ),
                                                     array('edit' => 'inline',
                                                           'inline' => 'table',))
 ....

Убедитесь, что у вас есть администратор OrderItem. Это необходимо, потому что sonata_type_collection требует класса Admin для работы.

Это решение прекрасно работает в моем наборе счетов со многими пунктами счета.

...