Bonjour,
j'ai commencer a créer une galerie avec cakephp mais cela ne fonctionne pas concernant les uploads et la création des dossiers
Le débug que je fais ne fonctionne pas
ci-dessous mes scripts

GaleriesController.php

<?php
App::uses('AppController', 'Controller');

class GaleriesController extends AppController {
    public $name = 'Galeries';
    public $helpers = array('Html', 'Session');
    public $components = array('Img');

        public function beforeFilter(){
            parent::beforeFilter();
            $this->layout = 'gallery';
        }

        function index(){
            if($this->request->is('post')){
                $data = $this->request->data'Gallery'];
            if(isset($data'url'])){
                $this->redirect(array('action'=>'index','?class=&alt=&src='.urlencode($data'url'])));           
            }

                // Création du dossier galerie

                $dir = IMAGES.Gallery('cat');
                    if(!file_exists($dir))
                        mkdir($dir,0777);

                        // création du sous dossier image

                        $dir .= DS.date('d');
                            if(!file_exists($dir))
                                mkdir($dir,0777);

                $f = explode('.',$data'file']'name']);
                $ext = '.'.end($f);
                $filename = Inflector::slug(implode('.',array_slice($f,0,-1)),'-');

            // Sauvegarde dans la base de données

                $success = $this->Gallery->save(array(
                    'name' => $data'name'],
                    'url' => date('Y').'/'.date('m').'/'.$filename.$ext
                ));

                if($success){
                    move_uploaded_file($data'file']'tmp_name'],$dir.DS.$filename.$ext);
                    //On parcourre les different de format de media 
                        foreach(Configure::read('Media.formats') as $k =>$v){
                            $prefix = $k;
                            $size = explode('x',$v);
                            $this->Img->crop($dir.DS.$filename.$ext,$dir.DS.$filename.'_'.$prefix.'.jpg',$size[0],$size[1]);
                        }
                }else{
                    $this->Session->setFlash("L'image n'est au bon format","notif",array('type'=>'error'));
                }
            }
            $d =array();
            $d'galeries'] = $this->Gallery->find('all',array(
                'conditions' => array('type' => 'image')            
            ));
                $d'formats'] = Configure::read('Media.formats');
                $this->set($d);
        }
        function show($id = null,$format = ''){
        $d = array();
            if($this->request->is('post')){
                $this->set($this->request->data'Gallery']);
                $this->layout = false;
                $this->render('tinymce');
                return;

            }
            if($id){
                $this->Gallery->id =$id;
                $galeries = current($this->Gallery->read());
                $d'src'] = Router::url('/img/'.$galeries'url'.$format]);
                $d'alt'] = $galeries'name'];
                $d'class'] = 'alignLeft';
            }else{
                $d = $this->request->query;
                $d'src'] = urldecode($d'src']);
            }
                $this->set($d);

        }
        function admin_delete($id){
            $this->Gallery->delete($id);
            $this->Session->setFlash("L'image a bien été supprimé","notif");
            $this->redirect($this->referer());
        }
}

Mon Model : GalleryModel

<?php
class Gallery extends AppModel {
        public $useTable = 'galeries';
        public $validate =array(
        'url' => array(
            'rule' => '/^.*\.(jpg|png|jpeg)$/',
            'allowEmpty' => true,
            'message' => "Le fichier n'est pas une image valide"
            )       
        );
        public function beforeDelete(){
                $file = $this->field('url');
                $f = explode('.',$file);
                unlink(IMAGES.DS.$file);
                $ext = '.'.end($f);
                $file = implode('.',array_slice($f,0,-1));
                foreach(glob(IMAGES.DS.$file.'_*.jpg')as $v){
                    unlink($v);             
                }
            return true;
        }

        public function afterfind($data){
        foreach ($data as $k => $d){
            if(isset($d'Gallery']'url']) && isset($d'Gallery']'type']) && $d'Gallery']'type']=='image'){
                $filename = implode('.',array_slice(explode('.',$d'Gallery']'url']),0,-1));
                    foreach (Configure::read('Media.formats') as $kk=>$vv){
                        $d'Gallery']'url'.$kk] = $filename.'_'.$kk.'.jpg';
                    }
                }
                    $data$k] = $d;
                }
        return $data;
    }
}
?>

Mon index.ctp

<b>Ajoutrer une image</b>
    <?php echo $this->Form->create('Gallery',array('type'=>'file'));?>
    <?php echo $this->Form->input('file',array('label'=>'Image (format png/jpg)','type'=>'file'));?>
    <?php echo $this->Form->input('name',array('label'=>"Nom de l'image"));?>
    <?php echo $this->Form->input('cat',array('label'=>'Catégorie'));?>
<?php echo $this->Form->end('Envoyer');?>

je vous remerci de votre aide

Cafreunion

7 réponses


cafreunion
Auteur
Réponse acceptée

bonsoir,
Du coups je gère le tout dans une page a part

Merci de l'aide

Je pense que c'est ton code qui ne va pas...

$dir = IMAGES.Gallery('cat');

Que donne ton debug sur $dir?

