Bonjour à tous.

Je me prends mais trop méchament le chous a faire a mettre en place le plugin Media, alors que je l'ai fait facilement pour une autre application.

Je veux mettre en place le Plugin Madia de Grafikart
Texte du lien

Ca fait 3 h, que je suis dessus.

Dans mon applic ou ca ne marche pas, j'ai fait ceci

  1. Coller le plugin Media dans /app/plugin/Media/

  2. Dans appController, j'a ajouter le Helper

    public $helpers = array('Html','Text','Form','Session','Date','Cache','Subcategories','Image.Image','Media.Media');

  3. Dans boostrap.php j'ai activé le plugin

    CakePlugin::load('Media');

  4. Dans appController, j'ai ajouter cette fonction

    function canUploadMedias($model,$id){
    return true;
    }

Il y a des chances que mon problème vient du model.

Dans l'application qui marche, mon model est simple. Voici:

<?php
class Topic extends AppModel {
    public $actsAs = array(
        'Media.Media' => array(
            "path"=>"/files/Images/Topics/%id/%f",
            "max_width"=>1500,
            "max_height"=>1500,
            "limit"=>4
        )
    );

}

Je vais décrire ce qu'il ne fonctionne pas, plus bas.

Dans le l'application qui ne marche pas mon modele est beaucoup pluis gros et il fait deja une liasion avec la table ArticleTag.

Je met tout le code, mais je pense que ce qu'il nous intéresse c'est le début, particulierement $actsAs, $hasMany, $belongTo etc

<?php
class Article extends AppModel{
    public $actsAs = array(
        'Containable',
        'Media.Media' => array(
            "path"=>"/files/Images/Articles/%id/%f",
            "max_width"=>1500,
            "max_height"=>1500,
            "limit"=>5
        ));

    // Création d'un liasons
    // DECI EFFACERA LE CAMPS DU TABLEAU MEDIAS ASSOCIE AU ARTICLE_ID
    // Nous sommes dans les article. Si dessous, il va associé l'id du article, automatiquement avec le champs article_id du tableau medias.
    public $hasMany =array(
        'ArticleTag'
        );
    // Permet d'enregistrer dans la table Tag et Categorie, le nombre de Article qui sont enregistré avec la categorie ou un tag
    public $belongsTo = array(
            'Category' => array(
                'counterCache' => array(
                    'article_count' => array(
                        'Article.online' => 1,
                        'Article.created <= NOW()'
                        )
                )
            )//,
            //'Search' // Added for the search module
    );
    public $hasAndBelongsToMany = array('Tag');
    // Permet de classer par date. Mais dans mon cas, ceci est fait dans ArticlesController sous admin_edit
    //public $order = 'Article.created DESC';
    //MyQL Arrete de faire des requetes recursive
    public $recursive = -1;

    // Règle de validation
    public $validate = array(
        'slug' => array(
            'rule' =>'/^[A-z0-9éàèäëïöüâêîôû \-]+$/',
            'allowEmpty'=> true,
            'message'   => "Slug n'est pas valable"
            ),
        'noarticle' => array(
            'rule' => 'isUnique',
            'allowEmpty'=> false,
            'message'   => "Ce numéro d'article existe déjà"
            ),
        'width' => array(
            'rule' =>'/^[0-9.]+$/',
            'allowEmpty'=> true,
            'message'   => "La largeur doit être numérique"
            ),
        'name'  => array(
            'rule' =>'notEmpty',
            'message'   => "Titre/nom obligatoire"
            ),
        // This is for the field in the thumbail.ctp (basket)
        'numberof' => array(
            'rule' => 'notEmpty',
            'allowEmpty' => false,
            'message'   => "Nombre d'article est obligatoire"
            ),
        'image' => array(
            'rule' =>'/.jpg$/', // /\/index$/
            'allowEmpty' => true,
            'message' => "Le nom doit avoir l'extention .jpg"
            )
    );

