我对Yii框架有点新意。我正在制作一个销售网站的产品,它有3个基本型号 1. 用户包含主键ID 的模型 2. 产品包含主键ID 的模型 3. 订单模型,它基本上是产品和订单之间的映射。它包含 product_id 字段和 user_id 字段外键。
我创建了一个页面,其中填充了所有产品,登录用户可以单击产品包装盒上的按钮来订购特定产品。
链接的代码就像这样
<?php echo CHtml::link('Order Now',array('order',
'product_id'=>$model->id,
'user_id'=>Yii::app()->user->id)); ?>
(Q1)这是发送GET请求,但我想发送详细信息作为发布请求。怎么做?
我的默认控制器是站点控制器。我在这个控制器中创建了一个actionOrder方法。 代码是:
if(Yii::app()->user->isGuest){
$this->redirect('login');
}else{
$model=new Orders;
if(isset($_POST['products_id']))
{
$model->attributes->products_id=$_POST['product_id'];
$model->attributes->users_id=Yii::app()->user->id;
if($model->save())
$this->redirect(array('index'));
}
$this->render('index');
}
但是这段代码显示出一堆错误。此外,(Q2)如何将products_id
和users_id
放在一个数组Orders
中,这样我就必须编写$_POST['orders']
此外,(Q3)如何在保存成功后显示Flash消息?
请帮助我解决我的3个问题,如果你觉得问题太愚蠢,请对不起。
答案 0 :(得分:1)
Q1 :如果你想使用POST请求,你将不得不使用一种形式,在这种情况下是CActiveForm。
控制器:
public function actionOrder()
{
if(Yii::app()->user->isGuest)
$this->redirect('login');
else
{
$model=new Orders;
if(isset($_POST['Orders']))
{
$model->product_id=$_POST['Orders']['products_id'];
$model->users_id = Yii::app()->user->id;
if($model->save())
{
// Q3: set the flashmessage
Yii::app()->user->setFlash('ordered','The product has been ordered!');
$this->redirect(array('index'));
}
}
$this->render('index', array('model'=>$model)); //send the orders model to the view
}
}
查看:
<!-- Q3: show the flash message if it's set -->
<?php if (Yii::app()->user->hasFlash('ordered')): ?>
<?php echo Yii::app()->user->getFlash('ordered'); ?>
<?php endif ?>
...
<?php $form=$this->beginWidget('CActiveForm', array('id'=>'order-form')); ?>
<?php echo $form->hiddenField($model,'products_id',array('value'=>$product->id)); ?> // please note the change of variable name
<?php echo CHtml::submitButton('Order Now'); ?>
<?php $this->endWidget(); ?>
请注意,我已将产品型号变量$model
的名称更改为$product
,因为我们将$model
用于表单的订单模型。
Q2 :在这种情况下,我在控制器中设置了users_id
值,因此$_POST['Orders']
仅包含products_id
的值。在yii中,您还可以通过以下方式批量分配属性:
$model->attributes = $_POST['Orders']
这基本上意味着$_POST['Orders']
已经是一个关联数组,其中包含表单中的属性名称和值。
Q3 :代码显示订单成功后如何设置和显示Flash消息。
答案 1 :(得分:0)
首先你必须声明表单发送方法,如果你使用的是bootrap它会像我的一样:
<?php $form = $this->beginWidget('bootstrap.widgets.TbActiveForm', array(
'action' => Yii::app()->createUrl($this->route),
'method' => 'post',
'id' => 'activity_timeRpt',
));
?>
其次,如果你想发送自定义输入,你必须指定,否则它就像
我将回来完成这个
答案 2 :(得分:0)
对于您的问题1和2,我建议您使用CActiveForm课程。例如
<?php $form = $this->beginWidget('CActiveForm', array(
'action' => 'you_action_here'
'method'=>'post' // this is optinal parameter, as 'post' is default value
)); ?>
<?php echo $form->textField($model,'product_id'); ?>
<?php echo $form->hiddenField($model,'user_id', array('value'=>Yii::app()->user->id)); ?>
<?php $this->endWidget(); ?>
其中$model
是Orders
类的实例,由变量通过控制器传递,或在视图文件中设置。之后,您可以在操作方法中以您想要$model->attributes = $_POST['orders']
的方式使用它。
对于Flash消息,您可以在actionOrder中重定向(或渲染)之前使用Yii->app()->user->setFlash('orderStatus', 'Successful')
。要表明:
<?php if(Yii::app()->user->hasFlash('orderStatus')):?>
<div class="info">
<?php echo Yii::app()->user->getFlash('orderStatus'); ?>
</div>
<?php endif; ?>