Mar 06

Yii1 – 2 boutons d’action sur un formulaire

Il arrive qu’il soit nécessaire d’avoir besoin de deux boutons d’action ou plus sur un formulaire.
Il faut donc pouvoir distinguer laquelle des actions a été exécutés.

Partons du principe que l’on souhaite afficher le formulaire en création, pour cela nous allons appeler l’action create.
L’action create va rediriger l’utilisateur vers la vue « form »

Vue

Au niveau de la vue, on peut définir les 2 boutons comme suit :

....
<?php echo CHtml::submitButton('Actualiser', array('name' => 'btnActualisé')); ?>
 
....
<?php echo CHtml::submitButton('Valider', array('name' => 'btnValider')); ?> 
...

Contrôleur

Au niveau du contrôleur, il faudra distinguer les 3 cas possibles :

  • affichage de la page la 1ère fois
  • ré-affichage de la page suite à une action (bouton Actualiser dans notre exemple)
  • redirection vers une autre page après avoir exécuter les opérations souhaitées : sauvegarde en base de données par exemple.

C’est dans le contrôleur que l’on distingue depuis quel bouton l’action a été demandée.

....
public function actionCreate() {
 
  // le formulaire est associé à un modèle 
  $model = new MaClasseModel();
 
  if(isset($_POST['MaClasseModel']))
  {
      // Récupération des informations saisies sur la page
        $model->attributes=$_POST['MaClasseModel'];  
  }
 
  if (isset($_POST['btnActualisé']))
  {
    // Si le bouton Actualiser vient d'être utilisé
    ... // Faire une action
    // puis revenir sur la page en gardant les informations préalablement saisies 
        $this->render('form',array('model'=>$model));
 
  } else if (isset($_POST['btnValider']))
        {
           //  Action a exécuter et retour sur la page d'accueil par exemple
           $this->render('index');
        } else  // C'est la 1ère fois que la page est ouverte
            $this->render('form',array('model'=>$model));
 }
 
...

Fév 24

Yii1 – CActiveRecord – findAll() – trier le résultat

Vous souhaitez récupérer la totalité d’une table avec un tri particulier en utilisant les ActiveRecord et la fonction findAll().
Comme d’habitude Yii framework vous facilite la vie

 $variable=NomModel::model()->findAll(array('order'=>'ColonneDeTri'));

Fév 18

Yii1 – Download un fichier depuis un blob dans une base de données MySQL

Nous avons vu dans l’article précédent :

Une fois le fichier stocké en base de données, nous allons voir comment récupérer le fichier dans un blob.
Le code est simple …

Controller

 public function actionDownloadFile()
{
    // Recherche de l'enregistrement en base de données
    $model=Image::model()->findByPk('7');
 
    // code introduit pour transférer le fichier 
    header('Pragma: public');
    header('Expires: 0');
    header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
    header('Content-Transfer-Encoding: binary');
    header('Content-length: '.$model->file_size);
    header('Content-Type: '.$model->file_type);
    header('Content-Disposition: attachment; filename='.$model->file_name);
 
    // Récupération du fichier        
    echo $model->file_content;
}

Fév 12

Yii1 – Uploader un fichier dans un blob d’une base de données

Dans un article précédent, nous avons vu comment uploader un fichier sur le serveur .

Nous allons voir maintenant comment charger un fichier dans une base de données.

Au niveau de la vue (view.php)

Nous allons utiliser le composant « activeFileField » pour que l’utilisateur sélectionne le fichier.
Note : Pour que cela fonctionne, il faut mettre à jour ‘htmlOptions’ avec « array(‘enctype’ => ‘multipart/form-data’) ».

<h1>
<?php $form=$this->beginWidget('CActiveForm', array(
	'id'=>'users-users-form',
	'enableAjaxValidation'=>false,
    'htmlOptions' => array('enctype' => 'multipart/form-data'),
)); ?>
 
<div class="row">
        <?php echo $form->labelEx($model,'fichier'); ?>
        <?php echo CHtml::activeFileField($model, 'fichier'); ?>  
        <?php echo $form->error($model,'fichier'); ?>
</div>
<p>
 
</p>
<div class="row buttons">
		<?php echo CHtml::submitButton('Valider'); ?>
	</div>
<?php $this->endWidget(); ?>

Modèle (Image.php)

Définition de la table

Nous allons créer la table qui stockera le fichier pour une base de données mySQL.

