Rendre facilement compatibles avec Bootstrap des formulaires standard CakePHP

Des plugins excellents existent pour intégrer Bootstrap dans CakePHP, comme twitter-bootstrap-helper. Cependant même s'ils permettent d'intégrer assez facilement des élements de Bootstrap dans une application, ils ne permettent pas forcément d'adapter automatiquement des formulaires déjà existants à un affichage profitant de Bootstrap.

Si vous avez généré vos formulaires dans vos vues avec la commande 'cake bake' ou en suivant le même standard, voiçi un helper qui permettra de rendre instantanément vos formulaires Bootstrap-compatibles.

Ce Helper est compatible avec Bootstrap 2.3.1 et Cake 2.X.

<?php
/**
 * CakePHP(tm) : Rapid Development Framework (http://cakephp.org)
 *
 * Licensed under The MIT License
 *
 * Copyright (c) La Pâtisserie, Inc. (http://patisserie.keensoftware.com/)
 * @license     MIT License (http://www.opensource.org/licenses/mit-license.php)
 */

App::uses('FormHelper', 'View/Helper');

class BootstrapFormHelper extends FormHelper {

/**
 * Default input values with bootstrap classes
 * Changed order of error and after to be able to display validation error messages inline
 */
	protected $_inputDefaults = array(
		'format' => array('before', 'label', 'between', 'input', 'error', 'after'),
		'div' => 'control-group',
		'label' => array('class' => 'control-label'),
		'between' => '<div class="controls">',
		'after' => '</div>',
		'class' => 'input-xxlarge',
		'error' => array('attributes' => array('wrap' => 'span', 'class' => 'help-inline'))
	);
	
/**
 * Added an array_merge_recursive for labels to combine $_inputDefaults with specific view markup for labels like custom text.
 * Also removed null array for options existing in $_inputDefaults.
 */
	protected function _parseOptions($options) {
		if(!empty($options['label'])) {
			//manage case 'label' => 'your label' as well as 'label' => array('text' => 'your label') before array_merge()
			if(!is_array($options['label'])) {
				$options['label'] = array('text' => $options['label']);
			}
			$options['label'] = array_merge_recursive($options['label'], $this->_inputDefaults['label']);
		}
		$options = array_merge(
			array('before' => null),
			$this->_inputDefaults,
			$options
		);
		return parent::_parseOptions($options);
	}
	
/**
 * adds the default class 'form-horizontal to the <form>
 * 
 */
	public function create($model = null, $options = array()) {
		$class = array(
			'class' => 'form-horizontal',
		);
		$options = array_merge($class, $options);
		return parent::create($model, $options);
	}
	
/**
 * modified the first condition with a more general empty() otherwise if $default is an empty array
 * !is_null() returns true and $this->_inputDefaults is erased
 */
	public function inputDefaults($defaults = null, $merge = false) {
		if (!empty($defaults)) {
			if ($merge) {
				$this->_inputDefaults = array_merge($this->_inputDefaults, (array)$defaults);
			} else {
				$this->_inputDefaults = (array)$defaults;
			}
		}
		return $this->_inputDefaults;
	}
	
}

Comment utiliser ce Helper ?

Pour utiliser ce Helper, créez un fichier nommé BootstrapFormHelper.php dans le répertoire View/Helper de votre application et copiez y le code, ou alors téléchargez le sur github.

La redéclaration de la fonction _parseOptions() est purement utilitaire, elle permet de ne pas avoir à redéclarer la classe "help-inline" lorsque l'on personnalise le label d'un input (comme ajouter un texte personnalisé). Par défaut sans array_merge_recursive(), c'est l'array 'label' déclaré dans la vue qui écrasera celui de $_inputDefaults, ce qui oblige à redéfinir la classe du label en plus du texte.

La redéclaration de la fonction create() est absolument indispensable pour ajouter la class "form-horizontal" à la création du form.

La redéclaration de la fonction inputDefaults() est indispensable aussi, sinon les valeurs du protected $_inputDefaults sont écrasées.

Enfin, pour pouvoir utiliser le Helper de manière transparente dans vos vues avec la syntaxe $this->Form->input(), n'oubliez pas de faire un alias du FormHelper dans votre AppController.php ou dans le contrôleur dans lequel vous déclarez le Helper Form.

public $helpers = array('Form' => array('className' => 'BootstrapForm'));
Cette page appartient aux catégories suivantes: actualités , CakePHP , Code.

Commentaires

Ajoutez un commentaire

5103
Petits fours servis