La gestion simultanée de plusieurs uploads de fichier à Sonata Admin Bundle
Alors, après recherche beaucoup et n'obtenez pas de résultats (peut-être que je suis un mauvais chercheur) j'en provenance de ce sujet: SonataAdmin Bundle De Téléchargement De Fichier D'Erreur et SonataMediaBundle - comment télécharger des images? je ne peux pas trouver une solution à mon problème. J'ai une Entité Company
et chaque entreprise peut avoir plusieurs fichiers: PDF, DOC, XLS et quelques autres/mime types. Je pense que pour utiliser VichUploaderBundle mais encore une fois docs ne couvre exemple pour une pour une relation donc ma question est, tout peut me donner des exemples ou les moyens d'obtenir ce fait? Je veux dire télécharger des fichiers et de les joindre à la société?
EDIT1 de travail et de tests
Comme je l'ai dit avant, je suis en train d'intégrer SonataMediaBundle dans un autre module de l'admin que j'ai, mais je ne peux pas le faire fonctionner. Ce que j'ai fait jusqu'à maintenant?
Bien sûr, d'installer et de configurer tous les bundles: SonataAdminBundle et SonataMediaBundle les deux fonctionnent très bien
Modifié \Application\Sonata\MediaBundle\Entity\Media.php
classe pour ajouter les fonctionnalités requises par l'ajout d'une relation 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;
}
}
L'ajout de champs dans le besoin PL\OrderBundle\Entity\Order.php comme suit:
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;
}
}
Changé le configureFormFields dans OrderAdmin.php fichier comme suit:
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')
);
}
Mais cela ne marche pas puisque je ne peut pas télécharger n'importe quel fichier et c'est ce que j'ai envie de télécharger de nombreux fichiers à partir du même formulaire et le joindre à la commande, je suis en train de créer. Voir les photos ci-jointes pour un visuel que j'ai quand je accéder à l'action de création:
Ce que je suis absent?
Non, je n'essaie pas encore, avez-vous un exemple ou des documents concernant cette question?
Comme @GeertWille dit, vous pouvez le faire avec le SonataMediaBundle. Tout ce que vous devez faire est de faire un un-à-plusieurs relation entre la société et les fichiers. Ceci est fait par l'enregistrement d'une société de référence à vos fichiers en ligne, mais ce n'est pas la bonne façon. La meilleure chose que vous pouvez faire est de créer une table de lien entre vos fichiers et de la société. Après ceci est fait, vous avez juste besoin de libérer la puissance de la SonataAdminBundle.
vous pouvez prendre un coup d'oeil à mon montage?
J'ai fait comme vous l'avez suggéré, mais je suis coincé car je ne sais pas comment ajouter les fichiers directement à partir de OrderAdmin, un conseil?
OriginalL'auteur Reynier | 2014-02-11
Vous devez vous connecter pour publier un commentaire.
Pour votre solution pour avoir plusieurs images pour votre entreprise admin que vous avez à organiser votre relation comme il y aura une jonction de l'entité qui sera le point de la sonate médias entité dans une relation ManyToOne et aussi à votre entité de produits dans une relation ManyToOne ainsi j'ai créé ce type de collecte pour l'un des besoins pour les widgets en bas de page qui peut avoir plusieurs images de sorte que vous pouvez mapper vos produits aussi bien les images d'une manière similaire.
Pied de page de l'Entité contient une propriété nommée comme des liens qui pointe vers une jonction entité FooterWidgetsHasMedia en OneToMany façon,à la jonction de l'entité (FooterWidgetsHasMedia ) est titulaire de la relation de la sonate médias, en plus j'ai besoin de plusieurs images pour chaque mon pied de page de l'objet et aussi pour chaque image un dans le besoin d'une info-image trop si mon jonction entité fondamentalement, est titulaire de deux propriétés que les points de la sonate médias
FooterWidgets
Maintenant mon jonction entité points de retour à FooterWidgets et sonate médias entité
FooterWidgetsHasMedia
Définitions de propriétés
Générer les getters et setters pour les propriétés ci-dessus
Maintenant, vous devez créer de nouveaux admin pour votre collection de références à la jonction de l'entité FooterWidgetsHasMedia et configureFormFields va ressembler à quelque chose comme ci-dessous
FooterWidgetsHasMediaAdmin
De votre société et d'administrateur aura un nouveau champ dans configureFormFields
FooterWidgetsAdmin
Registre de service d'administration pour votre nouvelle admin comme
Démo snap shot
Vous pouvez trouver un code de démo ici
Git Hub
espère qu'il fait sensoui, vous pouvez définir votre base admin ou vous pouvez utiliser directement de la sonata admin de la base de
Bonjour, je suis en train de copier "Image de fond" à l'aide de PHPCR mais au lieu d'utiliser l'Application "\Sonate\MediaBundle\Entity\Media", j'ai utilisé un document personnalisé qui a sa propre admin contenant 3 fichiers uploaders et d'autres champs de texte. Mon problème est quand je clique sur le bouton "Ajouter", il me redirige le my custom doc d'administration et lors de l'enregistrement, il n'est pas redirigé me retourner d'où je suis venu et ne semble pas être lié à un autre document en phpcr arbre. Aucune idée sur le manque de config? Aussi pourriez-vous ajouter l'Application "\Sonate\MediaBundle\Entity\Media" et "WidgetsBaseAdmin" les fichiers dans votre repo git?
Par classe personnalisée je voulais dire une extension de ImagineBlock document et l'URL générée sur le bouton "Ajouter": localhost:8080/projets/web/admin/monprojet/bloc/...
À la fin, mon but est de faire exactement ce que vous avez montré dans l'image, je.e être en mesure d'avoir une image et une collection de documents contenant des images, tous intégrés dans/liée à un document unique.
OriginalL'auteur M Khalid Junaid