<?php if (!defined('BASEPATH')) exit('No direct script access allowed');
/**
* MaxSite CMS
* (c) http://max-3000.com/
*/
# функция автоподключения плагина
function redirect_autoload($args = array())
{
mso_hook_add( 'admin_init', 'redirect_admin_init'); # хук на админку
mso_hook_add( 'init', 'redirect_init'); # хук на init
mso_hook_add( 'custom_page_404', 'redirect_custom_page_404', 5); # хук на custom_page_404 с низким приоритетом
}
# функция выполняется при активации (вкл) плагина
function redirect_activate($args = array())
{
mso_create_allow('redirect_edit', t('Админ-доступ к плагину редиректов'));
return $args;
}
# функция выполняется при деинстяляции плагина
function redirect_uninstall($args = array())
{
mso_remove_allow('redirect_edit'); // удалим созданные разрешения
mso_delete_option('redirect', 'plugins' ); // удалим созданные опции
return $args;
}
# цепляемся к хуку init
function redirect_init($args = array())
{
// получаем опции
// в опциях all - строки с редиректами
// загоняем их в массив
// смотрим текущий url
// если он есть в редиректах, то редиректимся
$options = mso_get_option('redirect', 'plugins', array());
if ( !isset($options['all']) ) return $args; // нет опций
$all = explode("\n", $options['all']); // разобъем по строкам
if (!$all) return $args; // пустой массив
// текущий адрес
$current_url = mso_current_url(true);
foreach ($all as $row) // перебираем каждую строчку
{
$urls = explode('|', $row); // адрес | редирект | 301, 302
$urls = array_map('trim', $urls);
if ( isset($urls[0]) && isset($urls[1]) && $urls[0] && $urls[1]) // если есть урлы
{
//проверяем, используются ли шаблоны в $urls[0]
if ( preg_match("/\(.*\)+/",$urls[0]) )
{
$patern = preg_replace( "![\-\?]+!", '\\\$0', $urls[0] );
if ( preg_match("!" . $patern . "!i", $current_url, $match) )
{
$urls[0] = $match[0];
$cn = count($match);
for($i=1; $i < $cn; $i++)
$urls[1] = str_replace('$' . $i, $match[$i], $urls[1]);
}
}
//
if($current_url != $urls[0]) continue; // адреса разные
// совпали, делаем редирект
if ( isset($urls[2]) ) mso_redirect($urls[1], true, $urls[2]);
else mso_redirect($urls[1], true);
}
}
return $args;
}
function redirect_custom_page_404($args = false)
{
// это почти аналог redirect_init с той разницей, что
// хук срабатывает только при page_404
// получаем опции
// в опциях all - строки с редиректами
// загоняем их в массив
// смотрим текущий url
// если он есть в редиректах, то редиректимся
$options = mso_get_option('redirect', 'plugins', array());
if ( !isset($options['all404']) ) return $args; // нет опций
$all = explode("\n", $options['all404']); // разобъем по строкам
if (!$all) return $args; // пустой массив
// текущий адрес
$current_url = mso_current_url(true);
foreach ($all as $row) // перебираем каждую строчку
{
$urls = explode('|', $row); // адрес | редирект | 301, 302
$urls = array_map('trim', $urls);
if ( isset($urls[0]) && isset($urls[1]) && $urls[0] && $urls[1]) // если есть урлы
{
//проверяем, используются ли шаблоны в $urls[0]
if ( preg_match("/\(.*\)+/",$urls[0]) )
{
$patern = preg_replace( "![\-\?]+!", '\\\$0', $urls[0] );
if ( preg_match("!" . $patern . "!i", $current_url, $match) )
{
$urls[0] = $match[0];
$cn = count($match);
for($i=1; $i < $cn; $i++)
$urls[1] = str_replace('$' . $i, $match[$i], $urls[1]);
}
}
//
if($current_url != $urls[0]) continue; // адреса разные
// совпали, делаем редирект
if ( isset($urls[2]) ) mso_redirect($urls[1], true, $urls[2]);
else mso_redirect($urls[1], true);
}
}
return $args;
}
# функция выполняется при хуке admin_init
function redirect_admin_init($args = array())
{
if ( !mso_check_allow('redirect_edit') )
{
return $args;
}
$this_plugin_url = 'redirect'; // url и hook
# добавляем свой пункт в меню админки
# первый параметр - группа в меню
# второй - это действие/адрес в url - http://сайт/admin/demo
# можно использовать добавочный, например demo/edit = http://сайт/admin/demo/edit
# Третий - название ссылки
mso_admin_menu_add('plugins', $this_plugin_url, t('Редиректы'));
# прописываем для указаного admin_url_ + $this_plugin_url - (он будет в url)
# связанную функцию именно она будет вызываться, когда
# будет идти обращение по адресу http://сайт/admin/redirect
mso_admin_url_hook ($this_plugin_url, 'redirect_admin_page');
return $args;
}
# функция вызываемая при хуке, указанном в mso_admin_url_hook
function redirect_admin_page($args = array())
{
# выносим админские функции отдельно в файл
if ( !mso_check_allow('redirect_edit') )
{
echo t('Доступ запрещен');
return $args;
}
mso_hook_add_dinamic( 'mso_admin_header', ' return $args . "' . t('Редиректы') . '"; ' );
mso_hook_add_dinamic( 'admin_title', ' return "' . t('Редиректы') . ' - " . $args; ' );
require(getinfo('plugins_dir') . 'redirect/admin.php');
}
# end file