如何通过POST发送请求以及如何访问模型的属性?

时间:2013-10-20 12:13:03

标签: php yii yii-components

我对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_idusers_id放在一个数组Orders中,这样我就必须编写$_POST['orders'] 此外,(Q3)如何在保存成功后显示Flash消息?

请帮助我解决我的3个问题,如果你觉得问题太愚蠢,请对不起。

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

其中$modelOrders类的实例,由变量通过控制器传递,或在视图文件中设置。之后,您可以在操作方法中以您想要$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; ?>