Bonjour,
J'ai un formulaire qui va ajouter une petite annonce, et je souhaite associé une photo.
En suivant le tuto de GA, j'ai donc fait repris le gestionnaire de Media.

<?php echo $this->Form->create('Media', array('type'=>'file'));?>
<?php echo $this->Form->input('file', array('label'=>'Photo','type'=>'file')); ?>
<?php echo $this->Form->input('name',array('label'=>__("Nom de l'image"))); ?>
<?php echo $this->Form->end(__('Ajouter'));?>

Mais je souhaite l'inclure dans le formulaire d'annonce.

<?php echo $this->Form->create('Annonce');?>
    <fieldset>
        <legend><?php echo __('Votre annonce'); ?> en 5 minutes</legend>

        <?php echo $this->Form->input('content',array('label'=>"Description",'required','type'=>'textarea', 'rows' => '5','class'=>'input-xxlarge')); ?>
        <?php echo $this->Form->input('address',array('label'=>__('Adresse'),'type'=>'textarea','rows'=>'2','class'=>'input-xlarge','style'=>'float')); ?>
        <?php echo $this->Form->input('phone',array('label'=>__('Telephone'))); ?>
        <?php echo $this->Form->input('category_id', array(
                'legend'=>__('Categorie'),
                'type'=>'radio'
                )
            ); ?>

La je ne vois pas comment au moment de la sauvegarde faire en sorte que l'image ira se sauvegarder dans le model "Media", et que l'annonce dans le model "Annonce".

Je vais essayer de voir si c'est possible de faire ceci ( je rêve debout)

<?php echo $this->Form->create('Annonce','Media', array('type'=>'file'));?>

5 réponses


Grafikart
Réponse acceptée

Dans le controller tu devra faire 2 traitements, un premier pour sauvegarder l'annonce et un second pour sauvegarder le Media séparément (ou utiliser le afterSave du model)

sylvain
Auteur
<?php echo $this->Form->create('Annonces');?>
    <fieldset>
        <legend><?php echo __('Votre annonce'); ?> en 5 minutes</legend>

        <?php echo $this->Form->input('content',array('label'=>"Description",'required','type'=>'textarea', 'rows' => '5','class'=>'input-xxlarge')); ?>

        <?php echo $this->Form->input('prix',array('label'=>__('Prix'),'class'=>'input-mini')); ?>

        <?php echo $this->Form->input('Media.file', array('label'=>__('Photo'),'type'=>'file')); ?>

J'ai juste ajouter Media.file pour préciser que je veux sauvegarder dans la table Media.
Mais la je ne sais pas si c'est dans le controller que je dois specifier, que je veux utiliser le model media
ou c'est dans le model Annonces que je dois ajouter l'utilisation du model Media.

sylvain
Auteur

Si je comprends bien, le mieux est de faire le traitement dans le model, car il sera plus facile a tester avec les Tests Unitaire ( sur le Model justement)

sylvain
Auteur

J'ai un probleme j'ai crée un controller Annonce, qui aura plusieurs Media.
Seulement la BDD est de la forme Medias(id, url, post_id)

Est ce que c'est propre d'ajouter un champs annonce_id ?
Je vais devoir ajouter un champs (id, url, post_id, annonce_id)

sylvain
Auteur

Sniff, le saveAll ne renvoi pas d'erreur mais je n'ai aucune insertion en base sur le Model medias

En fait il ne fait qu'une seule requete, pas la deuxieme.

public function add() {
        if ($this->request->is('post')) {
            $data = $this->request->data;

            // traitement photo
            $dir = IMAGES.date('Y');
            if(!file_exists($dir))
                mkdir($dir,0777);
            // creation rep correspondant au mois
            $dir .= DS.date('m');
            if(!file_exists($dir))
                mkdir($dir,0777);
            $f = explode('.', $data'Media']'file']);
            $ext = '.'.end($f);
            $filename = Inflector::slug(implode('.',array_slice($f,0, -1)),'-');

            $data'Media']'url'] = date('Y').'/'.date('m').'/'.$filename.$ext;

            if($this->Location->saveAll($data, array('validate'=>'first'))){
                die("save");
            } else {
                die("ko");
            }