Tout fonctionne très bien je crée et supprime des images et des videos.
Mais lorsque je veux modifier modifier dans le formulaire tous les données apparaissent comme le titre le type (image ou video) ... mais pas le fichier dans le champ Image/Video y a pas le fichier déjà enregistré
Alors c'est tout à fait logique puisque ton champ est à null si tu ne mets rien.
Une solution serait de vérifier que le champ file n'est pas nul lors du traitement de l'update.
Si il est nul tu mets le nom déjà présent en base.
Quelque chose dans ce genre là (bien sur ce n'est qu'une piste hein, à adapter ):
<?php
$lastFile = $entity->getFile()
//Tu récupères les données du formulaire
//là si le champ file est a nul tu lui remets l'ancienne valeur que tu as mis dans une variable avant la récupération des données du formulaire
if($form['file']->getData() == null){
$entity->setFile($lastFile);
}
Mais lorsque je veux modifier modifier dans le formulaire tous les données apparaissent comme le titre le type (image ou video) ... mais pas le fichier dans le champ Image/Video y a pas le fichier déjà enregistré
C'est normal. Si tu fais attention, quand tu mets un fichier dans un <inputtype="file"/>, tu as le chemin absolu du fichier qui s'inscrit dans le champ. Or, par logique, on devrait afficher le chemin absolu du fichier sur le serveur quand on fait référence à un fichier qui y existe. Mais cela représenterait une grosse faille de sécurité. C'est pourquoi l'attribut value d'un <inputtype="file"/> n'est pas pris en compte par les navigateurs. De plus, ce chemin absolu serveur ne rimerait plus à rien chez le client, et le chemin absolu client ne servirait à rien au serveur.
En complément de ce sujet, le code ci-dessous n'y figure pas, mais pourrait t'intéresser tout autant. En plus d'un champ <inputtype="file"/>, il affiche l'image, quand tu édites. Malheureusement, je n'ai pas de truc pour faire apparaître une image extraite d'une vidéo.
{% block ysoft_picture_widget %}
{% spaceless %}
<div class="box blue picture" id="{{ form.parent.get('label') ~ '_' ~ form.get('name') }}">
{% if (form.file_name.vars.value != '') %}
{{ html_image(
form.file_path.vars.value|default(constant('YSoft\\MediaBundle\\Entity\\Picture::UPLOAD_DIR') ~ '/') ~ form.file_name.vars.value,
{'title': form.picture_title.vars.value, 'alt': form.alt.vars.value|default('ysoft_media.default.common'|trans), 'type': 'thumbnail'}
)|raw }}
{% set prototype = form_widget(form.file) %}
{% else %}
{% if auth_key is defined and template_id is defined %}
<input type="hidden" name="params" value="{"auth":{"key":"{{ auth_key }}"},"template_id":"{{ template_id }}","redirect_url":"{{ path('_welcome') }}"}" />
{% endif %}
{% set prototype = form_widget(form.file) %}
{{ prototype|raw }}
{% endif %}
{{ form_rest(form) }}
{% if in_collection is defined %}
<div class="{{ form.parent.get('name') }} remover"></div>
{% else %}
<div class="{{ form.parent.get('name') }} resetter"{% if auth_key is defined and template_id is defined %} data-prototype-empty="<input type="hidden" name="params" value="{&quot;auth&quot;:{&quot;key&quot;:&quot;{{ auth_key }}&quot;},&quot;template_id&quot;:&quot;{{ template_id }}&quot;,&quot;redirect_url&quot;:&quot;{{ url('_welcome') }}&quot;}" />{{ prototype|escape }}" data-prototype-chosen=""{% endif %}></div>
{% endif %}
</div>
{% endspaceless %}
{% endblock %}
D'accord. Mais avec les getters et setters de $file, et avec la coloration syntaxique, ce serait parfait. Edite ton précédent message plutôt que d'en créer un autre.
D'accord. Mais avec les getters et setters de $file, et avec la coloration syntaxique, ce serait parfait. Edite ton précédent message plutôt que d'en créer un autre.
Je peux regarder pour te fournir mon MediaBundle, il y a aussi SonataMediaBundle et VichUploadBundle, à toi de voir.
Au passage, tu peux me montrer ton nouveau getFile ?
Autre question : tu dis que ça ne marche pas, qu'as-tu comme erreur ? Aucune, mais toujours le même problème ?
Montre aussi ton MediaType, s'il te plaît.
Merci, ca marche pas lorsque je modifie sans sectionner une image le champ file reste nul !!
mon getFile est le suivant :
/**
* Get file
*
* @return object
*/
public function getFile()
{
return $this->file;
}
ton entité et la mienne sans différente j'ai les propriétés : id ,title, file, comment, partie et type mes méthodes aussi qui permettent d'uploader un fichier !!
public function getFile()
{
/* Note that the file is taken relatively to the web root. The initial
* slash for the path of the picture is to be removed, else the server
* will return a 500 error */
return (($this->file_path == NULL) && ($this->file_name != NULL)
? new UploadedFile(
$this->getUploadRootDir() . '/' . $this->file_name,
$this->file_name)
: NULL);
}
je n'ai pas file_name, file-path dans mon entité du coup j'improvise ... et je ne sais pas quoi mettre !!
D'accord. Mais du coup, comment reconstruis-tu le fichier ? Il te faut bien son nom (et éventuellement son chemin), non ? Et il est/était enregistré où dans la base de données ?
oui il enregistrer dans la base de données si le fichier s'appelle toto.jpg dans le disque dur il pend le même nom dans le champ file de la table (toto.jpg). son chemin (path) c'est : getWebPath(). voila quoi tout va bien sauf l'action editFile et UpdateFile qui ne prend pas en compte la valeur du champ (aucun fichier sélectionner)!!
remarque la méthode getFile() récupère le nom du fichier : toto.jpg !!
On va faire un essai : modifie la méthode getFile comme suit :
<?php
public function getFile()
{
var_dump($this->file);
throw new \Exception('Stopped on dev request');
return $this->file;
}
Et tu me dis ce qui s'affiche en haut à gauche de l'écran, soit le résultat du var_dump, quand tu accèdes au formulaire d'édition de ton media.
Citation : aiafree
remarque la méthode getFile() récupère le nom du fichier : toto.jpg !!
Et non un objet UploadedFile comme reçu après soumission du formulaire. Normal. C'est pour ça que je ne persiste pas le fichier directement (même comme une chaîne de caractères), mais son nom et son chemin, et que mon getFile est plus conséquent que le tien.
Edit
<?php
public function uploadFile()
{
if (null === $this->file) {
return;
}
$this->file->move($this->getUploadRootDir(), $this->file->getClientOriginalName());
$this->file = $this->file->getClientOriginalName();
}
Ça ne te choque pas, toi, de changer ce qu'il y a dans $file, soit un objet, et d'y mettre une chaîne de caractères ? Je sais que PHP n'est pas fortement typé, mais avec Symfony et Doctrine, il te faut tout de même faire attention à ce genre de choses. Je pense que tu as pris l'exemple du cookbook de Symfony, mais que tu l'as modifié à ta sauce ? J'espère que tu savais ce que tu faisais…
En effet, le tableau m'affiche : string(10) "toto.jpg", j'ai repris l'exemple du CookBook de sf2 !! le type du champ file dans /Resources/config/doctrine/metadata/orm/ est "text" mais avec les asset je peux afficher l'image uploadé !!
Sincèrement, je te conseille d'enregistrer le nom du fichier dans une autre propriété que $file, sans quoi tu auras des soucis à n'en plus finir. $file doit contenir un objet de type UploadedFile, ou être nul, mais il ne doit jamais contenir une chaîne de caractères, c'est déjà asssez étrange que Symfony ne te crie pas dessus quand il remplit ton formulaire d'édition.
Tu as repris le code du cookbook, mais tu y as ajouté cette ligne 215 qui est une aberration. Ta propriété $file n'est plus l'objet représentant ton fichier, mais simplement son nom, après cette ligne. Alors oui, ça peut fonctionner en bricolant comme tu l'as fait, mais c'est pas propre.
Ne persiste pas la propriété $file Mets le nom du fichier dans une autre propriété que tu persistes, celle-là Et reconstruit la propriété $file (new UploadedFile) à partir de son nom et de son chemin.
Je t'ai donné un code peut-être compliqué, certainement pas très commenté, mais fonctionnel, dans l'autre sujet. Tout comme le code du cookbook – à un petit détail près qu'il ne joue pas dans tous les cas, mais dans le tien, ça ne devrait pas être un problème.
Fais ces modifications, teste, et reviens si tu as encore un souci, avec le nouveau code englobé dans une balise <secret>…</secret>
Edit (08/09/2012)
Souci apparemment réglé (par MP), mais comme je ne peux pas mettre moi le sujet en résolu…
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
Il n'y a pas quelque chose qui te choque, là ?
Et tu me dis ce qui s'affiche en haut à gauche de l'écran, soit le résultat du var_dump, quand tu accèdes au formulaire d'édition de ton media.