在阅读了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文件的内容。
问题......
使用CForm是否正确(或者我应该使用CActiveForm)?
为什么不呈现表单?
在这种情况下我应该直接使用CHtml吗?
谢谢!
答案 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();
这不是可重复使用的,但在这种情况下,它是一种非常简单的形式。无论如何,我可能会使用表单构建器重新编写它。