avr 11

Internationalisation (i18n)

Cet article correspond à une traduction adaptée (il ne s’agit d’une version synthétisée et non une traduction exacte) du tutorial en anglais que l’on retrouve dans la documentation Yii à cette adresse http://www.yiiframework.com/doc/guide/1.1/fr/topics.i18n

Avant de commencer, définition le champ d’action. Merci wikipédia

Extrait de Wikipedia :

L’internationalisation est le processus de conception d’un logiciel afin qu’il puisse être adapté aux différentes langues et régions sans modifications techniques.

La régionalisation est le processus d’adaptation des logiciels à une région spécifique ou à une langue en y ajoutant des éléments spécifiques locaux et la traduction du texte.

Dans un contexte comme le Web, cette notion devient très importante puisque vous touchez le monde entier.

Yii fournit un mécanisme afin d’assurer un support de I18N sur plusieurs aspects :

  • Il met à disposition des données local
  • il propose un service de traduction des messages ou de textes
  • il permet de formater une date, une heure, un nombre selon la région…

 

La Culture de l’utilisateur et sa langue

Les caractéristiques i18n sont basées sur la culture de l’utilisateur. La culture est la combinaison de la langue et du pays de l’utilisateur. Par exemple, la culture pour un utilisateur qui parle français est fr et la culture pour un utilisateur de la France est fr_fr.

Nous aurons donc dans Yii, les formats suivants « LanguageID" ou « LanguageID_RegionID", ces données devant être en minuscule (e.g. en, en_us).

Les données locales (culture) seront représentées par une instance de la classe CLocale. Celle-ci fournira les données relatives aux nombres, symboles (comme la monnaies), le format de la date ou de l’heure…

Les données locales sont identifiées via un code du type fr (francais), en (anglais)…

Notice

Info: Yii apporte des informations sur les données locales sur la plupart des langues et régions. Ces données sont issus du référentiel commun des données locales (« Common Locale Data Repository » (CLDR)). Vous pouvez retrouver les informations dans l’arborescence du framework  « framework/i18n/data".

Si l’on prend par exemple le fichier « fr.php », nous constatons que Yii fournit la traduction de l’ensemble des données locales comme par exemple les jours de la semaine :

'weekDayNames' =>
array (
'wide' =>
array (
0 => 'dimanche',
1 => 'lundi',
2 => 'mardi',
3 => 'mercredi',
4 => 'jeudi',
5 => 'vendredi',
6 => 'samedi',
),

L’utilisation des données locales passe par la classe CApplication à travers la propriété « locale ».

 

Traduction

La traduction des messages est stockée dans un référentiel appelé source du message (message source). Un mmessage source est représenté par une implémentation de la classe CMessageSource ou par héritage l’une des classes filles.
La traduction d’un texte se fait via la fonction t(), de la classe de base « Yii ».
Lorsque la fonction Yii::t() est appelée, celle-ci recherche le message dans la source et retourne la traduction associée si elle est trouvée..

Yii permet de stocker la traduction d’un texte selon 3 types de support :

  • CPhpMessageSource: la traduction est stockée dans un tableau PHP avec le format clé -> valeur. ce tableau est stocké dans un fichier au format PHP ayant comme nom l’identifiant de la langue. Par exemple f »r.PHP » pour le francais ou « de.php » pour l’allemand..
  • CGettextMessageSource: la traduction est stockée dans un fichier au format  GNU Gettext.
  • CDbMessageSource: la traduction est stockée dans une table de la base de données. Voir la classe dans l’API de Yii CDbMessageSource.

 

La fonction Yii est définit comme suit :

 

public static string t(string $category, string $message, array $params=array ( ), string $source=NULL, string $language=NULL)
$category string Catégorie du message. Utiliser un mot simple (excepter le mot « yii » réservé). Pour plus d’information regarder la classe CPhpMessageSource.
$message string le message à traduire (source)
$params array Dans le cas ou vous souhaitez faire des messages personnalisés. Il s’agit d’un tableau qui contiendra le nom du tag à remplacer associé à la valeur.Ce tag devra être entre accolade. Le tableau sera de la forme array(‘{tag}’=>$valeurTag)
$source string Par défaut prend la valeur null. Source du texte.
$language string langue du message que vous voulez récupérer. si cette donnée est omise, le système récupère la langue de l’application c’est à dire la langue renvoyé par CApplication::getLanguage().
{return} string retourne le message traduit

 

Nous venons dans cet article d’aborder la notion de traduction multi-langues d’une application. Nous verrons dans un prochain article un petit exemple de traduction d’un texte.

J’espère que cet article vous a plu. Si vous souhaitez que des thèmes ou sujet soit abordé, n’hésitez pas à laisser un petit commentaire.

mar 06

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

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

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

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

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

sept 25

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;

sept 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();