Search posts

This commit is contained in:
Michael Foster 2013-07-29 16:18:06 -04:00
parent c0e0a5db7d
commit 58306bdc63
3 changed files with 132 additions and 8 deletions

View File

@ -1035,6 +1035,8 @@
$config['mod']['rebuild'] = ADMIN;
// Search through posts, IP address notes and bans
$config['mod']['search'] = JANITOR;
// Allow searching posts (can be used with board configuration file to disallow searching through a certain board)
$config['mod']['search_posts'] = JANITOR;
// Read the moderator noticeboard
$config['mod']['noticeboard'] = JANITOR;
// Post to the moderator noticeboard

View File

@ -225,7 +225,7 @@ function mod_search($type, $search_query_escaped, $page_no = 1) {
// Which `field` to search?
if ($type == 'posts')
$sql_field = 'body';
$sql_field = 'body_nomarkup';
if ($type == 'IP_notes')
$sql_field = 'body';
if ($type == 'bans')
@ -246,7 +246,27 @@ function mod_search($type, $search_query_escaped, $page_no = 1) {
// Compile SQL query
if ($type == 'posts') {
error('Searching posts is under development. Sorry.');
$query = '';
$boards = listBoards();
if (empty($boards))
error(_('There are no boards to search!'));
foreach ($boards as $board) {
openBoard($board['uri']);
if (!hasPermission($config['mod']['search_posts'], $board['uri']))
continue;
if (!empty($query))
$query .= ' UNION ALL ';
$query .= sprintf("SELECT *, '%s' AS `board` FROM `posts_%s` WHERE %s", $board['uri'], $board['uri'], $sql_like);
}
// You weren't allowed to search any boards
if (empty($query))
error($config['error']['noaccess']);
$query .= ' ORDER BY `sticky` DESC, `id` DESC';
}
if ($type == 'IP_notes') {
@ -273,10 +293,15 @@ function mod_search($type, $search_query_escaped, $page_no = 1) {
// Execute SQL query (with pages)
$q = query($query . ' LIMIT ' . (($page_no - 1) * $config['mod']['search_page']) . ', ' . $config['mod']['search_page']) or error(db_error());
$results = $q->fetchAll(PDO::FETCH_ASSOC);
// Get total result count
$q = query('SELECT COUNT(*) FROM `' . $sql_table . '` WHERE ' . $sql_like) or error(db_error());
$result_count = $q->fetchColumn();
if ($type == 'posts') {
$q = query("SELECT COUNT(*) FROM ($query) AS `tmp_table`") or error(db_error());
$result_count = $q->fetchColumn();
} else {
$q = query('SELECT COUNT(*) FROM `' . $sql_table . '` WHERE ' . $sql_like) or error(db_error());
$result_count = $q->fetchColumn();
}
if ($type == 'bans') {
foreach ($results as &$ban) {
@ -285,6 +310,12 @@ function mod_search($type, $search_query_escaped, $page_no = 1) {
}
}
if ($type == 'posts') {
foreach ($results as &$post) {
$post['snippet'] = pm_snippet($post['body']);
}
}
// $results now contains the search results
mod_page(_('Search results'), 'mod/search_results.html', array(

View File

@ -39,7 +39,7 @@
</tr>
{% endfor %}
</table>
{% endif %}
{% endif %}
{% if search_type == 'bans' %}
<table class="modlog" style="width:100%">
@ -125,7 +125,7 @@
</tr>
{% endfor %}
</table>
{% endif %}
{% endif %}
{% if search_type == 'log' %}
<table class="modlog">
@ -166,7 +166,98 @@
</tr>
{% endfor %}
</table>
{% endif %}
{% endif %}
{% if search_type == 'posts' %}
<table class="modlog">
<tr>
<th>Time</th>
<th>Board</th>
<th>ID</th>
<th>Thread</th>
<th>IP</th>
<th>Name</th>
<th>Subject</th>
<th>File</th>
<th>Body (snippet)</th>
</tr>
{% for post in results %}
<tr>
<td class="minimal">
<small>{{ post.time | ago }} ago</small>
</td>
<td class="minimal">
<a href="?/{{ config.board_path|sprintf(post.board) }}{{ config.file_index }}">{{ config.board_abbreviation|sprintf(post.board) }}</a>
</td>
<td class="minimal" >
{% if post.thread %}
{% set thread = post.thread %}
{% else %}
{% set thread = post.id %}
{% endif %}
<a href="{{ config.root ~ post.board ~ '/' ~ config.dir.res}}{{ config.file_page|sprintf(thread) }}#{{ post.id }}">
{{ post.id }}
</a>
</td>
<td class="minimal">
<small>
{% if post.thread %}
{{ post.thread }}
{% else %}
(OP)
{% endif %}
</small>
</td>
<td class="minimal">
{% if mod|hasPermission(config.mod.show_ip, post.board) %}
<a href="?/IP/{{ post.ip }}">
{{ post.ip }}
</a>
{% else %}
<em>hidden</em>
{% endif %}
</td>
<td class="minimal" >
<small>
{% if post.email|length > 0 %}
{# start email #}
<a class="email" href="mailto:{{ post.email }}">
{% endif %}
{% set capcode = post.capcode|capcode %}
<span {% if capcode.name %}style="{{ capcode.name }}" {% endif %}class="name">{{ post.name }}</span>
{% if post.trip|length > 0 %}
<span {% if capcode.trip %}style="{{ capcode.trip }}" {% endif %}class="trip">{{ post.trip }}</span>
{% endif %}
{% if post.email|length > 0 %}
{# end email #}
</a>
{% endif %}
{% if capcode %}
{{ capcode.cap }}
{% endif %}
</small>
</td>
<td class="minimal" >
{% if post.subject %}
<small>{{ post.subject }}</small>
{% else %}
&ndash;
{% endif %}
</td>
<td class="minimal">
{% if post.file %}
<small>{{ post.file }} ({{ post.filesize | filesize }})</small>
{% else %}
&ndash;
{% endif %}
</td>
<td>
<small><em>{{ post.snippet }}</em></small>
</td>
</tr>
{% endfor %}
</table>
{% endif %}
{% if result_count > results|count %}
<p class="unimportant" style="text-align:center;word-wrap:break-word">