Php 在Yii'中放置小部件;s CActiveForm将丢失CActiveForm功能
我在很多很多地方使用了Php 在Yii'中放置小部件;s CActiveForm将丢失CActiveForm功能,php,yii,yii-widgets,Php,Yii,Yii Widgets,我在很多很多地方使用了CActiveForm::dropdownList()。为了加快开发速度,我想编写一个小部件来封装所有相关的工作。我的某些内容显示正确,但丢失了CActiveForm的验证功能 下面是我如何直接创建下拉列表的$activeModel指的是CActiveForm使用的模型(CActiveRecord)$allItems是用于填充下拉列表的CActiveRecord数组。这段代码工作得很好 <div class="row"> <?php echo $f
CActiveForm::dropdownList()
。为了加快开发速度,我想编写一个小部件来封装所有相关的工作。我的某些内容显示正确,但丢失了CActiveForm
的验证功能
下面是我如何直接创建下拉列表的$activeModel
指的是CActiveForm
使用的模型(CActiveRecord
)$allItems
是用于填充下拉列表的CActiveRecord
数组。这段代码工作得很好
<div class="row">
<?php echo $form->labelEx($activeModel, 'keyId'); ?>:
<?php
$data = array();
foreach ($allItems as $Item) {
$data[$Item->keyId] = CHtml::encode($Item->keyName);
}
$options = array(
'prompt' => 'Select an item',
'options' => array($activeModel->keyId => array('selected' => true)),
);
echo $form->dropDownList($activeModel, 'keyId', $data, $options);
?>
<?php echo $form->error($activeModel, 'keyId'); ?>
</div>
小部件本身如下所示:
<?php
/**
* Echoes a populated <select> element
*/
class CustomDropdown extends CWidget {
public $form;
public $items = array();
public $model;
public $prompt;
public $selected = false;
/**
* @var CActiveForm $form
* @var CActiveRecord[] $items
* @var CActiveRecord $model
* @var string $prompt
* @var bool $selected (optional)
*/
public function run() {
$data = array();
foreach ($this->items as $Item) {
$data[$Item->{$Item->tableSchema->primaryKey}] = CHtml::encode($Item->getName());
}
$options = array(
'prompt' => CHtml::encode($this->prompt),
'options' => (
$this->selected ? array($this->model->{$Item->tableSchema->primaryKey} => array('selected' => true)) : array()
),
);
echo $this->form->dropDownList($this->model, $this->model->tableSchema->primaryKey, $data, $options);
}
}
?>
echo $form->dropDownList(
$activeModel,
'keyId',
CHtml::listData( MyActiveRecordForDropDown::model()->findAll(), 'valueField', 'textField' ),
array( 'prompt' => 'Select an item' )
);
所有这些都可以工作,但是CActiveForm
会在下拉列表中丢失验证功能。具体来说,小部件的$form
不会映射到CActiveForm的验证数组,因此提交错误永远不会显示给用户
如何将此类小部件与
CActiveForm
完全集成,从而不丢失任何功能?感谢您的帮助。根据您的示例判断,调用小部件比调用$form->dropDownList()。我建议简化一些代码并继续使用widgetless解决方案
为什么需要这个代码
$data = array();
foreach ($allItems as $Item) {
$data[$Item->keyId] = CHtml::encode($Item->keyName);
}
$options = array(
'prompt' => 'Select an item',
'options' => array($activeModel->keyId => array('selected' => true)),
);
您只是在重复CHtml::listData()
所做的事情。您只需创建如下下拉列表:
<?php
/**
* Echoes a populated <select> element
*/
class CustomDropdown extends CWidget {
public $form;
public $items = array();
public $model;
public $prompt;
public $selected = false;
/**
* @var CActiveForm $form
* @var CActiveRecord[] $items
* @var CActiveRecord $model
* @var string $prompt
* @var bool $selected (optional)
*/
public function run() {
$data = array();
foreach ($this->items as $Item) {
$data[$Item->{$Item->tableSchema->primaryKey}] = CHtml::encode($Item->getName());
}
$options = array(
'prompt' => CHtml::encode($this->prompt),
'options' => (
$this->selected ? array($this->model->{$Item->tableSchema->primaryKey} => array('selected' => true)) : array()
),
);
echo $this->form->dropDownList($this->model, $this->model->tableSchema->primaryKey, $data, $options);
}
}
?>
echo $form->dropDownList(
$activeModel,
'keyId',
CHtml::listData( MyActiveRecordForDropDown::model()->findAll(), 'valueField', 'textField' ),
array( 'prompt' => 'Select an item' )
);
所选项目将根据模型属性值自动选择