Bonsoir, j'ai modifié la création des dossiers pour l'instant c'est pas vraiment ce que je veux mais cela me permet d'avancer un tout petit peu lors de la validation de mon formulaire j'ai les deux erreur ci-dessous [code] 1er erreur : Notice (8): Undefined index: Galerie [APP\Controller\GaleriesController.php, line 18 2eme erreur : Fatal error: Call to a member function save() on a non-object in E:\wamp\www\malagasy\app\Controller\GaleriesController.php on line 43 [/code] Le premier fait régérence à la ligne 18 de mon GaleriesController et le deuxième à la ligne 43 concernant l'enregistrement dans la base de donnée ci-dessous la structure de ma base de donnée [code]CREATE TABLE IF NOT EXISTS galeries ( id int(11) NOT NULL AUTO_INCREMENT, name varchar(255) DEFAULT NULL, url varchar(255) DEFAULT NULL, cat varchar(30) DEFAULT NULL, type varchar(10) DEFAULT 'image', PRIMARY KEY (id) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;[/code] Mon GaleriesController.php que j'ai actualisé [code]<?php App::uses('AppController', 'Controller');

class GaleriesController extends AppController {

public $name = 'Galeries';
public $helpers = array('Html', 'Session');
public $components = array('Img');

    public function beforeFilter(){
        parent::beforeFilter();
        $this->layout = 'gallery'; } function index(){ if($this->request->is('post')){ $data = $this->request->data['Galerie']; if(isset($data['url'])){ $this->redirect(array('action'=>'index','?class=&alt=&src='.urlencode($data['url']))); } // Création du dossier galerie $dir = IMAGES.('cat'); if(!file\_exists($dir)) mkdir($dir,0777); // création du sous dossier image $dir .= DS.date('d'); if(!file\_exists($dir)) mkdir($dir,0777); $f = explode('.',$data['file']['name']); $ext = '.'.end($f); $filename = Inflector::slug(implode('.',array\_slice($f,0,-1)),'-'); // Sauvegarde dans la base de données $success = $this->Galerie->save(array( 'name' => $data['name'], 'url' => $cat.'/'.date('m').'/'.$filename.$ext, 'cat' => $data['cat'] )); if($success){ move\_uploaded\_file($data['file']['tmp\_name'],$dir.DS.$filename.$ext); //On parcourre les different de format de media foreach(Configure::read('Media.formats') as $k =>$v){ $prefix = $k; $size = explode('x',$v); $this->Img->crop($dir.DS.$filename.$ext,$dir.DS.$filename.'\_'.$prefix.'.jpg',$size[0],$size[1]); } }else{ $this->Session->setFlash("L'image n'est au bon format","notif",array('type'=>'error')); } } $d =array(); $d['formats'] = Configure::read('Media.formats'); $this->set($d); } function show($id = null,$format = ''){ $d = array(); if($this->request->is('post')){ $this->set($this->request->data['Gallery']); $this->layout = false; $this->render('tinymce'); return; } if($id){ $this->Gallery->id =$id; $galeries = current($this->Gallery->read()); $d['src'] = Router::url('/img/'.$galeries['url'.$format]); $d['alt'] = $galeries['name']; $d['class'] = 'alignLeft'; }else{ $d = $this->request->query; $d['src'] = urldecode($d['src']); } $this->set($d); } function admin\_delete($id){ $this->Gallery->delete($id); $this->Session->setFlash("L'image a bien été supprimé","notif"); $this->redirect($this->referer()); } }[/code] Merci de votre aide cafreunion

Alors... Pour ta première erreur, dans ta vue, le formulaire s'appel "Gallerie" alors que tu cherche un $this->request->data'Gallery'];

Donc tu dois changer ton nom de formulaire en 'Gallery' pour qu'il ai le même nom que ton Model.

En suite ton controller s'appel Galeries et ton model Gallery. Tu vois pas une faute d'orthographe? ^^

Donc tu change le nom de controller (dans le nom de fichier et le nom de class et ta variable name en Galleries). Il va du coup détecter le singulier qui est Gallery et reconnaitre ton Model ^^.

Voilà pour les deux erreurs. Dis moi si ça marche mieux et si tu as d'autres soucies.

Bonsoir,
j'ai modifier les erreurs et cela fonctionne.
Je voudrais gérer ce formulaire en tans qu'élement, du coup j'ai cré le même fichier dans le dossier element et je l'ai inclus dans ma page. Le problème c'est lors de l'upload rien se passe c'est normal car il ne reconnais pas le chemin du fichier
Pour moi ca serais un moyen pratique d'avoir toujours en visu et uplader des image sans changer de page

Y' a t'il un moyen de contourner ce prolème

Ci-dessous mon fichier siderbar qui comprend 3 parti, la liste des catégorie, la liste des page et l'upload d'image

<div id="nav">
    <div id="navigation">
        <b>Les catégories</b>
            <?php $categories = $this->requestAction(array('controller'=>'categories', 'action'=>'sidebar','admin'=>false)); ?>
                <?php foreach ($categories as $k => $v): $v = current($v);?>    
                <li><?php echo $this->Html->link($v'name'].' ('.$v'post_count'].')',$v'link']);?></li>  
                <?php endforeach;?>
    </div>

    <div id="navigation">
        <b>Page disponible</b>
            <?php $pages = $this->requestAction(array('controller'=>'pages', 'action'=>'menu','admin'=>false)); ?>

            <?php foreach ($pages as $k=>$v): $v = current($v);?>
                <li><?php echo $this->Html->link($v'name'],$v'link']);?></li>
            <?php endforeach;?>
    </div>

                <div id="image">
                    <?php echo $this->element('index');?>
                </div>          

</div>

je vous remerci de votre aide

Cafreunion

Il existe une classe File et une classe Folder intégré dans CakePHP si ça t'intéresse :
http://book.cakephp.org/2.0/fr/core-utility-libraries/file-folder.html

Bonjour,
Merci pour votre réponse mais n'y a t'il pas un moyen plus simple pour gerer ce formaulaire dans un élément
Au pire des cas je serais contrain de le gérer sur autre page ce qui me dérange et alourdi mon projet en nombre d'onglets et du design
je vous remerci pour l'aide que vous pourriez m'"apporter

Cafreunion