Salut,
J'ai un petit helper pour faire fonctionner les fomrulaires avec le style de twitter Bootstrap3. Ca fonctionne parfaitement et ça formate correctement les formulaires.

Cependant, je veux rajouter sous mes input une petite div qui a la class 'indicator' qui comprendra une indication sous l'input, comme ceci:

<input type="text" required="required" id="PostName">
<div class="indicator">max. 70 caractères</div>

Comme je veux me faciliter la vie, je veux pouvoir ajouter dynamiquement cette div dans un attribut dans du helper form comme ça :

<?php 
echo $this->Form->input('name',array('label'=>'Titre', 'indicator' => "max. 70 caractères")); 
?>

Ma question est simple : Comment récupérer la valeur de l'attribut "indicator" dans la classe de mon helper qui se trouve dans "View/Helper" ?

4 réponses


Niramar
Réponse acceptée
public function input($fieldName, $options = array()) {
    // J'ajoute la div.indicator si l'option est précisé
    $indicator = isset($options["indicator"]) ? "<div class="indicator">".$options["indicator"]."</div>" : null;

        if (isset($options['label']) && is_string($options['label'])) {
            $option['text'] = $options['label'];
            $options['label'] = array_merge($option, $this->_inputDefaults['label']);
        }
        else if (isset($options['label']['text']) && !isset($options['label']['class'])) {
            $options['label'] = array_merge($options['label'], $this->_inputDefaults['label']);
        }

        return parent::input($fieldName, $options).$indicator;// je retourne l'input avec l'indicateur
    }

Rien de plus quand tu utilise ton helper :

echo $this->Form->input('name',array('label'=>'Titre', 'indicator' => "max. 70 caractères")); 

Dans les options de ta méthode tout simplement un petit example d'un de mes helper form:

    public function input($fieldName, $options = []) {
        $config = $this->config();
        $__ = $this->translate();
        $options['required'] = false;
        if (!isset($options['label'])) $options['label'] = $__($fieldName);// Set default label
        if (!isset($options['placeholder'])) $options['placeholder'] = $__($fieldName.'PH');// Set default placeholder
        $options = $this->popover($fieldName, $options);// Set default popover
        return $this->Form->input($fieldName, $options);
    }

Bon j'ai fait un copier coller...
Tu as 2 params passés le premier étant le champs le second les option que tu passes donc tu récupère $otpions['indicator'] dans ton cas et tu retourne par example

$indicator = "<div class="indicator">".$options["indicator"]."</div>";
unset($options["indicator"]);// Histoire de pas le retrouver dans les params de ton input
return $this->Form->input($fieldName, $options).$indicator;

et voila

Merci @Niramar, j'ai tenté d'appliquer ça à mon helper mais je n'y suis pas parvenu.

Voici mon helper Bootstrap3 tel qu'il est
(et c'est bien là que j'aimerai générer la div class="indicator") :

class BootstrapHelper extends FormHelper {

    public function create($model = null, $options = array()) {
   // $legend= "<div class='legend'>".$options["legend"]."</div>";
        $defaultOptions = array(
            'inputDefaults' => array(
                'div' => array(
                    'class' => 'form-group'
                ),

                'label' => array(
                    'class' => 'col-lg-2 control-label'
                ),
                'between' => '<div class="col-lg-9">',
                'seperator' => '</div>',

                'after' => '</div>',
                'class' => 'form-control',
            ),
            'class' => 'form-horizontal',
            'role' => 'form',
        );

        if(!empty($options['inputDefaults'])) {
            $options = array_merge($defaultOptions['inputDefaults'], $options['inputDefaults']);
        } else {
            $options = array_merge($defaultOptions, $options);
        } 
        return parent::create($model, $options);
    }

    // Remove this function to show the fieldset & language again
    public function inputs($fields = null, $blacklist = null, $options = array()) {
        $options = array_merge(array('fieldset' => false), $options);
        return parent::inputs($fields, $blacklist, $options);
    }

    public function submit($caption = null, $options = array()) {
        $defaultOptions = array(
            'class' => 'btn btn-flat btn-lg btn-success pull-right',
            'div' =>  'form-group',
            'before' => '<div class="col-lg-offset-2 col-lg-9">',
            'after' => '</div>',
        );
        $options = array_merge($defaultOptions, $options);     
        return parent::submit($caption, $options);
    }

    public function input($fieldName, $options = array()) {
        if (isset($options['label']) && is_string($options['label'])) {

            $option['text'] = $options['label'];
            $options['label'] = array_merge($option, $this->_inputDefaults['label']);
        }
        else if (isset($options['label']['text']) && !isset($options['label']['class'])) {
            $options['label'] = array_merge($options['label'], $this->_inputDefaults['label']);
        }

        return parent::input($fieldName, $options);

    }

}

Une idée ?

Merci beaucoup de ton aide @Niramar ! J'y vois un peu plus clair dans le fonctionnement des helpers.