簡體   English   中英

在Sonata Admin Bundle中處理多個文件上傳

[英]Handling multiple file uploads in Sonata Admin Bundle

因此,經過大量研究並得不到任何結果(也許我是一個不好的搜索者)我來自這個主題: SonataAdmin捆綁文件上傳錯誤SonataMediaBundle - 如何上傳圖像? 我無法找到解決問題的方法。 我有一個實體Company ,每個公司可以有多個文件:PDF,DOC,XLS和其他一些mime /類型。 我想要使​​用VichUploaderBundle但是文檔只覆蓋一對一關系的例子,所以我的問題是,任何可以給我一些例子或方法來完成這個嗎? 我的意思是上傳文件並將它們附加到公司?

EDIT1工作和測試

正如我之前所說,我正在嘗試將SonataMediaBundle集成到另一個管理模塊中,但我無法讓它工作。 我到現在為止做了什么?

當然安裝和配置所有捆綁包:SonataAdminBundle和SonataMediaBundle都工作正常

修改\\Application\\Sonata\\MediaBundle\\Entity\\Media.php類,通過添加ManyToMany關系添加所需的功能

namespace Application\Sonata\MediaBundle\Entity;

use Sonata\MediaBundle\Entity\BaseMedia as BaseMedia;
use Doctrine\ORM\Mapping as ORM;

class Media extends BaseMedia {

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

    /**
     * @ORM\ManyToMany(targetEntity="PL\OrderBundle\Entity\Order", inversedBy="medias")
     * @ORM\JoinTable(name="order_has_media__media",
     *      joinColumns={@ORM\JoinColumn(name="media__media_id", referencedColumnName="id")},
     *      inverseJoinColumns={@ORM\JoinColumn(name="order_no_order", referencedColumnName="no_order")}
     * )
     */
    protected $orders;

    public function __construct() {
        $this->orders = new \Doctrine\Common\Collections\ArrayCollection();
    }

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

    public function setOrders(\PL\OrderBundle\Entity\Order $order) {
        $this->orders[] = $order;
    }

    public function getOrders() {
        return $this->orders;
    }

}

在PL \\ OrderBundle \\ Entity \\ Order.php中添加需要字段如下:

namespace PL\OrderBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity
 * @ORM\Table(name="tb_order")
 */
class Order {

    /**
     * @ORM\Id
     * @ORM\Column(type="string", length=15, unique=true, nullable=false)
     */
    protected $no_order;

    /**
     * @ORM\ManyToOne(targetEntity="PL\CompanyBundle\Entity\Company", inversedBy="id")
     */
    protected $company;

    /**
     * @ORM\Column(type="string", length=15, unique=true)
     */
    protected $business_case;

    /**
     * @ORM\Column(type="integer", length=1)
     */
    protected $charge_status;

    /**
     * @ORM\Column(type="datetime")
     */
    protected $eta;

    /**
     * @ORM\Column(type="datetime")
     */
    protected $etd;

    /**
     * @ORM\Column(type="integer", length=1)
     */
    protected $transport_media;

    /**
     * @ORM\Column(type="integer", length=1)
     */
    protected $incoterm;

    /**
     * @ORM\Column(type="string", length=250)
     */
    protected $comments;

    /**
     * @ORM\ManyToMany(targetEntity="Application\Sonata\MediaBundle\Entity\Media", mappedBy="orders")
     */
    protected $medias;

    public function __construct() {
        $this->medias = new \Doctrine\Common\Collections\ArrayCollection();
    }

    public function setNoOrder($no_order) {
        $this->no_order = $no_order;
    }

    public function getNoOrder() {
        return $this->no_order;
    }

    public function setCompany(\PL\CompanyBundle\Entity\Company $company) {
        $this->company = $company;
    }

    public function getCompany() {
        return $this->company;
    }

    public function setBusinessCase($business_case) {
        $this->business_case = $business_case;
    }

    public function getBusinessCase() {
        return $this->business_case;
    }

    public function setChargeStatus($charge_status) {
        $this->charge_status = $charge_status;
    }

    public function getChargeStatus() {
        return $this->charge_status;
    }

    public function setETA($eta) {
        $this->eta = $eta;
    }

    public function getETA() {
        return $this->eta;
    }

    public function setETD($etd) {
        $this->etd = $etd;
    }

    public function getETD() {
        return $this->etd;
    }

