Mot-clé - framework

Fil des billets - Fil des commentaires

vendredi 11 septembre 2015

Installer une extension sur Yii2 sans composer

Lorsque Yii2 est sorti, une grande avancée a été faite dans son système d'installation, ainsi que dans celui des extensions: l'utilisation de composer. Composer est un outil de gestion des dépendances en PHP qui est fort utile et pratique, un peu comme les gestionnaires de package sous linux (apt, yum, ...). Mais parfois, on ne peut pas l'utiliser, et c'est plutôt bloquant.

Je vais donc vous décrire, si possible simplement, comment ajouter une extension à Yii2 à la main.

Lire la suite...

lundi 17 mars 2014

Un bloc à onglets sous Yii

J'ai eu besoin de pouvoir intégrer facilement un bloc avec des onglets dans une page générée par Yii et je n'ai rien trouvé d'assez léger, j'ai donc développé une petite extension: ETabbedDiv.

Elle utilise les fonctionnalités de jquery-ui et s'implémente très facilement:

Utilisation

  • dézippez le fichier et copiez ETabbedDiv.php dans votre répertoire protected/extensions/
  • appelez le widget depuis votre vue, comme dans l'exemple suivant:
<?php $this->widget('application.extensions.ETabbedDiv',
   array(
      'divClass' => 'tabbed',
      'tabs' => array(
         'tab1' => array('content' => '<p>Ceci est le premier onglet</p>'),
         'tab2' => array('title'=>'Second', 'content' => '<p>Ceci est le second onglet</p>'),
         'other' => array('content' => '<p>Et voila le dernier onglet</p>'),
      ),
   ),
);
?>

Paramètres

  • divClass (optionnel) est la classe CSS qui sera appliquée au bloc contenant les onglets,
  • tabs est un tableau associatif des onglets, sous la forme id => tableau de contenu décrit ci-dessous
    • title (optionnel) est le titre qui sera affiché dans l'onglet. S'il n'est pas renseigné, id sera utilisé
    • content est le contenu HTML a afficher dans l'onglet

Source

Vous trouverez la version anglaise sur Yii Framework

Lien de téléchargement sur ce blog : ETabbedDiv

lundi 14 octobre 2013

[MàJ] Yii : ajout d'une entrée depuis le CGridView

