【发布时间】: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 移动到外部文件并在<head>或</body>之前使用<script src="url_to_file"></script>标记 -
来自PHP manual:“如果您使用array_push() 将一个元素添加到数组中,最好使用$array[] =,因为这样就没有调用函数的开销。 "
-
@DFriend 是的,javascript 在dashboard.php 中。我将它移到一个外部文件中,将该外部文件包含在 header.php 中。 Header.php 包含在所有视图/页面中。但是……还是不行。主页仍然有效(dashboard.php),但是当您在不同的页面/控制器上并尝试在搜索框中输入内容时,什么也没有发生。
-
@DFriend,如果对您的建议有所帮助,请进一步了解我发现的内容。请查看编辑 1
标签: php html codeigniter