cakephp jour 2 message d'erreur: current() ....

Par guiom, il y a 14 ans


Bonjour,
je viens de finir le tuto faire un site avec cakephp jour2.
J'ai pu constater en lisant les commentaires sous la vidéo que je ne suis pas le seul a avoir ce problème.

Lorsque je veux uploader une image via une url, j'ai le message suivant qui apparaît:
current() expects parameter 1 to be array, boolean given [APP/Controller/MediasController.php, line 74]

Je n'arrive pas à trouver ce qui cloche je fais donc appel à votre aide.
Voila mon fichier MediasController.php

<?php 
class MediasController extends AppController
    {
        public $components = array('Img') ;
        public function beforeFilter()
            {
                parent::beforeFilter();
                $this->layout = 'modal';
            }
        function admin_index($post_id)
            {
                if($this->request->is('post'))
                    {                   
                        $data = $this->request->data'Media'];
                        if(isset($data'url']))
                            {
                                $this->redirect(array('action'=>'show','?class=&alt=&src='.urlencode($data'url'])));
                            }
                        $dir = IMAGES.date('Y');
                        If(!file_exists($dir))
                                mkdir($dir,0777);
                                $dir .= DS.date('m');
                        If(!file_exists($dir))
                                mkdir($dir,0777);
                        $f = explode('.', $data'file']'name']);
                        $ext = '.'.end($f);
                        $filename = strtolower(Inflector::slug(implode('.',array_slice($f,0,-1)),'-'));
                        //Sauvegarde Bdd

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

                            ));

                        if($success)
                            {
                                move_uploaded_file($data'file']'tmp_name'], $dir.DS.$filename.$ext);
                                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 pas au bon format","notif",array('type'=>'error'));
                            }
                    }
                $d = array();
                $d'medias'] = $this->Media->find('all',array('conditions' =>array('post_id' => $post_id)
                ));
                $d'formats']= Configure::read('Media.formats');
                $this->set($d);
            }
        function admin_show($id=null,$format='')
            {
                $d = array();
                if($this->request->is('post'))
                    {
                        $this->set($this->request->data'Media']);
                        $this->layout = false;
                        $this->render('tinymce');
                        return;
                    }
                if($id)
                    {
                        $this->Media->id = $id;
                        $media = current($this->Media->read());
                        $d'src'] = Router::url('/img/'.$media'url'.$format]);
                        $d'alt'] = $media'name'];   
                        $d'class'] = 'alignLeft';       
                    }
                else
                    {
                        $d = $this->request->query;
                        $d'src'] = urldecode($d'src']);

                    }
                    $this->set($d);
            }
        function admin_delete($id)
            {
                $this->Media->id = $id;
                $file = $this->Media->field('url');
                unlink(IMAGES.DS.$file);
                $f = explode('.', $file);
                $ext = '.'.end($f);
                $file = implode('.',array_slice($f,0,-1));
                debug($filename);
                foreach(glob(IMAGES.DS.$file.'_*.jpg') as $v)
                    {
                        unlink($v);
                    }
                $this->Media->delete($id);
                $this->Session->setFlash("L'image a bien été supprimée","notif");
                $this->redirect($this->referer());

            }
    }

 ?>

Quand je compare l'url transmise dans la barre de navigation voila à quoi elle ressemble:
http://localhost/tuto/admin/medias/show/%3Fclass%3D%26alt%3D%26src%3Dhttp%253A%252F%252Fwww.grafikart.fr%252Fimg%252Ftutos%252Fthumbs%252F259\_205x100.jpg
alors que dans la vidéo elle ressemble à un truc du genre:
http://localhost/tuto/admin/medias/show/?class=alt=src=http://Fwww.grafikart.fr/img/tutos/thumbs/259\_205x100.jpg

Ce que je peux remarquer en plus c'est que la requette passée est :SELECT Media.id, Media.name, Media.url, Media.post\_id, Media.type FROM medias AS Media WHERE Media.id = '?class=&alt=&src=http%3A%2F%2Fwww.grafikart.fr%2Fimg%2Ftutos%2Fthumbs%2F259_205x100.jpg' LIMIT 1
Il cherche un id qui n'existe pas.

Merci d'avance pour votre aide.

Cordialement.

6 réponses

guiom, il y a 14 ans

Merci beaucoup problème résolu, j'espère que la réponse pourra être utile a d'autres personnes.

Au passage les tutos sont super.

Grafikart, il y a 14 ans

Remplace
if($id)
par
if(is_numeric($id))

Dans ta fonction show

ccvf3s, il y a 13 ans

merci ;)

gato, il y a 13 ans

Avec Cake php 2.2.1, au lieu d'écrire :

$this->redirect(array('action'=>'show','?class=&alt=&src='.urlencode($data'url'])));

on peut mettre :

$this->redirect(array('action' => 'show', '?' => array('class' => '', 'alt' => '', 'src' => urlencode($data'url']))));

Ça me semble plus propre et on a pas besoin de mettre le if(is_numeric($id))

J'ai trouvé cette réponse dans les commentaires de la vidéo.

duffJohn, il y a 13 ans

Super merci pour le tuyau gato :)

Thepastisboy, il y a 13 ans

J'ai palié à cette erreur en utilisant un findBy

function admin_show($id = null, $format = ''){
        $d = array();

        if($this->request->is('post')){
            $this->set($this->request->data'Media']);
            $this->layout = false;
            $this->render('tinymce');
            return;
        }
        if($id && is_numeric($id)){
            $this->Media->$id = $id;
            $media=$this->Media->findAllById($id);
            $d'src'] = Router::url('/img/'.$media[0]'Media']'url'.$format]);
            $d'alt'] = $media[0]'Media']'name'];
            $d'class'] = 'alignLeft';
        }else{
            $d = $this->request->query;
            $d'src'] = urldecode($d'src']);
        }
        $this->set($d);

    }