    public function setTransportMedia($transport_media) {
        $this->transport_media = $transport_media;
    }

    public function getTransportMedia() {
        return $this->transport_media;
    }

    public function setIncoterm($incoterm) {
        $this->incoterm = $incoterm;
    }

    public function getIncoterm() {
        return $this->incoterm;
    }

    public function setComments($comments) {
        $this->comments = $comments;
    }

    public function getComments() {
        return $this->comments;
    }

    public function setMedias(\Application\Sonata\MediaBundle\Entity\Media $media) {
        $this->medias[] = $media;
    }

    public function addMedia(\Application\Sonata\MediaBundle\Entity\Media $media) {
        $this->medias[] = $media;
    }

    public function getMedias() {
        return $this->medias;
    }

}

更改了OrderAdmin.php文件中的configureFormFields,如下所示:

protected function configureFormFields(FormMapper $form) {
        $form
                ->add('no_order', null, array('label' => 'No. Order'))
                ->add('company', 'entity', array('class' => 'PL\CompanyBundle\Entity\Company', 'label' => 'Cliente'))
                ->add('business_case', null, array('label' => 'BC'))
                ->add('charge_status', 'choice', array('choices' => array(
                        "empty_value" => "Seleccione una opción",
                        "0" => "Ninguno",
                        "1" => "Proceso de Fabricacion",
                        "2" => "Pickup en destino",
                        "3" => "A la espera de recojo por cliente",
                        "4" => "Carga en transito",
                        "5" => "Carga arribada",
                        "6" => "En proceso de aduana",
                        "7" => "Entregado a cliente",
                        "8" => "En bodega"
                    ), "required" => true, 'label' => 'Estado de la carga'))
                ->add('eta', null, array('label' => 'ETD'))
                ->add('etd', null, array('label' => 'ETA'))
                ->add('transport_media', 'choice', array('choices' => array("empty_value" => "Seleccione una opción", "0" => "EXW", "1" => "Maritimo", "2" => "Aereo"), "required" => true, 'label' => 'Via de Transporte'))
                ->add('incoterm', 'choice', array('choices' => array(
                        "empty_value" => "Seleccione una opción",
                        "0" => "Ninguno",
                        "1" => "EWX",
                        "2" => "FOB",
                        "3" => "CIF",
                        "4" => "DDP"
                    ), "required" => true, 'label' => 'Incoterm'))
                ->add('comments', null, array('label' => 'Comentarios'))
                ->add('medias', 'sonata_type_collection', array(
                    'label' => 'Documentos',
                    'type_options' => array('delete' => true)), array(
                    'edit' => 'inline', 'inline' => 'table', 'sortable' => 'position')
        );
    }

但這不起作用,因為我無法上傳任何文件,這就是我想要從同一表單上傳許多文件並將它們附加到我正在創建的訂單。 請參閱附圖,了解我在訪問創建操作時獲得的視覺效果:

在此輸入圖像描述在此輸入圖像描述

我錯過了什么?

為了讓您的公司管理員擁有多個圖像的解決方案,您必須組織您的關系,就像將有一個聯結實體,它將指向ManyToOne關系中的奏鳴曲媒體實體,也指向您已創建的ManyToOne關系中的產品實體這種類型的集合可滿足頁腳小部件的需求,這些小部件可以有多個圖像,因此您也可以以類似的方式為產品圖像映射它。

頁腳實體包含一個名為鏈接的屬性,指向一個實體FooterWidgetsHasMedia以OneToMany方式,連接實體(FooterWidgetsHasMedia)保存與奏鳴曲媒體的關系,此外我需要多個圖像用於我的每個頁腳對象以及每個圖像a需要一個懸停圖像也是如此,我的連接實體基本上擁有兩個指向奏鳴曲媒體的屬性

FooterWidgets

/**
 * @Assert\NotBlank()
 * @ORM\OneToMany(targetEntity="Traffic\WidgetsBundle\Entity\FooterWidgetsHasMedia", mappedBy="footerWidget",cascade={"persist","remove"} )
 */
protected $links;


/**
 * Remove widgetImages
 *
 * @param \Application\Sonata\MediaBundle\Entity\Media $widgetImages
 */
public function removeLinks(\Traffic\WidgetsBundle\Entity\FooterWidgetsHasMedia $links)
{
    $this->links->removeElement($links);
}


