å½å建 HTML 表åæ¶ï¼ç»å¸¸æ们åç°æ们å¨åå¾å¤éå¤èä¸å¨ä¸å项ç®ä¸å¾é¾éç¨çè§å¾ä»£ç ã ä¾å¦ï¼å¯¹äºæ¯ä¸ªè¾å ¥æ¡ï¼ æ们éè¦ä»¥ä¸ä¸ªææ¬æ ç¾åæ¾ç¤ºå¯è½çéªè¯é误æ¥å ³èå®ã 为äºæ¹åè¿äºä»£ç çéç¨æ§ï¼æ们å¯ä»¥ä½¿ç¨èªçæ¬ 1.1.0 å¯ç¨ç表åçæå¨ç¹å¾ã
Yii 表åçæå¨ä½¿ç¨ CForm 对象æ¥ä»£è¡¨æè¿°ä¸ä¸ªHTML表åæéçå 容ï¼å æ¬åªäºæ°æ®æ¨¡åå ³èå°æ¤è¡¨åï¼ è¡¨åä¸æåªäºè¾å ¥æ¡ï¼ä»¥åå¦ä½æ¸²ææ´ä¸ªè¡¨åãå¼åè 主è¦éè¦å建åé ç½®è¿ä¸ª CForm 对象ï¼ç¶åè°ç¨å®ç渲ææ¹æ³æ¥æ¾ç¤ºè¡¨åã
表åçè¾å ¥æ¡åæ°è¢«ç»ç»ä¸ºæ ¹æ®è¡¨åå ç´ çåå±ç»æã å¨ç»æç顶å±ï¼æ¯ CForm 对象ãæ¤å¯¹è±¡çæååä¸ºä¸¤å¤§ç±»ï¼ CForm::buttons å CForm::elementsãåè å å« æé®å ç´ ï¼ä¾å¦æ交æé®ï¼é设æé®ï¼ï¼åè å å«è¾å ¥å ç´ ï¼éæææ¬åå表åãå表åä¹æ¯ CForm 对象ï¼åªæ¯å®åå¨äº å¦ä¸ä¸ªè¡¨åç CForm::elements ä¸ãå表åå¯ä»¥æå®èªå·±çæ°æ®æ¨¡åï¼ CForm::buttons å CForm::elements éåã
å½ç¨æ·æ交ä¸ä¸ªè¡¨åæ¶ï¼æ´ä¸ªè¡¨åç»æä¸å¡«åçæ°æ®è¢«æäº¤ï¼ ä¹å å«å表åä¸å¡«åçæ°æ®ã CForm æä¾äºä¾¿å©æ¹æ³ï¼å¯ä»¥èªå¨èµå¼è¾å ¥çæ°æ®å°å¯¹åºçæ°æ®å±æ§å¹¶æ§è¡æ°æ®éªè¯ã
ä¸é¢ï¼æ们å±ç¤ºå¦ä½ä½¿ç¨è¡¨åçæå¨æ¥å建ä¸ä¸ªç»å½è¡¨åã
é¦å ï¼æ们ç¼åç»å½ action 代ç ï¼
public function actionLogin()
{
$model = new LoginForm;
$form = new CForm('application.views.site.loginForm', $model);
if($form->submitted('login') && $form->validate())
$this->redirect(array('site/index'));
else
$this->render('login', array('form'=>$form));
}
å¨ä¸é¢ç代ç ä¸ï¼æ们使ç¨ç±è·¯å¾å«å application.views.site.loginForm
ï¼å°ä¼ç®è¦è§£éï¼ æå®çåæ°åå»ºäº CForm 对象ã
CForm 对象å LoginForm
模åï¼å¨Creating Modelä¸å·²ä»ç»ï¼å
³èã
å¦ä»£ç æ示ï¼è¥è¡¨å被æ交并ä¸ææçè¾å
¥ç»è¿äºéªè¯è没æé误ï¼æ们å°è½¬åç¨æ·çæµè§å¨å° site/index
页é¢ãå¦åï¼
æ们以æ¤è¡¨å渲æ login
è§å¾ã
è·¯å¾å«å application.views.site.loginForm
å®é
æçæ¯ PHP æ件
protected/views/site/loginForm.php
ãæ¤æ件åºå½è¿åä¸ä¸ª PHP æ°ç»ï¼è¿ä¸ªæ°ç»ä»£è¡¨äº CForm æéçé
ç½®ï¼
å¦ä¸æ示ï¼
return array(
'title'=>'Please provide your login credential',
'elements'=>array(
'username'=>array(
'type'=>'text',
'maxlength'=>32,
),
'password'=>array(
'type'=>'password',
'maxlength'=>32,
),
'rememberMe'=>array(
'type'=>'checkbox',
)
),
'buttons'=>array(
'login'=>array(
'type'=>'submit',
'label'=>'Login',
),
),
);
é ç½®æ¯ä¸ä¸ªç±é®å¼å¯¹ç»æçå ³èæ°ç»ï¼è¢«ç¨æ¥åå§å CForm ç对åºå±æ§ãè¦é ç½®çæéè¦çå±æ§ï¼å¦ä¹åæè¿°ï¼æ¯ CForm::elements å CForm::buttonsã å®ä»¬çæ¯ä¸ä¸ªæ¯ä¸ä¸ªæå®äºè¡¨åå ç´ å表çæ°ç»ãå¨ä¸ä¸å°èæ们å°ç»åºæ´å¤ç»èå ³äºå¦ä½é 置表åå ç´ ã
æåï¼æ们ç¼å login
è§å¾ï¼å¯ä»¥ç®æ´å°å¦ä¸æ示ï¼
<h1>Login</h1> <div class="form"> echo $form; </div>
æ示: ä¸é¢ç代ç
echo $form;
ç¸å½äºecho $form->render();
ã è¿æ¯å 为 CForm æ§è¡äº__toString
éæ¯æ¹æ³ï¼å®è°ç¨render()
并è¿åå®çç»æ为代表æ¤è¡¨å对象çå符串ã
使ç¨è¡¨åçæå¨ï¼æ们大é¨åçå·¥ä½ç±ç¼åè§å¾èæ¬ä»£ç 转为æå®è¡¨åå ç´ ãå¨è¿ä¸å°èä¸ï¼æ们讲述å¦ä½æå® CForm::elements å±æ§ã æ们ä¸åå¤è®²è¿° CForm::buttons å 为å®çé ç½®å CForm::elements çé ç½®å ä¹ç¸åã
CForm::elements å±æ§æ¥åä¸ä¸ªæ°ç»ä½ä¸ºå®çå¼ãæ¯ä¸ªæ°ç»å ç´ æå®äºä¸ä¸ªåç¬ç表åå ç´ ï¼è¿ä¸ªè¡¨åå ç´ å¯ä»¥æ¯ä¸ä¸ªè¾å ¥æ¡ï¼ä¸ä¸ªéæææ¬å符串æä¸ä¸ªå表åã
ä¸ä¸ªè¾å ¥å ç´ ä¸»è¦ç±æ ç¾ï¼è¾å ¥æ¡ï¼æ示æååé误æ¾ç¤ºç»æã å®å¿ é¡»åä¸ä¸ªæ¨¡åå±æ§å ³èãä¸ä¸ªè¾å ¥å ç´ çè§æ ¼è¢«ä»£è¡¨ä¸ºä¸ä¸ª CFormInputElement å®ä¾ã CForm::elements æ°ç»ä¸çå¦ä¸ä»£ç æå®äºä¸ä¸ªåç¬çè¾å ¥å ç´ ï¼
'username'=>array(
'type'=>'text',
'maxlength'=>32,
),
å®è¯´æ模åå±æ§è¢«å½å为 username
ï¼è¾å
¥æ¡çç±»å为 text
ï¼å®ç maxlength
å±æ§ä¸º 32ã
ä»»ä½ CFormInputElement å¯åçå±æ§é½å¯ä»¥å¦ä¸é
ç½®ãä¾å¦ï¼æ们å¯ä»¥æå®
hint é项æ¥æ¾ç¤ºæ示信æ¯ï¼æè
æ们å¯ä»¥æå®
items é项è¥è¾å
¥æ¡æ¯ä¸ä¸ª list boxï¼ä¸ä¸ªä¸æå表ï¼ä¸ä¸ªå¤éå表æä¸ä¸ªåéæé®å表ã
è¥é项çååä¸æ¯ä¸ä¸ª CFormInputElement å±æ§ï¼å®å°è¢«è®¤ä¸ºæ¯å¯¹åº HTML è¾å
¥å
ç´ çå±æ§ï¼
ä¾å¦ï¼å 为ä¸é¢ç maxlength
ä¸æ¯ä¸ä¸ª CFormInputElement å±æ§ï¼å®è¢«æ¸²æä½ä¸º HTML ææ¬è¾å
¥æ¡ç maxlength
å±æ§ã
type é项éè¦ç¹å«æ³¨æãå®æå®äºè¾å
¥æ¡çç±»åã
ä¾å¦ï¼text
ç±»åæå³çå°æ¸²æä¸ä¸ªæ®éçææ¬è¾å
¥æ¡ï¼password
ç±»åæå³çå°æ¸²æä¸ä¸ªå¯ç è¾å
¥æ¡ã CFormInputElement è¯å«å¦ä¸å
ç½®çç±»åï¼
å¨ä¸é¢çå
置类åä¸ï¼æ们æ³è¦å¯¹è¿äº "list" ç±»åçç¨æ³å¤è¯´ä¸äºï¼
å
æ¬ dropdownlist
ï¼ checkboxlist
å radiolist
ãè¿äºç±»åéè¦è®¾ç½®å¯¹åºè¾å
¥å
ç´ ç items
å±æ§ãå¯ä»¥è¿æ ·åï¼
'gender'=>array(
'type'=>'dropdownlist',
'items'=>User::model()->getGenderOptions(),
'prompt'=>'Please select:',
),
...
class User extends CActiveRecord
{
public function getGenderOptions()
{
return array(
0 => 'Male',
1 => 'Female',
);
}
}
ä¸é¢ç代ç å°çæä¸ä¸ªä¸æå表éæ©å¨ï¼æ示æåæ¯ âplease select:âãé项å
æ¬
âMaleâ å âFemaleâï¼å®ä»¬æ¯ç± User
模åç±»ä¸ç getGenderOptions
æ¹æ³è¿åçã
é¤äºè¿äºå ç½®çç±»åï¼ type é项ä¹å¯ä»¥æ¯ä¸ä¸ª widget ç±»ååæ widget ç±»çè·¯å¾å«åã widget ç±»å¿ é¡»æ©å±èª CInputWidget æ CJuiInputWidgetãå½æ¸²æè¾å ¥å ç´ æ¶ï¼ ä¸ä¸ªæå® widget ç±»çå®ä¾å°è¢«å建并渲æãThe widget will be configured using the specification as given for the input element.
å¾å¤æ åµä¸ï¼ä¸ä¸ªè¡¨åå å«ä¸äºè£ 饰æ§ç HTML 代ç ã ä¾å¦ï¼ä¸ä¸ªæ°´å¹³çº¿è¢«ç¨æ¥åé表åä¸ä¸åçé¨åï¼ä¸ä¸ªå¾ååºç°å¨ç¹å®çä½ç½®æ¥å¢å¼ºè¡¨åçè§è§å¤è§ã æ们å¯ä»¥å¨ CForm::elements éåä¸æå®è¿äº HTML 代ç ä½ä¸ºéæææ¬ãè¦è¿æ ·åï¼æ们åªè¦æå®ä¸ä¸ªéæææ¬å符串ä½ä¸ºä¸ä¸ªæ°ç»å ç´ ï¼å¨ CForm::elements æ°å½çä½ç½®ãä¾å¦,
return array(
'elements'=>array(
......
'password'=>array(
'type'=>'password',
'maxlength'=>32,
),
'<hr />',
'rememberMe'=>array(
'type'=>'checkbox',
)
),
......
);
å¨ä¸é¢ï¼æä»¬å¨ password
è¾å
¥æ¡å rememberMe
ä¹é´æå
¥ä¸ä¸ªæ°´å¹³çº¿ã
éæææ¬æ好ç¨äºææ¬å 容åå®ä»¬çä½ç½®ä¸è§åæ¶ã è¥è¡¨åä¸çæ¯ä¸ªè¾å ¥å ç´ éè¦è¢«ç¸ä¼¼çè£ é¥°ï¼æ们åºå½å®å¶è¡¨å渲ææ¹æ³ï¼æ¤ç« èå°ç®çä»ç»ã
å表å被ç¨æ¥å离ä¸ä¸ªé¿ç表å为å 个é»è¾é¨åã ä¾å¦ï¼æ们å¯ä»¥å离ç¨æ·æ³¨å表å为两é¨åï¼ç»å½ä¿¡æ¯åæ¡£æ¡ä¿¡æ¯ã æ¯ä¸ªå表ååä¸ä¸ªæ°æ®æ¨¡åææ å ³èåå¯ãä¾å¦å¨ç¨æ·æ³¨å表åï¼è¥æ们åå¨ç¨æ·ç»å½ä¿¡æ¯åæ¡£æ¡ä¿¡æ¯å°ä¸¤ä¸ªå离çæ°æ®è¡¨ä¸(表示为两个æ°æ®æ¨¡å)ï¼ ç¶åæ¯ä¸ªå表åéè¦åä¸ä¸ªå¯¹åºçæ°æ®æ¨¡åå ³èãè¥æ们åå¨ææä¿¡æ¯å°ä¸ä¸ªæ°æ®è¡¨ä¸ï¼ä»»æä¸ä¸ªå表åé½æ²¡ææ°æ®æ¨¡å,å 为å®ä»¬åæ ¹è¡¨åå享ç¸åç模åã
ä¸ä¸ªå表åä¹è¡¨ç¤ºä¸ºä¸ä¸ªCForm 对象ãè¦æå®ä¸ä¸ªå表åï¼æ们åºå½é
ç½® CForm::elements å±æ§ä¸ºä¸ä¸ªç±»åæ¯ form
çå
ç´ ï¼
return array(
'elements'=>array(
......
'user'=>array(
'type'=>'form',
'title'=>'Login Credential',
'elements'=>array(
'username'=>array(
'type'=>'text',
),
'password'=>array(
'type'=>'password',
),
'email'=>array(
'type'=>'text',
),
),
),
'profile'=>array(
'type'=>'form',
......
),
......
),
......
);
类似äºé ç½®ä¸ä¸ªæ ¹è¡¨åï¼æ们主è¦éè¦ä¸ºä¸ä¸ªå表åæå® CForm::elements å±æ§ãè¥ä¸ä¸ªå表åéè¦å ³èä¸ä¸ªæ°æ®æ¨¡åï¼æ们ä¹å¯ä»¥é ç½®å®ç CForm::model å±æ§ã
ææ¶ï¼æ们æ³è¦ä½¿ç¨ä¸ä¸ªç±»ä»£è¡¨è¡¨åï¼èä¸ä½¿ç¨é»è®¤ç CForm ç±»ãä¾å¦ï¼
æ¤å°èå°ç®çå±ç¤ºï¼æ们å¯ä»¥æ©å± CForm 以å®å¶è¡¨å渲æé»è¾ã
éè¿æå®è¾å
¥å
ç´ çç±»å为 form
ï¼ä¸ä¸ªå表åå°èªå¨è¢«è¡¨ç¤ºä¸ºä¸ä¸ªå¯¹è±¡ï¼å®çç±»åå®çç¶è¡¨åç¸åãè¥æ们æå®è¾å
¥å
ç´ çç±»åç±»ä¼¼äº XyzForm
(ä¸ä¸ªä»¥ Form
ç»å°¾çå符串)ï¼
ç¶åå表åå°è¢«è¡¨ç¤ºä¸ºä¸ä¸ª XyzForm
对象ã
访é®è¡¨åå
ç´ å访é®æ°ç»å
ç´ ä¸æ ·ç®åãCForm::elements å±æ§è¿åä¸ä¸ª CFormElementCollection 对象ï¼
å®æ©å±èª CMap 并å
许以类似äºä¸ä¸ªæ®éæ°ç»çæ¹å¼æ¥è®¿é®å®çå
ç´ ãä¾å¦ï¼è¦è®¿é®ç»å½è¡¨åä¸çå
ç´ username
ï¼æ们å¯ä»¥ä½¿ç¨ä¸é¢ç代ç ï¼
$username = $form->elements['username'];
è¦è®¿é®ç¨æ·æ³¨å表åä¸ç email
å
ç´ ï¼ä½¿ç¨
$email = $form->elements['user']->elements['email'];
å 为 CForm 为å®ç CForm::elements å±æ§æ§è¡æ°ç»è®¿é®ï¼ä¸é¢ç代ç å¯ä»¥ç®å为ï¼
$username = $form['username'];
$email = $form['user']['email'];
æ们已ç»æè¿°äºå表åãæ们称ä¸ä¸ªæå表åç表å为ä¸ä¸ªåµå¥è¡¨åãå¨è¿ä¸ç« èï¼
æ们使ç¨ç¨æ·æ³¨å表åä½ä¸ºä¾åæ¥å±ç¤ºå¦ä½å建ä¸ä¸ªå
³èå¤ä¸ªæ°æ®æ¨¡åçåµå¥è¡¨åãæ们å设ç¨æ·ç认è¯ä¿¡æ¯åå¨ä¸ºä¸ä¸ª User
模åï¼èç¨æ·çæ¡£æ¡ä¿¡æ¯è¢«åå¨ä¸ºä¸ä¸ª Profile
模åã
æ们é¦å
å建 register
action å¦ä¸ï¼
public function actionRegister()
{
$form = new CForm('application.views.user.registerForm');
$form['user']->model = new User;
$form['profile']->model = new Profile;
if($form->submitted('register') && $form->validate())
{
$user = $form['user']->model;
$profile = $form['profile']->model;
if($user->save(false))
{
$profile->userID = $user->id;
$profile->save(false);
$this->redirect(array('site/index'));
}
}
$this->render('register', array('form'=>$form));
}
å¨ä¸é¢ï¼æ们使ç¨ç± application.views.user.registerForm
æå®çé
ç½®å建äºè¡¨åã
å¨è¡¨å被æ交ä¸æåéªè¯ä¹åï¼æ们å°è¯ä¿å user å proï¬le 模åã
æ们éè¿è®¿é®ç¸åºå表å对象ç model
å±æ§æ¥æ£ç´¢ user å proï¬le 模åã
å 为è¾å
¥éªè¯å·²ç»å®æï¼æ们è°ç¨ $user->save(false)
æ¥è·³è¿éªè¯ã为 proï¬le 模åä¹è¿æ ·åã
æ¥ä¸æ¥ï¼æ们ç¼å表åé
ç½®æ件 protected/views/user/registerForm.php
ï¼
return array(
'elements'=>array(
'user'=>array(
'type'=>'form',
'title'=>'Login information',
'elements'=>array(
'username'=>array(
'type'=>'text',
),
'password'=>array(
'type'=>'password',
),
'email'=>array(
'type'=>'text',
)
),
),
'profile'=>array(
'type'=>'form',
'title'=>'Profile information',
'elements'=>array(
'firstName'=>array(
'type'=>'text',
),
'lastName'=>array(
'type'=>'text',
),
),
),
),
'buttons'=>array(
'register'=>array(
'type'=>'submit',
'label'=>'Register',
),
),
);
å¨ä¸é¢ï¼å½æå®æ¯ä¸ªå表åæ¶ï¼æ们ä¹æå®å®ç CForm::title å±æ§ã é»è®¤ç表å渲æé»è¾å°å°è£ æ¯ä¸ªå表åå°ä¸ä¸ª ï¬eld-set ä¸ï¼ä½¿ç¨æ¤å±æ§ä½ä¸ºå®çæ é¢ã
æåï¼æ们ç¼å register
è§å¾èæ¬ï¼
<h1>Register</h1> <div class="form"> echo $form; </div>
使ç¨è¡¨åçæå¨æ主è¦ç好å¤æ¯é»è¾ (表åé 置被åå¨å¨ä¸ä¸ªåç¬çæ件ä¸) åè¡¨ç° (CForm::renderæ¹æ³) çå离ã è¿æ ·ï¼æ们å¯ä»¥å®ç°å®å¶è¡¨åæ¾ç¤ºï¼éè¿éå CForm::render ææä¾ä¸ä¸ªå±é¨è§å¾æ¥æ¸²æ表åã两ç§æ¹æ³é½å¯ä»¥ä¿æ表åé ç½®çå®æ´æ§ï¼å¹¶ä¸å¯ä»¥å®¹æå°éç¨ã
å½éå CForm::render æ¶, ä½ ä¸»è¦éè¦éå CForm::elements å CForm::buttons 并è°ç¨æ¯ä¸ªè¡¨åå ç´ ç CFormElement::render æ¹æ³ãä¾å¦,
class MyForm extends CForm
{
public function render()
{
$output = $this->renderBegin();
foreach($this->getElements() as $element)
$output .= $element->render();
$output .= $this->renderEnd();
return $output;
}
}
å¯è½æ们ä¹éè¦åä¸ä¸ªè§å¾èæ¬ _form
以渲æä¸ä¸ªè§å¾ï¼
echo $form->renderBegin(); foreach($form->getElements() as $element) echo $element->render(); echo $form->renderEnd();
è¦ä½¿ç¨æ¤è§å¾èæ¬ï¼æ们éè¦è°ç¨ï¼
<div class="form">
$this->renderPartial('_form', array('form'=>$form));
</div>
è¥ä¸ä¸ªéç¨ç表å渲æä¸éç¨äºä¸ä¸ªç¹æ®ç表å(ä¾å¦ï¼è¡¨å为ç¹å®çå ç´ éè¦ä¸è§åçè£ é¥°)ï¼å¨è§å¾èæ¬ä¸æ们å¯ä»¥è¿æ ·å:
some complex UI elements here echo $form['username']; some complex UI elements here echo $form['password']; some complex UI elements here
å¨æåçæ¹æ³ä¸ï¼è¡¨åçæå¨çèµ·æ¥å¹¶æ²¡æ带æ¥å¥½å¤ï¼å 为æ们ä»ç¶éè¦åå¾å¤è¡¨å代ç ãç¶èï¼å®ä»ç¶æ¯æ好å¤çï¼è¡¨å被使ç¨ä¸ä¸ªå离çé ç½®æ件æå®ï¼è¿æ ·å¯ä»¥å¸®å©å¼åè æ´ä¸æ³¨äºé»è¾é¨åã
Found a typo or you think this page needs improvement?
Edit it on github !
Signup or Login in order to comment.