【问题标题】:how to create search form with into codeigniter uri format?如何使用codeigniter uri格式创建搜索表单?
【发布时间】:2011-08-14 11:36:20
【问题描述】:

亲爱的,我是codeigniter的菜鸟,

我想征求意见,关于如何创建一个搜索表单,该表单将导致 url 为:

http://domain/class/index/searchvar1/searcvar1val/searchvar2/searchvar2val

形式会是这样的

<form action="http://domain/class/index">
   <input name="searchvar1" value="searchvar1val">
   <input name="searchvar2" value="searchvar2val">
   <input type="submit">
</form>

这方面的最佳做法是什么?

我搜索了包括 stackoverflow 帖子在内的所有内容,但仍然找不到任何解决方案。

谢谢:)

~thisismyfirstpostthere

更新 ::

我想强调一下,我的目标是处理来自 uri 字符串(上图)的搜索变量,而不是来自 post vars;所以我认为将表单搜索设置为 POST 不是一种选择? :)

更新 (2)

我认为这不能在 codeigniter 中开箱即用,我正在考虑使用 jQuery 将表单 vars/vals 处理为 URI 格式的表单操作。 完成后将在此处发布更新。

【问题讨论】:

  • stackoverflow.com/questions/712340/codeigniter-uris-and-forms 看看 NexusRex 的答案,这可能适用于此
  • 感谢@littlechad; NexusRex 的回答我认为更多的是控制器中的过程(请求后);虽然我的问题更多是关于预请求,但在视图本身中,如何创建将搜索输入变量和值解析为 uri 字符串的搜索表单操作。
  • 看到你的更新。你绝对不需要 jQuery,我无法想象它有什么帮助。我现在正在为 Codeigniter 中的房地产查找做一个高级搜索表单,并且没有任何问题。也许你的目标对我来说还不清楚......

标签: php forms codeigniter get uri


【解决方案1】:

看看user_guide

$this->uri->assoc_to_uri()

将关联数组作为输入 并从中生成一个 URI 字符串。 数组键将包含在 细绳。示例:

$array = array('product' => 'shoes', 'size' => 'large', 'color' => 'red');

$str = $this->uri->assoc_to_uri($array);

// Produces: product/shoes/size/large/color/red 

我想如果你的表格是这样的:

<form action="http://domain/class/index/search">
   <input name="product" value="shoes">
   <input name="size" value="large">
   <input name="color" value="red">
   <input type="submit">
</form>

然后在搜索控制器的某个地方执行此操作$this-&gt;uri-&gt;assoc_to_uri($data); 恕我直言,product/shoes/size/large/color/red

【讨论】:

    【解决方案2】:

    您可能想要enable query strings 并使用$_GET。 IMO,这是查询字符串的用途的完美示例。

    确保将您的表单更改为&lt;form method="get" action="http://domain/class/index"&gt;

    然后,您的 URL 中将有一个查询字符串,例如 ?searchvar1=value1&amp;searchvar2=value2

    您可以像这样访问部分字符串:$this-&gt;input-&gt;get('searchvar1')

    使用您当前使用的方法,如果用户搜索您的$config['permitted_uri_chars'] 中不允许的任何字符,您将不得不自己进行大量编码和解码,以确保字符串在你的网址。 CI Input 类会为您解决这个问题,因此这是我的建议。

    基于 URI 段的搜索参数的另一个缺点是没有正确的方法来表达像?values[]=one&amp;values[]=two&amp;values[]=three 这样的数组。有一些黑客可以解决这个问题,但它们都是这样的:黑客。你最终会遇到麻烦。

    使用 $_POST 非常繁琐,并且强制使用表单提交分页结果和链接,并且还确保您无法链接到搜索结果或正确使用后退按钮。

    如果您必须使用此方法,只需将表单发布到您的控制器,读取输入,然后将redirect() 发送到您从中构造的 url。 littlechad 在his answer 中对这种方法有正确的想法

    // This URL:
    http://domain/class/index/searchvar1/searcvar1val/searchvar2/searchvar2val
    
    // With this:
    $search = $this->uri->uri_to_assoc();
    
    // Produces this:
    array(
        'searchvar1'    =>    'searchvarval1',
        'searchvar2'    =>    'searchvarval2',
    );
    
    // And you can use it like this:
    $arg1 = $search['searchvar1'];
    $arg2 = $search['searchvar2'];
    

    要获取此网址,您可以对表单发布执行类似操作(在发布后的控制器中):

    $var1 = $this->input->post('searchvar1');
    $var2 = $this->input->post('searchvar2');
    redirect('searchvar1/'.urlencode($var1).'/searchvar2/'.urlencode($var2));
    

    我相信您可以看到这比仅使用久经考验的查询字符串要做的工作多...

    【讨论】:

    • 感谢@Madmartigan,您上面的解释正是我现在正在做的事情,但我打算将?searchvar1=value1&amp;searchvar2=value2 解析为/searchvar1/value1/searchvar2/value2,而不是从视图本身。同意您的其余评论。
    • @Seno 我添加了重定向部分,如果不清楚请告诉我。
    • 是的,这确实需要更多的努力才能再次重定向。但是,嘿,对,这是一种方法,谢谢:)
    【解决方案3】:

    大家好,感谢您的回复和讨论,我认为我会顺其自然:

    查看 --> 表单 --> jquery,在表单提交时:用表单参数替换操作属性 --> 使用 uri 字符串的控制器 --> 其余过程

    jquery 部分会是这样的

    $("#searchFormID").submit(function(){
    
        // $(this).serialize() outputs param1=value1&param2=value2 string
        // var.replace(regex, string) outputs param1/value1/param2/value2 string
        // newact would be http://localhost/class/index/param1/value1/param2/value2
        var newact = $(this).attr("action") + "/" + $(this).serialize().replace(/&|=/g,"/");
    
        $(this).attr("action", newact); // or $(this).attr("target", newact);
    
        return true;
    });
    

    注释:

    • 在表单中添加一个id属性->用于jquery中的表单选择器
    • 在表单中使用 post 方法(这是 codeigniter 中的默认设置)-> 因此操作 url 不会填充 GET 字符串

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-09-18
      • 2013-12-03
      • 1970-01-01
      • 2018-11-02
      • 1970-01-01
      • 1970-01-01
      • 2014-03-28
      • 1970-01-01
      相关资源
      最近更新 更多