This commit is contained in:
czaks 2013-07-29 16:26:10 -04:00
commit 4257191acd
4 changed files with 134 additions and 10 deletions

View File

@ -583,7 +583,7 @@
// Use Font-Awesome for displaying lock and pin icons, instead of the images in static/.
// http://fortawesome.github.io/Font-Awesome/icon/pushpin/
// http://fortawesome.github.io/Font-Awesome/icon/lock/
$config['font_awesome'] = false;
$config['font_awesome'] = true;
$config['font_awesome_css'] = 'stylesheets/font-awesome/css/font-awesome.min.css';
// Boardlinks
@ -1062,6 +1062,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

@ -52,7 +52,7 @@
<em>{% trans 'no subject' %}</em>
{% endif %}
<small class="unimportant">
&mdash; {% trans 'by' %} {{ post.name }} {% trans 'at' %} {{ notice.time|date(config.post_date) }}
&mdash; {% trans 'by' %} {{ post.name }} {% trans 'at' %} {{ post.time|date(config.post_date) }}
</small>
</h2>
<p>

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 style="max-width:100px">
<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 style="max-width:250px">
{% if post.subject %}
<small>{{ post.subject }}</small>
{% else %}
&ndash;
{% endif %}
</td>
<td style="max-width:200px">
{% 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">