    /**
    * Permet de générer / recupérer un brouillon
    **/
    public function getDraft($type){
        $article = $this->find('first', array(
            'conditions'=>array(
                        'online'=> -1,
                        'type'=>$type
                        )
            ),false);
        if(empty($article)){
            $this->save(array(
                'type'=>$type,
                'online'=> -1,
                'user_id' => authComponent::user('id')
                )
            );
            $article = $this->read();
        }
        $article'Article']'online']=0;
        return $article;

    }
    public function afterFind($data,$primary=false){

        foreach($data as $k => $d){
            if(isset($d'Article']'slug']) && isset($d'Article']'id']) && isset($d'Article']'type']) ){
                $d'Article']'link']=array(
                    'controller'    =>Inflector::pluralize($d'Article']'type']),
                    //'controller'  =>'pages',
                    'action' =>'show',
                    'id' =>$d'Article']'id'],
                    'slug' =>$d'Article']'slug']
                    );
            }
            $data$k] = $d;
        }

        return $data;
    }
    public function beforeSave($option=array()){
        // Règle de validation
        if(!empty($this->data'Article']'slug'])){
            $this->data'Article']'slug'] = strtolower(Inflector::slug($this->data'Article']'slug'],'-'));
        }else if(empty($this->data'Article']'slug']) && isset($this->data'Article']'slug']) && !empty($this->data'Article']'name'])){
            // Creation of slug with pagetitle
            $this->data'Article']'slug'] = strtolower(Inflector::slug($this->data'Article']'name'],'-'));

        }
        return true;
    }
    // More comment are in /Model/page.php
    public function afterSave($created,$option=array()){
        // Pour la gestion des tag
        if(!empty($this->data'Article']'tags'])){
            // place les tag sous form d'array
            $tags = explode(',',$this->data'Article']'tags']);
            // Parcours l'array
            foreach($tags as $tag){
                // supprime les espaces et tout en minuscule
                $tag = strtolower(trim($tag));
                // Si Tag a une valeur
                if(!empty($tag)){
                    // Cherche sans la table tag s'il y a une valeur equiv.
                    $d = $this->Tag->findByName($tag);
                    // Si d est vide
                    if(!empty($d)){
                        $this->Tag->id = $d'Tag']'id'];
                    }else{
                        // Réinitialise le modele
                        $this->Tag->create();
                        // Fais uen insertion
                        $this->Tag->save(array(
                            'name' => $tag,
                            'type' => 'articles'
                        ));
                    }
                    // Controle s'il n'y a pas de similitude dans Pagetag et stoek dans la variable
                    $hasTag = $this->ArticleTag->find('first',array(
                        'conditions' => array(
                            'article_id' => $this->id,
                            'tag_id' => $this->Tag->id
                        )
                    ));
                    if(empty($hasTag)){
                        $this->ArticleTag->create();
                        $this->ArticleTag->save(array(
                            'article_id'=> $this->id,
                            'tag_id' => $this->Tag->id
                        ));
                    }
                }
            }
            return true;
        }
    }
}

Ce que je ne comprends pas c'est que dans le controller de mon application qui fonctionne et que je fait un debug de $d

public function member_index($id=null) {

        $this->paginate = array('Topic'=>array('limit'=>10,'order'=>'name DESC'));
        $d'topics']=$this->Paginate('Topic',array());       
        debug($d);
        $this->set($d);

    }

il m'affiche
un 'thumb'
un 'Thumb' et
un 'Media'