/**
 * Get widgetImages
 *
 * @return \Doctrine\Common\Collections\Collection
 */
public function getLinks()
{
    return $this->links;
}


/**
 * {@inheritdoc}
 */
public function setLinks($links)
{
    $this->links = new ArrayCollection();


    foreach ($links as $footerWidget) {
        $this->addLinks($footerWidget);
    }
}

/**
 * {@inheritdoc}
 */
public function addLinks(\Traffic\WidgetsBundle\Entity\FooterWidgetsHasMedia $links)
{
    $links->setFooterWidget($this);


    $this->links[] = $links;
}

現在,我的交匯點實體將指向FooterWidgets和sonata媒體實體

FooterWidgetsHasMedia

屬性的定義

/**
 * @var \Application\Sonata\MediaBundle\Entity\Media
 * @Assert\NotBlank()
 * @ORM\ManyToOne(targetEntity="Application\Sonata\MediaBundle\Entity\Media", cascade={"persist"}, fetch="LAZY")
 * @ORM\JoinColumn(name="media_id", referencedColumnName="id")
 */
protected $media;

/**
 * @var \Application\Sonata\MediaBundle\Entity\Media
 * @Assert\NotBlank()
 * @ORM\ManyToOne(targetEntity="Application\Sonata\MediaBundle\Entity\Media", cascade={"persist"}, fetch="LAZY")
 * @ORM\JoinColumn(name="media_hover_id", referencedColumnName="id")
 */
protected $mediaHover;

/**
 * @var \Traffic\WidgetsBundle\Entity\FooterWidgets
 * @Assert\NotBlank()
 * @ORM\ManyToOne(targetEntity="Traffic\WidgetsBundle\Entity\FooterWidgets", cascade={"persist","remove"} ,inversedBy="links", fetch="LAZY" )
 * @ORM\JoinColumn(name="footer_widget_id", referencedColumnName="id",nullable=true)
 */
protected $footerWidget;
/**
 * @var integer
 * @ORM\Column(name="position", type="integer")
 */
protected $position;


/**
 * @var boolean
 * @ORM\Column(name="enable", type="boolean")
 */
protected $enabled;

為上述屬性生成getter和setter

現在你必須為你的集合創建新的管理員,它引用了交匯點實體FooterWidgetsHasMedia和configureFormFields看起來如下所示

FooterWidgetsHasMediaAdmin

protected function configureFormFields(FormMapper $formMapper)
{
    $link_parameters = array();

    if ($this->hasParentFieldDescription()) {
        $link_parameters = $this->getParentFieldDescription()->getOption('link_parameters', array());
    }

    if ($this->hasRequest()) {
        $context = $this->getRequest()->get('context', null);

        if (null !== $context) {
            $link_parameters['context'] = $context;
        }
    }

    $formMapper

        ->add('media', 'sonata_type_model_list', array('required' => false), array(
            'link_parameters' => $link_parameters
        ))
        ->add('mediaHover', 'sonata_type_model_list', array('required' => false), array(
            'link_parameters' => $link_parameters
        ))
        ->add('enabled', null, array('required' => false))
        ->add('link', 'text', array('required' => false))
        ->add('position', 'hidden')


    ;
}

您的公司管理員將在configureFormFields中有一個新字段

FooterWidgetsAdmin

        ->add('links', 'sonata_type_collection', array(
                'cascade_validation' => false,
                'type_options' => array('delete' => false),
            ), array(

                'edit' => 'inline',
                'inline' => 'table',
                'sortable' => 'position',
                'link_parameters' => array('context' => 'widgets'),
                'admin_code' => 'sonata.admin.footer_widgets_has_media' /*here provide service name for junction admin */
            )
        )

為您的新管理員注冊管理服務

sonata.admin.footer_widgets_has_media:
    class: Traffic\WidgetsBundle\Admin\FooterWidgetsHasMediaAdmin
    tags:
        - { name: sonata.admin, manager_type: orm, group: "Widgets", label: "Footer Widgets Section Media" , show_in_dashboard: false }
    arguments:
        - ~
        - Traffic\WidgetsBundle\Entity\FooterWidgetsHasMedia
        - ~
    calls:
        - [ setTranslationDomain, [TrafficWidgetsBundle]]

演示快照

在此輸入圖像描述

你可以在這里找到完整的代碼演示Git Hub希望它有意義

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM