如何将参数传递给Yii中的场景?

时间:2015-01-21 12:25:32

标签: yii

如何将$id传递给搜索方案?也许在模型中看起来像这样,所以我可以像控制器一样调用:

$model = new job('search',$id);

4 个答案:

答案 0 :(得分:4)

我认为你正在尝试进行搜索。搜索是一回事,一个"场景"是另一回事。

在验证规则中使用方案,以便能够以多种方式验证同一模型,具体取决于您插入/添加或搜索数据的位置。

还有一个叫做搜索'的场景。该模型的search()方法使用了该方法,但我告诉您原因:

有几种方法可以使用Yii在数据库中搜索某些内容,我将提到两种:

1)使用ClassName :: model() - > findCommandHere

其中有几个:

ClassName::model()->findByPk($id);
ClassName::model()->findAll("id=$id");
ClassName::model()->findByAttributes(array('id'=>$id));

依此类推,更多信息:http://www.yiiframework.com/doc/guide/1.1/en/database.ar#reading-record

2)使用模型的search()方法

这种查找数据的方式主要用于轻松创建搜索页面并与数据网格结合使用。

如果您使用GII代码生成工具生成CRUD代码,它将为您生成所有部分,但我将解释每个部分的工作原理。

此代码来自Yii文件中的博客演示:

在控制器中,它使用Post类定义$model并搜索'作为情景。

$model=new Post('search');
if(isset($_GET['Post']))  // <- checks if there are search params in the URL
    $model->attributes=$_GET['Post']; // <- assigns all search params masively to the model (later you'll see why)
$this->render('admin',array(
    'model'=>$model,
));

&#39;搜索&#39;这里的场景告诉Yii直接从$_GET(URL)分配搜索参数时要使用的验证规则。

您可以看到params被大量分配以减少编写的代码但$model->attributes=$_GET['Post']它与执行相同:

$model->title=$_GET['Post']['title'];
$model->status=$_GET['Post']['status'];

在Post模型中,您可以找到搜索方案的验证规则。告诉Yii,分配标题和状态字段是安全的,以便以后在搜索中使用它们。

public function rules()
{
    return array(
        // ... //

        array('title, status', 'safe', 'on'=>'search'), 
    );
}

然后在Post模型中,您可以看到实际用于获取数据的search()方法:

public function search()
{
    $criteria=new CDbCriteria;

    $criteria->compare('title',$this->title,true);

    $criteria->compare('status',$this->status);

    return new CActiveDataProvider('Post', array(
        'criteria'=>$criteria,
        'sort'=>array(
            'defaultOrder'=>'status, update_time DESC',
        ),
    ));
}

搜索方法创建了一个&#34;标准&#34;并使用您之前分配给此模型的值应用所需的过滤方式。请参阅$this->title来自您在控制器中使用的$model->attributes=$_GET['Post']

标准可以直接在模型上使用,例如Post::model()->findAll($criteria),但在这种情况下,search()方法使用不同的东西,数据提供者&#34;。

数据提供商是一件好事,因为它在一个地方为您提供了大量工具,它会返回数据,还有分页和排序,因此您不必手动定义更多代码为此目的(CPaginationCSort)。

最后,在视图admin.php中,它将使用网格视图显示结果:

$this->widget('zii.widgets.grid.CGridView', array(
    'dataProvider'=>$model->search(),
    'filter'=>$model,
    'columns'=>array(
        array(
            'name'=>'title',
            'type'=>'raw',
            'value'=>'CHtml::link(CHtml::encode($data->title), $data->url)'
        ),
        array(
            'name'=>'status',
            'value'=>'Lookup::item("PostStatus",$data->status)',
            'filter'=>Lookup::items('PostStatus'),
        ),

    ),
)); 

现在您可以看到,在网格配置中,它将$model->search()方法作为网格应使用的dataProvider进行传递。

现在,网格可以访问其余的dataProvider元素,例如排序,分页并在页面上显示它们。

如果你不想使用CGridView,因为它是一个非常基本的表,并且你想创建自己的html标记,你也可以通过一个方法检索dataProvider及其组件一个并将它们放在HTML代码中并根据需要显示数据:

$dataProvider=$model->search(); // get the dataprovider from search method
$models=$dataProvider->getData(); // actually get the data (rows) and assign them to a $models variable that you can put in a foreach loop

// show pagination somewhere
$this->widget('CLinkPager', array(
              'pages' => $dataProvider->pagination,
          ));

// create sort links
echo $dataProvider->sort->link('title', 'Title');

所以我希望它能解决你对如何使用Yii显示/搜索数据的疑虑。

我建议你阅读官方手册:http://www.yiiframework.com/doc/guide/1.1/en/index

我还建议查看API,然后在那里搜索所有Yii组件,看看他们有哪些方法和参数:http://www.yiiframework.com/doc/api/

手动探索框架代码库是一种很好的学习方法。如果你不知道CActiveDataProvider如何工作,那么在代码中找到CActiveDataProvider类文件,你就会看到它使用的所有方法和属性,所以这样做对于一切你不明白它是如何运作的。

对于初学者,我建议使用一个好的IDE来自动完成代码,并允许你按Ctrl +单击一个类名,它将找到定义它的原始文件。我使用NetBeans for PHP,在创建项目后,我将Yii框架文件添加到项目中,包括NetBeans知道如何查找框架文件以进行自动完成和ctrl + click的路径。

答案 1 :(得分:1)

我认为这只需要完成工作而不需要任何方案

$model = new job;   
$model->search($id); 

但如果我无法理解您的问题,那么您也可以尝试这个

$model = new job('search');
$model->search($id);

答案 2 :(得分:1)

将场景视为可在模型中使用的特殊变量。

$userModel = new User("register");
$userModel->setId = 10;

是相同的

$userModel = new User();
$userModel->scenario = 10
$userModel->setId = 10;

在你的模特中

class Manufacturer extends CActiveRecord
{
        // :
   if ($this->scenario == 'register')  ...
        // :

}

答案 3 :(得分:1)

是的,您可以使用参数定义方案,但该方案包含在模型的类构造函数中

$model = new Job('search'); // creating a model with scenario search

如果你想包含更多参数,那么你需要使用createComponent -remember,所有都是一个组件

$model = Yii::createComponent(array('class'=>'Job','scenario'=>'search'));