Bonjour,
Je veux sauvegarder plusieurs local (langues) dans la Basse de donnée. CakePhp panique car je luis demande de sauvegarder un tableau. Il m'affiche une erreur suivante :

Database Error

SQL Query: INSERT INTO radio.r\_tracks (name, slug, album, description, sc, created) VALUES ('teste', 'sss', 'sss', Array, '123', '2014-05-07 21:33:09')

Pour forcer Cakephp à savegarder la local Fra et Eng j'utilise la fonction local :

$this->Track->locale = Configure::read('Config.languages');

Voici le débug des données.

Track' => array(
        'id' => '',
        'name' => 'Escape',
        'slug' => 'escape',
        'album' => 'teste',
        'description' => array(
            'fra' => 'Je suis français',
            'eng' => 'I'm english'
        ),
        'sc' => '123'
    )

Merci de votre aide.

9 réponses


lakamark
Auteur
Réponse acceptée

J'ai désactiver les règle de validations et sa fonctionne étrange....

ben serialize au moment de sauvegarder, et unserialize quand tu récupères !
http://www.php.net/manual/en/function.serialize.php

lakamark
Auteur

if($this->Track->save(serialize($this->request->data),true)){
}

Je regarde dans ma Basse de donnée il les donnée ne se sont pas enregistré.

Ca n'a rien a voir.
Je ne connais pas cake, donc je peux pas t'aider pour l'enregistrement, mais serialize retourne une chaine de caractère, donc peut etre enregistré en bdd.
En l'occurence, ton Track ressemble a ceci:

$Track = array(
'id' => '',
'name' => 'Escape',
'slug' => 'escape',
'album' => 'teste',
'description' => array(
    'fra' => 'Je suis francais',
    'eng' => 'I\'m english'
    ),
'sc' => '123'
);
$Track_S = serialize($Track);
echo $Track_S . "<br /><br />";
print_r(unserialize($Track_S));

Pour ce qui est de l'enreigstrement tu te foires ailleurs, mais je peux pas te dire ou.

Ce qu'il te faut ici c'est comme l'a dit @Vallyan, serializer les donnes de ton tableau description.
Supposons que tu ai le tableau suivant :

// Contenu de $this->request->data
Track' => 
    'id' => '',
    'name' => 'Escape',
    'slug' => 'escape',
    'album' => 'teste',
    'description' => 
        'fra' => 'Je suis français',
        'eng' => 'I'm english'
    ],
    'sc' => '123'
]

tout ce que tu as a faire c'est serializer le tableau de description avant insertion dans la base :

$data = $this->request->data;
$data'Track']'description'] = serialize($data'Track']'description']);
if($this->Track->save( $data, true ))
{
    // code apres sauvegarde
}

Enfin pour recuperer le tout, il suffit de faire :

$track = $this->Track->find('first', 
    'conditions' => 'id' => 1]
]);
$descriptions = unserialize( $track'Track']'description'] ); // Retourne un tableau
lakamark
Auteur

Dans ma table r_i18n (la table de traduction) j'ai deux enregistrement avec la local fra. Le résultat que je veux avoir c'est deux enregistrements une en eng et une en fra qui contient le contenu en français pour la local fra et le contenu en anglais pour la local eng. Dans le tutoriel de grafikart ça fonctionne sans que je suis obligé d'utiliser la fonction serialize()

C'est pourtant pas compliqué ...

  • La variable TRACK est un array, et tu veux enregistrer chaque valeur de cet array dans des champs d'une table (une valeur par champ ... jusque la tout va bien)
  • MAIS l'une de ces valeur est aussi un array.
  • OR: tu ne PEUX PAS enregistrer un array PHP dans un champ de bdd !!!!!
  • DONC:
    * SOIT tu convertis cet array en une chaine de caractère avec la fonction serialize() pour pouvoir faire la sauvegarde dans un champ 'text'
    * SOIT tu fais une autre table dans ta base de donnée et tu requêtes avec un join. Cet autre table s'appellerait par exemple track\_desc, et aurait les champs id, fr et en.
    * Note que faire deux entrée dans ta table r\_tracks une avec une desc en fr et un avec un desc en anglais <u>n'est pas une bonne méthode</u> puisque tu te retrouves a dupliquer toutes les autres valeurs. S'il y en a a changer par la suite c'est source d'erreurs
lakamark
Auteur

Voici la solution que j'ai trouver à mon problème :
http://fr.openclassrooms.com/forum/sujet/cakephp-2-internationalisation