我对 Yii 和 PHP 都比较陌生,在撰写用户友好的网址时遇到了一些问题。
我想从用户输入的参数中创建一个URL,该表单是 CFormModel 的扩展名。我最初选择 GET方法而不是POST,因为用户应该能够为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。)
答案 0 :(得分:1)
您可以通过在控制器中创建两个操作来实现此目的。
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.
}
}