Bonjour tout le monde :)
J'ai suivi le tuto qui créé le UploadBehavior et je rencontre un problème qui est que je ne peut pas avoir plusieurs 'fields' de sauvegarde.
Voici ma fonction afterSave de mon behavior :
public function afterSave(Model $model,$created,$options = array())
{
if(!$dataSaved)
{
$this->modelData = $model->data;
$dataSaved = true;
}
foreach($this->options$model->alias]'fields'] as $field => $path)
{
if(isset($this->modelData$model->alias]$field.'_file']))
{
$file = $this->modelData$model->alias]$field.'_file'];
debug($file);
$extension = strtolower(pathinfo($file'name'], PATHINFO_EXTENSION));
$path = $this->getUploadPath($model,$path,$extension);
$dirname = dirname($path);
if(!file_exists(WWW_ROOT . $dirname))
{
mkdir(WWW_ROOT . $dirname , 0777,true);
}
$model->deleteOldUpload($field);
move_uploaded_file(
$file'tmp_name'],
WWW_ROOT. $path
);
chmod(WWW_ROOT. $path , 0777);
if($field == 'photo_ressource')
{
//on change le chemin en base pour que htmlHelper prenne directement l'image
$path = str_replace('img/','', $path);
}
//on sauvegarde en base de donnée
$model->saveField($field ,$path);
}
}
}
Ceci me retourne cette erreur :
Error: Maximum function nesting level of '100' reached, aborting!
Suite a cela j'ai trouvé où cela plantais, c'est ici :
if(!$this->dataSaved)
{
$this->modelData = $model->data;
$this->dataSaved = true;
}
J'ai fait ce bout de code car après avoir appelé saveField de mon model, je perdait toute les données...
avant le saveField $model->data vaut :
array(
'Ressource' => array(
'id_responsable' => '1',
'type_ressource_id' => '1',
'nom_ressource' => 'modele',
'prenom_ressource' => 'cv',
'date_arrivee' => '2014-04-05',
'date_sortie' => '2014-04-01',
'commentaire_ressource' => 'a',
'mail_ressource' => 'a@test.fr',
'lien_cv_file' => array(
'name' => 'modele-cv-1.doc',
'type' => 'application/msword',
'tmp_name' => 'C:\wamp\tmp\phpC0EE.tmp',
'error' => (int) 0,
'size' => (int) 0
),
'photo_ressource_file' => array(
'name' => 'free-computer-wallpapers-4.jpg',
'type' => 'image/jpeg',
'tmp_name' => 'C:\wamp\tmp\phpC0EF.tmp',
'error' => (int) 0,
'size' => (int) 0
),
'id_ressource' => '138'
)
)
après le saveField, il vaut :
array(
'Ressource' => array(
'id_ressource' => '141',
'lien_cv' => 'files/cv/141.doc'
)
)
Voici la déclaration dans mon model du $actAs :
public $actsAs = array(
'Upload.Upload' => array(
'fields' => array('lien_cv' => 'files/cv/%id','photo_ressource' => 'img/photos/%id')
)
);
J'espère que j'ai donné assez de détail :), sinon n'hésitez pas à posez des questions :)
Cordialement,
Jeremy
J'ai trouvé une solution à mon problème :) Même si je ne sais pas trop si c'est "propre" de faire comme cela.
J'ai remplacé le saveField par une requête update , ce qui revient au même je pense :s .
Je vous joint le code , on sait jamais sa peu servir à quelqu'un d'autre.
public function afterSave(Model $model,$created,$options = array())
{
foreach($this->options$model->alias]'fields'] as $field => $path)
{
if(isset($model->data$model->alias]$field.'_file']))
{
$file = $model->data$model->alias]$field.'_file'];
debug($file);
$extension = strtolower(pathinfo($file'name'], PATHINFO_EXTENSION));
$path = $this->getUploadPath($model,$path,$extension);
$dirname = dirname($path);
if(!file_exists(WWW_ROOT . $dirname))
{
mkdir(WWW_ROOT . $dirname , 0777,true);
}
$model->deleteOldUpload($field);
move_uploaded_file(
$file'tmp_name'],
WWW_ROOT. $path
);
chmod(WWW_ROOT. $path , 0777);
if($field == 'photo_ressource')
{
//on change le chemin en base pour que htmlHelper prenne directement l'image
$path = str_replace('img/','', $path);
}
//on sauvegarde en base de donnée
// $model->saveField($field ,$path);
$queryUpdate = "UPDATE `".$model->useTable."`
SET `".$field."` = '".$path."'
WHERE `".$model->primaryKey."` ='".$model->id."' ;";
$model->query($queryUpdate);
}
}
}