IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Bibliothèques et frameworks PHP Discussion :

[I18n] Find ne renvoi aucun résultat [CakePHP]


Sujet :

Bibliothèques et frameworks PHP

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2007
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 27
    Points : 18
    Points
    18
    Par défaut [I18n] Find ne renvoi aucun résultat
    Bonjour à tous,

    Je suis entrain de créer un site internet multilingue pour un de mes clients avec un CMS que j'ai développé grâce à CakePHP. Pour l'internationalisation j'ai suivi le très bon tutoriel de Pierre-Emmanuel Fringant. Pour les urls je n'est pas de soucis, pour l'insertion/édition non plus, le problème est que je ne récupère aucune donnée lorsque j'utilise un findAll alors que ma base de donnée est correctement alimenté.

    J'ai lu pas mal de post sur le forum français de Cakephp mais je n'ai rien trouvé, si cette question à déjà été poster et résolu j'en suis navré mais je ne l'ai trouvé via le moteur de cherche.

    Voici ma table article ainsi que la table pour l'i18n :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    CREATE TABLE `articles` (
      `id` int(3) NOT NULL AUTO_INCREMENT,
      `active` tinyint(1) DEFAULT NULL,
      `active_intro` tinyint(1) DEFAULT NULL,
      `on_homepage` tinyint(1) NOT NULL DEFAULT '0',
      `into_trash` tinyint(1) NOT NULL DEFAULT '0',
      `created` datetime DEFAULT NULL,
      `modified` datetime DEFAULT NULL,
      `category_id` int(3) NOT NULL,
      PRIMARY KEY (`id`)
    )
     
    CREATE TABLE `article_i18ns` (
      `id` int(10) NOT NULL AUTO_INCREMENT,
      `locale` varchar(6) COLLATE utf8_unicode_ci NOT NULL,
      `model` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
      `foreign_key` int(10) NOT NULL,
      `field` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
      `content` text COLLATE utf8_unicode_ci,
      PRIMARY KEY (`id`),
      KEY `locale` (`locale`),
      KEY `model` (`model`),
      KEY `row_id` (`foreign_key`),
      KEY `field` (`field`)
    )
    Voici le contenu des deux tables :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    INSERT INTO `articles` (`id`, `active`, `active_intro`, `on_homepage`, `into_trash`, `created`, `modified`, `category_id`) VALUES
    (1, 1, 0, 1, 0, '2010-04-06 16:10:51', '2010-04-06 16:10:51', 0);
     
    --
    -- Contenu de la table `ns_article_i18ns`
    --
     
    INSERT INTO `article_i18ns` (`id`, `locale`, `model`, `foreign_key`, `field`, `content`) VALUES
    (1, 'fre', 'Article', 1, 'title', 'test fre'),
    (2, 'eng', 'Article', 1, 'title', 'test eng'),
    (3, 'fre', 'Article', 1, 'introduction', ''),
    (4, 'fre', 'Article', 1, 'article', '<p>test fre</p>'),
    (5, 'eng', 'Article', 1, 'article', '<p>test eng</p>');
    Voici le contenu de mes différents fichier :
    {app}/models/article.php
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    <?php
    class Article extends AppModel {
     
        var $name = 'Article';
     
    	var $translateModel = 'ArticleI18n';
     
    	var $actsAs = array(
    		'Translate' => array(
    			'title' => 'Titre',
    			'introduction' => 'Introduction',
    			'article' => 'Article',
    			'link_rewrite' => 'LinkRewrite',
    			'meta_title' => 'MetaTitle',
    			'meta_keyword' => 'MetaKeyWord',
    			'meta_description' => 'MetaDescription'
    		)  
    	);
     
        var $validate = array(
    		'active' => array(
    			'rule' => 'boolean',
    			'required'   => true
    		),
    		'on_homepage' => array(
    			'rule' => 'boolean',
    			'required'   => true
    		),
    		'title' => array(
    			'rule' => 'notEmpty',
    			'required'   => true
    		),
    		'article' => array(
    			'rule' => 'notEmpty',
    			'required'   => true
    		),
    		'category_id' => array('numeric')
    	);
     
    	//The Associations below have been created with all possible keys, those that are not needed can be removed
    	var $belongsTo = array(
    		'Category' => array(
    			'className' => 'Category',
    			'foreignKey' => 'category_id'
    		)
    	);
    }
    ?>
    {app}/controllers/articles_controller.php
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    <?php
    class ArticlesController extends AppController {
     
    	var $name = 'Articles';
     
    	var $components = array('RequestHandler');
     
    	var $paginate = array(
    		'limit' => 25,
    		'order' => array(
    			'Article.title' => 'asc'
    		)
    	);
     
        function index()
        {
                Configure::write('debug', 2);
                debug($this->Article->findAll());
                $this->autoRender = false;
        }
    }
    Lorsque j'affiche la page http://localhost/myapp/fr/articles/index/ voici ce que j'ai comme résultat
    app\controllers\articles_controller.php (line 48)

    Array
    (
    )


    (default) 0 query took ms
    Nr Query Error Affected Num. rows Took (ms)
    Comme vous pouvez le remarquer je n'est aucune requête d'effectué.

    Avez vous une idée de la cause du problème ? Ai-je oublié quelque chose ?

    J'attends vos réponse rapidement (Date limite de livraison du site multilingue vendredi 09/04/2010)

    En vous remerciant d'avance,
    Steven

  2. #2
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2007
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 27
    Points : 18
    Points
    18
    Par défaut
    J'ai continué a chercher la solution et je pense avoir une piste (mais pas la réponse).

    Lorsque je fait un find, voici la requête effectué maintenant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    SELECT 
        `Article`.*, 
        `I18n__title`.`content`, `I18n__introduction`.`content`, `I18n__article`.`content`, `I18n__link_rewrite`.`content`, `I18n__meta_title`.`content`, `I18n__meta_keyword`.`content`, `I18n__meta_description`.`content` 
    FROM 
        `ns_articles` AS `Article` 
    LEFT JOIN 
        `ns_article_i18ns` AS `I18n__title` ON 
            (
                `Article`.`id` = `I18n__title`.`foreign_key` 
                AND `I18n__title`.`model` = 'Article' 
                AND `I18n__title`.`field` = 'title'
            ) 
    LEFT JOIN 
        `ns_article_i18ns` AS `I18n__introduction` ON 
            (
                `Article`.`id` = `I18n__introduction`.`foreign_key` 
                AND `I18n__introduction`.`model` = 'Article' 
                AND `I18n__introduction`.`field` = 'introduction'
            ) 
    LEFT JOIN 
        `ns_article_i18ns` AS `I18n__article` ON 
            (
                `Article`.`id` = `I18n__article`.`foreign_key` 
                AND `I18n__article`.`model` = 'Article' 
                AND `I18n__article`.`field` = 'article'
            ) 
    LEFT JOIN 
        `ns_article_i18ns` AS `I18n__link_rewrite` ON 
            (
                `Article`.`id` = `I18n__link_rewrite`.`foreign_key` 
                AND `I18n__link_rewrite`.`model` = 'Article' 
                AND `I18n__link_rewrite`.`field` = 'link_rewrite'
            ) 
    LEFT JOIN 
        `ns_article_i18ns` AS `I18n__meta_title` ON 
            (
                `Article`.`id` = `I18n__meta_title`.`foreign_key` 
                AND `I18n__meta_title`.`model` = 'Article' 
                AND `I18n__meta_title`.`field` = 'meta_title'
            ) 
    LEFT JOIN 
        `ns_article_i18ns` AS `I18n__meta_keyword` ON 
            (
                `Article`.`id` = `I18n__meta_keyword`.`foreign_key` 
                AND `I18n__meta_keyword`.`model` = 'Article' 
                AND `I18n__meta_keyword`.`field` = 'meta_keyword'
            ) 
    LEFT JOIN 
        `ns_article_i18ns` AS `I18n__meta_description` ON 
            (
                `Article`.`id` = `I18n__meta_description`.`foreign_key` 
                AND `I18n__meta_description`.`model` = 'Article' 
                AND `I18n__meta_description`.`field` = 'meta_description'
            ) 
    WHERE 
        `Article`.`on_homepage` = 1 
        AND `Article`.`active` = 1 
        AND `Article`.`into_trash` = 0 
        AND `I18n__title`.`locale` = 'fre' 
        AND `I18n__introduction`.`locale` = 'fre' 
        AND `I18n__article`.`locale` = 'fre' 
        AND `I18n__link_rewrite`.`locale` = 'fre' 
        AND `I18n__meta_title`.`locale` = 'fre' 
        AND `I18n__meta_keyword`.`locale` = 'fre' 
        AND `I18n__meta_description`.`locale` = 'fre' 
    ORDER BY 
        `I18n__title`.`content` ASC
    Lorsque j'exécute la requete en bdd je n'ai aucun résultat mais si "j'allège" la requête manuelle pour obtenir cette requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    SELECT 
        `Article`.*, 
        `I18n__title`.`content`,  `I18n__article`.`content`
    FROM 
        `ns_articles` AS `Article` 
    LEFT JOIN 
        `ns_article_i18ns` AS `I18n__title` ON 
            (
                `Article`.`id` = `I18n__title`.`foreign_key` 
                AND `I18n__title`.`model` = 'Article' 
                AND `I18n__title`.`field` = 'title'
            )
    LEFT JOIN 
        `ns_article_i18ns` AS `I18n__article` ON 
            (
                `Article`.`id` = `I18n__article`.`foreign_key` 
                AND `I18n__article`.`model` = 'Article' 
                AND `I18n__article`.`field` = 'article'
            ) 
    WHERE 
        `Article`.`on_homepage` = 1 
        AND `Article`.`active` = 1 
        AND `Article`.`into_trash` = 0 
        AND `I18n__title`.`locale` = 'fre' 
        AND `I18n__article`.`locale` = 'fre' 
    ORDER BY 
        `I18n__title`.`content` ASC
    J'obtient bien mon résultat :
    id = 1
    active = 1
    active_intro = 0
    on_homepage = 1
    into_trash = 0
    created = 2010-04-06 16:10:51
    modified = 2010-04-06 16:10:51
    category_id = 0
    content = "test fr"
    content = " <p>test fr</p>"
    Avez vous une idée pour que la requête généré par cakephp soit correct ?

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2007
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 27
    Points : 18
    Points
    18
    Par défaut
    Bonjour,
    J'ai enfin trouvé la solution.
    Lorsque d'un utilisateur arrive sur ma page d'ajout d'article il y a un test pour savoir si je doit activer le chapô ou non. Si le chapô n'est pas activé le champ n'était simplement pas affiche dans le formulaire.
    Hors lorsque CakePHP effectue la requête de selection, il fait essai de l'extraire de la bdd.

    Pour corriger le programme j'ai ajout ceci à mon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    <?php
    if($allow_intro==1)
    {			
        // On récupère les éventuelles traductions existantes :
        $introduction = Set::combine($this->data['Introduction'], '{n}.locale', '{n}.content');
     
        echo '<div class="field-mutli">';
            echo '<div class="locale">';
     
                foreach(Configure::read('Config.languages') as $codeLang => $locale)
                {
                    echo $form->input(
                        'Article.introduction.'.$locale,
                        array(
                            'label' => __('Introduction :', true),
                            'value' => isset($introduction[$locale]) ? $introduction[$locale] : '',
                            'class'=>'active-tinymce'
                        )
                    );
                }
            echo '</div>';
     
            echo '<div class="flags">';
                echo '<p class="explication">',__('Veuillez choisir une langue :', true),'</p>';
                foreach(Configure::read('Config.languages') as $codeLang => $locale)
                {					
                    echo '<a href="#'.$codeLang.'" rel="Article.introduction.'.$locale.'" class="ns-widget ns-lang">', $html->image('/img/flags/'.$codeLang.'.gif'), '</a>';
                }
            echo '</div>';
        echo '</div>';
     
    }
    else
    {
        echo $form->input('active_intro', array('type'=>'hidden', 'value'=>0));
        $introduction= Set::combine($this->data['Introduction'], '{n}.locale', '{n}.content');
        foreach(Configure::read('Config.languages') as $codeLang => $locale)
        {
            echo $form->input(
                'Article.introduction.'.$locale,
                array('label' => false, 'type' => 'hidden', 'value' => isset($introduction[$locale]) ? $introduction[$locale] : '')
            );
        }
    }
    ?>
    J'espère que cela pourra aidé quelqu'un dans le futur.

    Cordialement,
    Steven

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [RegEx] Syntaxe qui ne renvoie aucun résultat
    Par dut-dut dans le forum Langage
    Réponses: 4
    Dernier message: 24/12/2014, 00h53
  2. Réponses: 2
    Dernier message: 24/02/2010, 09h01
  3. Code de calcul qui ne renvoie aucun résultat
    Par joniyyy dans le forum Langage
    Réponses: 9
    Dernier message: 04/10/2008, 19h33
  4. Tester si une requête renvoie un résultat
    Par dl_jarod dans le forum ASP
    Réponses: 4
    Dernier message: 13/10/2005, 15h48
  5. PSQLException "Aucun résultat retourné par la requête&q
    Par BRAUKRIS dans le forum PostgreSQL
    Réponses: 3
    Dernier message: 15/09/2005, 20h55

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo