Ajouter image
#1
Posted 21 April 2011 - 05:34 PM
J'ai un table sociétés qui contient des champs suivant : id, nom, description, logo
Dans la page d'ajouter nouveau société je veux que le champ Logo doit être une sélection d'un image en local à Upload sur le serveur.
Je veux savoir si possible avec cette méthode d'ajouter le chemin de l'image logo sur la table société ou il faut créer nouveau table logo pour ajouter dedans les images et aussi créer ( controller logo, model...) ?
Merci
#2
Posted 22 April 2011 - 04:14 AM
Il est tout à fait possible d'ajouter le chemin de l'image sur la table société.
Si tu veux pouvoir ajouter plusieurs images par société, il serait plus judicieux de passer par une table logo, mais pour un seul logo par entreprise, c'est plus pratique de renseigner le champ dans la table société.
Tu peux regarder ici :
http://www.yiiframew...-using-a-model/
#3
Posted 22 April 2011 - 06:06 AM
voici le code dans le model société :
public function rules() { return array( array('Nom', 'required'), array('Nom', 'length', 'max'=>75), array('Logo', 'file', 'types'=>'jpg, gif, png'), ); }voici le code de controller :
public function actionCreate() { $this->layout="main"; $model=new Societes; if(isset($_POST['Societes'])) { $model->attributes=$_POST['Societes']; $model->Logo=CUploadedFile::getInstance($model,'Logo'); if($model->save()) [color="#FF0000"]$model->Logo->saveAs('path/images');[/color] $this->redirect(array('view','id'=>$model->Id)); } $this->render('create',array( 'model'=>$model, )); }
#4
Posted 22 April 2011 - 06:21 AM
Je peux d'ores et déjà te conseiller de ne pas utiliser de majuscules au début des noms d'attributs mais seulement pour les noms de classes. ("Logo" devrait donc être "logo").
Je pense que le problème peut venir de
$model->Logo=CUploadedFile::getInstance($model,'Logo');
...
$model->Logo->saveAs('path/images'); qui devrait être
$model->logo=CUploadedFile::getInstance($model,'logo');
...
$model->logo->saveAs('path/images'); (et pareil partout où tu as Logo (dans le _form.php par exemple)
#5
Posted 22 April 2011 - 06:39 AM
Benn, on 22 April 2011 - 06:21 AM, said:
Je peux d'ores et déjà te conseiller de ne pas utiliser de majuscules au début des noms d'attributs mais seulement pour les noms de classes. ("Logo" devrait donc être "logo").
Je pense que le problème peut venir de
$model->Logo=CUploadedFile::getInstance($model,'Logo');
...
$model->Logo->saveAs('path/images'); qui devrait être
$model->logo=CUploadedFile::getInstance($model,'logo');
...
$model->logo->saveAs('path/images'); (et pareil partout où tu as Logo (dans le _form.php par exemple)
J'ai fait ça mais ce ne marche pas, toujours le bouton de "Ajouter" ne renvoi aucun postback , c'est a dire quand je clique sur "ajouter" pour ajouter nouveau société ce ne marche plus cette bouton il ne renvoi aucun donnée !! mais quand je vais annuler le code de logo tout ce fonctionne bien je peux ajouter des nouveau société
Merci...
#6
Posted 22 April 2011 - 06:47 AM
<?php echo CHtml::form('','post',array('enctype'=>'multipart/form-data')); ?>As tu bien ajouté l'attribut
public $logo;dans ton modele Societes.php?
#7
Posted 22 April 2011 - 09:56 AM
<?php echo CHtml::form('','post',array('enctype'=>'multipart/form-data')); ?>
<?php echo CHtml::activeFileField($model, 'Logo'); ?>
<?php echo CHtml::endForm(); ?>le type de logo dans la table : Logo c'est un(Varchar)
Mais dommage c marche pas.
Je crains que le code dans le controller qui est pas bon :
if(isset($_POST['Societes']))
{
$model->attributes=$_POST['Societes'];
$model->logo=CUploadedFile::getInstance($model,'Logo');
if($model->save())
$model->logo->saveAs('path/images');
$this->redirect(array('view','id'=>$model->Id));
}
$this->render('create',array(
'model'=>$model,
));voici l'ajout qui peut ne fonctionne pas correct :
$model->logo=CUploadedFile::getInstance($model,'Logo');
#8
Posted 24 April 2011 - 06:43 PM
Code SQL pour la table :
CREATE TABLE IF NOT EXISTS `tbl_societes` ( `id` int(10) NOT NULL AUTO_INCREMENT, `nom` varchar(30) NOT NULL, `description` varchar(100) NOT NULL, `logo` varchar(100) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;
_form.php:
<div class="form">
<?php $form=$this->beginWidget('CActiveForm', array(
'htmlOptions'=>array('enctype' => 'multipart/form-data'),
'id'=>'societes-form',
'enableAjaxValidation'=>false,
)); ?>
<p class="note">Fields with <span class="required">*</span> are required.</p>
<?php echo $form->errorSummary($model); ?>
<div class="row">
<?php echo $form->labelEx($model,'nom'); ?>
<?php echo $form->textField($model,'nom',array('size'=>30,'maxlength'=>30)); ?>
<?php echo $form->error($model,'nom'); ?>
</div>
<div class="row">
<?php echo $form->labelEx($model,'description'); ?>
<?php echo $form->textField($model,'description',array('size'=>60,'maxlength'=>100)); ?>
<?php echo $form->error($model,'description'); ?>
</div>
<div class="row">
<?php echo $form->labelEx($model,'logo'); ?>
<?php echo $form->fileField($model,'logo'); ?>
<?php echo $form->error($model,'logo'); ?>
</div>
<div class="row buttons">
<?php echo CHtml::submitButton($model->isNewRecord ? 'Create' : 'Save'); ?>
</div>
<?php $this->endWidget(); ?>
</div><!-- form -->Societes.php:
...
public function rules()
{
// NOTE: you should only define rules for those attributes that
// will receive user inputs.
return array(
array('nom, description', 'required'),
array('nom', 'length', 'max'=>30),
array('description, logo', 'length', 'max'=>100),
array('logo', 'file', 'types'=>'jpg, gif, png'),
// The following rule is used by search().
// Please remove those attributes that should not be searched.
array('id, nom, description, logo', 'safe', 'on'=>'search'),
);
}
...SocietesController.php:
...
public function actionCreate()
{
$model=new Societes;
// Uncomment the following line if AJAX validation is needed
// $this->performAjaxValidation($model);
if(isset($_POST['Societes']))
{
$model->attributes=$_POST['Societes'];
$file=CUploadedFile::getInstance($model,'logo');
$extension = $file->getExtensionName();
$filename = md5_file($file->tempName);
$fullFilename = $filename . '.' . $extension;
$model->logo=$fullFilename;
if($model->save())
{
$file->saveAs(Yii::app()->basePath . '/../images/' . $fullFilename);
$this->redirect(array('view','id'=>$model->id));
}
}
$this->render('create',array(
'model'=>$model,
));
}
...(les logos seront stockés dans un dossier images situé au même niveau que protected, avec un nom correspondant au md5 du fichier uploadé.
#9
Posted 02 May 2011 - 02:54 PM
Une autre possibilité (plutôt que d'ajouter des champs / tables sql) est d'utiliser l'extension fileimagearbehavior.
Tu rajoutes un comportement à ton modèle société (un behavior) qui va permetre d'associer une ou plusieurs images à chaque entrée de ta table. De plus, tu peux apliquer des traitements automatique sur les images (redimensionner, etc).
#10
Posted 05 December 2011 - 04:35 AM
quelqu'un pourrait-il m'aiguiller pour l'update?!
edit:C'est tous bon merci je m'en suis sorti!
This post has been edited by Lorenzo: 05 December 2011 - 08:40 AM
#11
Posted 05 December 2011 - 05:27 AM
Lorenzo, on 05 December 2011 - 04:35 AM, said:
Je sais que ça fait plus d'un an que personne n'a posté mais si quelqu'un peut m'aider :
Il ne reconnait pas la fonction getExtensionName()!
Fatal error: Call to a member function getExtensionName() on a non-object
Une solution ?!
Hello Lorenzo,
Le problème n'est pas qu'il ne reconnait pas la méthode getExtensionName(), mais elle est appelée sur un non objet.
Ca veut dire que si tu as suivi l'exemple ci dessus, ton $file n'existe pas.
Peux tu partager ton code pour qu'on voie ce qui ne va pas?
#12
Posted 06 December 2011 - 11:38 AM
J'avais juste pas mis les choses dans l'ordre, je veux juste dire que si vous voulez le nom de l'image dans la base de donnée (car pour moi je voulais uploader l'image sur le serveur et pouvoir l'utiliser)
$filename = $file->name; $model->img=$filename;
Pour que le nom de l'image sois dans img(champ de ma table).
et peut-être que ça peut aider quelqu'un :
Si vous souhaiter que fileField sois facultatif allez dans votre model
public function rules()
{
...
array('img', 'file', 'allowEmpty'=>true, 'on' => 'insert'),
array('img', 'file', 'allowEmpty'=>true, 'on' => 'update'),
array('img', 'file', 'types'=>'jpg, gif, png,' , 'allowEmpty'=>true),
La 3ieme ligne est très importante! car même si votre champ ne se trouve pas dans requiered, il est obligatoire!
le allowEmpty=>true après les types de fichiers est inévitable pour que le champs sois facultatif!
Voila j'espère que j'ai été claire et que je vais peut-être aider quelqu'un!
Bonne soirée

Help