'topics' => array(
        (int) 0 => array(
            'Topic' => array(
                'id' => '9',
                'name' => 'Stnal landslide inventories',
                'keywords' => 'Shallow lan',
                'content' => '<p>Around the s',
                'contact1' => 'jonas.vonruette@env.ethz.ch',
                'contact2' => 'peter.lehmann@env.ethz.ch',
                'contact3' => '',
                'contact4' => '',
                'media_id' => '12',
                <strong>'thumb' => '/files/Images/Topics/9/IMG_0729.jpg'</strong>
            ),
            'Thumb' => array(
                'id' => '12',
                'ref' => 'Topic',
                'ref_id' => '9',
                'file' => '/files/Images/Topics/9/IMG_0729.jpg',
                'position' => '0',
                'type' => 'pic',
                'icon' => '/files/Images/Topics/9/IMG_0729.jpg'
            ),
            'Media' => array(
                (int) 12 => array(
                    'id' => '12',
                    'ref' => 'Topic',
                    'ref_id' => '9',
                    'file' => '/files/Images/Topics/9/IMG_0729.jpg',
                    'position' => '0',
                    'type' => 'pic',
                    'icon' => '/files/Images/Topics/9/IMG_0729.jpg'
                )
            )
        ),

alors que dans l'application qui ne fonctionne pas, je fais un debug de $d, comme-ceci:

function index(){
        $this->Article->contain('Tag'); // Ceci a été ajouté pour la jointure des tag (ArticlessTags)
        $this->paginate = array('Article'=>array('limit'=>'12','order'=>'created DESC, name ASC'));
        $d'articles'] = $this->Paginate('Article',array('type'=>'article','online'=>1,'created <= NOW()'));
        $this->Session->write('Page.description',__("Articles et accessoires de sport. Mobilier urbain et les équipements pour collectivités."));
        $this->Session->write('Page.keywords',__("mobilier,urbain,equipements,collectivités,sport,accessoires"));
debug($d);
        $this->set($d);
        $this->render('thumbnails');
    }

Il m'affiche ceci. pas de Media, pas de Thumb etc.

'articles' => array(
        (int) 0 => array(
            'Article' => array(
                'id' => '4',
                'category_id' => '1',
                'untergruppe' => '',
                'name' => 'Huile magique',
                'showcatDEL' => true,
                'slug' => 'huile-magique',
                'content' => '<p><strong>Lorem ipsum dolor sit amet, consectetur </strong><br /> Encididunt ut labore et dolore magna aliqua. Ut ser enim ad minim veniam, quis nostrud exercitation lro ullamco laboris nisi ut aliquip ex ea commodo con sequat lorem ports amet sren stre. Encididunt ut labore et dolore mag.</p>',
                'type' => 'article',
                'created' => '2014-02-14 01:33:27',
                'online' => '1',
                'user_id' => '2',
                'noarticle' => '04',
                'width' => null,
                'height' => null,
                'thickness' => null,
                'volume' => null,
                'attribut' => '',
                'media_id' => null,
                'price' => '100',
                'catpage' => '',
                'link' => array(
                    'controller' => 'articles',
                    'action' => 'show',
                    'id' => '4',
                    'slug' => 'huile-magique'
                )
            ),
            'Tag' => array()
        ),

Un peu comme sîl ne faisait la liaison avec Tag.

Je n'arrive pas comprendre pourquoi et j'ai pourtant fait et refait le tour sans succes.

Voyez-vous un truc qui ne colle pas?

J'espère que vous pourrez m'aider avec les info que je donne.

6 réponses


Question bête, mais est-ce que ta table Medias contient bien les enregistrements appropriés ?

Peut-être as-tu mal installé ou configuré le plugin, qui du coup nuit au fonctionnement global des models qui l'utilisent.

Hello!
Ben j'ai vérifié les deux tables des deux applications et elles sont identique.

Aussi j'ai résolu mon problème sans le résoudre!!!

Dans mon action index de l'application de ne fonctionne pas j'a ajouter ceci

$this->Article->contain('Tag','Media');

soit

function index(){
        $this->Article->contain('Tag','Media'); // Ceci a été ajouté pour la jointure des tag (ArticlessTags)
        $this->paginate = array('Article'=>array('limit'=>'12','order'=>'created DESC, name ASC'));
        $d'articles'] = $this->Paginate('Article',array('type'=>'article','online'=>1,'created <= NOW()'));
        $this->Session->write('Page.description',__("Articles et accessoires de sport. Mobilier urbain et les équipements pour collectivités."));
        $this->Session->write('Page.keywords',__("huile,massage"));
#debug($d);
        $this->set($d);
        $this->render('thumbnails');
    }

