需要帮助使用yii-framework创建带有下拉列表(关系)的CRUD屏幕

时间:2013-06-23 19:11:42

标签: php yii yii-extensions

我需要使用yii-framework创建CRUD屏幕。使用一张桌子的简单CRUD屏幕工作得很好。我在使用下拉列表(链接表)时遇到问题/问题。

我已经安装了giix扩展,如果指定了FK,我想用下拉列表创建CRUD但是我的托管服务提供商上没有MySql Engine InnoDB,所以我无法使用该扩展。我需要手动完成。

我有两张桌子

主要: - ID STORE_ID 前缀

存储: - ID 名称

现在main的store_id是FK到商店表的id。我想为主表创建CRUD。

这样添加屏幕应显示: -

商店名称: - 下拉列表 前缀: - 文本框

查看屏幕应使用商店表的名称列,而不是显示store_id

感谢您的期待。

2 个答案:

答案 0 :(得分:2)

使用Gii生成CRUD,然后阅读我的博客。 http://jmmurphy.blogspot.com/2013/05/using-yii-model-relations.html

基本上,在Gii Generation

之后,你的store_id字段会有这样的东西
<?php echo $form->labelEx($model,'store_id'); ?>
<?php echo $form->textField($model, 'store_id', array('size'=>60,'maxlength'=>255));?>
<?php echo $form->error($model,'store_id'); ?>

textField行替换为:

<?php $list = CHtml::listData(Store::model()->findAll(), 'id', 'name'); ?>
<?php echo $form->dropDownList($model, 'store_id', $list, array('empty'=>'(Select a Store)')); ?>

您还需要在Main模型中定义关系,以便您可以访问相关表(即使您的数据库不支持外键),如下所示:

public function relations()
{
    return array(
        'store'=>array(self::BELONGS_TO, 'Store', 'store_id'),
    );
}

要完成此关系,您还应该为Store模型添加以下关系:

public function relations()
{
    return array(
        'main'=>array(self::HAS_MANY, 'Main', 'store_id'),
    );
}

这些关系定义了Store和Main之间的一对多关系,其中store是父级,Main是Child。要使其成为一对一关系,请将HAS_MANY更改为HAS_ONE。 HAS_ *进入父模型并指向子表中的外键属性。 BELONGS_TO进入子进程并告诉子表中的属性指向父进程中的主键。

现在要查看视图操作中的商店名称,您需要将view.php中的“store_id”更改为如下所示的数组:

array(
   'name' => 'store_id',
   'value' => $model->store->name,
)

管理员视图略有不同。我不确定为什么,但要在管理视图中查看商店名称而不是ID,您将需要使用如下所示的数组:

array(
   'name' => 'store_id',
   'value' => '$data->store->name',
)

请注意,Gii生成这个以便$ data是模型而不是$ model,并且它还有一个时髦的双间接内容,因此您需要将变量声明放在单引号中。

答案 1 :(得分:0)

感谢jmarkmurphy的帮助。你帮助了我很多,只有在你给我指导的时候,我才将你的答案标记为正确。只需详细发布确切的代码。

我用以下代码更改了view.php: -

<?php $this->widget('zii.widgets.CDetailView', array(
'data'=>$model,
'attributes'=>array(
    'id',
    'store.name',
    'prefix',
),

));

还使用以下代码更改了admin.php: -

<?php echo CHtml::encode($data->store->name); ?>

<?php $this->widget('zii.widgets.grid.CGridView', array(
'id'=>'main-grid',
'dataProvider'=>$model->search(),
'filter'=>$model,
'columns'=>array(
    'id',
    'store.name',
    'prefix',
    array(
        'class'=>'CButtonColumn',
    ),
),

)); ?&GT;

再次感谢jmarkmurphy。非常感谢 。我的应用程序现在正在按照我想要的方式工作。