Symfony2& SonataMedia:当前字段未链接到管理员

时间:2012-08-18 20:25:21

标签: php symfony symfony-sonata

我一直在努力让SonataMedia与Symfony 2.0.16一起工作......但没有成功。谷歌搜索似乎没有多少人使用该捆绑或有一个我不知道的教程或操作方法,因为我没有得到很多关于我到目前为止的错误消息的信息。

无论如何,我上一次尝试给出了下一条错误消息:

The current field `path` is not linked to an admin. Please create one for the target entity : `` 

“path”是用于保存文件图像(相对)路径的字段。

AttachmentAdmin.php

<?php

class AttachmentAdmin extends Admin
{
    protected function configureFormFields(FormMapper $formMapper)
    {
        $formMapper
            ->add(
                'path',
                'sonata_type_collection',
                array(
                    'required' => true
                ),
                array(
                    'edit' => 'inline',
                    'inline' => 'table',
                    'sortable' => 'position',
                    'targetEntity' => 'Application\Sonata\MediaBundle\Entity\GalleryHasMedia',
                    'link_parameters' => array(
                        'context' => 'attachment'
                    )
                )
            )
            ->add('notes', 'textarea', array('required' => false))
        ;
    }

    // other methods
}

Attachment.php

<?php

class Attachment
{
    // other properties

    /**
     * @var string $path
     *
     * @ORM\Column(name="path", type="string", nullable=false)
     * @ORM\ManyToOne(targetEntity="Application\Sonata\MediaBundle\Entity\GalleryHasMedia", cascade={"persist"})
     */
    protected $path;

    // other methods

    /**
     * Set path
     *
     * @param string $path
     */
    public function setPath($path)
    {
        $this->path = $path;

        foreach ($path as $ent) {
            $ent->setAttachment($this);
        }
    }

    /**
     *
     * @return string
     */
    public function getPath()
    {
        return $this->path;
    }

    /**
     *
     * @param \Application\Sonata\MediaBundle\Entity\GalleryHasMedia $path
     */
    public function addPath(\Application\Sonata\MediaBundle\Entity\GalleryHasMedia $path)
    {
        $this->path[] = $path;
    }
}

GalleryHasMedia.php

<?php

class GalleryHasMedia extends BaseGalleryHasMedia
{

    /**
     * @var integer $id
     */
    protected $id;

    /**
     *
     * @var File
     */
    private $attachment;

    /**
     * Get id
     *
     * @return integer $id
     */
    public function getId()
    {
        return $this->id;
    }

    /**
     *
     * @param \Mercury\CargoRecognitionBundle\Entity\Attachment $attachment
     * @return \Application\Sonata\MediaBundle\Entity\GalleryHasMedia
     */
    public function setAttachment(\Mercury\CargoRecognitionBundle\Entity\Attachment $attachment = null)
    {
        $this->attachment = $attachment;

        return $this;
    }

    /**
     *
     * @return \Application\Sonata\MediaBundle\Entity\File
     */
    public function getAttachment()
    {
        return $this->attachment;
    }
}

services.yml

    mercury.cargo_recognition.admin.attachment:
        class: Mercury\CargoRecognitionBundle\Admin\AttachmentAdmin
        tags:
            - { name: sonata.admin, manager_type: orm, group: General, label: Attachments }
        arguments: [ null, Mercury\CargoRecognitionBundle\Entity\Attachment, "MercuryCargoRecognitionBundle:AttachmentAdmin" ]

感谢您的任何信息!

7 个答案:

答案 0 :(得分:4)

只是猜测,为GalleryHasMedia实体创建一个管理类。

答案 1 :(得分:3)

您需要像这样添加admin_code

$formMapper
        ->add(
            'path',
            'sonata_type_collection',
            array(
                'required' => true
            ),
            array(
                'edit' => 'inline',
                'inline' => 'table',
                'sortable' => 'position',
                'targetEntity' => 'Application\Sonata\MediaBundle\Entity\GalleryHasMedia',
                'link_parameters' => array(
                    'context' => 'attachment'
                ),
                'admin_code' => 'sonata.media.admin.gallery_has_media' // this will be your admin class service name
            )
        )
        ->add('notes', 'textarea', array('required' => false))
    ;

答案 2 :(得分:1)

您正尝试在 相同实体类的字段' 路径 '上应用' sonata_type_collection ' > '附件',而' sonata_type_collection '用于收集不同类的嵌入形式。 因此,您将需要另外一个实体类假设' AttachmentCollection ',并且在此特定的 AttachmentsCollection 管理类中,您应该嵌入' 附件 '班级管理员..  例如:

class AttachmentsCollection extends Admin
{
protected function configureFormFields(FormMapper $formMapper)
    {
        $formMapper
   ->add('attachments', 'sonata_type_collection', array(
                        'required' => false,
                        'type_options' => array('delete' => true)
                    ), array(
                        'edit' => 'inline',
                        'inline' => 'table',
                        'sortable' => 'position',
                    ));
     }
  }

并且不要忘记在' AttachmentsCollection '之间映射“一对多”或“多对多”映射'附件'假设一个' AttachmentsCollection '有很多'附件'对象..

答案 3 :(得分:0)

看起来您需要做的是将admin_code mercury.cargo_recognition.admin.attachment参数中$fieldDescriptionOptions参数中的管理部分(add())的名称传递给{{1}}方法

答案 4 :(得分:0)

与这个问题一样古老,我仍然会添加一些关于如何解决这个问题的内容,以帮助其他可能遇到此问题的人。根本问题是$ path targetEntity(“Application \ Sonata \ MediaBundle \ Entity \ GalleryHasMedia”)没有管理类。

要解决此问题,请为targetEntity添加管理类:

[self.navigationController setNavigationBarHidden:YES];
    self.edgesForExtendedLayout = UIRectEdgeNone;
    self.view.autoresizingMask = UIViewAutoresizingFlexibleHeight;
    self.view.backgroundColor = [UIColor whiteColor];


    //we need to add white background behind the status bar
    CGFloat statusBarHeight = [UIApplication sharedApplication].statusBarFrame.size.height;
    UIView* statusBarWhiteBackGround = [[UIView alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, statusBarHeight)];
    [statusBarWhiteBackGround setBackgroundColor:[UIColor whiteColor]];
    [self.view addSubview:statusBarWhiteBackGround];

    UIView * redBackGroundColor  = [[UIView alloc] init];
    [redBackGroundColor setBackgroundColor:[UIColor redColor]];
    redBackGroundColor.frame =CGRectMake(0,statusBarHeight , self.view.frame.size.width, self.view.frame.size.height-statusBarHeight);
    [self.view addSubview:redBackGroundColor];

然后将该admin类添加到services.yml

class GalleryHasMediaAdmin extends Admin
{
    protected function configureFormFields(FormMapper $formMapper)
    {
        $formMapper
            ->add('attachment', 'file')
        ;
    }

    // other methods
}

答案 5 :(得分:0)

如果还没有创建GalleryHasMedia的管理类,并且您没有将服务代码放在config.yml文件中,那么首先执行此操作然后重试。我有同样的问题,并以这种方式得到解决。

答案 6 :(得分:0)

五年后,值得注意的是“目标实体”本身在错误文本中显示为空白。我们得到一组反引号,而不是实体名称。

(我正在处理一个旧的应用程序并且现在收到类似的错误。我已经为我的实体生成了一个管理类并在正确的位置注册了它,看起来该应用程序无法弄清楚我的目标是什么实体 - 默认情况下会阻止它找到相关的管理类。我有点在这个上面撕掉我的头发并且可能会在明天就拿出一笔赏金。)