基于模型的Bootstrap小部件


Yii Bootstrap widget non based on model

渲染任何不基于模型的Yii-Bootstrap小部件的最佳方法(如果有的话)是什么?

我有一个创建/更新表单的所有模型的属性,现在我想添加一个额外的下拉列表,这将让用户选择一些值从纯数组,这与当前模型无关。

换句话说,我正在寻找等价的CHtml::dropDownList,这将让我渲染这个特定的列表样式在Yii-Bootstrap的心情,就像我的表单上的所有其他元素。

到目前为止,我尝试引入自己的助手方法,包含对Yii::app()->controller->widget('bootstrap.widgets.input.TbInputHorizontal', array());的直接调用。但是失败了。如果没有模型和属性,所有的Yii-Bootstrap小部件和方法似乎都要死了。

我也试过超载TbInputHorizontal::dropDownList(),强迫它使用CHtml::dropDownList而不是$this->form->dropDownList,但我不知道,如何强迫TbActiveForm使用我的小部件而不是TbInputHorizontal

嗯,Bootstrap依赖于标记和类,我所做的是复制Bootstrap所需的相同标记,并通过 htmlloptions 的数组将类添加到元素中。

这是我做的一个例子(有些词是西班牙语),它是一个水平形式与一些下拉框和输入框,观察我如何传递他们引导类:

  • 标签array('class' => 'col-lg-2 control-label')
  • array('class' => 'form-control')用于输入控件

下面是一个例子(它包括一个Yii的jQuery UI日期拾取器的例子):

<?php $form=$this->beginWidget('CActiveForm', array(
    'id'=>'subscriber-form',
    'htmlOptions' => array('class'=>'form-horizontal'),
)); ?>
<fieldset>
    <legend>Datos del usuario</legend>
    <div class="form-group">
        <?php 
            echo CHtml::label('Pasarela de pago','gateway', array(
            'class' => 'col-lg-2 control-label'
            )) 
        ?>
        <div class="col-lg-2">
            <?php 
                echo CHtml::textField('gateway',$gateway, array(
                    'id'=>'gateway',
                    'class' => 'form-control', 'disabled'=>'true'
                ));
            ?>
        </div>
    </div>
    <div class="form-group">
        <?php 
            echo CHtml::label('Fecha de suscripción','subscriptionDate', array(
            'class' => 'col-lg-2 control-label'
            )) 
        ?>
        <div class="col-lg-2">
            <?php
            $this->widget('zii.widgets.jui.CJuiDatePicker',array(
                'name'=>'subscriptionDate',
                'attribute'=>'subscriptionDate',
                'language'=>'es',
                'options'=>array(        
                    'showButtonPanel'=>true,
                    'dateFormat'=>'dd/mm/yy',
                    'maxDate'=>'0',
                ),
                'htmlOptions'=>array(
                    'class'=>'form-control'
                ),
            ));
         ?>
        </div>
    </div>
    <div class="form-group">
        <?php echo CHtml::label('Estado','status', array(
            'class'=>'col-lg-2 control-label'
            )); 
        ?>
        <div class="col-lg-2">
            <?php 
                echo CHtml::dropDownList('status', $status, $statusList , array(
                'class'=>'form-control'
                )); 
            ?>
        </div>
    </div>
    <div class="col-lg-3 col-lg-offset-2">
        <?php echo CHtml::submitButton('Guardar cambios', array(
            'class'=>'btn btn-primary'
        )) ?>
        <a class="btn btn-default" href="<?php echo Yii::app()->urlManager->createUrl('admin/suscriptores'); ?>">Cancelar</a>
    </div>
</fieldset>
<?php $this->endWidget() ?>

到目前为止,我想到的唯一解决方案是在我的视图中直接复制Yii-Bootstrap样式:

<?php $fieldName = 'Boards['.$type.']'; ?>
<div class="control-group">
    <div class="controls">
        <div class="input-prepend">
            <span style="width: 215px; text-align: left" class="add-on">
                <label for="<?php echo $fieldName; ?>"><?php echo ucfirst($committees['boards']['roles'][$type]); ?></label>
            </span>
            <?php echo CHtml::dropDownList($fieldName, $committee, $committees['boards']['names'], array('style'=>'width: 650px')); ?>
        </div>
    </div>
</div>

讨厌,但它是有效的。但是,我想看看其他选项