Mais pour moi c'est pas la solution, car dans la video il est dit que la liaison se faisait automatiquement.
Je me demande, si la liaison avec Tag, ne cause pas un trouble avec la nouvelle liaison avec Media

De plus, dans l'application qui fonctionne, j'ai pas eu besoin d'ajouter ceci

$this->Article->contain('Tag','Media');

//public $components = array('Paginator');
    public function member_index($id=null) {

        $this->paginate = array('Topic'=>array('limit'=>10,'order'=>'name DESC'));
        $d'topics']=$this->Paginate('Topic',array());       
        #debug($d);
        $this->set($d);

    }

Peut-être une piste à creuser dans le model : si tu définis les tag directement dans le containable, tu n'as plus besoin de les gérer en surcouche avec contain lorsque tu initialise ton objet Article.

Y a pas mal de soucis d'héritages pseudo automatiques qui sautent quand on met en place une surcouche.

Sur tes autres projets, tu as également ajouté les Tags ? Et via Contain ?

Sur tes autres projets, tu as également ajouté les Tags ? Et via Contain ? <
Non, justement pas!! Topics n'a pas de liaisons

si tu définis les tag directement dans le containable, tu n'as plus besoin de les gérer en surcouche avec contain lorsque tu initialise ton objet Article. <
Oups, pas trop compris. Si je défini le Tag dans mon modele Article, donc? au lieu de mettre

$this->Article->contain('Tag','Media');

Hello,
je confirme que mon Media été configuré correctement.
Je viens de le mettre en place, (sur l'application qui cause problème), mais pour un autre controller GalleriesController.

Donc le problème vient bien du cotze du model Articles.php et le controller ArticlesController, que malheureusement, je ne trouve pas.

ArtcilesController

function index(){
        $this->Article->contain('Tag');
        $this->paginate = array('Article'=>array('limit'=>'12','order'=>'created DESC, name ASC'));
        $d'articles'] = $this->Paginate('Article',array('type'=>'article','online'=>1,'created <= NOW()'));
#debug($d);
        $this->Session->write('Page.description',__("Articles et accessoires de sport. Mobilier urbain et les équipements pour collectivités."));
        $this->Session->write('Page.keywords',__("huile,massage"));

        $this->set($d);
        $this->render('thumbnails');
    }

Articles.php

<?php
class Article extends AppModel{

    public $actsAs = array(
        'Containable',
        'Media.Media' => array(
            "path"=>"/files/Images/Articles/%id/%f",
            "max_width"=>1500,
            "max_height"=>1500,
            "limit"=>5
        ));

    // Création d'un liasons
    // DECI EFFACERA LE CAMPS DU TABLEAU MEDIAS ASSOCIE AU ARTICLE_ID
    // Nous sommes dans les article. Si dessous, il va associé l'id du article, automatiquement avec le champs article_id du tableau medias.
    public $hasMany =array(

        'ArticleTag'
        );
    // Permet d'enregistrer dans la table Tag et Categorie, le nombre de Article qui sont enregistré avec la categorie ou un tag
    public $belongsTo = array(
            'Category' => array(
                'counterCache' => array(
                    'article_count' => array(
                        'Article.online' => 1,
                        'Article.created <= NOW()'
                        )
                )
            )//,
            //'Search' // Added for the search module
    );

    public $hasAndBelongsToMany = array('Tag');

    // Permet de classer par date. Mais dans mon cas, ceci est fait dans ArticlesController sous admin_edit
    //public $order = 'Article.created DESC';

    //MyQL Arrete de faire des requetes recursive
    public $recursive = -1;

