move to widget and blog pref. See changelog.

This commit is contained in:
Jean-Christian Denis 2021-08-23 01:28:59 +02:00
parent f64f1f6157
commit d93e3e616f
17 changed files with 956 additions and 912 deletions

View file

@ -1,8 +1,12 @@
2021.08.20
2021.08.21
* update license
* fix query
* change template titles to h3
* move to PSR-2 coding style and short array
* move config to widget
* move template to widget
* use default template for search
* use custom template for 404
* fix public translation
2013.10.28
* Switch to Dotclear 2.6

View file

@ -21,12 +21,12 @@ show related entries to visitor.
First install saba, mannualy from a zip package or from
Dotaddict repository. (See Dotclear's documentation to know how do this)
Go to ''plugins manager'', expand saba information then
go to ''configure plugin'', fill in form.
Go to ''Blog preference'', active plugin saba for search and 404,
go to ''Widgets'', add and configure ''Advanced search'' widget.
If you use a custom theme (not Dotclear's default theme)
you must create custom templates that match yours.
You can find exemple in saba/default-tempaltes.
You can find exemple in plugins/saba/default-tempaltes.
## MORE

56
_admin.php Normal file
View file

@ -0,0 +1,56 @@
<?php
# -- BEGIN LICENSE BLOCK ----------------------------------
#
# This file is part of saba, a plugin for Dotclear 2.
#
# Copyright (c) 2009-2021 Jean-Christian Denis and contributors
#
# Licensed under the GPL version 2.0 license.
# A copy of this license is available in LICENSE file or at
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
#
# -- END LICENSE BLOCK ------------------------------------
if (!defined('DC_CONTEXT_ADMIN')) {
return;
}
# settings namespace
$core->blog->settings->addNamespace('saba');
# behaviors
$core->addBehavior(
'adminBlogPreferencesForm',
['adminSaba', 'adminBlogPreferencesForm']
);
$core->addBehavior(
'adminBeforeBlogSettingsUpdate',
['adminSaba', 'adminBeforeBlogSettingsUpdate']
);
# add settings to admin blog pref page
class adminSaba
{
public static function adminBlogPreferencesForm($core, $blog_settings)
{
echo
'<div class="fieldset">' .
'<h4 id="saba_params">' . __('Search Across Blog Archive') . '</h4>' .
'<p><label class="classic">' .
form::checkbox('saba_active', '1', (boolean) $blog_settings->saba->active) .
__('Enable advanced search on this blog') . '</label></p>' .
'<p><label class="classic">' .
form::checkbox('saba_error', '1', (boolean) $blog_settings->saba->error) .
__('Enable suggestion for page 404') . '</label></p>' .
'<p class="form-note">' .
__("This suggests visitors some posts on page 404.") .
'</p>' .
'</div>';
}
public static function adminBeforeBlogSettingsUpdate($blog_settings)
{
$blog_settings->saba->put('active', !empty($_POST['saba_active']));
$blog_settings->saba->put('error', !empty($_POST['saba_error']));
}
}

View file

@ -1,141 +0,0 @@
<?php
# -- BEGIN LICENSE BLOCK ----------------------------------
#
# This file is part of saba, a plugin for Dotclear 2.
#
# Copyright (c) 2009-2021 Jean-Christian Denis and contributors
#
# Licensed under the GPL version 2.0 license.
# A copy of this license is available in LICENSE file or at
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
#
# -- END LICENSE BLOCK ------------------------------------
if (!defined('DC_CONTEXT_MODULE')) {
return null;
}
# -- Get settings --
$core->blog->settings->addNamespace('saba');
$s = $core->blog->settings->saba;
$filters_list = array(
'options',
'orders',
'ages',
'categories',
'authors',
'types'
);
$saba_active = (boolean) $s->active;
$saba_filters = (string) $s->filters;
$saba_filters = @unserialize($saba_filters);
if (!is_array($saba_filters)) {
$saba_filters = array();
}
# -- Set settings --
if (!empty($_POST['save'])) {
try {
$saba_active = !empty($_POST['saba_active']);
$saba_filters = array();
foreach($filters_list as $filter) {
if (!empty($_POST['saba_filter_'.$filter])) {
$saba_filters[] = $filter;
}
}
$s->put(
'active',
$saba_active,
'boolean',
'Enable extension'
);
$s->put(
'filters',
serialize($saba_filters),
'string',
'Diabled filters'
);
$core->blog->triggerBlog();
dcPage::addSuccessNotice(
__('Configuration has been successfully updated.')
);
http::redirect(
$list->getURL('module=saba&conf=1&redir='.
$list->getRedir())
);
}
catch (Exception $e) {
$core->error->add($e->getMessage());
}
}
# -- Display form --
echo '
<div class="fieldset">
<h4>'.__('Activate').'</h4>
<p><label class="classic" for="saba_active">'.
form::checkbox(
'saba_active',
1,
$saba_active
).__('Enable extension on this blog').'</label></p>
</div>
<div class="fieldset">
<h4>'.__('Advanced search').'</h4>
<p><label class="classic" for="saba_filter_options">'.
form::checkbox(
'saba_filter_options',
1,
in_array('options', $saba_filters)
).__('Disable filter on post options').'</label></p>
<p><label class="classic" for="saba_filter_orders">'.
form::checkbox(
'saba_filter_orders',
1,
in_array('orders', $saba_filters)
).__('Disable filter on order').'</label></p>
<p><label class="classic" for="saba_filter_ages">'.
form::checkbox(
'saba_filter_ages',
1,
in_array('ages', $saba_filters)
).__('Disable filter on age').'</label></p>
<p><label class="classic" for="saba_filter_categories">'.
form::checkbox(
'saba_filter_categories',
1,
in_array('categories', $saba_filters)
).__('Disable filter on categories').'</label></p>
<p><label class="classic" for="saba_filter_authors">'.
form::checkbox(
'saba_filter_authors',
1,
in_array('authors', $saba_filters)
).__('Disable filter on authors').'</label></p>
<p><label class="classic" for="saba_filter_types">'.
form::checkbox(
'saba_filter_types',
1,
in_array('types', $saba_filters)
).__('Disable filter on post types').'</label></p>
</div>';

View file

@ -19,11 +19,11 @@ $this->registerModule(
'saba',
'Search across blog archive',
'Jean-Christian Denis and Contributors',
'2021.08.20.5',
'2021.08.21',
[
'permissions' => 'admin',
'type' => 'plugin',
'dc_min' => '2.18',
'dc_min' => '2.19',
'support' => 'https://github.com/JcDenis/saba',
'details' => 'https://plugins.dotaddict.org/dc2/details/saba'
]

View file

@ -15,77 +15,25 @@ if (!defined('DC_RC_PATH')) {
return null;
}
# Admin behaviors
# setting
$core->blog->settings->addNamespace('saba');
if (!$core->blog->settings->saba->active) {
return null;
}
# Register saba handler
$core->url->register(
'search',
'search',
'^search(/.+)?$',
['urlSaba', 'saba']
);
# translation
l10n::set(dirname(__FILE__) . '/locales/' . $_lang . '/public');
# Add saba templates path
# widget
require_once dirname(__FILE__) . '/_widgets.php';
# template path
$core->tpl->setPath(
$core->tpl->getPath(),
dirname(__FILE__) . '/default-templates/'
);
# templates
$core->tpl->addBlock(
'SabaIf',
['tplSaba', 'SabaIf']
);
$core->tpl->addBlock(
'SabaEntries',
['tplSaba', 'SabaEntries']
);
$core->tpl->addBlock(
'SabaFormIf',
['tplSaba', 'SabaFormIf']
);
$core->tpl->addValue(
'SabaFormSearch',
['tplSaba', 'SabaFormSearch']
);
$core->tpl->addValue(
'SabaFormOptions',
['tplSaba', 'SabaFormOptions']
);
$core->tpl->addValue(
'SabaFormCategories',
['tplSaba', 'SabaFormCategories']
);
$core->tpl->addValue(
'SabaFormTypes',
['tplSaba', 'SabaFormTypes']
);
$core->tpl->addValue(
'SabaFormAges',
['tplSaba', 'SabaFormAges']
);
$core->tpl->addValue(
'SabaFormOrders',
['tplSaba', 'SabaFormOrders']
);
$core->tpl->addValue(
'SabaFormAuthors',
['tplSaba', 'SabaFormAuthors']
);
$core->tpl->addValue(
'SabaPaginationURL',
['tplSaba', 'SabaPaginationURL']
);
$core->tpl->addValue(
'SabaURL',
['tplSaba', 'SabaURL']
);
# behavior
$core->addBehavior(
'templateCustomSortByAlias',
@ -96,12 +44,14 @@ $core->addBehavior(
['pubSaba', 'urlHandlerBeforeGetData']
);
$core->addBehavior(
'corePostSearch',
['pubSaba', 'corePostSearch']
'coreBlogBeforeGetPosts',
['pubSaba', 'coreBlogBeforeGetPosts']
);
# url
$core->url->registerError(['urlSaba', 'error']);
if ($core->blog->settings->saba->error) {
$core->url->registerError(['urlSaba', 'error']);
}
class pubSaba
{
@ -123,128 +73,16 @@ class pubSaba
{
global $core;
$options = [
'q'=> '',
'q_opt' => [],
'q_cat' => [],
'q_age' => '0,0',
'q_user'=> [],
'q_order'=> 'date',
'q_rev' => '0',
'q_type'=> []
];
$options = tplSaba::getSabaDefaultPostsOptions();
if (!empty($_GET['q']) && 1 < strlen($_GET['q'])) {
# move to saba
$_ctx->current_tpl = null;
$_ctx->current_tpl = 'saba_search.html';
# retreive _GET
$qs = $_SERVER['QUERY_STRING'];
$qs = preg_replace('#(^|/)page/([0-9]+)#', '', $qs);
parse_str($qs, $get);
$params = [
'sql'=>'',
'post_type' => []
];
# search string
$params['search'] = rawurldecode($_GET['q']);
$params = new ArrayObject(['search' => rawurldecode($_GET['q'])]);
$options = self::getPostsParams($params);
$options['q'] = rawurldecode($_GET['q']);
# options
if (!empty($get['q_opt'])) {
if (in_array('selected', $get['q_opt'])) {
$options['q_opt'][] = 'selected';
$params['post_selected'] = 1;
}
if (in_array('comment', $get['q_opt'])) {
$options['q_opt'][] = 'comment';
$params['sql'] = "AND nb_comment > 0 ";
}
if (in_array('trackback', $get['q_opt'])) {
$options['q_opt'][] = 'trackback';
$params['sql'] = "AND nb_trackback > 0";
}
}
# categories
if (!empty($get['q_cat'])) {
$cats = array();
foreach($get['q_cat'] as $v) {
$v = abs((integer) $v);
if (!$v) {
continue;
}
$cats[] = "C.cat_id = '" . $v . "'";
$options['q_cat'][] = $v;
}
if (!empty($cats)) {
$params['sql'] .= 'AND (' . implode(' OR ', $cats) . ') ';
}
}
# post types
if (!empty($get['q_type'])) {
$types = $core->getPostTypes();
foreach($get['q_type'] as $v) {
if (!$types[$v]) {
continue;
}
$options['q_type'][] = $v;
$params['post_type'][] = $v;
}
} else {
$params['post_type'][] = 'post';
}
# age
$ages = tplSaba::getSabaFormAges();
if (!empty($get['q_age']) && in_array($get['q_age'], $ages)) {
$age = explode(',', $get['q_age']);
$ts = time();
$options['q_age'] = $get['q_age'];
if ($age[0]) {
$params['sql'] .= "AND P.post_dt < '" .
dt::str('%Y-%m-%d %H:%m:%S', $ts - $age[0]) . "' ";
}
if ($age[1]) {
$params['sql'] .= "AND P.post_dt > '" .
dt::str('%Y-%m-%d %H:%m:%S', $ts - $age[1]) . "' ";
}
}
# user
if (!empty($get['q_user'])) {
$users = array();
foreach($get['q_user'] as $v) {
$users[] = "U.user_id = '" . $core->con->escape($v) . "'";
$options['q_user'][] = $v;
}
if (!empty($users)) {
$params['sql'] .= 'AND (' . implode(' OR ', $users) . ') ';
}
}
#order
$sort = 'desc';
if (!empty($get['q_rev'])) {
$options['q_rev'] = '1';
$sort = 'asc';
}
$orders = tplSaba::getSabaFormOrders();
if (!empty($get['q_order']) && in_array($get['q_order'], $orders)) {
$options['q_order'] = $get['q_order'];
$params['order'] = $core->tpl->getSortByStr(
['sortby' => $get['q_order'], 'order' => $sort],
'post'
); //?! post_type
}
# count
$GLOBALS['_search'] = rawurldecode($_GET['q']);
if ($GLOBALS['_search']) {
@ -264,13 +102,132 @@ class pubSaba
$_ctx->saba_options = $options;
}
# Ajouter la condition "ou" à la recherche
public static function corePostSearch($core, $p)
public static function getPostsParams($params)
{
$sentences = explode(',', $p[2]['search']);
global $core;
if (!isset($params['sql'])) {
$params['sql'] = '';
}
$params['post_type'] = [];
# retreive _GET
$qs = $_SERVER['QUERY_STRING'];
$qs = preg_replace('#(^|/)page/([0-9]+)#', '', $qs);
parse_str($qs, $get);
# search string
$options = tplSaba::getSabaDefaultPostsOptions();
$options['q'] = $params['search'];
# options
if (!empty($get['q_opt'])) {
if (in_array('selected', $get['q_opt'])) {
$options['q_opt'][] = 'selected';
$params['post_selected'] = 1;
}
if (in_array('comment', $get['q_opt'])) {
$options['q_opt'][] = 'comment';
$params['sql'] = "AND nb_comment > 0 ";
}
if (in_array('trackback', $get['q_opt'])) {
$options['q_opt'][] = 'trackback';
$params['sql'] = "AND nb_trackback > 0";
}
}
# categories
if (!empty($get['q_cat'])) {
$cats = array();
foreach($get['q_cat'] as $v) {
$v = abs((integer) $v);
if (!$v) {
continue;
}
$cats[] = "C.cat_id = '" . $v . "'";
$options['q_cat'][] = $v;
}
if (!empty($cats)) {
$params['sql'] .= 'AND (' . implode(' OR ', $cats) . ') ';
}
}
# post types
if (!empty($get['q_type'])) {
$types = $core->getPostTypes();
foreach($get['q_type'] as $v) {
if (!$types[$v]) {
continue;
}
$options['q_type'][] = $v;
$params['post_type'][] = $v;
}
} else {
$params['post_type'][] = 'post';
}
# age
$ages = tplSaba::getSabaFormAges();
if (!empty($get['q_age']) && in_array($get['q_age'], $ages)) {
$age = explode(',', $get['q_age']);
$ts = time();
$options['q_age'] = $get['q_age'];
if ($age[0]) {
$params['sql'] .= "AND P.post_dt < '" .
dt::str('%Y-%m-%d %H:%m:%S', $ts - $age[0]) . "' ";
}
if ($age[1]) {
$params['sql'] .= "AND P.post_dt > '" .
dt::str('%Y-%m-%d %H:%m:%S', $ts - $age[1]) . "' ";
}
}
# user
if (!empty($get['q_user'])) {
$users = array();
foreach($get['q_user'] as $v) {
$users[] = "U.user_id = '" . $core->con->escape($v) . "'";
$options['q_user'][] = $v;
}
if (!empty($users)) {
$params['sql'] .= 'AND (' . implode(' OR ', $users) . ') ';
}
}
#order
$sort = 'desc';
if (!empty($get['q_rev'])) {
$options['q_rev'] = '1';
$sort = 'asc';
}
$orders = tplSaba::getSabaFormOrders();
if (!empty($get['q_order']) && in_array($get['q_order'], $orders)) {
$options['q_order'] = $get['q_order'];
$params['order'] = $core->tpl->getSortByStr(
['sortby' => $get['q_order'], 'order' => $sort],
'post'
); //?! post_type
}
return $options;
}
# Ajouter la condition "ou" à la recherche
public static function coreBlogBeforeGetPosts($p)
{
global $core;
if (empty($p['search'])) {
return;
}
self::getPostsParams($p);
$OR = [];
foreach($sentences as $sentence) {
foreach(explode(',', $p['search']) as $sentence) {
$AND = [];
$words = text::splitWords($sentence);
foreach($words as $word) {
@ -281,8 +238,8 @@ class pubSaba
}
}
if (!empty($OR)) {
$p[0] = '';
$p[2]['sql'] = (isset($p[2]['sql']) ? $p[2]['sql'] : '') . "AND (" . implode (' OR ', $OR) . ") ";
$p['search'] = '';
$p['sql'] .= "AND (" . implode (' OR ', $OR) . ") ";
}
}
}
@ -307,232 +264,26 @@ class urlSaba extends dcUrlHandlers
$GLOBALS['_from_error'] = true;
# Serve saba
self::serveDocument('saba_search.html');
self::serveDocument('saba_404_default.html');
return true;
}
}
public static function saba($args)
{
$_ctx =& $GLOBALS['_ctx'];
$core =& $GLOBALS['core'];
self::serveDocument('saba_search.html');
}
}
class tplSaba
{
public static function SabaEntries($a, $c)
{
return
'<?php if ($_ctx->exists("posts")) : while ($_ctx->posts->fetch()) : ?>'.$c.'<?php endwhile; endif; ?>';
}
public static function SabaFormSearch($a)
{
return '<?php echo html::escapeHTML($_ctx->saba_options["q"]); ?>';
}
public static function SabaIf($a, $c)
{
$if = [];
$operator = isset($a['operator']) ? $GLOBALS['core']->tpl->getOperator($a['operator']) : '&&';
if (isset($a['has_search'])) {
$sign = (boolean) $a['has_search'] ? '' : '!';
$if[] = $sign . 'isset($_search_count)';
}
if (isset($a['from_error'])) {
$sign = (boolean) $a['from_error'] ? '' : '!';
$if[] = $sign . 'isset($_from_error)';
}
return !empty($if) ?
'<?php if(' . implode(' ' . $operator . ' ', $if) . ') : ?>' . $c . '<?php endif; ?>'
: $c;
}
public static function SabaURL($a)
{
$f = $GLOBALS['core']->tpl->getFilters($a);
return '<?php echo ' . sprintf($f, '$core->blog->url.$core->url->getBase("search")') . '; ?>';
}
public static function SabaFormIf($a, $c)
{
$if = [];
$operator = isset($a['operator']) ? $GLOBALS['core']->tpl->getOperator($a['operator']) : '&&';
$fl = self::getSabaFormFilters();
foreach($fl as $filter) {
if (isset($a['filter_' . $filter])) {
$sign = (boolean) $a['filter_' . $filter] ? '' : '!';
$if[] = $sign . 'tplSaba::isSabaFormFilter(\'' . $filter . '\')';
}
}
return !empty($if) ?
'<?php if(' . implode(' ' . $operator . ' ', $if) . ') : ?>' . $c . '<?php endif; ?>'
: $c;
}
public static function SabaFormOptions($a)
{
$dis = !empty($a['remove']) ? explode(',', $a['remove']) : [];
$res = '';
$li = '<li><label><input name="q_opt[]" type="checkbox" value="%s" %s/> %s</label></li>';
$rs = self::getSabaFormOptions();
foreach($rs as $k => $v) {
if (in_array($v, $dis)) {
continue;
}
$chk = '<?php echo in_array("' . $v . '",$_ctx->saba_options["q_opt"]) ? \'checked="checked" \' : ""; ?>';
$res .= sprintf($li, $v, $chk, html::escapeHTML($k));
}
if (!empty($res)) {
return '<div class="saba_opt_otp"><h3>' . __('Filter options') . '</h3><ul>' . $res . '</ul></div>';
}
}
public static function SabaFormOrders($a)
{
$dis = !empty($a['remove']) ? explode(',',$a['remove']) : [];
$res = '';
$li = '<li><label><input name="q_order" type="radio" value="%s" %s/> %s</label></li>';
$rs = self::getSabaFormOrders($dis);
foreach($rs as $k => $v) {
if (in_array($v, $dis)) {
continue;
}
$chk = '<?php echo "' . $v . '" == $_ctx->saba_options["q_order"] ? \'checked="checked" \' : ""; ?>';
$res .= sprintf($li, $v, $chk, html::escapeHTML($k));
}
if (!empty($res)) {
$chk = '<?php echo !empty($_ctx->saba_options["q_rev"]) ? \'checked="checked" \' : ""; ?>';
$res .= '<li><label><input name="q_rev" type="checkbox" value="1" ' . $chk . '/> ' . __('Reverse order') . '</label></li>';
return '<div class="saba_opt_order"><h3>' . __('Filter order') . '</h3><ul>' . $res . '</ul></div>';
}
}
public static function SabaFormCategories($a)
{
global $core;
$dis = !empty($a['remove']) ? explode(',', $a['remove']) : [];
$res = '';
$li = '<li><label><input name="q_cat[]" type="checkbox" value="%s" %s/> %s</label></li>';
$rs = $core->blog->getCategories();
while ($rs->fetch()) {
if (in_array($rs->cat_id, $dis) || in_array($rs->cat_url, $dis)) {
continue;
}
$chk = '<?php echo in_array("' . $rs->cat_id . '",$_ctx->saba_options["q_cat"]) ? \'checked="checked" \' : ""; ?>';
$res .= sprintf($li, $rs->cat_id, $chk, html::escapeHTML($rs->cat_title));
}
if (!empty($res)) {
return '<div class="saba_opt_cat"><h3>' . __('Filter by category') . '</h3><ul>' . $res . '</ul></div>';
}
}
public static function SabaFormTypes($a)
{
global $core;
$dis = !empty($a['remove']) ? explode(',',$a['remove']) : [];
$res = '';
$li = '<li><label><input name="q_type[]" type="checkbox" value="%s" %s/>%s</label></li>';
$rs = self::getSabaFormTypes();
foreach($rs as $k => $v) {
if (in_array($v, $dis)) {
continue;
}
$chk = '<?php echo in_array("' . $v . '",$_ctx->saba_options["q_type"]) ? \'checked="checked" \' : ""; ?>';
$res .= sprintf($li, $v, $chk, html::escapeHTML($k));
}
if (!empty($res)) {
return '<div class="saba_opt_type"><h3>' . __('Filter by type') . '</h3><ul>' . $res . '</ul></div>';
}
}
public static function SabaFormAges($a)
{
$res = '';
$li = '<li><label><input name="q_age" type="radio" value="%s" %s/> %s</label></li>';
$rs = self::getSabaFormAges();
foreach($rs as $k => $v) {
$chk = '<?php echo "' . $v . '" == $_ctx->saba_options["q_age"] ? \'checked="checked" \' : ""; ?>';
$res .= sprintf($li, $v, $chk, html::escapeHTML($k));
}
if (!empty($res)) {
return '<div class="saba_opt_age"><h3>' . __('Filter by age') . '</h3><ul>' . $res . '</ul></div>';
}
}
public static function SabaFormAuthors($a)
{
global $core;
$dis = !empty($a['remove']) ? explode(',',$a['remove']) : [];
$res = '';
$li = '<li><label><input name="q_user[]" type="checkbox" value="%s" %s/> %s</label></li>';
$rs = $core->blog->getPostsUsers();
while ($rs->fetch()) {
if (in_array($rs->user_id, $dis)) {
continue;
}
$chk = '<?php echo in_array("' . $rs->user_id . '",$_ctx->saba_options["q_user"]) ? \'checked="checked" \' : ""; ?>';
$res .= sprintf($li, $rs->user_id, $chk, html::escapeHTML(dcUtils::getUserCN($rs->user_id, $rs->user_name, $rs->user_firstname, $rs->user_displayname)));
}
if (!empty($res)) {
return '<div class="saba_opt_user"><h3>' . __('Filter by author') . '</h3><ul>' . $res . '</ul></div>';
}
}
public static function SabaPaginationURL($attr)
{
$offset = 0;
if (isset($attr['offset'])) {
$offset = (integer) $attr['offset'];
}
$f = $GLOBALS['core']->tpl->getFilters($attr);
return '<?php echo '.sprintf($f, "ctxSaba::PaginationURL(" . $offset . ")") . '; ?>';
}
public static function getSabaFormFilters()
public static function getSabaDefaultPostsOptions()
{
return [
'options',
'orders',
'ages',
'categories',
'authors',
'types'
'q'=> '',
'q_opt' => [],
'q_cat' => [],
'q_age' => '0,0',
'q_user'=> [],
'q_order'=> 'date',
'q_rev' => '0',
'q_type'=> []
];
}
@ -591,44 +342,4 @@ class tplSaba
return $rs;
}
public static function isSabaFormFilter($f)
{
$filters = (string) $GLOBALS['core']->blog->settings->saba->filters;
$filters = @unserialize($filters);
if (!is_array($filters)) {
$filters = [];
}
return !in_array($f, $filters);
}
}
class ctxSaba extends context
{
public static function PaginationURL($offset = 0)
{
$args = $_SERVER['URL_REQUEST_PART'];
$n = self::PaginationPosition($offset);
$args = preg_replace('#(^|/)page/([0-9]+)$#', '', $args);
$url = $GLOBALS['core']->blog->url . $args;
if ($n > 1) {
$url = preg_replace('#/$#', '', $url);
$url .= '/page/' . $n;
}
$qs = preg_replace('#(^|/)page/([0-9]+)(&?)#', '', $_SERVER['QUERY_STRING']);
# If search param
if (!empty($_GET['q'])) {
$s = strpos($url, '?') !== false ? '&amp;' : '?';
$url .= $s . $qs;
}
return $url;
}
}

233
_widgets.php Normal file
View file

@ -0,0 +1,233 @@
<?php
# -- BEGIN LICENSE BLOCK ----------------------------------
#
# This file is part of saba, a plugin for Dotclear 2.
#
# Copyright (c) 2009-2021 Jean-Christian Denis and contributors
#
# Licensed under the GPL version 2.0 license.
# A copy of this license is available in LICENSE file or at
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
#
# -- END LICENSE BLOCK ------------------------------------
if (!defined('DC_RC_PATH')) {
return null;
}
$core->addBehavior('initWidgets', ['sabaWidget', 'setWidget']);
class sabaWidget
{
public static function setWidget($w)
{
global $core;
$w
->create(
'saba',
__('Advanced search'),
array('sabaWidget', 'getWidget'),
null,
__('Add more search options on public side')
)
->addTitle(__('Search'))
->setting(
'saba_filter_types',
__('Disable filter on post types'),
0,
'check'
)
->setting('saba_remove_types', __('Hidden types:'), '')
->setting(
'saba_filter_options',
__('Disable filter on post options'),
0,
'check'
)
->setting('saba_remove_options', __('Hidden options:'), '')
->setting(
'saba_filter_categories',
__('Disable filter on categories'),
0,
'check'
)
->setting('saba_remove_categories', __('Hidden categories:'), '')
->setting(
'saba_filter_authors',
__('Disable filter on authors'),
0,
'check'
)
->setting('saba_remove_authors', __('Hidden authors:'), '')
->setting(
'saba_filter_orders',
__('Disable filter on order'),
0,
'check'
)
->setting(
'saba_filter_ages',
__('Disable filter on age'),
0,
'check'
)
->addContentOnly()
->addClass()
->addOffline();
}
public static function getWidget($w)
{
global $core, $_ctx;
$core->blog->settings->addNamespace('saba');
if (!$core->blog->settings->saba->active) {
return;
}
if (!$core->blog->settings->saba->error && $core->url->type == '404') {
return;
}
if ($w->offline) {
return;
}
# title and search
$res =
($w->title ? $w->renderTitle('<label for="q">' . html::escapeHTML($w->title) . '</label>') : '') .
'<form action="' . $core->blog->url . '" method="get" role="search">' .
'<p><input type="text" size="10" maxlength="255" id="q" name="q" value="' .
html::escapeHTML($_ctx->saba_options["q"]) . '" ' .
($w->placeholder ? 'placeholder="' . html::escapeHTML($w->placeholder) . '"' : '') .
' aria-label="' . __('Search') . '"/> ' .
'<input type="submit" class="submit" value="ok" title="' . __('Search') . '" /></p>' ;
# advenced search only on search page
if ($core->url->type == 'search') {
# order
if (!$w->saba_filter_orders) {
$ct = '';
foreach(tplSaba::getSabaFormOrders() as $k => $v) {
$ct .=
'<li><label><input name="q_order" type="radio" value="' .
$v . '" ' .
($v == $_ctx->saba_options['q_order'] ? 'checked="checked" ' : '') .
'/> ' . html::escapeHTML($k) . '</label></li>';
}
if (!empty($ct)) {
$ct .= '<li><label><input name="q_rev" type="checkbox" value="1" ' .
(!empty($_ctx->saba_options['q_rev']) ? 'checked="checked" ' : '') .
'/> ' . __('Reverse order') . '</label></li>';
$res .= $w->renderTitle(__('Filter order')) . sprintf('<ul>%s</ul>', $ct);
}
}
# options
if (!$w->saba_filter_options) {
$ct = '';
$rm = explode(',', $w->saba_remove_options);
foreach(tplSaba::getSabaFormOptions() as $k => $v) {
if (in_array($v, $rm)) {
continue;
}
$ct .=
'<li><label><input name="q_opt[]" type="checkbox" value="' .
$v . '" ' .
(in_array($v, $_ctx->saba_options['q_opt']) ? 'checked="checked" ' : '') .
'/> ' . html::escapeHTML($k) . '</label></li>';
}
if (!empty($ct)) {
$res .= $w->renderTitle(__('Filter options')) . sprintf('<ul>%s</ul>', $ct);
}
}
# ages
if (!$w->saba_filter_ages) {
$ct = '';
foreach(tplSaba::getSabaFormAges() as $k => $v) {
$ct .=
'<li><label><input name="q_age" type="radio" value="' .
$v . '" ' .
($v == $_ctx->saba_options['q_age'] ? 'checked="checked" ' : '') .
'/> ' . html::escapeHTML($k) . '</label></li>';
}
if (!empty($ct)) {
$res .= $w->renderTitle(__('Filter by age')) . sprintf('<ul>%s</ul>', $ct);
}
}
# types
if (!$w->saba_filter_types) {
$ct = '';
$rm = explode(',', $w->saba_remove_types);
foreach(tplSaba::getSabaFormTypes() as $k => $v) {
if (in_array($v, $rm)) {
continue;
}
$ct .=
'<li><label><input name="q_type[]" type="checkbox" value="' .
$v . '" ' .
(in_array($v, $_ctx->saba_options['q_type']) ? 'checked="checked" ' : '') .
'/> ' . html::escapeHTML($k) . '</label></li>';
}
if (!empty($ct)) {
$res .= $w->renderTitle(__('Filter by type')) . sprintf('<ul>%s</ul>', $ct);
}
}
# categories
if (!$w->saba_filter_categories) {
$ct = '';
$rm = explode(',', $w->saba_remove_categories);
$rs = $core->blog->getCategories();
while ($rs->fetch()) {
if (in_array($rs->cat_id, $rm) || in_array($rs->cat_url, $rm)) {
continue;
}
$ct .=
'<li><label><input name="q_cat[]" type="checkbox" value="' .
$rs->cat_id . '" ' .
(in_array($rs->cat_id, $_ctx->saba_options['q_cat']) ? 'checked="checked" ' : '') .
'/> ' . html::escapeHTML($rs->cat_title) . '</label></li>';
}
if (!empty($ct)) {
$res .= $w->renderTitle(__('Filter by category')) . sprintf('<ul>%s</ul>', $ct);
}
}
# authors
if (!$w->saba_filter_authors) {
$ct = '';
$rm = explode(',', $w->saba_remove_authors);
$rs = $core->blog->getPostsUsers();
while ($rs->fetch()) {
if (in_array($rs->user_id, $rm)) {
continue;
}
$ct .=
'<li><label><input name="q_user[]" type="checkbox" value="' .
$rs->user_id . '" ' .
(in_array($rs->user_id, $_ctx->saba_options['q_user']) ? 'checked="checked" ' : '') .
'/> ' . html::escapeHTML(dcUtils::getUserCN($rs->user_id, $rs->user_name, $rs->user_firstname, $rs->user_displayname)) . '</label></li>';
}
if (!empty($ct)) {
$res .= $w->renderTitle(__('Filter by author')) . sprintf('<ul>%s</ul>', $ct);
}
}
}
$res .= '</form>';
return $w->renderDiv($w->content_only, $w->class, 'id="search"', $res);
}
}

View file

@ -0,0 +1,40 @@
{{tpl:extends parent="__layout.html"}}
<tpl:Block name="head-title">
<title>{{tpl:lang Document not found}} - {{tpl:BlogName encode_html="1"}}</title>
</tpl:Block>
<tpl:Block name="meta-robots">
<meta name="ROBOTS" content="{{tpl:BlogMetaRobots robots="NOINDEX,NOARCHIVE"}}" />
</tpl:Block>
<tpl:Block name="head-linkrel">
<link rel="contents" title="{{tpl:lang Archives}}" href="{{tpl:BlogArchiveURL}}" />
<link rel="alternate" type="application/atom+xml" title="Atom 1.0" href="{{tpl:BlogFeedURL type="atom"}}" />
</tpl:Block>
<tpl:Block name="body-tag">
<body class="dc-404">
</tpl:Block>
<tpl:Block name="main-content">
<div id="content-info">
<h2>{{tpl:lang Document not found}}</h2>
<p>{{tpl:lang URL you've tried has typos, or the page has been deleted or moved.}}</p>
<h3>{{tpl:lang Suggestions:}}</h3>
</div>
<div class="content-inner">
<tpl:Entries>
{{tpl:include src="_entry-short.html"}}
<tpl:EntriesFooter>
<tpl:Pagination>
<p class="pagination">
<tpl:PaginationIf end="0">
<a href="{{tpl:PaginationURL offset="+1"}}" class="prev">&#171; {{tpl:lang previous entries}}</a> -
</tpl:PaginationIf>
{{tpl:lang page}} {{tpl:PaginationCurrent}} {{tpl:lang of}} {{tpl:PaginationCounter}}
<tpl:PaginationIf start="0">
- <a href="{{tpl:PaginationURL offset="-1"}}" class="next">{{tpl:lang next entries}} &#187;</a>
</tpl:PaginationIf>
</p>
</tpl:Pagination>
</tpl:EntriesFooter>
</tpl:Entries>
</div> <!-- End #content-inner -->
</tpl:Block>

View file

@ -0,0 +1,48 @@
{{tpl:extends parent="__layout.html"}}
<tpl:Block name="head-title">
<title>{{tpl:lang Document not found}} - {{tpl:BlogName encode_html="1"}}</title>
</tpl:Block>
<tpl:Block name="meta-robots">
<meta name="ROBOTS" content="{{tpl:BlogMetaRobots robots="NOINDEX,NOARCHIVE"}}" />
</tpl:Block>
<tpl:Block name="head-linkrel">
<link rel="contents" title="{{tpl:lang Archives}}" href="{{tpl:BlogArchiveURL}}" />
<link rel="alternate" type="application/atom+xml" title="Atom 1.0" href="{{tpl:BlogFeedURL type="atom"}}" />
</tpl:Block>
<tpl:Block name="body-tag">
<body class="dc-404">
</tpl:Block>
<tpl:Block name="main-content">
<tpl:Block name="main-content-before"></tpl:Block>
<tpl:Block name="content-info-header">
<header id="content-info">
<tpl:Block name="content-info-header-title">
<h2>{{tpl:lang Document not found}}</h2>
</tpl:Block>
<tpl:Block name="content-info-header-content">
<p>{{tpl:lang URL you've tried has typos, or the page has been deleted or moved.}}</p>
</tpl:Block>
</header>
</tpl:Block>
<tpl:Block name="content-inner">
<div class="content-inner">
<h3>{{tpl:lang Suggestions:}}</h3>
<tpl:Block name="content-inner-entries">
<tpl:Entries>
<tpl:Block name="content-inner-entry">
{{tpl:include src="_entry-short.html"}}
</tpl:Block>
<tpl:Block name="content-inner-pagination">
<tpl:EntriesFooter>
</tpl:EntriesFooter>
</tpl:Block>
</tpl:Entries>
</tpl:Block>
<tpl:Block name="content-inner-footer">
</tpl:Block>
</div> <!-- # End #content-inner -->
</tpl:Block>
<tpl:Block name="main-content-after"></tpl:Block>
</tpl:Block>

View file

@ -0,0 +1,47 @@
{{tpl:extends parent="__layout.html"}}
<tpl:Block name="head-title">
<title>{{tpl:lang Document not found}} - {{tpl:BlogName encode_html="1"}}</title>
</tpl:Block>
<tpl:Block name="meta-robots">
<meta name="ROBOTS" content="{{tpl:BlogMetaRobots robots="NOINDEX,NOARCHIVE"}}" />
</tpl:Block>
<tpl:Block name="head-linkrel">
<link rel="contents" title="{{tpl:lang Archives}}" href="{{tpl:BlogArchiveURL}}" />
<link rel="alternate" type="application/atom+xml" title="Atom 1.0" href="{{tpl:BlogFeedURL type="atom"}}" />
</tpl:Block>
<tpl:Block name="body-tag">
<body class="dc-404">
</tpl:Block>
<tpl:Block name="main-content">
<tpl:Block name="main-content-before"></tpl:Block>
<tpl:Block name="content-info-header">
<header id="content-info">
<tpl:Block name="content-info-header-title">
<h2>{{tpl:lang Document not found}} - {{tpl:lang Suggested items:}}</h2>
</tpl:Block>
<tpl:Block name="content-info-header-content">
<p>{{tpl:lang URL you've tried has typos, or the page has been deleted or moved.}}</p>
</tpl:Block>
</header>
</tpl:Block>
<tpl:Block name="content-inner">
<div class="content-inner">
<tpl:Block name="content-inner-entries">
<tpl:Entries>
<tpl:Block name="content-inner-entry">
{{tpl:include src="_entry-short.html"}}
</tpl:Block>
<tpl:Block name="content-inner-pagination">
<tpl:EntriesFooter>
</tpl:EntriesFooter>
</tpl:Block>
</tpl:Entries>
</tpl:Block>
<tpl:Block name="content-inner-footer">
</tpl:Block>
</div> <!-- # End #content-inner -->
</tpl:Block>
<tpl:Block name="main-content-after"></tpl:Block>
</tpl:Block>

View file

@ -0,0 +1,78 @@
{{tpl:extends parent="__layout.html"}}
<tpl:Block name="head-title">
<title>{{tpl:lang Document not found}} - {{tpl:BlogName encode_html="1"}}</title>
</tpl:Block>
<tpl:Block name="meta-robots">
<meta name="ROBOTS" content="{{tpl:BlogMetaRobots robots="NOINDEX,NOARCHIVE"}}" />
</tpl:Block>
<tpl:Block name="head-linkrel">
<link rel="contents" title="{{tpl:lang Archives}}" href="{{tpl:BlogArchiveURL}}" />
<link rel="alternate" type="application/atom+xml" title="Atom 1.0" href="{{tpl:BlogFeedURL type="atom"}}" />
</tpl:Block>
<tpl:Block name="body-tag">
<body class="dc-404">
</tpl:Block>
<tpl:Block name="main-content">
<div id="content-info">
<h2>{{tpl:lang Document not found}}</h2>
<p>{{tpl:lang The document you are looking for does not exist.}}</p>
<h3>{{tpl:lang Suggestions:}}</h3>
</div>
<tpl:Entries>
<div id="p{{tpl:EntryID}}" class="post {{tpl:EntryIfOdd}} {{tpl:EntryIfFirst}}" lang="{{tpl:EntryLang}}" role="article">
<!-- # New day date -->
<tpl:DateHeader>
<p class="day-date">{{tpl:EntryDate}}</p>
</tpl:DateHeader>
<h2 class="post-title"><a
href="{{tpl:EntryURL}}">{{tpl:EntryTitle encode_html="1"}}</a></h2>
<p class="post-info">{{tpl:lang By}} {{tpl:EntryAuthorLink}}
{{tpl:lang on}} {{tpl:EntryDate}}, {{tpl:EntryTime}}
<tpl:EntryIf has_category="1">
- <a href="{{tpl:EntryCategoryURL}}">{{tpl:EntryCategory encode_html="1"}}</a>
</tpl:EntryIf>
</p>
<tpl:EntryTags>
<tpl:TagsHeader>
<ul class="post-tags">
</tpl:TagsHeader>
<li><a href="{{tpl:TagURL}}">{{tpl:TagID}}</a></li>
<tpl:TagsFooter>
</ul>
</tpl:TagsFooter>
</tpl:EntryTags>
<!-- # --BEHAVIOR-- publicEntryBeforeContent -->
{{tpl:SysBehavior behavior="publicEntryBeforeContent"}}
<!-- # Entry with an excerpt -->
<tpl:EntryIf extended="1">
<div class="post-content">{{tpl:EntryExcerpt}}</div>
<p class="read-it"><a href="{{tpl:EntryURL}}"
title="{{tpl:lang Continue reading}} {{tpl:EntryTitle encode_html="1"}}">{{tpl:lang Continue
reading}}</a><span class="readmore-ellipsis">...</span></p>
</tpl:EntryIf>
<!-- # Entry without excerpt -->
<tpl:EntryIf extended="0">
<div class="post-content">{{tpl:EntryContent}}</div>
</tpl:EntryIf>
<!-- # --BEHAVIOR-- publicEntryAfterContent -->
{{tpl:SysBehavior behavior="publicEntryAfterContent"}}
<!-- # Number of comments, trackbacks and attachments -->
<tpl:EntryIf operator="or" show_comments="1" show_pings="1" has_attachment="1">
<p class="post-info-co">
</tpl:EntryIf>
<tpl:EntryIf show_comments="1">
<a href="{{tpl:EntryURL}}#comments" class="comment_count">{{tpl:EntryCommentCount}}</a>
</tpl:EntryIf>
<tpl:EntryIf show_pings="1">
<a href="{{tpl:EntryURL}}#pings" class="ping_count">{{tpl:EntryPingCount}}</a></tpl:EntryIf>
<tpl:EntryIf has_attachment="1">
<a href="{{tpl:EntryURL}}#attachments" class="attach_count">{{tpl:EntryAttachmentCount}}</a></tpl:EntryIf>
<tpl:EntryIf operator="or" show_comments="1" show_pings="1" has_attachment="1">
</p>
</tpl:EntryIf>
</div>
<tpl:EntriesFooter>
</tpl:EntriesFooter>
</tpl:Entries>
</tpl:Block>

View file

@ -1,14 +0,0 @@
<div class="saba-post">
<h2 id="p{{tpl:EntryID}}" class="post-title" lang="{{tpl:EntryLang}}" xml:lang="{{tpl:EntryLang}}"><a
href="{{tpl:EntryURL}}" title="{{tpl:lang Read}} {{tpl:EntryTitle encode_html="1"}}">{{tpl:EntryTitle encode_html="1"}}</a></h2>
<p class="post-info">{{tpl:lang By}} {{tpl:EntryAuthorLink}} {{tpl:lang on}} {{tpl:EntryDate}}
<tpl:EntryIf show_comments="1">
- <a href="{{tpl:EntryURL}}#comments">{{tpl:EntryCommentCount}}</a>
</tpl:EntryIf>
<tpl:EntryIf show_pings="1">
- <a href="{{tpl:EntryURL}}#pings">{{tpl:EntryPingCount}}</a></tpl:EntryIf>
<tpl:EntryIf has_attachment="1">
- <a href="{{tpl:EntryURL}}#attachments">{{tpl:EntryAttachmentCount}}</a></tpl:EntryIf>
</p>
</div>

View file

@ -1,133 +0,0 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="{{tpl:BlogLanguage}}" lang="{{tpl:BlogLanguage}}">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<meta name="MSSmartTagsPreventParsing" content="TRUE" />
<meta name="ROBOTS" content="{{tpl:BlogMetaRobots robots="NOINDEX"}}" />
<title>{{tpl:lang Search}} - {{tpl:SysSearchString encode_html="1"}} - {{tpl:BlogName encode_html="1"}}<tpl:PaginationIf start="0"> - {{tpl:lang page}} {{tpl:PaginationCurrent}}</tpl:PaginationIf></title>
<meta name="copyright" content="{{tpl:BlogCopyrightNotice encode_html="1"}}" />
<meta name="author" content="{{tpl:BlogEditor encode_html="1"}}" />
<meta name="date" scheme="W3CDTF" content="{{tpl:BlogUpdateDate iso8601="1"}}" />
<link rel="schema.dc" href="http://purl.org/dc/elements/1.1/" />
<meta name="dc.title" lang="{{tpl:BlogLanguage}}" content="{{tpl:lang Search}} - {{tpl:SysSearchString encode_html="1"}} - {{tpl:BlogName encode_html="1"}}<tpl:PaginationIf start="0"> - {{tpl:lang page}} {{tpl:PaginationCurrent}}</tpl:PaginationIf>" />
<meta name="dc.language" content="{{tpl:BlogLanguage}}" />
<meta name="dc.publisher" content="{{tpl:BlogEditor encode_html="1"}}" />
<meta name="dc.rights" content="{{tpl:BlogCopyrightNotice encode_html="1"}}" />
<meta name="dc.date" scheme="W3CDTF" content="{{tpl:BlogUpdateDate iso8601="1"}}" />
<meta name="dc.type" content="text" />
<meta name="dc.format" content="text/html" />
<link rel="top" href="{{tpl:BlogURL}}" title="{{tpl:lang Home}}" />
<link rel="contents" href="{{tpl:BlogArchiveURL}}" title="{{tpl:lang Archives}}" />
{{tpl:include src="_head.html"}}
</head>
<body class="dc-search<tpl:SabaIf from_error="1"> dc-404</tpl:SabaIf>">
<div id="page">
{{tpl:include src="_top.html"}}
<div id="wrapper">
<div id="main">
<div id="content">
<div id="content-info">
<tpl:SabaIf from_error="1">
<h2>{{tpl:lang Document not found}}</h2>
<p>{{tpl:lang URL you've tried has typos, or the page has been deleted or moved.}}</p>
</tpl:SabaIf>
<tpl:SabaIf has_search="1" from_error="0">
<h2>{{tpl:lang Search across blog's archive}}</h2>
<tpl:SysIf search_count="==0">
<p>{{tpl:SysSearchString encode_html="1" string="Your search for <em>%1$s</em> returned no result."}}</p>
</tpl:SysIf>
<tpl:SysIf search_count="==1">
<p>{{tpl:SysSearchString encode_html="1" string="Your search for <em>%1$s</em> returned <strong>%2$s</strong> result."}}</p>
</tpl:SysIf>
<tpl:SysIf search_count="&gt;1">
<p>{{tpl:SysSearchString encode_html="1" string="Your search for <em>%1$s</em> returned <strong>%2$s</strong> results."}}</p>
</tpl:SysIf>
</tpl:SabaIf>
<tpl:SabaIf has_search="0" from_error="0">
<form action="{{tpl:BlogURL}}" method="get" id="saba-form">
<div class="saba-opt-text">
<h3><label for="q">{{tpl:lang Advanced search}}</label></h3>
<p><input name="q" type="text" size="100" maxlength="255" value="{{tpl:SabaFormSearch}}" />
<input type="submit" class="submit" value="ok" /></p>
</div>
<tpl:SabaFormIf filter_options="1">{{tpl:SabaFormOptions}}</tpl:SabaFormIf>
<tpl:SabaFormIf filter_orders="1">{{tpl:SabaFormOrders remove="selected"}}</tpl:SabaFormIf>
<tpl:SabaFormIf filter_ages="1">{{tpl:SabaFormAges}}</tpl:SabaFormIf>
<tpl:SabaFormIf filter_categories="1">{{tpl:SabaFormCategories}}</tpl:SabaFormIf>
<tpl:SabaFormIf filter_authors="1">{{tpl:SabaFormAuthors}}</tpl:SabaFormIf>
<tpl:SabaFormIf filter_types="1">{{tpl:SabaFormTypes}}</tpl:SabaFormIf>
</form>
</tpl:SabaIf>
</div>
<div class="content-inner">
<tpl:SabaEntries>
<tpl:SabaIf from_error="1">
<tpl:EntriesHeader>
<h2>{{tpl:lang Suggested items}}</h2>
</tpl:EntriesHeader>
</tpl:SabaIf>
{{tpl:include src="saba_post.html"}}
<tpl:EntriesFooter>
<tpl:Pagination>
<p class="pagination"><tpl:PaginationIf end="0"><a href="{{tpl:SabaPaginationURL offset="+1"}}" class="prev">&#171;
{{tpl:lang previous entries}}</a> - </tpl:PaginationIf>
{{tpl:lang page}} {{tpl:PaginationCurrent}} {{tpl:lang of}} {{tpl:PaginationCounter}}
<tpl:PaginationIf start="0"> - <a href="{{tpl:SabaPaginationURL offset="-1"}}" class="next">{{tpl:lang next entries}}
&#187;</a></tpl:PaginationIf></p>
</tpl:Pagination>
</tpl:EntriesFooter>
</tpl:SabaEntries>
</div>
</div>
</div> <!-- End #main -->
<div id="sidebar">
<div id="blognav">
<tpl:SabaIf has_search="1" from_error="1" operator="or">
<form action="{{tpl:BlogURL}}" method="get" id="saba-form">
<div class="saba-opt-text">
<h3><label for="q">{{tpl:lang Advanced search}}</label></h3>
<p><input name="q" type="text" size="10" maxlength="255" value="{{tpl:SabaFormSearch}}" />
<input type="submit" class="submit" value="ok" /></p>
</div>
<tpl:SabaFormIf filter_options="1">{{tpl:SabaFormOptions}}</tpl:SabaFormIf>
<tpl:SabaFormIf filter_orders="1">{{tpl:SabaFormOrders remove="selected"}}</tpl:SabaFormIf>
<tpl:SabaFormIf filter_ages="1">{{tpl:SabaFormAges}}</tpl:SabaFormIf>
<tpl:SabaFormIf filter_categories="1">{{tpl:SabaFormCategories}}</tpl:SabaFormIf>
<tpl:SabaFormIf filter_authors="1">{{tpl:SabaFormAuthors}}</tpl:SabaFormIf>
<tpl:SabaFormIf filter_types="1">{{tpl:SabaFormTypes}}</tpl:SabaFormIf>
</form>
</tpl:SabaIf>
{{tpl:Widgets type="nav"}}
</div> <!-- End #blognav -->
<div id="blogextra">
{{tpl:Widgets type="extra"}}
</div> <!-- End #blogextra -->
</div>
</div> <!-- End #wrapper -->
{{tpl:include src="_footer.html"}}
</div> <!-- End #page -->
</body>
</html>

View file

@ -1,94 +1,57 @@
<?php
// Language: Français
// Module: saba - 2013.10.28
// Date: 2013-10-29 08:06:52
// Translated with dcTranslater - 2013.05.11
// Module: saba - 2021.08.21
// Date: 2021-08-22 23:22:12
// Translated with dcTranslater - 2021.08.18
#_config.php:70
$GLOBALS['__l10n']['Configuration has been successfully updated.'] = 'La configuration a été mise à jour avec succés.';
#_admin.php:38
$GLOBALS['__l10n']['Search Across Blog Archive'] = 'Rechercher dans les archives';
#_config.php:93
$GLOBALS['__l10n']['Enable extension on this blog'] = 'Activer l\'extension sur ce blog';
#_admin.php:41
$GLOBALS['__l10n']['Enable advanced search on this blog'] = 'Activer la recherche avancée sur ce blog';
#_config.php:98
#_admin.php:44
$GLOBALS['__l10n']['Enable suggestion for page 404'] = 'Activer la suggestion sur la page 404';
#_admin.php:46
$GLOBALS['__l10n']['This suggests visitors some posts on page 404.'] = 'Ceci suggère au visiteurs des billets sur la page 404.';
#_widgets.php:18
$GLOBALS['__l10n']['Advanced search'] = 'Recherche avancée';
#_config.php:105
$GLOBALS['__l10n']['Disable filter on post options'] = 'Désactiver le filtre des options de billet';
#_widgets.php:21
$GLOBALS['__l10n']['Add more search options on public side'] = 'Ajoute plus d\'options de recherche';
#_config.php:112
$GLOBALS['__l10n']['Disable filter on order'] = 'Désactiver le filtre d\'ordre';
#_config.php:119
$GLOBALS['__l10n']['Disable filter on age'] = 'Désactiver le filtre de date';
#_config.php:126
$GLOBALS['__l10n']['Disable filter on categories'] = 'Désactiver le filtre de catégories';
#_config.php:133
$GLOBALS['__l10n']['Disable filter on authors'] = 'Désactiver le filtre d\'auteurs';
#_config.php:140
#_widgets.php:26
$GLOBALS['__l10n']['Disable filter on post types'] = 'Désactiver le filtre de type de billets';
#_public.php:345
$GLOBALS['__l10n']['Filter options'] = 'Options du filtre';
#_widgets.php:30
$GLOBALS['__l10n']['Hidden types:'] = 'Billets cachés :';
#_public.php:365
$GLOBALS['__l10n']['Reverse order'] = 'Inverser l\'ordre';
#_widgets.php:33
$GLOBALS['__l10n']['Disable filter on post options'] = 'Désactiver le filtre des options de billet';
#_public.php:367
$GLOBALS['__l10n']['Filter order'] = 'Options de tri';
#_widgets.php:37
$GLOBALS['__l10n']['Hidden options:'] = 'Options cachées :';
#_public.php:388
$GLOBALS['__l10n']['Filter by category'] = 'Filter par catégorie';
#_widgets.php:40
$GLOBALS['__l10n']['Disable filter on categories'] = 'Désactiver le filtre de catégories';
#_public.php:409
$GLOBALS['__l10n']['Filter by type'] = 'Filtrer par type';
#_widgets.php:44
$GLOBALS['__l10n']['Hidden categories:'] = 'Catégories cachées';
#_public.php:425
$GLOBALS['__l10n']['Filter by age'] = 'Filtrer par date';
#_widgets.php:47
$GLOBALS['__l10n']['Disable filter on authors'] = 'Désactiver le filtre d\'auteurs';
#_public.php:446
$GLOBALS['__l10n']['Filter by author'] = 'Filtrer par auteur';
#_widgets.php:51
$GLOBALS['__l10n']['Hidden authors:'] = 'Auteurs cachés';
#_public.php:477
$GLOBALS['__l10n']['With comments'] = 'Avec commentaires';
#_widgets.php:54
$GLOBALS['__l10n']['Disable filter on order'] = 'Désactiver le filtre d\'ordre';
#_public.php:478
$GLOBALS['__l10n']['With trackbacks'] = 'Avec rétroliens';
#_widgets.php:60
$GLOBALS['__l10n']['Disable filter on age'] = 'Désactiver le filtre de date';
#_public.php:490
$GLOBALS['__l10n']['Comments count'] = 'Nombre de commentaires';
#default-templates/saba_404_dotty.html:22
$GLOBALS['__l10n']['Suggested items:'] = 'Articles suggérés :';
#_public.php:491
$GLOBALS['__l10n']['Trackbacks count'] = 'Nombre de rétroliens';
#_public.php:498
$GLOBALS['__l10n']['All'] = 'Tous';
#_public.php:499
$GLOBALS['__l10n']['Less than a month'] = 'Moins d\'un mois';
#_public.php:500
$GLOBALS['__l10n']['From 1 to 6 month'] = 'De 1 à 6 mois';
#_public.php:501
$GLOBALS['__l10n']['From 6 to 12 month'] = 'De 6 à 12 mois';
#_public.php:502
$GLOBALS['__l10n']['More than a year'] = 'Plus d\'un an';
#_public.php:511
$GLOBALS['__l10n']['Poll'] = 'Sondage';
#_public.php:512
$GLOBALS['__l10n']['Event'] = 'Événement';
$GLOBALS['__l10n']['Search across blog\'s archive'] = 'Rechercher dans les archives';
$GLOBALS['__l10n']['Please select a request and options to search on'] = 'Merci de formuler une requête et les options de recherche';
$GLOBALS['__l10n']['Suggested items'] = 'Articles suggérés';
?>

View file

@ -1,133 +1,85 @@
# Language: Français
# Module: saba - 2013.10.28
# Date: 2013-10-29 08:06:53
# Translated with translater 2013.05.11
# Module: saba - 2021.08.21
# Date: 2021-08-22 23:22:12
# Translated with translater 2021.08.18
msgid ""
msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Project-Id-Version: saba 2013.10.28\n"
"Project-Id-Version: saba 2021.08.21\n"
"POT-Creation-Date: \n"
"PO-Revision-Date: 2013-10-29T08:06:53+00:00\n"
"PO-Revision-Date: 2021-08-22T23:22:12+00:00\n"
"Last-Translator: Jean-Christian Denis\n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
#: _config.php:70
msgid "Configuration has been successfully updated."
msgstr "La configuration a été mise à jour avec succés."
#: _admin.php:38
msgid "Search Across Blog Archive"
msgstr "Rechercher dans les archives"
#: _config.php:93
msgid "Enable extension on this blog"
msgstr "Activer l'extension sur ce blog"
#: _admin.php:41
msgid "Enable advanced search on this blog"
msgstr "Activer la recherche avancée sur ce blog"
#: _config.php:98
#: _admin.php:44
msgid "Enable suggestion for page 404"
msgstr "Activer la suggestion sur la page 404"
#: _admin.php:46
msgid "This suggests visitors some posts on page 404."
msgstr "Ceci suggère au visiteurs des billets sur la page 404."
#: _widgets.php:18
msgid "Advanced search"
msgstr "Recherche avancée"
#: _config.php:105
msgid "Disable filter on post options"
msgstr "Désactiver le filtre des options de billet"
#: _widgets.php:21
msgid "Add more search options on public side"
msgstr "Ajoute plus d'options de recherche"
#: _config.php:112
msgid "Disable filter on order"
msgstr "Désactiver le filtre d'ordre"
#: _config.php:119
msgid "Disable filter on age"
msgstr "Désactiver le filtre de date"
#: _config.php:126
msgid "Disable filter on categories"
msgstr "Désactiver le filtre de catégories"
#: _config.php:133
msgid "Disable filter on authors"
msgstr "Désactiver le filtre d'auteurs"
#: _config.php:140
#: _widgets.php:26
msgid "Disable filter on post types"
msgstr "Désactiver le filtre de type de billets"
#: _public.php:345
msgid "Filter options"
msgstr "Options du filtre"
#: _widgets.php:30
msgid "Hidden types:"
msgstr "Billets cachés :"
#: _public.php:365
msgid "Reverse order"
msgstr "Inverser l'ordre"
#: _widgets.php:33
msgid "Disable filter on post options"
msgstr "Désactiver le filtre des options de billet"
#: _public.php:367
msgid "Filter order"
msgstr "Options de tri"
#: _widgets.php:37
msgid "Hidden options:"
msgstr "Options cachées :"
#: _public.php:388
msgid "Filter by category"
msgstr "Filter par catégorie"
#: _widgets.php:40
msgid "Disable filter on categories"
msgstr "Désactiver le filtre de catégories"
#: _public.php:409
msgid "Filter by type"
msgstr "Filtrer par type"
#: _widgets.php:44
msgid "Hidden categories:"
msgstr "Catégories cachées"
#: _public.php:425
msgid "Filter by age"
msgstr "Filtrer par date"
#: _widgets.php:47
msgid "Disable filter on authors"
msgstr "Désactiver le filtre d'auteurs"
#: _public.php:446
msgid "Filter by author"
msgstr "Filtrer par auteur"
#: _widgets.php:51
msgid "Hidden authors:"
msgstr "Auteurs cachés"
#: _public.php:477
msgid "With comments"
msgstr "Avec commentaires"
#: _widgets.php:54
msgid "Disable filter on order"
msgstr "Désactiver le filtre d'ordre"
#: _public.php:478
msgid "With trackbacks"
msgstr "Avec rétroliens"
#: _widgets.php:60
msgid "Disable filter on age"
msgstr "Désactiver le filtre de date"
#: _public.php:490
msgid "Comments count"
msgstr "Nombre de commentaires"
#: _public.php:491
msgid "Trackbacks count"
msgstr "Nombre de rétroliens"
#: _public.php:498
msgid "All"
msgstr "Tous"
#: _public.php:499
msgid "Less than a month"
msgstr "Moins d'un mois"
#: _public.php:500
msgid "From 1 to 6 month"
msgstr "De 1 à 6 mois"
#: _public.php:501
msgid "From 6 to 12 month"
msgstr "De 6 à 12 mois"
#: _public.php:502
msgid "More than a year"
msgstr "Plus d'un an"
#: _public.php:511
msgid "Poll"
msgstr "Sondage"
#: _public.php:512
msgid "Event"
msgstr "Événement"
msgid "Search across blog's archive"
msgstr "Rechercher dans les archives"
msgid "Please select a request and options to search on"
msgstr "Merci de formuler une requête et les options de recherche"
msgid "Suggested items"
msgstr "Articles suggérés"
#: default-templates/saba_404_dotty.html:22
msgid "Suggested items:"
msgstr "Articles suggérés :"

View file

@ -0,0 +1,82 @@
<?php
// Language: Français
// Module: saba - 2021.08.21
// Date: 2021-08-22 23:22:12
// Translated with dcTranslater - 2021.08.18
#_public.php:293
#_public.php:303
$GLOBALS['__l10n']['Selected entry'] = 'Billet sélectionné';
#_public.php:294
$GLOBALS['__l10n']['With comments'] = 'Avec commentaires';
#_public.php:295
$GLOBALS['__l10n']['With trackbacks'] = 'Avec rétroliens';
#_public.php:302
$GLOBALS['__l10n']['Title'] = 'Titre';
#_public.php:304
$GLOBALS['__l10n']['Author'] = 'Auteur·rice';
#_public.php:305
$GLOBALS['__l10n']['Date'] = 'Date';
#_public.php:306
$GLOBALS['__l10n']['Update'] = 'Mise à jour';
#_public.php:307
$GLOBALS['__l10n']['Comments count'] = 'Nombre de commentaires';
#_public.php:308
$GLOBALS['__l10n']['Trackbacks count'] = 'Nombre de rétroliens';
#_public.php:315
$GLOBALS['__l10n']['All'] = 'Tous';
#_public.php:316
$GLOBALS['__l10n']['Less than a month'] = 'Moins d\'un mois';
#_public.php:317
$GLOBALS['__l10n']['From 1 to 6 month'] = 'De 1 à 6 mois';
#_public.php:318
$GLOBALS['__l10n']['From 6 to 12 month'] = 'De 6 à 12 mois';
#_public.php:319
$GLOBALS['__l10n']['More than a year'] = 'Plus d\'un an';
#_public.php:326
$GLOBALS['__l10n']['Entry'] = 'Publication';
#_public.php:327
$GLOBALS['__l10n']['Page'] = 'Page';
#_public.php:328
$GLOBALS['__l10n']['Poll'] = 'Sondage';
#_public.php:329
$GLOBALS['__l10n']['Event'] = 'Événement';
#_widgets.php:114
$GLOBALS['__l10n']['Reverse order'] = 'Inverser l\'ordre';
#_widgets.php:115
$GLOBALS['__l10n']['Filter order'] = 'Options de tri';
#_widgets.php:135
$GLOBALS['__l10n']['Filter options'] = 'Options du filtre';
#_widgets.php:151
$GLOBALS['__l10n']['Filter by age'] = 'Filtrer par date';
#_widgets.php:171
$GLOBALS['__l10n']['Filter by type'] = 'Filtrer par type';
#_widgets.php:192
$GLOBALS['__l10n']['Filter by category'] = 'Filter par catégorie';
#_widgets.php:213
$GLOBALS['__l10n']['Filter by author'] = 'Filtrer par auteur';

118
locales/fr/public.po Normal file
View file

@ -0,0 +1,118 @@
# Language: Français
# Module: saba - 2021.08.21
# Date: 2021-08-22 23:22:12
# Translated with translater 2021.08.18
msgid ""
msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Project-Id-Version: saba 2021.08.21\n"
"POT-Creation-Date: \n"
"PO-Revision-Date: 2021-08-22T23:22:12+00:00\n"
"Last-Translator: Jean-Christian Denis\n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
#: _public.php:293
#: _public.php:303
msgid "Selected entry"
msgstr "Billet sélectionné"
#: _public.php:294
msgid "With comments"
msgstr "Avec commentaires"
#: _public.php:295
msgid "With trackbacks"
msgstr "Avec rétroliens"
#: _public.php:302
msgid "Title"
msgstr "Titre"
#: _public.php:304
msgid "Author"
msgstr "Auteur·rice"
#: _public.php:305
msgid "Date"
msgstr "Date"
#: _public.php:306
msgid "Update"
msgstr "Mise à jour"
#: _public.php:307
msgid "Comments count"
msgstr "Nombre de commentaires"
#: _public.php:308
msgid "Trackbacks count"
msgstr "Nombre de rétroliens"
#: _public.php:315
msgid "All"
msgstr "Tous"
#: _public.php:316
msgid "Less than a month"
msgstr "Moins d'un mois"
#: _public.php:317
msgid "From 1 to 6 month"
msgstr "De 1 à 6 mois"
#: _public.php:318
msgid "From 6 to 12 month"
msgstr "De 6 à 12 mois"
#: _public.php:319
msgid "More than a year"
msgstr "Plus d'un an"
#: _public.php:326
msgid "Entry"
msgstr "Publication"
#: _public.php:327
msgid "Page"
msgstr "Page"
#: _public.php:328
msgid "Poll"
msgstr "Sondage"
#: _public.php:329
msgid "Event"
msgstr "Événement"
#: _widgets.php:114
msgid "Reverse order"
msgstr "Inverser l'ordre"
#: _widgets.php:115
msgid "Filter order"
msgstr "Options de tri"
#: _widgets.php:135
msgid "Filter options"
msgstr "Options du filtre"
#: _widgets.php:151
msgid "Filter by age"
msgstr "Filtrer par date"
#: _widgets.php:171
msgid "Filter by type"
msgstr "Filtrer par type"
#: _widgets.php:192
msgid "Filter by category"
msgstr "Filter par catégorie"
#: _widgets.php:213
msgid "Filter by author"
msgstr "Filtrer par auteur"