Cform Con Bootstrap3

Ciao a tutti,

sto cercando una soluzione che mi permetta di usare i cform con bootstrap3.

Per quanto riguarda bootstrap ho trovato solo bootstrap3.pascal-brewing.de , però rispetto a diverse soluzioni con bootstrap2 non ha un integrazione con cform perchè essenzialmente un widget. Siete a conoscenza di un estensione migliore?

In caso non ci fosse ho visto che si potrebbe estendere CFormInputElement




class BootstrapInputElement extends CFormInputElement

{

    public static $coreTypes=array(

        'text'=>'textFieldControlGroup'

        .....other elements here......

    );


    //needs to be overridden to make use of BootstrapHtml instead of CHtml. Also take a look at renderLabel and renderHint for the same reason

    public function renderInput()

    {

    if(isset(self::$coreTypes[$this->type]))

    {

        $method=self::$coreTypes[$this->type];

        if(strpos($method,'List')!==false)

            return BootstrapHtml::$method($this->getParent()->getModel(), $this->name, $this->items, $this->attributes);

        else

            return BootstrapHtml::$method($this->getParent()->getModel(), $this->name, $this->attributes);

    }



Per ottenere un output in bootstrap 3 l’uso del widget è il seguente




$form = $this->beginWidget('bootstrap.widgets.BsActiveForm', array(.........

));

echo $form->textFieldControlGroup($model, 'username');

essendo un widget lo devo applicare ad un componente, ma in questo caso come faccio? sto sbagliando approccio?

Grazie in anticipo per ogni suggerimento!

Spiacente, ma personalmente volendo usare bs3 con yii ho modificato il codice generato da gii in modo che corrisponda a come desidero.

Per far questo ho proprio creato un mio crud generator, per evitare di dover rimodificare ogni codice generato.

Mi rendo conto dello sforzo che questo comporta, e che non è proprio entry-level. Però non è difficile ed è molto "yii-way"

Grazie per la risposta! Vediamo se l’ho capita :)

L’estensione ha un suo generatore CRUD che ho avuto modo di modificare e funziona correttamente.

Il problema non è lato view, il problema è lato cform ampiamente utilizzato nell’estensione wizard-behavior.pbm-webdev.co.uk


public function registrationWizardProcessStep($event) {

		$modelName = ucfirst($event->step);

		$model = new $modelName();

		$model->attributes = $event->data;

		$form = $model->getForm();


		$this->render('form', compact('event','form'));

	}

certo una soluzione wii sarebbe implementare una vista per ciascun modello




$this->render('form'.$modelName, compact('event','form'));



ma in questo modo il vantaggio di usare una sola vista per tutti i modelli coinvolti nel Wizard viene a mancare

Condivido la soluzione sperando possa servire ad altri.

BootstrapForm:

  • estende la classe CForm

  • definisce un nuova classe come inputElement, nel nostro caso BootstrapInputElement definita successivamente

  • in fase di render aggiunge la classe html ‘form-group’


class BootstrapForm extends CForm

{

 public $inputElementClass="BootstrapInputElement";

    public function renderElement($element)

    {

        if(is_string($element))

        {

            if(($e=$this[$element])===null && ($e=$this->getButtons()->itemAt($element))===null)

                return $element;

            else

                $element=$e;

        }

        if($element->getVisible())

        {

            if($element instanceof CFormInputElement)

            {

                if($element->type==='hidden')

                    return "<div style=\"visibility:hidden\">\n".$element->render()."</div>\n";

                else

                    return "<div class=\"form-group field_{$element->name}\">\n".$element->render()."</div>\n";

            }

            elseif($element instanceof CFormButtonElement)

                return $element->render()."\n";

            else

                return $element->render();

        }

        return '';

    }

}



BootstrapInputElement invece semplicemente richiama i metodi dell’estensione di bootstrap 3 BSHtml al posto di CHtml.




class BootstrapInputElement extends CFormInputElement

{

    //needs to be overridden to make use of BootstrapHtml instead of CHtml. Also take a look at renderLabel and renderHint for the same reason

    public function renderInput()

    {


        if(isset(self::$coreTypes[$this->type]))

        {

            $method=self::$coreTypes[$this->type];

            if(strpos($method,'List')!==false)

                return BSHtml::$method($this->getParent()->getModel(), $this->name, $this->items, $this->attributes);

            else

                return BSHtml::$method($this->getParent()->getModel(), $this->name, $this->attributes);

        }

        else

        {

            $attributes=$this->attributes;

            $attributes['model']=$this->getParent()->getModel();

            $attributes['attribute']=$this->name;

            ob_start();

            $this->getParent()->getOwner()->widget($this->type, $attributes);

            return ob_get_clean();

        }

    }

}



ecco, questa è una Yii-Way …

bravo