使用 CActiveForm 从 URL 中排除空表单参数
Exclude empty form parameters from URL with CActiveForm
我对 Yii 和 PHP 都比较陌生,在编写 时遇到了一些问题用户友好 URLs.
我想根据用户输入的参数创建一个 URL 表单,该表单是 CFormModel 的扩展。我最初选择 GET 方法 而不是 POST 因为用户应该能够将 URL 添加为书签以便 return 到相同的搜索结果稍后 on.The 用户必须指定(至少)一个搜索参数,但由于表单中有许多可能的参数,我想将 URL 缩短为 ,仅包括非空参数参数 及其值,例如
http://localhost/search/results?name=John&country=Ireland
而不是
http://localhost/search/results?name=John&family=&country=Ireland&yt0=Search
(如果有人知道如何排除按钮 ID 和标签“yt0=Search”,那也很好。)
我知道将所有 GET 参数传递给 URL 是 HTML 表单的标准行为,不能仅使用 PHP 来更改。现在我有了添加一个 JavaScript 函数 的想法,该函数在提交表单后检查所有表单参数的值是否为空。如果参数值为空,则参数的名称设置为空字符串(如建议的 here),这有效地从 URL:
中删除了空参数
function myFunction()
{
var myForm = document.getElementById('form-id');
var allInputs = myForm.getElementsByTagName('input');
var input, i;
for(i = 0; input = allInputs[i]; i++) {
if(input.getAttribute('name') && !input.value) {
input.setAttribute('name', '');
}
}
}
但是,我不确定在哪里调用此函数(与标准 HTML 表单的“onsubmit”相反)以及如何引用表单参数,因为我还不熟悉 CFormModel/CActiveForm.
任何帮助将不胜感激!
这是(简化的)表单模型:
class SearchForm extends CFormModel {
private $_parameters = array (
'firstName' => array (
'type' => 'text',
'config'=>array('name'=>'name'),
),
'familyName' => array (
'type' => 'text',
'config'=>array('name'=>'family'),
),
'country' => array (
'type' => 'text',
'config'=>array('name'=>'country')
),
);
public $firstName;
public $familyName;
public $country;
public function getParameters() {
return $this->_parameters;
}
}
这是视图的相关部分:
$elements = $model->getParameters ();
$form = $this->beginWidget ( 'CActiveForm', array (
'method'=>'get',
'enableAjaxValidation' => false
)
);
这是控制器的动作部分:
public function actionResults() {
$model = new SearchForm ();
$filters = array ();
if (isset ($_REQUEST['name'])){
$filters['firstName'] = $_REQUEST['name'];
}
if (isset ($_REQUEST['family'])){
$filters['familyName'] = $_REQUEST['family'];
}
if (isset ($_REQUEST['country'])){
$filters['country'] = $_REQUEST['country'];
}
if ($filters) {
$model->attributes = $filters;
if ($model->validate ()) {
// search action
}
}
}
(两周前我问过一个类似但不太具体的问题 here。)
您可以通过在控制器中创建两个操作来实现此目的。
class SearchController extends Controller {
function actionFormhandler() {
$formValues = $_POST;
$argName = $_POST['name'];
$argCountry = $_POST['name'];
// and other statements
// Now redirect
$this->redirect(array('/search/results',
array('id' => $argName,
'country' => $argCountry
));
}
function actionResults() {
// do your thang here.
}
}
- 第一个操作从您的表单接收 post,并在 $_POST 变量中包含所有可能的数据。
- 第二个操作处理 GET,其中包含相关的 URL 组件。这是您的最终目的地,由 post 处理程序操作重定向到。
我对 Yii 和 PHP 都比较陌生,在编写 时遇到了一些问题用户友好 URLs.
我想根据用户输入的参数创建一个 URL 表单,该表单是 CFormModel 的扩展。我最初选择 GET 方法 而不是 POST 因为用户应该能够将 URL 添加为书签以便 return 到相同的搜索结果稍后 on.The 用户必须指定(至少)一个搜索参数,但由于表单中有许多可能的参数,我想将 URL 缩短为 ,仅包括非空参数参数 及其值,例如
http://localhost/search/results?name=John&country=Ireland
而不是
http://localhost/search/results?name=John&family=&country=Ireland&yt0=Search
(如果有人知道如何排除按钮 ID 和标签“yt0=Search”,那也很好。) 我知道将所有 GET 参数传递给 URL 是 HTML 表单的标准行为,不能仅使用 PHP 来更改。现在我有了添加一个 JavaScript 函数 的想法,该函数在提交表单后检查所有表单参数的值是否为空。如果参数值为空,则参数的名称设置为空字符串(如建议的 here),这有效地从 URL:
中删除了空参数function myFunction()
{
var myForm = document.getElementById('form-id');
var allInputs = myForm.getElementsByTagName('input');
var input, i;
for(i = 0; input = allInputs[i]; i++) {
if(input.getAttribute('name') && !input.value) {
input.setAttribute('name', '');
}
}
}
但是,我不确定在哪里调用此函数(与标准 HTML 表单的“onsubmit”相反)以及如何引用表单参数,因为我还不熟悉 CFormModel/CActiveForm. 任何帮助将不胜感激!
这是(简化的)表单模型:
class SearchForm extends CFormModel {
private $_parameters = array (
'firstName' => array (
'type' => 'text',
'config'=>array('name'=>'name'),
),
'familyName' => array (
'type' => 'text',
'config'=>array('name'=>'family'),
),
'country' => array (
'type' => 'text',
'config'=>array('name'=>'country')
),
);
public $firstName;
public $familyName;
public $country;
public function getParameters() {
return $this->_parameters;
}
}
这是视图的相关部分:
$elements = $model->getParameters ();
$form = $this->beginWidget ( 'CActiveForm', array (
'method'=>'get',
'enableAjaxValidation' => false
)
);
这是控制器的动作部分:
public function actionResults() {
$model = new SearchForm ();
$filters = array ();
if (isset ($_REQUEST['name'])){
$filters['firstName'] = $_REQUEST['name'];
}
if (isset ($_REQUEST['family'])){
$filters['familyName'] = $_REQUEST['family'];
}
if (isset ($_REQUEST['country'])){
$filters['country'] = $_REQUEST['country'];
}
if ($filters) {
$model->attributes = $filters;
if ($model->validate ()) {
// search action
}
}
}
(两周前我问过一个类似但不太具体的问题 here。)
您可以通过在控制器中创建两个操作来实现此目的。
class SearchController extends Controller {
function actionFormhandler() {
$formValues = $_POST;
$argName = $_POST['name'];
$argCountry = $_POST['name'];
// and other statements
// Now redirect
$this->redirect(array('/search/results',
array('id' => $argName,
'country' => $argCountry
));
}
function actionResults() {
// do your thang here.
}
}
- 第一个操作从您的表单接收 post,并在 $_POST 变量中包含所有可能的数据。
- 第二个操作处理 GET,其中包含相关的 URL 组件。这是您的最终目的地,由 post 处理程序操作重定向到。