2014-02-28 63 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(); 

這是不可重複使用的,但在這種情況下,它是一個非常簡單的形式。無論如何,我可能會使用表單構建器重新編碼。