    // Règle de validation
    public $validate = array(
        'slug' => array(
            'rule' =>'/^[A-z0-9éàèäëïöüâêîôû \-]+$/',
            'allowEmpty'=> true,
            'message' => "Slug n'est pas valable"
            ),
        'noarticle' => array(
            'rule' => 'isUnique',
            'allowEmpty'=> false,
            'message' => "Ce numéro d'article existe déjà"
            ),
        'width' => array(
            'rule' =>'/^[0-9.]+$/',
            'allowEmpty'=> true,
            'message' => "La largeur doit être numérique"
            ),
        'name' => array(
            'rule' =>'notEmpty',
            'message' => "Titre/nom obligatoire"
            ),
        // This is for the field in the thumbail.ctp (basket)
        'numberof' => array(
            'rule' => 'notEmpty',
            'allowEmpty' => false,
            'message' => "Nombre d'article est obligatoire"
            ),
        'image' => array(
            'rule' =>'/.jpg$/', // /\/index$/
            'allowEmpty' => true,
            'message' => "Le nom doit avoir l'extention .jpg"
            )
    );

    /**
    * Permet de générer / recupérer un brouillon
    **/
    public function getDraft($type){
        $article = $this->find('first', array(
            'conditions'=>array(
                        'online'=> -1,
                        'type'=>$type
                        )
            ),false);

        if(empty($article)){
            $this->save(array(
                'type'=>$type,
                'online'=> -1,
                'user_id' => authComponent::user('id')
                )
            );
            $article = $this->read();
        }

        $article'Article']'online']=0;
        return $article;

    }

    public function afterFind($data,$primary=false){

        foreach($data as $k => $d){
            if(isset($d'Article']'slug']) && isset($d'Article']'id']) && isset($d'Article']'type']) ){
                $d'Article']'link']=array(
                    'controller' =>Inflector::pluralize($d'Article']'type']),
                    //'controller' =>'pages',
                    'action' =>'show',
                    'id' =>$d'Article']'id'],
                    'slug' =>$d'Article']'slug']
                    );
            }
            $data$k] = $d;
        }

        return $data;
    }

    public function beforeSave($option=array()){
        // Règle de validation

        if(!empty($this->data'Article']'slug'])){
            $this->data'Article']'slug'] = strtolower(Inflector::slug($this->data'Article']'slug'],'-'));
        }else if(empty($this->data'Article']'slug']) && isset($this->data'Article']'slug']) && !empty($this->data'Article']'name'])){
            // Creation of slug with pagetitle
            $this->data'Article']'slug'] = strtolower(Inflector::slug($this->data'Article']'name'],'-'));

        }

        return true;
    }

    // More comment are in /Model/page.php
    public function afterSave($created,$option=array()){
        // Pour la gestion des tag
        if(!empty($this->data'Article']'tags'])){
            // place les tag sous form d'array
            $tags = explode(',',$this->data'Article']'tags']);
            // Parcours l'array
            foreach($tags as $tag){
                // supprime les espaces et tout en minuscule
                $tag = strtolower(trim($tag));
                // Si Tag a une valeur
                if(!empty($tag)){
                    // Cherche sans la table tag s'il y a une valeur equiv.
                    $d = $this->Tag->findByName($tag);
                    // Si d est vide
                    if(!empty($d)){
                        $this->Tag->id = $d'Tag']'id'];
                    }else{
                        // Réinitialise le modele
                        $this->Tag->create();
                        // Fais uen insertion
                        $this->Tag->save(array(
                            'name' => $tag,
                            'type' => 'articles'
                        ));
                    }

                    // Controle s'il n'y a pas de similitude dans Pagetag et stoek dans la variable
                    $hasTag = $this->ArticleTag->find('first',array(
                        'conditions' => array(
                            'article_id' => $this->id,
                            'tag_id' => $this->Tag->id
                        )
                    ));

                    if(empty($hasTag)){
                        $this->ArticleTag->create();
                        $this->ArticleTag->save(array(
                            'article_id'=> $this->id,
                            'tag_id' => $this->Tag->id
                        ));
                    }
                }
            }
            return true;
        }
    }

}

As-tu des modèles liés à ton modèle Gallery en dehors des Medias ?

Je pense que le "problème" vient vraiment de contain. Si tu passes la récursivité du model à 1 et que tu vires le contain de ton controller, tu as du mieux ?