(Mise à jour : ajout de l'option fillIsFilter) Il est parfois utile de pouvoir remplir un CGridView directement depuis sa vue sans avoir à changer de page. Cette extension permet d'avoir un formulaire dans la grille et d'ajouter à la volée de nouvelles entrées.

Pour les anglophones, la source originale est sur cette page.

Lire la suite...

vendredi 21 juin 2013

Recherche sur plage de taille avec CGridView

En travaillant sur un système de reporting de transferts de fichier (utilisant Yii), j'ai eu besoin d'un champ permettant de faire une recherche sur la taille des fichiers, avec une syntaxe "humainement compréhensible". Et cela avec un seul champ de recherche. (traduction de mon article à http://www.yiiframework.com/wiki/516/search-a-file-size-range-in-cgridview/)

Lire la suite...

vendredi 27 avril 2012

Cryptage réversible en java

Mon cryptage réversible a fait des émules ! Ophanin a fait une version java du système et vous la livre.

A priori complètement compatible avec la version PHP, peut-être un souci sur le décodage mais je suis certain que ce sera vite corrigé.

RevCrypt java

jeudi 25 mars 2010

Ajax en post avec jQuery

Actuellement, jQuery possède une fonction ajax qui est getJSON et qui permet de faire des appels Ajax qui récupèrent des données au format JSON. Le seul souci est que les paramètres envoyées le sont en GET, avec toutes les contraintes que cela impose.

Pour pouvoir fonctionner en POST avec la même logique, j'ai étendu jQuery avec une fonction postJSON:

jQuery.extend({
   postJSON: function( url, data, callback) {
      return jQuery.post(url, data, callback, "json");
   }
});

Elle prend les mêmes arguments que getJSON mais fonctionne en POST.

QuoteInto avec Zend_Db_Table_Abstract

Plus ça va et plus je suis obligé de modifier le Db_Table_Abstract, dans la lignée de lastInsertId() avec Zend_Db_Table_Abstract.

Il s'agit cette fois de pouvoir ajouter des paramêtres dans les fonctions telles que fetchAll() et fetchRow(), voici donc le code ajouté à applications/models/Db/Abstract.php:

Dans le répertoire applications/models/Db, création de la classe Default_Model_Db_Abstract qui étend la classe d'origine Zend_Db_Table_Abstract :

public function quoteInto($text) {
      $args = func_get_args();
      array_shift($args);
      if (isset($args[0]) && is_array($args[0])) {
         $args = $args[0];
      }
      foreach ($args as $arg) {
         $text = preg_replace('/\?{1}/', $this->_db->quote($arg), $text, 1);
      }
      return $text;
   }

On peut désormais, dans le mapper, utiliser:

$this->getDbTable()->fetchAll(
   $this->getDbTable()->quoteInto('requestId = ?', $requestId)
);

ou

$this->getDbTable()->fetchRow(
   $this->getDbTable()->quoteInto('requestId = ?', $requestId)
);

mercredi 17 février 2010

lastInsertId() avec Zend_Db_Table_Abstract

En suivant le tutoriel Zend QuickStart, je me suis retrouvé confronté à un problème: aucun accès au dernier id créé.

C'est une lacune connue mais pas encore corrigée. Voici la méthode que j'ai utilisée pour y remédier:

Nouvel abstract

Dans le répertoire applications/models/Db, création de la classe Default_Model_Db_Abstract qui étend la classe d'origine Zend_Db_Table_Abstract :

<?php 
abstract class Default_Model_Db_Abstract extends Zend_Db_Table_Abstract {
   /**
    * Last insert id.
    *
    * @access private
    * @var int
    */
   private $_iLastInsertId = 0;
 
   /**
    * returns last insert id.
    *
    * @access private
    * @return int
    */
   private function getLastInsertId() {
      return $this->_iLastInsertId;
   }
   /**
    * Initialisation
    *
    * @access public
    * @return void
    */
   public function init() {
   }
   /**
    * Override the initial insert function
    *
    * @access public
    * @param array $aData
    * @return mixed
    */
   public function insert(array $aData) {
      $mReturn = parent::insert($aData);
      $this->setLastInsertId($this->getAdapter()->lastInsertId());
      return $mReturn;
   }
   /**
    * Returns the last insertId
    *
    * @access public
    * @return int
    */
   public function lastInsertId() {
      if (! $this->getLastInsertId()) {
         throw new Exception('Retrieving last insert ID is meaningless without inserting before.');
      }
      return $this->getLastInsertId();
   }
   /**
    * Sets the last insert ID
    *
    * @access private
    * @param int $iLastInsertId
    * @return Db_Table_Abstract
    */
   private function setLastInsertId($iLastInsertId) {
      $this->_iLastInsertId = $iLastInsertId;
      return $this;
   }
}

Modèles de tables

Les modèles contenus dans applications/models/DbTable/ sont ensuite de la forme:

<?php
class Default_Model_DbTable_Users extends Default_Model_Db_Abstract
{
	protected $_name = 'users';
}

Mapper

Au niveau du mapper (applications/models/UsersMapper.php), la fonction setDbTable() est modifiée ainsi:

public function setDbTable($dbTable)
{
   if (is_string($dbTable)) {
      $dbTable = new $dbTable();
   }
   if (!$dbTable instanceof Default_Model_Db_Abstract) {
      throw new Exception('Invalide table data gateway provided');
   }
   $this->_dbTable = $dbTable;
   return $this;
}

Avec ceci, partout dans le mapper on a accès à $this->getDbTable->lastInsertId(), comme c'était possible en passant par l'ancien adaptateur.

lundi 5 octobre 2009

Envoyer un email html avec pièce jointe en PHP

C'est toujours un casse-tête pour envoyer un email avec des pièces jointes.

Cette classe est très simple d'utilisation et possède seulement les options basiques. Elle prépare le contenu du mail et utilise simplement la fonction mail() de php pour l'expédier. Le code ne sera quasiment pas détaillé, ci-dessous vous trouverez essentiellement l'explication de l'utilisation et l'accès aux sources.

Lire la suite...

dimanche 6 septembre 2009

Les assertions et vérification de formulaire

Cette classe abstraite permet de vérifier certaines assertions, ou en d'autres termes de vérifier qu'une valeur répond à une condition.

Les vérifications présentées ici sont très simples mais permettent de traiter la plupart des conditions requises pour un formulaire. Voici le détail des fonctionnalités actuelles.

Lire la suite...

- page 1 de 2