[英]How to validate a field of Zend_Form based on the value of another field?
[英]Zend_Form set and validate field value manually
我有一個帶有下拉字段的Zend_Form。 當用戶在url中設置一個值時,應在此下拉列表中將此值選擇為默認值。
所以我現在要做的是:
$parlang = $this->getRequest()->getParam('lang');
if($parlang){
$this->view->filterForm->getElement('ddLanguage')->setValue($parlang);
}
if ($this->getRequest()->isPost()) {
if($this->view->filterForm->isValid($_POST)){
...
...
...
不,我想檢查變量的值是否對於下拉列表而言甚至是有效值? 我如何與表單驗證配合檢查這一點。 是的,我可以針對數組檢查變量,但是這似乎是“針對框架”。
那么Zend做這種事情的方法是什么?
編輯:對於所有感興趣的人,我的最終解決方案是:
$parlang = $this->getRequest()->getParam('lang');
if($parlang){
$ddLanguage = $this->view->filterForm->ddLanguage;
if($ddLanguage->isValid($parlang)){
$ddLanguage->setValue($parlang);
$language = $parlang;
}
}
我進行了一項快速測試,看來您可以使用的一種方法是Zend_Form_Element_Select::getMultiOption()
來檢查選擇值中是否存在該語言。
<?php
$parlang = $this->getRequest()->getParam('lang');
if ($parlang) {
$el = $this->view->filterForm->getElement('ddLanguage');
// attempt to get the option
// Returns null if no such option exists, otherwise returns a
// string with the display value for the option
if ($el->getMultiOption($parlang) !== null) {
$el->setValue($parlang);
}
}
如果您的Multiselect元素包含一個國家/地區列表,那么我將根據URL中的元素值填充一個默認值。
為此,您可以創建一個自定義Zend_Form_Element,如下所示:
class My_Form_Element_SelectCountry extends Zend_Form_Element_Select
{
protected $_translatorDisabled = true;
public function init()
{
$locale = Zend_Registry::get('Zend_Locale');
if (!$locale) {
throw new Exception('No locale set in registry');
}
$countries = Zend_Locale::getTranslationList('territory', $locale, 2);
unset($countries['ZZ']);
// fetch lang parameter and set US if there is no param
$request = Zend_Controller_Front::getInstance()->getRequest();
$lang = $request->getParam('lang', 'US');
// sort your country list
$oldLocale = setlocale(LC_COLLATE, '0');
setlocale(LC_COLLATE, 'en_US');
asort($countries, SORT_LOCALE_STRING);
setlocale(LC_COLLATE, $oldLocale);
// check weither the lang parameter is valid or not and add it to the list
if (isset($countries[$lang])) {
$paramLang = array($lang => $countries[$lang]);
$countries = array_merge($paramLang, $countries);
}
$this->setMultiOptions($countries);
}
}
您可以從此自定義表單中獲得想法。 如果您要執行的操作不是在國家列表中填充多選字段,而是在語言列表中填充,那么邏輯是一樣的,您只需要將對靜態方法Zend_Locale::getTranslationList()
的調用更改為並獲取您需要的任何信息。
還有一件事,如果您只想在Multiselect元素中使用單個元素,那么請使用Zend_Form_Element_Hidden
。
很多“如果”,但我無法從您的問題中確切了解您的Multiselect元素的外觀。
現在讓我們看一下驗證方面,當您使用Multiselect元素時,Zend_Framework會自動添加一個InArray
驗證器,這意味着您無需檢查發送的數據是否正確。 isValid
將為您做這件事。
用戶要么使用默認參數,然后一切都會好起來,要么修改/刪除此參數,然后將默認參數(在這種情況下,請參見en_US,請參見上面的代碼)設置為Multiselect字段的默認值。
要回答您的最后一個問題,不,它不是針對檢查用戶設置的變量並將其與數組進行比較的框架getTranslationList()
例如,來自getTranslationList()
)。 我會說這甚至是推薦的做事方式。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.