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

Exclude empty form parameters from URL with CActiveForm

我对 YiiPHP 都比较陌生,在编写 时遇到了一些问题用户友好 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 处理程序操作重定向到。