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

时间:2015-03-02 12:08:52

标签: javascript php forms yii

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

1 个答案:

答案 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.
}

}
  • 第一个操作从表单中接收一个帖子,并包含$ _POST变量中的所有可能数据。
  • 第二个操作处理GET,其中包含相关的URL组件。这是您的最终目的地,并通过邮政处理程序操作重定向到。