【问题标题】:codeigniter - how to redirect to default index page when user submits form that's embedded in menucodeigniter - 当用户提交嵌入在菜单中的表单时如何重定向到默认索引页面
【发布时间】:2017-03-29 19:41:44
【问题描述】:

背景信息

我有一个 php Web 应用程序,它对我的​​页面使用模板方法。 换句话说,我有一个header.php、footer.php 和一个leftnav.php。 我的 php 应用程序中的每个视图都包含上面列出的所有三个页面。 到目前为止,一切都很好。一切正常。

作为我的 leftnav.php 的一部分,我有以下代码:

<div class="input-group custom-search-form">
    <input type="text" class="form-control" placeholder="Quick Search..." id="searchtext">
     <span class="input-group-btn">
            <button class="btn btn-default" type="button" id="qsearch">
              <i class="fa fa-search"></i>
               </button>
      </span>
 </div>

这个想法是为用户提供一个“快速搜索”选项,他们可以在应用程序中的任何位置使用它......它总是会显示,因为每个页面都包含存储在 leftnav.php 中的相同菜单。

问题

仅当您启动我的应用并立即触发搜索时,此代码才能正常工作。但是,如果您离开默认控制器,然后用户尝试运行搜索......没有任何反应,因为它们不在默认控制器中。

例如,当您启动我的网络应用程序时,这是默认 URL:

 http://myserver/testapplication/index.php

从这里,您可以运行快速搜索并启动仪表板控制器。

但是从其他地方像这样:

http://myserver/testapplication/index.php/widgets/addwidget

搜索按钮什么都不做。

问题

我不知道如何设置我的代码,以便每当用户单击搜索提交按钮时,系统中发生的第一件事都会重定向到仪表板控制器。

实际运行搜索的逻辑在我的默认控制器中,称为“仪表板”。控制器如下所示:

public function index()
{
            $data['main_content'] = "dashboard";
            $this->load->view('includes/template',$data);
}
public function quicksearch()
{
            //grab search text
            $seg3 = $this->uri->segment(3); //hardwaremodel 
    $searchresults = $this->dashboard_model->quick_search($seg3);
    $retval = array();
    foreach ( $searchresults as $id => $value )
    {
        //logic to build results array

        array_push($retval, $temp);         
    }
    echo json_encode($retval);
  }
}

包含显示搜索结果的逻辑的视图位于“dashboard.php”文件中。

$(document).ready(function(){
    $(".searchresults").hide();

    $('#qsearch').click(function(){

            $('#qsearchresults tbody').empty();
            var searchstring = $('#searchtext').val();
                var searchurl = "<?php echo site_url('dashboard/quicksearch/');?>" + searchstring;
            $.ajax({
                    url:searchurl,
                    type:'POST',
                    dataType:'json',
                    success: function(res) {
                    if (res.length > 0) {
                    var htmlstring = "<tr><th>ID</th><th>PH</th><th>Site</th><th>Location</th><th>Department</th><th>Description</th><th>Fax?</th><th>Last Assigned Date</th><th>Score</th></tr>";
                    for (var key in res) {
                    tmpurl = "<?php echo site_url('did/getdidbyobjid/')?>";
                    //bunch of logic to build html string with search results
                        }
                        $('#qsearchresults tbody').append(htmlstring); 
                    $('.searchresults').show();
                }
                    }, 
                error: function(xhr, req, err) {
                    var err = eval("(" + xhr.responseText + ")");
                    console.log(err.Message);
                }
            });


    });
  });

编辑 1

我尝试将处理搜索按钮单击事件的所有 javascript 放入一个名为 qsearch.js 的单独 js 文件中。 qsearch.js 现在包含在 header.php... 中,而所有视图又包含在其中。

<head>
    <script src="<?php echo base_url(); ?>assets/l/js/qsearch.js"></script>
</head>

测试

这行得通:(因为它启动了默认的控制器仪表板)

http://myserver/myapp/index.php/

但是假设我去:

http://myserver/myapp/index.php/reports/dept

搜索正在运行...但它没有显示结果的位置。 处理搜索点击事件的 javascript 部分执行此操作:

$('#qsearchresults tbody').append(htmlstring); 

"htmlstring" 包含搜索结果...但并非所有页面都有名为 qsearchresults 的 html 表。

所以我想我需要知道是否可以将用户重定向到仪表板控制器然后运行搜索。

如果没有,不用担心。我将重做代码并在 leftnav.php 菜单中使用静态表单。但我很接近,我想保持原样......如果可能的话

我找到了这个链接:How to redirect on another page and pass parameter in url from table? 我正在尝试查看是否可以使其适应我的用例。

【问题讨论】:

  • 直接的解决方案是不使用 ajax,将表单发布到特定方法并让该方法重定向。
  • 如果我理解正确,搜索 javascript 在dashboard.php。如果这是真的,答案是将 js 移动到外部文件并在 &lt;head&gt;&lt;/body&gt; 之前使用 &lt;script src="url_to_file"&gt;&lt;/script&gt; 标记
  • 来自PHP manual:“如果您使用array_push() 将一个元素添加到数组中,最好使用$array[] =,因为这样就没有调用函数的开销。 "
  • @DFriend 是的,javascript 在dashboard.php 中。我将它移到一个外部文件中,将该外部文件包含在 header.php 中。 Header.php 包含在所有视图/页面中。但是……还是不行。主页仍然有效(dashboard.php),但是当您在不同的页面/控制器上并尝试在搜索框中输入内容时,什么也没有发生。
  • @DFriend,如果对您的建议有所帮助,请进一步了解我发现的内容。请查看编辑 1

标签: php html codeigniter


【解决方案1】:

首先,表单和 ajax 仅在您的 JS 包含在每个页面上时才有效(看起来您只是从您的描述中添加到仪表板上)。这很容易通过对模板系统的工作方式进行轻微定制来实现,您不必将其添加到每个控制器中。

但是,我建议您实际使用带有 form_open 的表单和以任何适合的方式设置样式的提交按钮。然后提交按钮将从任何页面提交到您的搜索控制器。拥有一个专用的非 ajax 搜索结果页面可以让您非常轻松地做很多事情,而不必担心在每个页面上加载相同的 js,并在您没有​​搜索的页面上禁用它。

专门的搜索结果页面实际上对用户非常友好。如果您通过添加将在每个页面上更新的隐藏 xss 代码启用了 xss 保护,form_open 还将为您提供 xss 保护。

你可以在这里阅读:http://www.codeigniter.com/user_guide/helpers/form_helper.html

其中一个好处是您可以显示更复杂的结果集。例如,对于商店,您可以在用户友好且易于理解的布局中显示完全匹配、建议匹配、匹配类别、匹配子类别等。然后,您可以开发该页面以提供您认为访问者想要的越来越多的信息。在这种情况下,Ajax 可能不是最佳答案。

这里更好地使用 ajax 可能是创建一个可点击的搜索词列表,当他们开始输入时出现,这样您就可以建议实际产生良好结果的搜索,而不是用户实际执行的一些奇怪搜索。

我在这里有点喋喋不休,但我希望这在某种程度上有所帮助。

保罗。

【讨论】:

    猜你喜欢
    • 2012-12-18
    • 1970-01-01
    • 1970-01-01
    • 2022-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-30
    相关资源
    最近更新 更多