2014-02-28 66 views
0

通过YiiFramework和Ullman阅读后,有几种关于形式的事情我仍然很不清楚。我尝试了很多东西,但一般认为我必须错过一些根本性的东西。简单的Yii形式

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

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吗?

谢谢!

回答

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

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