<?php if (!defined('BASEPATH')) exit('No direct script access allowed');
/**
* MaxSite CMS
* (c) http://max-3000.com/
*/
# функция автоподключения плагина
function internal_links_autoload()
{
mso_hook_add('content_content', 'internal_links_custom');
}
# функция выполняется при активации (вкл) плагина
function internal_links_activate($args = array())
{
mso_create_allow('internal_links_edit', t('Админ-доступ к настройкам') . ' ' . t('Internal links'));
return $args;
}
# функция выполняется при деинсталяции плагина
function internal_links_uninstall($args = array())
{
mso_delete_option('plugin_internal_links', 'plugins' ); // удалим созданные опции
mso_remove_allow('internal_links_edit'); // удалим созданные разрешения
return $args;
}
# функция отрабатывающая миниопции плагина (function плагин_mso_options)
# если не нужна, удалите целиком
function internal_links_mso_options()
{
if ( !mso_check_allow('internal_links_edit') )
{
echo t('Доступ запрещен');
return;
}
# ключ, тип, ключи массива
mso_admin_plugin_options('plugin_internal_links', 'plugins',
array(
'links' => array(
'type' => 'textarea',
'rows' => 20,
'name' => t('Ключевые фразы и их ссылки'),
'description' => t('Укажите в формате: <strong>фраза | ссылка | css-класс ссылки</strong><br>Располагайте большие фразы выше мелких, чтобы не было пересечений.'),
'default' => ''
),
'default_class' => array(
'type' => 'text',
'name' => t('CSS-класс по-умолчанию'),
'description' => t('Этот класс будет подставляться для всех ссылок по-умолчанию.'),
'default' => ''
),
'only_page_type' => array(
'type' => 'checkbox',
'name' => t('Выполнять замены только на одиночных страницах'),
'description' => t('На всех остальных страницах сайта замены выполняться не будут'),
'default' => '1'
),
'max_count' => array(
'type' => 'text',
'name' => t('Максимальное количество ссылок одной фразы в тексте'),
'description' => t('Если указать «0», то будут выделены все вхождения.'),
'default' => '1'
),
),
t('Настройки плагина «Внутренние ссылки»'),
t('Плагин позволяет выполнить автоматическую замену указанных слов на ссылки.')
);
}
# функции плагина
function internal_links_custom($text = '')
{
static $a_link; // здесь хранится обработанный массив ссылок - чтобы не обрабатывать несколько раз
global $_internal_links;
$options = mso_get_option('plugin_internal_links', 'plugins', array());
// только на page
if (!isset($options['only_page_type'])) $options['only_page_type'] = true;
if ($options['only_page_type'] and !is_type('page')) return $text;
// не указаны ссылки
if (!isset($options['links'])) return $text;
if (!trim($options['links'])) return $text;
if (!isset($options['default_class'])) $options['default_class'] = '';
if (!isset($options['max_count'])) $options['max_count'] = 1;
else $options['max_count'] = (int) $options['max_count'];
if ($options['max_count'] === 0) $options['max_count'] = -1; // замена для preg_replace
$links = explode("\n", str_replace("\r", '', trim($options['links']))); // все ссылки в массив
if (!isset($a_link) or !$a_link)
{
$a_link = array();
foreach ($links as $key => $link)
{
$l1 = explode('|', $link);
if ( isset($l1[0]) and isset($l1[1]) ) // фраза | ссылка
{
$a_link[$key]['word'] = trim($l1[0]);
$a_link[$key]['link'] = trim($l1[1]);
// if (strpos($a_link[$key]['link'], 'http://') === false)
if (strpos($a_link[$key]['link'], getinfo('site_protocol')) === false)
$a_link[$key]['link'] = getinfo('siteurl') . $a_link[$key]['link'];
if ( isset($l1[2]) and trim($l1[2]) ) // class
{
$a_link[$key]['class'] = trim($l1[2]);
}
else
{
$a_link[$key]['class'] = trim($options['default_class']);
}
}
}
}
$current_url = getinfo('siteurl') . mso_current_url(false);
$limit = $options['max_count'];
foreach ($a_link as $key)
{
$word = $key['word'];
$link = $key['link'];
if ($link == $current_url) continue; // ссылка на себя
if (mb_stripos($text, $word, 0, 'UTF8') === false) continue; // нет вхождения
if ($key['class']) $class = ' class="' . $key['class']. '"';
else $class = '';
$regexp = '/(?!(?:[^<\[]+[>\]]|[^>\]]+<\/a>))(' . preg_quote($word, '/') . ')/usUi';
$replace = "<a href=\"" . $link . "\"" . $class . ">\$0</a>";
$text = preg_replace($regexp, $replace , $text, $limit);
}
// pr($text,1);
return $text;
}
# end file