gpt4 book ai didi

javascript - 使用 CActiveForm 从 URL 中排除空表单参数

转载 作者:行者123 更新时间:2023-12-03 10:40:21 25 4
gpt4 key购买 nike

我对 YiiPHP 都比较陌生,在编写用户友好的 URL 时遇到一些问题。

我想根据用户在表单中输入的参数创建一个 URL,该表单是 CFormModel 的扩展。我最初选择了 GET 方法 而不是 POST,因为用户应该能够为 URL 添加书签,以便稍后返回到相同的搜索结果。用户必须为该方法指定(至少)一个参数搜索,但由于表单中有许多可能的参数,我想通过 仅包含非空参数及其值来缩短 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;
}
}

这是 View 的相关部分:

$elements = $model->getParameters ();

$form = $this->beginWidget ( 'CActiveForm', array (
'method'=>'get',
'enableAjaxValidation' => false
)
);

这是 Controller 的操作部分:

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 。)

最佳答案

您可以通过在 Controller 中创建两个操作来实现此目的。

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 变量中的所有可能数据。
  • 第二个操作处理 GET,其中包含相关的 URL 组件。这是您的最终目的地,并由后处理程序操作重定向到。

关于javascript - 使用 CActiveForm 从 URL 中排除空表单参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28809449/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com