CREATE TABLE IF NOT EXISTS `fichier` (
  `id` BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT,
  `file_name` VARCHAR(64) NOT NULL,
  `file_type` VARCHAR(64) NOT NULL,
  `file_size` INT(11) NOT NULL,
  `file_content` longblob NOT NULL,
  UNIQUE KEY `id` (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=8 ;

file_content contiendra le fichier physique.

Pour rappel sous MySQL, une donnée de type
BLOB 65 536 octêts
MEDIUMBLOB 16 777 octêts
LONGBLOB 4 294 967 296 octêts

le modèle associé

Pour gérer le fichier, nous allons créer un modèle afin de récupérer les données saisies par l’utilisateur
la variable $image contiendra donc le fichier a télécharger.

class Fichier extends CActiveRecord
{
    /**
     * Cette propriété sera utilisée pour stocker les informations du fichier
     */
     public $fichier;
 
 
     public function rules()
    {
        /* Exemple pour des fichiers de type image */
        return array(
            array('image', 'file', 'types'=>'jpg, gif, png'),
        );
    }

Contrôleur (FichierController.php)

  public function actionCreate()
    {
        $model=new Fichier;
 
        if(isset($_POST['Fichier']))
        {
 
          $model->attributes=$_POST['Fichier'];
          // récupération des informations du fichier  
          $uploadedFile = CUploadedFile::getInstance($model, 'fichier');
          $fileName = "{$uploadedFile}"; 
 
          $model->file_name = $fileName;
 
        if($file=CUploadedFile::getInstance($this,'fichier'))
        {
            $this->file_name=$file->name;
            $this->file_type=$file->type;
            $this->file_size=$file->size;
            $this->file_content=file_get_contents($file->tempName);
        } 
       if($model->save()){
            $this->redirect(array('create'));
       }
 
      } else
        $this->render('view',array('model'=>$model,));
    }

Fév 05

Yii1 – Upload un fichier

Nous allons voir dans cet article comment envoyer un fichier sur le serveur après sélection par l’utilisateur.

Au niveau de la vue (view.php)

Nous allons utiliser le composant « activeFileField » pour que l’utilisateur sélectionne le fichier.
Note : Pour que cela fonctionne, il faut mettre à jour ‘htmlOptions’ avec « array(‘enctype’ => ‘multipart/form-data’) ».

<h1>
<?php $form=$this->beginWidget('CActiveForm', array(
	'id'=>'users-users-form',
	'enableAjaxValidation'=>false,
    'htmlOptions' => array('enctype' => 'multipart/form-data'),
)); ?>
 
<div class="row">
        <?php echo $form->labelEx($model,'image'); ?>
        <?php echo CHtml::activeFileField($model, 'image'); ?>  
        <?php echo $form->error($model,'image'); ?>
</div>
<p>
 
</p>
<div class="row buttons">
		<?php echo CHtml::submitButton('Valider'); ?>
	</div>
<?php $this->endWidget(); ?>

Modèle (Image.php)

Pour gérer le fichier, nous allons créer un modèle afin de récupérer les données saisies par l’utilisateur
la variable $image contiendra donc le fichier a télécharger.

class Image extends CActiveRecord
{
    /**
     * Cette propriété sera utilisée pour stocker les informations du fichier
     */
     public $image;
 
 
     public function rules()
    {
        return array(
            array('image', 'file', 'types'=>'jpg, gif, png'),
        );
    }

Contrôleur (ImageController.php)

Nous allons stocker le fichier dans un répertoire au niveau de la racine de notre site « www/Monsite/uploads/files/ ».
Pour cela, le composant « CUploadedFile » va prendre en charge la récupération et la copie du fichier sur le serveur.

public function actionUploadFile()
{
        // Création de l'objet
        $model=new Image;
       // On rentre dans le if si l'utilisateur a valider la page et sélectionner un fichier 
        if(isset($_POST['Image']))
        {
          // Les informations saisies sur la page sont récupérées dans l'objet Image (voir Modèle ci-dessus)
          $model->attributes=$_POST['Image'];
          // Récupération des données du composant activeFileField 
          $uploadedFile = CUploadedFile::getInstance($model, 'image'); 
          // Extraction du nom du fichier
          $fileName = $uploadedFile->getName();
          $model->file_name = $uploadedFile->getName(); 
          // Sauvegarde du fichier sur le serveur
          $uploadedFile->saveAs(Yii::app()->basePath.'/../uploads/files/'.$fileName);  
        }
        // Affichage de la page
         $this->render('view',array('model'=>$model,));
}

Oct 10

Créer une liste déroulante avec YiiFramework

Dans cet article nous allons voir comment utiliser la liste déroulante dans un formulaire.

Comme Yii est la pour faciliter la vie du développeur, la classe dropDownList vous permettra d’afficher une liste déroulante soit à partir de données que vous lui indiquerez manuellement ou soit à partir de données provenant d’une base de données

S’agissant d’un composant visuel, celui-ci provient de la classe CHtml qui porte la méthode « CHtml::dropDownList() method ».

 

public static function dropDownList($name,$select,$data,$htmlOptions=array())

$name: Correspond au tag name du <select> en HTML
$select: correspond à l’élément sélectionné par défaut dans la liste (clé de la valeur à renseigner)
$data: correspond au tableau de données contenu dans la liste déroulante (clé->valeur)
$htmlOptions: tableau d’attributs supplémentaire HTML

Exemple de liste déroulante simple sans utilisation du contrôleur

Ajouter dans votre vue le code suivant

<?php echo CHtml::dropDownList('listname', '1',
array('0' => 'Madame', '1' => 'Mademoiselle','2'=>'Monsieur'));?>

Dans cet exemple, Mademoiselle est sélectionné par défaut puisqu’en 2ème paramètre, la valeur 2 correspond à la clé de ‘Mademoiselle’.
A l’affichage cela donne

Exemple de liste déroulante simple avec utilisation du « Model »

Au niveau de la vue (view)

<?php echo CHtml::dropDownList('listname', '1',$model->getData);?>

Au niveau du model, ajouter la fonction permettant de renvoyer le tableau de données

 public function getData(){
    return array('0' => 'Madame', '1' => 'Mademoiselle','2'=>'Monsieur');
}

Sep 25

Yii1- Référence de la page sur laquelle l’action a été lancée

Le framework Yii vous permet de gérer les requêtes et URL.
Dans le cas ou vous avez besoin de connaitre la page à l’origine de l’action qui vient d’être exécutée, voila le code à utiliser
 

print Yii::app()->request->urlReferrer;

Sep 18

La version de Yii

Pour connaitre dans votre programme la version de Yii installée.

Ajouter le code suivant à votre page

 

print Yii::getVersion();