Ajouter image


(Programmeur4 You) #1

Salut,

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


(B Destrube) #2

Bonjour,

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.yiiframework.com/wiki/2/how-to-upload-a-file-using-a-model/


(Programmeur4 You) #3

Merci Benn, mais vraiment je n’arrive pas á bon résultat

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, 		)); 	}




(B Destrube) #4

Pourrais tu me dire ce que tu obtiens comme résultat?

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)


(Programmeur4 You) #5

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…


(B Destrube) #6

As tu bien spécifié l’enctype dans ton _form.php?


<?php echo CHtml::form('','post',array('enctype'=>'multipart/form-data')); ?>

As tu bien ajouté l’attribut


public $logo;

dans ton modele Societes.php?


(Programmeur4 You) #7

voila c que j’ai fait dans le view :


<?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');


(B Destrube) #8

Voici ce que ça devrait donner :

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é.


(Julien Parc) #9

Bonjour,

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).


(Laurent Dietrich) #10

Bonjour tout le monde,

quelqu’un pourrait-il m’aiguiller pour l’update?!

edit:C’est tous bon merci je m’en suis sorti!


(B Destrube) #11

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?


(Laurent Dietrich) #12

Salut Benn, enfaite je m’en suis sorti :)!

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