1

我对 Yii 框架有点陌生。我正在制作一个产品销售网站,它有 3 个基本模型
1.包含主键 id 的用户模型 2.包含键 id的产品模型 3.订单模型,它基本上是产品和订单之间的映射。它包含字段product_iduser_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)如何在保存成功后显示闪存消息?

请帮助我解决我的 3 个问题,如果您觉得这些问题太愚蠢,我们深表歉意。

4

3 回答 3

2

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 : 代码展示了如何设置和显示订单成功后的闪信。

于 2013-10-20T19:13:43.167 回答
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 消息,您可以Yii->app()->user->setFlash('orderStatus', 'Successful')在 actionOrder 中的重定向(或渲染)之前使用 ,。要显示它:

<?php if(Yii::app()->user->hasFlash('orderStatus')):?>
<div class="info">
    <?php echo Yii::app()->user->getFlash('orderStatus'); ?>
</div>
<?php endif; ?>
于 2013-10-20T17:44:50.330 回答
0

首先,您必须声明表单发送方法,如果您使用的是 bootsrap,它会像我的一样:

<?php $form = $this->beginWidget('bootstrap.widgets.TbActiveForm', array(
    'action' => Yii::app()->createUrl($this->route),
    'method' => 'post',
    'id' => 'activity_timeRpt',
));
?>

其次,如果要发送自定义输入,则必须指定,否则会像

我会回来完成这个

于 2013-10-20T13:33:00.590 回答