Bonjour bonjour,
Voila nouvelle question existentielle sur le tuto MVC : j'ai un adhérent qui pendant son inscription doit cocher une ou plusieurs checkbox puis il valide son formulaire et c'est terminé.
Mon problème est que je n'arrive pas à gérer les checkbox multiples, il me retourne un array vide... alors que si j'ai
name="id_spec"
il me retourne bien la valeur du dernier checkbox coché...
Un petit coup de main s'il vous plait ^^
Voila le code(simplifié) du formulaire partie checkbox :
Architecture <input id="id_spec_1" type="checkbox" value="1" name="id_spec]">
Catalogue / VPC <input id="id_spec_2" type="checkbox" value="2" name="id_spec]">
Corporate <input id="id_spec_3" type="checkbox" value="3" name="id_spec]">
Et voila le code ma fonction membres_spec()
/ **********************************
* Permet à l'adhérent d'ajouter
* sa ou ses spécialités
* ainsi que sa zone d'intervention
*********************************** /
function membres_spec($id) {
//Vérification que l'id passé en paramètre existe et que le compte a bien été activé
$this->loadModel('User');
if($this->request->data)
{
$user = $this->User->findFirst(array(
'conditions' => array('id' => $id, 'active' => 1, 'role' => 'membre')
));
if(!empty($user))
{
$this->loadModel('Adh_spec');
if($this->Adh_spec->validates($this->request->data))
{
//Le compte existe bien, on ajoute les infos dans la table associative Adh_spec
$id_spec = $_POST'id_spec'];
for ($i=0; $i<count($id_spec); $i++){
$this->request->data->id_adherent = $id;
$this->request->data->id_spec = $id_spec$i];
$this->Adh_spec->save($this->request->data);
}
$this->Session->setFlash('Vous pouvez maintenant utiliser vos identifiants pour vous connecter à votre compte.');
$this->redirect('users/login');
}
}
else
{
$this->Session->setFlash('Désolé, mais votre compte n\'existe pas ou n\'a pas été activé.','error');
}
}
}
Pour info : Adh_spec est une table de liaison entre la table users et la tables specialites.
Merci d'avance pour votre aide :)
Alors...moi reine du royaume du Blasé ! J'ai réglé mon problème sans vraiment le comprendre.
Dans ma fonction membres_spec, je récupérai les id_spec (checkbox multiples) dans une variable :
$id_spec = $_POST'id_spec'];
Et comme ça c'est vu, il m'était impossible de récupérer le tableau de checkbox.
J'ai contourné le problème en utilisant $_REQUEST.
$id_spec = $_REQUEST'id_spec'];
Et maintenant je récupère bien mon tableau avec les valeurs des checkbox cochées, et pas de problème pour l'insertion en base de données.
Peut-être ça aidera quelqu'un et merci à ceux qui m'ont aidés ^^
Hello merci de ton attention! ^^
Voila le résultat du debug sur $_POST :
Array
(
[id] =>
[id_spec] => Array
[zone] => 50
)
et le résultat du debug de $this->request->data qui retourne le meme résultat :
stdClass Object
(
[id] =>
[id_spec] => Array
[zone] => 50
)
Et voila le code de Model.php :
<?php
class Model{
static $connections = array();
public $conf = 'default';
public $table = false;
public $db;
public $primaryKey = 'id';
public $id;
public $errors = array();
public $form;
public $validate = array();
/**
* Permet d'initialiser les variable du Model
**/
public function __construct(){
// Nom de la table
if($this->table === false){
$this->table = strtolower(get_class($this)).'s';
}
// Connection à la base ou récupération de la précédente connection
$conf = Conf::$databases$this->conf];
if(isset(Model::$connections$this->conf])){
$this->db = Model::$connections$this->conf];
return true;
}
try{
$pdo = new PDO(
'mysql:host='.$conf'host'].';dbname='.$conf'database'].';',
$conf'login'],
$conf'password'],
array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8')
);
$pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_WARNING);
Model::$connections$this->conf] = $pdo;
$this->db = $pdo;
}catch(PDOException $e){
if(Conf::$debug >= 1){
die($e->getMessage());
}else{
die('Impossible de se connecter à la base de donnée');
}
}
}
/**
* Permet de valider des données
* @param $data données à valider
**/
function validates($data){
$errors = array();
foreach($this->validate as $k=>$v){
if(!isset($data->$k)){
$errors$k] = $v'message'];
}else{
if($v'rule'] == 'notEmpty'){
if(empty($data->$k)){
$errors$k] = $v'message'];
}
}elseif(!preg_match('/^'.$v'rule'].'$/',$data->$k)){
$errors$k] = $v'message'];
}
}
}
$this->errors = $errors;
if(isset($this->Form)){
$this->Form->errors = $errors;
}
if(empty($errors)){
return true;
}
return false;
}
/**
* Permet de récupérer plusieurs enregistrements
* @param $req Tableau contenant les éléments de la requête
**/
public function find($req = array()){
$sql = 'SELECT ';
if(isset($req'fields'])){
if(is_array($req'fields'])){
$sql .= implode(', ',$$req'fields']);
}else{
$sql .= $req'fields'];
}
}else{
$sql.='*';
}
$sql .= ' FROM '.$this->table.' as '.get_class($this).' ';
// Liaison
if(isset($req'join'])){
foreach($req'join'] as $k=>$v){
$sql .= 'LEFT JOIN '.$k.' ON '.$v.' ';
}
}
// Construction de la condition
if(isset($req'conditions'])){
$sql .= 'WHERE ';
if(!is_array($req'conditions'])){
$sql .= $req'conditions'];
}else{
$cond = array();
foreach($req'conditions'] as $k=>$v){
if(!is_numeric($v)){
$v = '"'.mysql_escape_string($v).'"';
}
$cond] = "$k=$v";
}
$sql .= implode(' AND ',$cond);
}
}
if(isset($req'order'])){
$sql .= ' ORDER BY '.$req'order'];
}
if(isset($req'limit'])){
$sql .= ' LIMIT '.$req'limit'];
}
$pre = $this->db->prepare($sql);
$pre->execute();
return $pre->fetchAll(PDO::FETCH_OBJ);
}
/**
* Alias permettant de retrouver le premier enregistrement
**/
public function findFirst($req){
return current($this->find($req));
}
/**
* Récupère le nombre d'enregistrement
**/
public function findCount($conditions){
$res = $this->findFirst(array(
'fields' => 'COUNT('.$this->primaryKey.') as count',
'conditions' => $conditions
));
return $res->count;
}
/**
* Permet de récupérer un tableau indexé par primaryKey et avec name pour valeur
**/
function findList($req = array()){
if(!isset($req'fields'])){
$req'fields'] = $this->primaryKey.',name';
}
$d = $this->find($req);
$r = array();
foreach($d as $k=>$v){
$r[current($v)] = next($v);
}
return $r;
}
/**
* Permet de supprimer un enregistrement
* @param $id ID de l'enregistrement à supprimer
**/
public function delete($id){
$sql = "DELETE FROM {$this->table} WHERE {$this->primaryKey} = $id";
$this->db->query($sql);
}
/**
* Permet de sauvegarder des données
* @param $data Données à enregistrer
**/
public function save($data){
$key = $this->primaryKey;
$fields = array();
$d = array();
foreach($data as $k=>$v){
if($k!=$this->primaryKey){
$fields] = "$k=:$k";
$d":$k"] = $v;
}elseif(!empty($v)){
$d":$k"] = $v;
}
}
if(isset($data->$key) && !empty($data->$key)){
$sql = 'UPDATE '.$this->table.' SET '.implode(',',$fields).' WHERE '.$key.'=:'.$key;
$this->id = $data->$key;
$action = 'update';
}
else
{
$sql = 'INSERT INTO '.$this->table.' SET '.implode(',',$fields);
$action = 'insert';
}
$pre = $this->db->prepare($sql);
$pre->execute($d);
if($action == 'insert'){
$this->id = $this->db->lastInsertId();
}
}
}
voilà, essais de remplace ta method save() avec çà:
public function save($data){
$key = $this->primaryKey;
$fields = array();
$d = array();
foreach($data as $k=>$v){
if($k!=$this->primaryKey){
$fields] = "$k=:$k";
$d":$k"] = ( is_array($v) ) ? serialize( $v ) : $v ; // Serialize the value if it is an Array :)
}elseif(!empty($v)){
$d":$k"] = $v;
}
}
if(isset($data->$key) && !empty($data->$key)){
$sql = 'UPDATE '.$this->table.' SET '.implode(',',$fields).' WHERE '.$key.'=:'.$key;
$this->id = $data->$key;
$action = 'update';
}
else
{
$sql = 'INSERT INTO '.$this->table.' SET '.implode(',',$fields);
$action = 'insert';
}
$pre = $this->db->prepare($sql);
$pre->execute($d);
if($action == 'insert'){
$this->id = $this->db->lastInsertId();
}
}
Code du formulaire en entier :
<form action="<?php echo Router::url('compte/users/spec/'.$this->request->params[0]); ?>" method="post">
<?php echo $this->Form->input('id','hidden'); ?>
<?php $elements = $this->request('Specialites','getSpec'); echo displaySpec(0, 0, $elements); ?>
<div class="zone bg-color-blueLight">
<div class="bg-color-blue">Quelle est votre zone d'intervention ?</div>
<div class="input">
<label class="label-zone">
<select id="zone" name="zone">
<option value="30">Maximum 30 km</option>
<option value="50">Maximum 50 km</option>
<option value="100">Maximum 100 km</option>
<option value="200">Maximum 200 km</option>
</select>
</label>
</div>
</div>
<div class="actions clearfix">
<input type="submit" class="btn btn-danger" value="Enregistrer">
</div>
</form>
La fonction displaySpec est une fonction récursive qui me permet de récupérer et d'afficher les spécialités parents et enfants, je la mets au cas où.
function displaySpec($parent, $niveau, $array)
{
foreach ($array AS $noeud)
{
if ($parent == $noeud->parent_id)
{
for ($i = 0; $i < $niveau; $i++) $html .= " → ";
$html .= " " . $noeud->name . '<input type="checkbox" id="id_spec_'.$noeud->id.'" name="id_spec]" value="'.$noeud->id.'" /><br />';
$html .= displaySpec($noeud->id, ($niveau + 1), $array);
}
}
return $html;
}
C'est quand même bizarre cette histoire ... :(
Je vois pas d'où viens ton erreur, j'ai testé en Local et ça fonctionne.
juste dans ta fonction displaySpec() j'ai eu une erreur. Au tout début de ta fonction, j'ai dû créer une variable $html.
function displaySpec($parent, $niveau, $array)
{
$html = "";
foreach ($array AS $noeud)
....
RedaElkhayat, merci pour ton ajustement ... mais hélas ça fonctionne pas :(
Merci pour l'info exothermique c'est retouché ! mais on est d'accord que c'est louche ...
Au secours je pète un plomb (ou deux ^^)
Exothermique quand tu dis que ça fonctionne en local, tu veux bien dire que si tu coches 4 checkbox tu as 4 enregistrements qui ont été insérées dans la base ?
en fait je n'obtiens pas ça
Array
(
[id] =>
[id_spec] => Array
[zone] => 50
)
mais ça
Array
(
[id] =>
[id_spec] => Array
(
[0] => 1
[1] => 3
)
[zone] => 50
)
Ok donc effectivement ça fonctionne bien avec mon code ... je suis jalouse ;-) et totalement perdue ! tu n'as rien modifié je suppose ?
A part ce que j'ai dit au dessus, non.
Tu as essayé en affichant tes input directement au lieu de passer par une fonction?
Si tu trouves d'ici ce week-end la solution ça m'intéressera j'ai essayé de faire un système de tailles multiples sur un produit spécifié mais je n'arrivais pas à créer plusieurs enregistrements tout comme toi.
J'ai réussi en fait à récupérer les différentes checkbox et leur valeur donc admettons:
taille => 31,32,34 etc... mais ça enregistrait que le dernier résultat retourné c'est à dire taille 42 par exemple ou 38 enfin tout dépend de la dernière valeur passée.
Si ton problème c'est d'avoir un tableau multi dimensionnel comme exothermique alors je regarderai ce que je peux avoir de différent car j'ai changé certaines choses du MVC, refonte de certaines fonctions, améliorations de certaines etc...
En tout cas si tu n'as pas trouvé de solution je regarde ça ce week-end voir vendredi soir.
Un truc que tu peux faire en attendant c'est spécifier un index à chaque valeur:
Architecture <input id="id_spec_1" type="checkbox" value="1" name="id_spec[0]">
Catalogue / VPC <input id="id_spec_2" type="checkbox" value="2" name="id_spec[1]">
Corporate <input id="id_spec_3" type="checkbox" value="3" name="id_spec[2]">
Hello Xtr3me,
J'ai essayé en spécifiant un index mais rien ... $_POST[id_spec] me retourne toujours Array.
Et oui j'aimerais récupérer le tableau multi dimensionnel que exothermique arrive à avoir, je dirais même que je rêverais d'avoir ce tableau :)
C'est fou c'est qu'avec un seul checkbox pas de souci pour récupérer mais dés qu'on passe en checkbox multiple pouf ! rien du tout !
Je me demande si ça pourrait pas venir de ce bout de code dans Request :
if(!empty($_POST)){
$this->data = new stdClass();
foreach($_POST as $k=>$v){
$this->data->$k=$v;
}
}
Bonjour,
mon $_POST est bon, mais j'utilise pas la même application que toi donc c'est pas comparable.
Pour voir si c'est ton data fait: et tu verras si c'est pareil...
if(!empty($_POST)){
debug($_POST);
$this->data = new stdClass();
foreach($_POST as $k=>$v){
$this->data->$k=$v;
}
debug($this->data);
}
Bon bah je désespère là ...
Premier debug :
Array
(
[id] =>
[id_spec] => Array
[zone] => 100
)
Deuxième debug :
stdClass Object
(
[id] =>
[id_spec] => Array
[zone] => 100
)
Exactement comme d'hab ...
Donc l'erreur doit provenir de ton form.
Si tu ajoutes ça, ça fonctionne dans le $_POST ?
Toto 1 <input type="checkbox" value="1" name="toto]">
<br>
Toto 2 <input type="checkbox" value="2" name="toto]">
<br>
Toto 3 <input type="checkbox" value="3" name="toto]">
<br>
J'ai la même erreur avec toto(lol) :
Array
(
[id] =>
[id_spec] => Array
[toto] => Array
[zone] => 100
)
Pour info, Firebug est plus intelligent que mon form, lui il voit bien que les checkbox ont été cochées et qu'il y en a plusieurs :
id
id_spec] 1
id_spec] 2
toto] 1
toto] 2
toto] 3
zone 100
Et bien là, je sais plus. Tu peux envoyer ton code source (Celui générer sur ton navigateur) du formulaire.
Il faut plutot regarder du cote de ta classe Request
if(!empty($_POST)){
if($this->aSup !=""){
unset($_POST[array_search($this->aSup,$_POST)]);
}
$this->data = new stdClass();
if($this->aSup !=''){
unset($_POST[array_search($this->aSup, $_POST)]);
}
foreach($_POST as $k => $v){
if(is_array($v)){
if(count($v) > 1){
foreach ($v as $o=>$p){
$this->data->$k$o] =$p;
}
}else{
if($v !=""){
$this->data->$k = $v;
}
}
$this->data->$k = $v;
}else{
$this->data->$k = $v;
}
}
}
Voila le code que me ressort le navigateur, pour info je vous épargne les 45 checkbox:
<form action="http://www.monsite.fr/compte/users/spec/17" method="post">
<label for="Entreprise & Industrie">Entreprise & Industrie</label><div class="input"><input type="checkbox" name="id_spec]" value="1" /></div>
<label for="Architecture">Architecture</label><div class="input"><input type="checkbox" name="id_spec]" value="2" /></div>
<label for="Automobile">Automobile</label><div class="input"><input type="checkbox" name="id_spec]" value="3" /></div>
<label for="Catalogue / VPC">Catalogue / VPC</label><div class="input"><input type="checkbox" name="id_spec]" value="4" /></div>
<label for="Corporate">Corporate</label><div class="input"><input type="checkbox" name="id_spec]" value="5" /></div>
<label for="Cosmétique - Bijoux">Cosmétique - Bijoux</label><div class="input"><input type="checkbox" name="id_spec]" value="6" /></div>
<label for="Décoration - Art de la table">Décoration - Art de la table</label><div class="input"><input type="checkbox" name="id_spec]" value="7" /></div>
<div class="actions clearfix">
<input type="submit" class="btn btn-danger" value="Enregistrer">
</div>
</form>
Et nestam, j'ai testé un peu ta modif mais pas de réaction de mes checkbox ...
Alors avec ta fonction nestam, j'ai testé un truc :
Avant le
if(!empty($_POST)){
j'ai placé un debug($_POST) et même là il me retourne :
Array
(
[id] =>
[id_spec] => Array
[zone] => 50
)
Du coup j'ai voulu testé ou est ce que ça passe dans le foreach :
if(!empty($_POST))
{
$this->data = new stdClass();
foreach($_POST as $k => $v)
{
if(is_array($v))
{
if(count($v) > 1){
foreach ($v as $o=>$p)
{
$this->data->$k$o] =$p;
}
}else{
if($v !=""){
$this->data->$k = $v;
}
}
$this->data->$k = $v;
echo 'Cool !';die();
}
else
{
echo 'Boom !';die();
$this->data->$k = $v;
}
}
}
Il me retourne "Boom !" ... là je vois pas d'ou ça peut venir et je trouve pas de solutions alternatives ... :(
EDIT:
J'ai ensuite fait dans mon Controller:
$id_spec = $_POST'id_spec'];
echo is_array($id_spec) ? 'tableau' : 'ce n\'est pas un tableau';
ET bien Oh surprise $_POST'id_spec'] n'est pas un tableau donc la je sais en encore moi qu'avant ...
mais non je pense tout simplement que tu n as pas cohce de case
mais si tu coches une ou deux
Meme plusieurs cochées il me renvoie Array.
Les checkbox fonctionnent que si elles sont chacune avec leurs propres names du genre : id_spec1, id_spec2, etc, sauf que si je fait comme ça il me faut le meme nombre d'entrées dans ma table et rajouter 45 champs me gêne un peu
Je regarde ça demain et je te dis quoi, si j'ai la même chose ou pas, si j'ai la même chose j'essayerai de régler comme je l'avais fait la dernière fois j'arrivais bien à récupérer les valeurs des checkbox en fait mais comme le tableau était multi dimensionnel et que le champ xxxx était un tableau contenant les checkbox, seul la dernière valeur sélectionné était enregistré et aucun nouvel enregistrement se faisait.
Chez moi j'ai essayé plusieurs checkbox je récupère bien un array avec les différentes valeurs le seul soucis qui se pose à moi maintenant c'est l'enregistrement, j'ai qu'un seul enregistrement et la valeur est de 0 pour la donnée multi-checkbox ^^ .
<?php echo $this->Form->input('length[0]','41 ',array('type'=>'length')); ?>
<?php echo $this->Form->input('length[1]','42',array('type'=>'length')); ?>
<?php echo $this->Form->input('length[2]','43',array('type'=>'length')); ?>
<?php echo $this->Form->input('length[3]','44',array('type'=>'length'));?>
Voici comment se compose mes multi-checkbox en sachant que le type length c'est simplement une checkbox avec pour valeur le label de la checkbox donc rien de bien spectaculaire.
Si je ne mets pas d'indice pour une raison qui m'est encore inconnu j'ai un tableau composé de 5 index avec des valeurs 0 si les cases ne sont pas cochées et si j'en coches quelques une certains index prennent la valeur de la checkbox alors qu'en mettant des indices à chaque checkbox j'ai le bon nombre de valeur.
Moi mon but c'est un système multi-tailles pour une gestion de produits donc un peu différent il faudrait que je fasse soit une table de jointure soit que je crée plusieurs fois l'entrée du produit dans la base de donnée avec les différentes tailles.
Si tu as besoin d'un bout de code pour voir la différence par rapport au tien dis le, je te passera ça sans aucun problème.
Bah écoute oui je veux bien xtr3me, parce que là je t'avouerais que je vois plus trop quoi faire.
Je te remercie ! Au fait, Joyeuses Paques tt le monde ^^
Voici donc mon type length:
elseif($options'type'] == 'length'){
$html .= '<input type="hidden" name="'.$name.'"
value="0"/><input type="checkbox" name="'.$name.'" value="'.$label.'" '.(empty($value)?'':'checked').'>';
}
Mon Model:
<?php
class Model{
static $connections = array();
public $conf ='default';
public $table =false;
public $db;
public $primaryKey ='id';
public $id;
public $errors = array();
public $form;
public function __construct(){
//J'initialise une variable qui correspondra à la table appellée
if($this->table === false){
$this->table = strtolower(get_class($this)).'s';
}
//Je me connecte à la base
$conf= Conf::$databases$this->conf];
if(isset( Model::$connections$this->conf])){
$this->db = Model::$connections$this->conf];
return true;
}/**
* Try et catch pour vérifier que la connection se déroule correctement
**/
try{
$pdo = new PDO(
'mysql:host='.$conf'host'].';dbname='.$conf'database'].';',
$conf'login'],
$conf'password'],
array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8')
);
$pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_WARNING);
Model::$connections$this->conf] =$pdo;
$this->db = $pdo;
}catch(PDOException $e){
if(Conf::$debug =0){
die($e->getMessage());
}else{
die('Impossible de se connecter à la base de donnée');
}
}
}
/**
* Fonction qui permet de faire de trouver tout les résultats dans la base de données
* Selon les conditions assignées.
**/
public function find($req = array()){
$sql ='SELECT ';
if(isset($req'fields'])){
if(is_array($req'fields'])){
$sql .= implode(', ',$req'fields']);
}else{
$sql .= $req'fields'];
}
}else{
$sql .='*';
}
$sql .= ' FROM '.$this->table.' as '.get_class($this).' ';
//Construction de la condition
if(isset($req'conditions'])){
$sql .= 'WHERE ';
if(!is_array($req'conditions'])){
$sql .= $req'conditions'];
}else{
$cond = array();
foreach($req'conditions'] as $k=>$v){
if(!is_numeric($v)){
$v = $this->db->quote($v);
}
$cond] = "$k=$v";
}
$sql .= implode(' AND ',$cond);
}
}
if(isset($req'limit'])){
$sql .= ' LIMIT '.$req'limit'];
}
$pre = $this->db->prepare($sql);
$pre->execute();
return $pre->fetchAll(PDO::FETCH_OBJ);
}
/**
* Retourne le premier résultat de la fonction find
**/
public function findFirst($req){
return current($this->find($req));
}
/**
* Compte le nombre de résultats
**/
public function findCount($conditions){
$res= $this->findFirst(array(
'fields' => 'COUNT('.$this->primaryKey.') as count',
'conditions' => $conditions
));
return $res->count;
}
/**
* Retourne les dernières entrées insérée dans la base de donnée.
**/
public function findlastentry($req = array()){
$sql ='SELECT * ';
$sql .= ' FROM '.$this->table.' ';
//Construction de la condition
if(isset($req'conditions'])){
$sql .= 'WHERE ';
if(!is_array($req'conditions'])){
$sql .= $req'conditions'];
}else{
$cond = array();
foreach($req'conditions'] as $k=>$v){
if(!is_numeric($v)){
$v = $this->db->quote($v);
}
$cond] = "$k=$v";
}
$sql .= implode(' AND ',$cond);
}
}
$sql .=' ORDER BY id DESC LIMIT ';
if(isset($req'insert'])){
if(is_array($req'insert'])){
$sql .= implode(', ',$req'insert']);
}else{
$sql .= $req'insert'];
}
}else{
$sql .='*';
}
$pre = $this->db->prepare($sql);
$pre->execute();
return $pre->fetchAll(PDO::FETCH_OBJ);
}
/**
* Fonction qui permet de supprimer une information dans la base de donnée
**/
public function delete($id){
$sql = "DELETE FROM {$this->table} WHERE {$this->primaryKey} = $id";
$this->db->query($sql);
}
/**
* Enregistre les résultats dans la base de donnée
**/
public function save($data){
$key = $this->primaryKey;
$fields = array();
$d = array();
foreach($data as $k=>$v){
if($k!=$this->primaryKey){
$fields] = "$k=:$k";
$d":$k"] = ( is_array($v) ) ? serialize( $v ) : $v ; // Serialize the value if it is an Array
}elseif(!empty($v)){
$d":$k"] = $v;
}
}
if(isset($data->$key) && !empty($data->$key)){
$sql = 'UPDATE '.$this->table.' SET '.implode(',',$fields).' WHERE '.$key.'=:'.$key;
$this->id = $data->$key;
$action = 'update';
}
else
{
$sql = 'INSERT INTO '.$this->table.' SET '.implode(',',$fields);
$action = 'insert';
}
$pre = $this->db->prepare($sql);
$pre->execute($d);
if($action == 'insert'){
$this->id = $this->db->lastInsertId();
}
}
/**
* Validation de données formulaires
**/
function validates($data){
$errors = array();
foreach($this->validate as $k=>$v){
if(!isset($data->$k)){
$errors$k] = $v'message'];
}else{
if($v'rule'] == 'notEmpty'){
if(empty($data->$k)){
$errors$k] = $v'message'];
}else{
if(isset($data->password)){
if(mb_strlen($data->password) <= 4 AND isset($v'messages'])){
$errors$k] = $v'messages'];
}}
}
}elseif($v'rule'] == 'isUnique'){
if(isset($data->login)){
$d'login'] = $this->findFirst(array(
'conditions' => array('login' => $data->login)
));
if(!empty($d'login']) AND isset($v'message'])){
$errors$k] = $v'message'];}}
if(empty($data->login) AND isset($v'messages'])){
$errors$k] = $v'messages'];}
if(!preg_match('#^[a-zA-Z0-9-]+$#',$data->login) AND isset($v'messages2'])){
$errors$k] = $v'messages2'];}
if(isset($data->email)){
$condition = array('email' => $data->email);
$d'email'] = $this->findFirst(array(
'conditions' => $condition
));if(!empty($d'email']) AND isset($v'email2'])){
$errors$k] = $v'email2'];
}}
if(!preg_match('#^([a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+)$#',$data->email)){
$errors$k] = $v'email1'];}
}elseif($v'rule'] == 'confirm'){
if($data->password === $data->password_conf){}else{ $errors$k] = $v'message'];}
}elseif(!preg_match('#^'.$v'rule'].'$#',$data->$k)){
$errors$k] = $v'message'];
}elseif($v'rule'] == 'notEqual'){
if($data->password_conf !== $data->password){}else{ $errors$k] = $v'message'];}
if(mb_strlen($data->password_conf) <= 4 AND isset($v'messages'])){
$errors$k] = $v'messages'];
}}
}
}
$this->errors = $errors;
if(isset($this->Form)){
$this->Form->errors = $errors ;
}
if(empty($errors)){
return true;
}
return false;
}
/**
* Validation de données formulaire du profil
**/
function validateprof($data,$user){
$errors = array();
foreach($this->validates as $k=>$v){
if(!isset($data->$k)){
$errors$k] = $v'message'];
}else{
if($v'rule'] == 'notEmpty'){
if(empty($data->$k)){
$errors$k] = $v'message'];
}else{
if(isset($data->password)){
if(mb_strlen($data->password) <= 4 AND isset($v'messages'])){
$errors$k] = $v'messages'];
}}
}
}elseif($v'rule'] == 'isUnique'){
if(isset($data->email)){
$condition = array('email' => $data->email);
$d'email'] = $this->findFirst(array(
'conditions' => $condition
));if(!empty($d'email'])){
$errors$k] = $v'message'];
}}
if(!preg_match('#^([a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+)$#',$data->email)){
$errors$k] = $v'messages'];}
}elseif($v'rule'] == 'same'){
if(isset($user->login)){
$d'password'] = $this->findFirst(array(
'conditions' => array('login' => $user->login,'password' => hash('sha1',PREFIX_SALT.$data->password.SUFFIX_SALT))
));
if(empty($d'password'])){
$errors$k] = $v'message'];}}
if(mb_strlen($data->password) <= 4 AND isset($v'messages'])){
$errors$k] = $v'messages'];
}
}elseif($v'rule'] == 'notEqual'){
if($data->password === $data->password_conf){$errors$k] = $v'message'];}
if(mb_strlen($data->password_conf) <= 4 AND isset($v'messages'])){
$errors$k] = $v'messages'];
}
}elseif(!preg_match('#^'.$v'rule'].'$#',$data->$k)){
$errors$k] = $v'message'];
}
}
}
$this->errors = $errors;
if(isset($this->Form)){
$this->Form->errors = $errors ;
}
if(empty($errors)){
return true;
}
return false;
}
/**
* Validation de données formulaire du nouveau mot de passe
**/
function validpwd($data){
$errors = array();
foreach($this->valid as $k=>$v){
if(!isset($data->$k)){
$errors$k] = $v'message'];
}else{
if($v'rule'] == 'same'){
if(isset($data->password)){
if($data->password !== $data->password_conf){
$errors$k] = $v'message'];}
if(mb_strlen($data->password_conf) <= 4 AND isset($v'messages'])){
$errors$k] = $v'messages'];
}
}
}elseif($v'rule'] == 'notEmpty'){
if(empty($data->$k)){
$errors$k] = $v'message'];
}
if(mb_strlen($data->password) <= 4 AND isset($v'messages'])){
$errors$k] = $v'messages'];
}
}
}
}
$this->errors = $errors;
if(isset($this->Form)){
$this->Form->errors = $errors ;
}
if(empty($errors)){
return true;
}
return false;
}
}
?>
J'ai encore certains bouts de code à revoir car pas toujours optimisé c'est juste des versions de développement ^^ .
Ok heureux que ça t'ai aidé si ton problème est résolu et que tout fonctionne (l'insertion y compris) je vais essayer pour moi ce soir ^^ .
La variable superglobale $_REQUEST contient les valeurs de $_POST/$_GET/$_COOKIE.
Moi toujours le même soucis ça ne me créer pas de nouvelles entrées mais ça prend la valeur de la dernière checkbox cochée et la rentre en bdd mais je pense que je vais revoir un peu mon système de gestion de produits ^^ .