简单的Yii表格

时间:2014-02-28 20:02:37

标签: yii

在阅读了YiiFramework和Ullman之后,有几个关于形式的事情对我来说仍然很不清楚。我尝试了很多东西,但一般认为我必须遗漏一些基本的东西。

作为一个应用程序,我说我正在创建一个用户可以发布的墙。我可以在控制器中使用以下方法显示特定用户的所有帖子:

public function actionShow($id)
{
    $userModel = new User;
    $user      = $userModel->findByPk($id);

    $postModel = new UserPost;
    $criteria = new CDbCriteria();
    $criteria->condition = 'user_id='.$id;

    $myPosts = $postModel->findAll($criteria);

    $this->render('show',array(
                  'user'    => $user,
                  'myPosts' => $myPosts,
                  'post'    => $postModel,
                  ));
}

视图(show.php)中的以下(缩写)代码呈现输出:

echo '<h2>' . $user->first_name . '</h2>';

foreach ($myPosts as $myPost){
    echo $myPost->post;
    echo '<br/>';
}

我尝试使用表单构建器创建表单:

return array(
    'title'=>'Write Something',

    'elements'=>array(
        'post'=>array(
            'type'=>'text',
            'maxlength'=>255,
        )
    ),

    'buttons'=>array(
        'post'=>array(
            'type'=>'submit',
            'label'=>'Post',
        ),
    ),
);

然后我使用:

创建了一个引用(在上面的actionShow中)
...
$myPosts = $postModel->findAll($criteria);
$postForm = new CForm('application.views.site.postForm', $postModel);
$this->render('show',array(
...

将其传递到我的视图(show.php),并在顶部呈现:

$form->render();

echo $form;

此时,它只是呈现postForm.php文件的内容。

问题......

  1. 使用CForm是否正确(或者我应该使用CActiveForm)?

  2. 为什么不呈现表单?

  3. 在这种情况下我应该直接使用CHtml吗?

  4. 谢谢!

1 个答案:

答案 0 :(得分:0)

这个例子非常接近于工作。在查看了几个例子后,我将细节拼凑在一起,并开始与Yii一起开始。

<强> 1。使用CForm是否正确(或者我应该使用CActiveForm)?
在这种情况下,CForm是正确的。要问的问题是“post”背后的模型是否是ActiveRecord(即它是扩展CActiveModel还是仅扩展CModel)? CForm / CActiveForm的使用应遵循所使用的模型。代码可以编写为使用任何一种模型,它只取决于开发人员如何处理信息。

如果要填充填写数据库表条目的表单,则拥有活动模型是有意义的。如果表格只是提供一条信息来处理(例如搜索),那么甚至可能没有模型。

我发现this是一个非常有用的例子。

<强> 2。为什么不渲染表格?
上面的代码基于Yii Framework page about using the form builder上的示例。为了使其工作,表单构建器文件在第一行中需要以下代码:

<?php

没有它,页面只是将内容呈现为数组。这不是在原始页面上,而是在其他一些示例中找到。

第3。在这种情况下我应该直接使用CHtml吗?
在发现问题#2的解决方案之前,我使用CHtml实现了表单并且效果很好。以下代码生成与上面的表单构建器代码中表达的相同形式(粗略)。

echo CHtml::beginForm();
echo CHtml::textField('Text', 'some value');
echo CHtml::submitButton('Post');
echo CHtml::endForm();

这不是可重复使用的,但在这种情况下,它是一种非常简单的形式。无论如何,我可能会使用表单构建器重新编写它。