Yii Bootstrap小部件非基于模型

时间:2014-08-17 17:13:03

标签: php twitter-bootstrap yii yii-extensions

渲染任何不基于模型的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小部件而不是{{1}}。

2 个答案:

答案 0 :(得分:1)

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

这是我做的一个例子(有些单词是西班牙语),它是一个水平形式,带有一些dropDowns和Input框,观察我如何传递它们的bootstrap类:

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

以下是示例(它包含Yii的jQuery UI datepicker的示例):

<?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() ?>

答案 1 :(得分:0)

我到目前为止唯一的解决方案是在我看来直接复制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>
讨厌,但它正在发挥作用。但是,我想看看其他一些选择。