Joomla 组件 - 列表视图管理页面 - 搜索不工作
Joomla component - list view admin page - search is not working
在我的 joomla 3.x 组件中,我有列表视图管理页面,我在其中添加了一些搜索工具:
<div class="filter-search btn-group pull-left">
<label for="filter_search" class="element-invisible"><?php echo JText::_('JSEARCH_FILTER');?></label>
<input type="text" name="filter_search" id="filter_search" placeholder="<?php echo JText::_('JSEARCH_FILTER'); ?>" value="<?php echo $this->escape($this->state->get('filter.search')); ?>" title="<?php echo JText::_('JSEARCH_FILTER'); ?>" />
</div>
<div class="btn-group pull-left">
<button class="btn hasTooltip" type="submit" title="<?php echo JText::_('JSEARCH_FILTER_SUBMIT'); ?>"><i class="icon-search"></i></button>
<button class="btn hasTooltip" id="clear-search-button" type="button" title="<?php echo JText::_('JSEARCH_FILTER_CLEAR'); ?>"><i class="icon-remove"></i></button>
</div>
但显然它不起作用。我应该如何以及在何处添加对该搜索的支持?我想我应该向模型添加一些动作?
我希望搜索仅适用于我的数据表的某些列(7 列中的 2 列)。
更新:
在我的模型文件中 populateState
方法我有:
// Load the filter state.
$search = $app->getUserStateFromRequest($this->context . '.filter.search', 'filter_search');
$this->setState('filter.search', $search);
并在 getListQuery
方法中:
// Filter by search in title
$search = $this->getState('filter.search');
if (!empty($search)) {
if (stripos($search, 'id:') === 0) {
$query->where('a.email = ' . $search );
} else {
$search = $db->Quote('%' . $db->escape($search, true) . '%');
}
}
更新 2:
好的,我设法让搜索对我有用。我不知道为什么一些默认的 joomla 语法破坏了我的搜索。
实际上,在我的模型文件中注释掉 getListQuery
中的一些元素并添加适当的 where
子句就达到了目的:
// Filter by search in title
$search = $this->getState('filter.search');
if (!empty($search)) {
//if (stripos($search, 'email:') === 0) {
$query->where('a.email LIKE "%' . $search .'%" OR a.imie LIKE "%'.$search.'%"' );
// } else {
// $search = $db->Quote('%' . $db->escape($search, true) . '%');
//
// }
}
所以我坚持我的赏金,可以解释为什么我必须评论 getListQuery
中的这些部分
您必须在组件视图文件中设置表单 'id' 和 'name' "adminForm"。
它将解决问题。
例如:
<form action="index.php?option=com_test&view=test" method="post" id="adminForm" name="adminForm">
.....
</form>
好的,在视图中你需要这样的东西:
- 将您视图中的表单更新为 post 到控制器
- 更新控制器以处理 post 并显示结果
关于视图:
<form action="<?php echo JRoute::_('index.php?option=com_test&view=search'); ?>" method="post" name="adminForm" id="adminForm">
<div class="filter-search btn-group pull-left">
<label for="filter_search" class="element-invisible"><?php echo JText::_('JSEARCH_FILTER');?></label>
<input type="text" name="filter_search" id="filter_search" placeholder="<?php echo JText::_('JSEARCH_FILTER'); ?>" value="<?php echo $this->escape($this->state->get('filter.search')); ?>" title="<?php echo JText::_('JSEARCH_FILTER'); ?>" />
</div>
<div class="btn-group pull-left">
<button class="btn hasTooltip" type="submit" title="<?php echo JText::_('JSEARCH_FILTER_SUBMIT'); ?>"><i class="icon-search"></i></button>
<button class="btn hasTooltip" id="clear-search-button" type="button" title="<?php echo JText::_('JSEARCH_FILTER_CLEAR'); ?>"><i class="icon-remove"></i></button>
</div>
<input type="hidden" name="option" value="com_test" />
<input type="hidden" name="task" value="search"/>
</form>
所以实际上现在当您提交时,您正在 post 向控制器 TestController
调用方法 search
。
实际上是 2 个隐藏字段在做这个。
在控制器上:
现在 components/com_test/controller.php
您可以添加 search
方法。
class TestController extends JControllerLegacy
{
/**
* Other methods here
* .
* .
* .
*/
/**
* Pseudo code for search
*/
public function search()
{
// get the data posted
$jinput = JFactory::getApplication()->input;
$jform = $jinput->post->get('jform', null, null);
// make a query in the db
$db = JFactory::getDbo();
// Create a new query object.
$query = $db->getQuery(true);
$query
->select($db->quoteName(array('col_2', 'col_7')))
->from($db->quoteName('#__your_table'))
->where($db->quoteName('filter_search') . ' LIKE '. $db->quote($jform['filter_search']))
// Reset the query using our newly populated query object.
$db->setQuery($query);
// Load the results as a list of stdClass objects (see later for more options on retrieving data).
$results = $db->loadObjectList();
// send the result to a view
$view = $this->getView('search', 'html'); //get the view
$view->assignRef('data', $results); // assign data from the model
$view->display(); // display the view
return $this;
}
正如您在这里看到的,有 3 个要点:
- 获取数据posted
- 在数据库中进行查询
- 将结果发送到视图
此视图中的视图将在 components/com_test/views/search/view.html.php
中。
因为它是 joomla 中的列表视图。填充列表的主要内容来自相应的模型文件。
如果它是一个标准的 Joomla 组件,其中将有一个名为 getListQuery() 的函数。
继续在那边添加代码。例如:
$search = $this->getState('filter.search');
if (!empty($search)) {
if (stripos($search, 'id:') === 0) {
$query->where('a.id = ' . (int) substr($search, 3));
} else {
$search = $db->Quote('%' . $db->escape($search, true) . '%');
//The previous line or directly $query->where('somecolumn like ' . $db->Quote('%' . $db->escape($search, true) . '%'));
}
}
同时在 populateState 中添加这个
// Load the filter state.
$search = $app->getUserStateFromRequest($this->context . '.filter.search', 'filter_search');
$this->setState('filter.search', $search);
这将设置状态中的变量。
只要这样做就大功告成了。
更新:
答案应该是
$search = $this->getState('filter.search');
if (!empty($search)) {
if (stripos($search, 'id:') === 0) {
$query->where('a.id = ' . (int) substr($search, 3));
} else {
$search = $db->Quote('%' . $db->escape($search, true) . '%');
$query->where('a.email LIKE ' . $search .' OR a.imie LIKE '.$search );
}
}
解释:
通常,"Search" 被认为是列表视图的常用搜索字段。通常,它适用于大多数列,因此与其为所有列创建单独的搜索框,不如只保留一个具有搜索所有列的共同目的的搜索框。
现在,这也取决于用户希望搜索什么。所以默认情况下Joomla用户使用上面的代码。
在搜索 if "id:3" 时,由于提到了 "id:",它会立即进入 if 部分,因此 if 部分变为 true,然后它将按 id 搜索(这将 return id 为 3 的行)。一般情况下,会自动转到else部分。
最后,这些只是标准做法。即使您只写条件,代码也可以工作。选择权在你。
在我的 joomla 3.x 组件中,我有列表视图管理页面,我在其中添加了一些搜索工具:
<div class="filter-search btn-group pull-left">
<label for="filter_search" class="element-invisible"><?php echo JText::_('JSEARCH_FILTER');?></label>
<input type="text" name="filter_search" id="filter_search" placeholder="<?php echo JText::_('JSEARCH_FILTER'); ?>" value="<?php echo $this->escape($this->state->get('filter.search')); ?>" title="<?php echo JText::_('JSEARCH_FILTER'); ?>" />
</div>
<div class="btn-group pull-left">
<button class="btn hasTooltip" type="submit" title="<?php echo JText::_('JSEARCH_FILTER_SUBMIT'); ?>"><i class="icon-search"></i></button>
<button class="btn hasTooltip" id="clear-search-button" type="button" title="<?php echo JText::_('JSEARCH_FILTER_CLEAR'); ?>"><i class="icon-remove"></i></button>
</div>
但显然它不起作用。我应该如何以及在何处添加对该搜索的支持?我想我应该向模型添加一些动作?
我希望搜索仅适用于我的数据表的某些列(7 列中的 2 列)。
更新:
在我的模型文件中 populateState
方法我有:
// Load the filter state.
$search = $app->getUserStateFromRequest($this->context . '.filter.search', 'filter_search');
$this->setState('filter.search', $search);
并在 getListQuery
方法中:
// Filter by search in title
$search = $this->getState('filter.search');
if (!empty($search)) {
if (stripos($search, 'id:') === 0) {
$query->where('a.email = ' . $search );
} else {
$search = $db->Quote('%' . $db->escape($search, true) . '%');
}
}
更新 2:
好的,我设法让搜索对我有用。我不知道为什么一些默认的 joomla 语法破坏了我的搜索。
实际上,在我的模型文件中注释掉 getListQuery
中的一些元素并添加适当的 where
子句就达到了目的:
// Filter by search in title
$search = $this->getState('filter.search');
if (!empty($search)) {
//if (stripos($search, 'email:') === 0) {
$query->where('a.email LIKE "%' . $search .'%" OR a.imie LIKE "%'.$search.'%"' );
// } else {
// $search = $db->Quote('%' . $db->escape($search, true) . '%');
//
// }
}
所以我坚持我的赏金,可以解释为什么我必须评论 getListQuery
您必须在组件视图文件中设置表单 'id' 和 'name' "adminForm"。 它将解决问题。
例如:
<form action="index.php?option=com_test&view=test" method="post" id="adminForm" name="adminForm">
.....
</form>
好的,在视图中你需要这样的东西: - 将您视图中的表单更新为 post 到控制器 - 更新控制器以处理 post 并显示结果
关于视图:
<form action="<?php echo JRoute::_('index.php?option=com_test&view=search'); ?>" method="post" name="adminForm" id="adminForm">
<div class="filter-search btn-group pull-left">
<label for="filter_search" class="element-invisible"><?php echo JText::_('JSEARCH_FILTER');?></label>
<input type="text" name="filter_search" id="filter_search" placeholder="<?php echo JText::_('JSEARCH_FILTER'); ?>" value="<?php echo $this->escape($this->state->get('filter.search')); ?>" title="<?php echo JText::_('JSEARCH_FILTER'); ?>" />
</div>
<div class="btn-group pull-left">
<button class="btn hasTooltip" type="submit" title="<?php echo JText::_('JSEARCH_FILTER_SUBMIT'); ?>"><i class="icon-search"></i></button>
<button class="btn hasTooltip" id="clear-search-button" type="button" title="<?php echo JText::_('JSEARCH_FILTER_CLEAR'); ?>"><i class="icon-remove"></i></button>
</div>
<input type="hidden" name="option" value="com_test" />
<input type="hidden" name="task" value="search"/>
</form>
所以实际上现在当您提交时,您正在 post 向控制器 TestController
调用方法 search
。
实际上是 2 个隐藏字段在做这个。
在控制器上:
现在 components/com_test/controller.php
您可以添加 search
方法。
class TestController extends JControllerLegacy
{
/**
* Other methods here
* .
* .
* .
*/
/**
* Pseudo code for search
*/
public function search()
{
// get the data posted
$jinput = JFactory::getApplication()->input;
$jform = $jinput->post->get('jform', null, null);
// make a query in the db
$db = JFactory::getDbo();
// Create a new query object.
$query = $db->getQuery(true);
$query
->select($db->quoteName(array('col_2', 'col_7')))
->from($db->quoteName('#__your_table'))
->where($db->quoteName('filter_search') . ' LIKE '. $db->quote($jform['filter_search']))
// Reset the query using our newly populated query object.
$db->setQuery($query);
// Load the results as a list of stdClass objects (see later for more options on retrieving data).
$results = $db->loadObjectList();
// send the result to a view
$view = $this->getView('search', 'html'); //get the view
$view->assignRef('data', $results); // assign data from the model
$view->display(); // display the view
return $this;
}
正如您在这里看到的,有 3 个要点:
- 获取数据posted
- 在数据库中进行查询
- 将结果发送到视图
此视图中的视图将在 components/com_test/views/search/view.html.php
中。
因为它是 joomla 中的列表视图。填充列表的主要内容来自相应的模型文件。
如果它是一个标准的 Joomla 组件,其中将有一个名为 getListQuery() 的函数。
继续在那边添加代码。例如:
$search = $this->getState('filter.search');
if (!empty($search)) {
if (stripos($search, 'id:') === 0) {
$query->where('a.id = ' . (int) substr($search, 3));
} else {
$search = $db->Quote('%' . $db->escape($search, true) . '%');
//The previous line or directly $query->where('somecolumn like ' . $db->Quote('%' . $db->escape($search, true) . '%'));
}
}
同时在 populateState 中添加这个
// Load the filter state.
$search = $app->getUserStateFromRequest($this->context . '.filter.search', 'filter_search');
$this->setState('filter.search', $search);
这将设置状态中的变量。 只要这样做就大功告成了。
更新: 答案应该是
$search = $this->getState('filter.search');
if (!empty($search)) {
if (stripos($search, 'id:') === 0) {
$query->where('a.id = ' . (int) substr($search, 3));
} else {
$search = $db->Quote('%' . $db->escape($search, true) . '%');
$query->where('a.email LIKE ' . $search .' OR a.imie LIKE '.$search );
}
}
解释:
通常,"Search" 被认为是列表视图的常用搜索字段。通常,它适用于大多数列,因此与其为所有列创建单独的搜索框,不如只保留一个具有搜索所有列的共同目的的搜索框。
现在,这也取决于用户希望搜索什么。所以默认情况下Joomla用户使用上面的代码。
在搜索 if "id:3" 时,由于提到了 "id:",它会立即进入 if 部分,因此 if 部分变为 true,然后它将按 id 搜索(这将 return id 为 3 的行)。一般情况下,会自动转到else部分。
最后,这些只是标准做法。即使您只写条件,代码也可以工作。选择权在你。