//Zion ArticlesCatMenu 6.10.2
//Вывод указанного меню категорий статей
/*КОММЕНТАРИИ К ДОСТУПНЫМ ПАРАМЕТРАМ:
$params['id'] = id меню
меню, которое нужно отобразить (по умолчанию '') (если указано пустое значение, плагин не выдаст результат)
$params['header'] = name|articles|none|текст
указание на то, какой заголовок следует выводить (по умолчанию 'none')
name: название шаблона меню
articles: название страницы статей
none: заголовок выводить не следует
также может быть указан любой текст (в нём следует заменять пробелы, двоеточия, точки с запятыми и амперсэнты на их HTML-коды)
$params['blocks'] = #
количество блоков, на которые стоит разбить меню (по умолчанию '1') (допускаются только целые положительные числа)
$params['inblock'] = #
количество элементов в блоке: учитывается только, если явно не указан $params['blocks'] (по умолчанию '0' = не учитывать) (допускаются только целые положительные числа)
$params['select'] = children|brothers|path|parents|only
указание на то, что следует выбирать
children: подкатегории, указанной в factor категории
brothers: категории подкатегории, категорией которой является указанная в factor категория
path: путь к указанной в factor категории
parents: надкатегория, указанного в level уровня и её "братья"
если level больше уровня factor-а, то select меняется на children, а factor становится равным ID предка уровня (level-1)
only:категории, указанной в factor статьи
$params['level'] = #
уровень, надкатегории которого нужно вывести при select="parents" (по умолчанию '0' - вне структуры)
$params['factor'] = id категории (если select != only) или статьи (если select == only)
на этот параметр влияет $_GET['cat'] (если select != only) или $_GET['target'] (если select == only)
$params['include'] = список пунктов, обязательных для добавления (через запятую, без пробелов)
при указании этого параметра в меню будут включены дополнительные пункты (только, если они существуют)
если эти пункты уже есть в меню, дублирование не произойдёт
$params['exclude'] = список пунктов, обязательных для исключения (через запятую, без пробелов)
при указании этого параметра из меню будут исключены указанные пункты (даже, если они существуют в базе)
если одни и те же пункты должны быть удалены дважды, двойное удаление не произойдёт
этот параметр имеет больший приоритет по сравнению с $params['include']
$params['random'] = #
количество случайных элементов из найденного списка, которые нужно отобразить в случайном же порядке (допускаются целые неотрицательный числа)
(по умолчанию '0' - не использовать случайную выборку, а отобразить все элементы в обычном порядке)
$params['feelpage'] = on|off
учитывать страницу статей при определении активного пункта меню (по умолчанию off)
$params['html5'] = on|off
вставка семантических тегов из HTML5 (по умолчанию выключена - off)
*/
//ПРОВЕРКА И ИСПРАВЛЕНИЕ ПЕРЕДАННЫХ ПАРАМЕТРОВ
//для условий
$serialnumber = 1;//сброс порядкового номера
unset($activeexists);//сброс наличия активного пункта
if ($params['html5'] != 'on')
$params['html5'] = 'off';
$base = "articlescatmenus_".project::$design;
$abase = "articles";
$acount = okdb_Length($abase);
$cbase = "{$abase}cat";
if (file_exists("ini/articles.ini"))
include("ini/articles.ini");
if ($params['feelpage'] != 'off')
$params['feelpage'] = 'on';
//проверяем, существует ли указанное меню
if (okdb_ItemExistsByID($base, $params['id']))
{
//проверяем, что нужно выбирать
if (($params['select'] != "brothers") && ($params['select'] != "path") && ($params['select'] != "parents") && ($params['select'] != "only"))
$params['select'] = "children";
//проверяем, что будет фактором: категория или статья
if ($params['select'] == 'only')
{
if (!$params['factor'])
if ($_GET['target'] && (($theme == $articles_options["page"]) || ($params['feelpage'] == 'off')))
$params['factor'] = $_GET['target'];
}
else
{
//проверяем, какой ID является фактором
if ((!okdb_ItemExistsByID($cbase, $params['factor'])) && ($params['factor'] != "."))
if ($_GET['cat'] && (($theme == $articles_options["page"]) || ($params['feelpage'] == 'off')))
$params['factor'] = $_GET['cat'];
}
//проверяем, что нужно делать с заголовком
if (!$params['header'])
//заголовок выводить не надо
$params['header'] = "none";
//корректируем указание уровня для предков
$params['level'] = intval($params['level']);
//проверяем возможность отображения предков
if ($params['select'] == "parents")
{
//определить уровень фактора
$pathtofactor = okts_IDsPath($params['factor'], $cbase);
//сравнить уровни фактора и level
if ((count($pathtofactor)+1 < $params['level']) && (count($pathtofactor) > 0))
//поменять параметры при необходимости
{
$params['select'] = "children";
$params['factor'] = $pathtofactor[count($pathtofactor)-1];
}
}
//опеделяем какие пункты меню нужно вывести
$c_count = okdb_Length($cbase);
if ($params['select'] == "children")
{
//подкатегории указанной категории
for ($i = 0; $i < $c_count; $i++)
{
$data = explode("|", okdb_ReadItem($cbase, $i));
if ($data[2] == $params['factor'])
$list[] = $data[0];
}
}
elseif ($params['select'] == "brothers")
{
//подкатегории надкатегории указанной категории
$data_ = explode("|", okdb_ReadItemByID($cbase, $params['factor']));
for ($i = 0; $i < $c_count; $i++)
{
$data = explode("|", okdb_ReadItem($cbase, $i));
if ($data[2] == $data_[2])
$list[] = $data[0];
}
}
elseif ($params['select'] == "path")
{
//путь к указанной записи
$list = okts_IDsPath($params['factor'], $cbase);
if (okdb_ItemExistsByID($cbase,$params['factor']))
$list[] = $params['factor'];
}
elseif ($params['select'] == "parents")
{
//надкатегории указанного уровня указанной подкатегории
//вычислить массив пути к фактору
$path = okts_IDsPath($params['factor'], $cbase);
$path[] = $params['factor'];
//если в массиве пути к фактору есть элемент искомого уровня, то продолжаем
if (count($path) >= $params['level'])
{
//найти братьев элемента искомого уровня
$data_ = explode("|", okdb_ReadItemByID($cbase, $path[$params['level']-1]));
$parentmode_father = $data_[2];//пригодится ниже
for ($i = 0; $i < $c_count; $i++)
{
$data = explode("|", okdb_ReadItem($cbase, $i));
if ($data[2] == $data_[2])
$list[] = $data[0];
}
}
}
elseif ($params['select'] == 'only')
{
//категории, указанной статьи
list(,,$cats) = explode('|',okdb_ReadItemByID($abase,$params['factor']));
if ($cats)
{
if (substr_count($cats,';'))
{
//несколько категорий
$cats = explode(';',$cats);
for ($i = 0; $i < count($cats); $i++)
{
//исключаем '', ' ' и '.'
if ($cats[$i] && ($cats[$i] != ' ') && ($cats[$i] != '.'))
$list[] = $cats[$i];
}
}
else
$list[] = $cats;
}
}
//пытаемся добавить дополнительные пункты
if ($params['include'])
{
//разбить по запятой
$includes = explode(",", $params['include']);
for ($i = 0; $i < count($includes); $i++)
{
//проверить, не существует ли уже в списке и существует ли в базе
if (((!$list) || ($list && (!array_search($includes[$i], $list)) && (array_search($includes[$i], $list) !== 0)))
&& okdb_ItemExistsByID($cbase, $includes[$i]))
//дополнить список
$list[] = $includes[$i];
}
}
//пытаемся удалить указанные пункты
if ($params['exclude'])
{
unset($templist);
//разбить по запятой
$excludes = explode(",", $params['exclude']);
for ($i = 0; $i < count($list); $i++)
{
//проверить, существует ли уже имеющийся пункт в списке тех пунктов, которые нужно удалить
if (!array_search($list[$i], $excludes) && (array_search($list[$i], $excludes) !== 0))
//добавляем пункт во временный список, если его не надо удалять
$templist[] = $list[$i];
}
//заменяем старый список временным
$list = $templist;
}
if ($list)
{
//проверяем, нужна ли случайная выборка
$params['random'] = intval($params['random']);
if ($params['random'] > 0)
{
if (count($list) <= $params['random'])
$params['random'] = count($list);
else
{
$temp_list = array_rand($list, $params['random']);
if (!is_array($temp_list))
{
//если у нас один случайный ключ
$rand_list[] = $list[$temp_list];
$list = $rand_list;
}
else
{
//если у нас массив из ключей
for ($i = 0; $i < count($temp_list); $i++)
$rand_list[] = $list[$temp_list[$i]];
$list = $rand_list;
shuffle($list);
}
}
}
//проверяем корректность указания количества блоков
if (!intval($params['blocks']) || ($params['blocks'] < 1))
{
if (($params['inblock'] == intval($params['inblock'])) && ($params['inblock'] > 0))
{
$params['blocks'] = count($list) / $params['inblock'];
if (intval($params['blocks']) != $params['blocks'])
$params['blocks'] = intval($params['blocks'])+1;
}
else
$params['blocks'] = 1;
}
//определяем количество элементов в блоках
$middle = count($list) / $params['blocks'];
if ($middle != intval($middle))
$middle = intval($middle)+1;
while ($count < count($list))
{
$count += $middle;
if ($count > count($list))
//только для последнего блока (если деление на блоки не ровное)
$in_block[] = $middle - ($count - count($list));
else
//для всех блоков, кроме последнего (если деление на блоки не ровное)
$in_block[] = $middle;
}
}
}
//ВЫПОЛНЕНИЕ ВЫВОДА
if ($list)
{
//загружаем данные об оформлении меню
list($id, $name, $before_menu, $after_menu, $before_block, $after_block, $block_spacer, $before_header, $after_header, $simple_item,
$current_item, $item_spacer) = explode("|", okdb_ReadItemByID($base, $params['id']));
$name = okcn_FromBase($name);
$before_menu = okcn_FromBase($before_menu);
$after_menu = okcn_FromBase($after_menu);
$before_block = okcn_FromBase($before_block);
$after_block = okcn_FromBase($after_block);
$block_spacer = okcn_FromBase($block_spacer);
$before_header = okcn_FromBase($before_header);
$after_header = okcn_FromBase($after_header);
$simple_item = okcn_FromBase($simple_item);
$current_item = okcn_FromBase($current_item);
$item_spacer = okcn_FromBase($item_spacer);
//выводим начало меню
$echo .= $before_menu;
//выводим заголовок
if ($params['header'] == "name")
//в качестве заголовка используется имя указанного шаблона меню
$echo .= $before_header . $name . $after_header;
elseif ($params['header'] == "articles")
//в качестве заголовка используется имя страницы статей
$echo .= $before_header . okdb_DetectName("pages", $articles_options["page"]) . $after_header;
elseif ($params['header'] != "none")
//в качестве заголовка используется указнный текст
$echo .= $before_header . $params['header'] . $after_header;
$echo = str_replace("{ARTICLES_CATEGORY_ID}", $params['factor'], $echo);
//разбиваем элементы на блоки
for ($i = 0; $i < ($params['blocks']); $i++)
{
$echo .= $before_block;
for ($j = 0; $j < $in_block[$i]; $j++)
{
//загрузка значений для {стандартных переменных}
list($cat_id, $cat_name, $cat_place, $cat_description, $cat_keys, $cat_img) = explode("|", okdb_ReadItemByID($cbase, $list[($j+$i*$middle)]));
if (project::$friendly_url == 'on')
$cat_url = "/{$articles_options["page"]}/?cat=$cat_id";
else
$cat_url = "/?theme={$articles_options["page"]}&cat=$cat_id";
//активный или обычный пункт меню
if ($params['select'] == "path")
{
//для select=path
if ($cat_id == $params['factor'])
{
if ($params['html5'] == 'on')
$echo .= "$current_item";
else
$echo .= $current_item;
}
else
{
if ($params['html5'] == 'on')
$echo .= "$simple_item";
else
$echo .= $simple_item;
}
}
else
{
//для других select-ов
if ((($_GET['cat'] == $cat_id ) || okts_ChildOfParent($_GET['cat'], $cat_id, $cbase) ||
($_GET['target'] && (okts_DetectPlace($_GET['target'],$abase) == $cat_id)))
&& ((($articles_options["page"] == $theme) && ($params['feelpage'] == "on"))
|| ($params['feelpage'] == "off")))
{
if ($params['html5'] == 'on')
$echo .= "$current_item";
else
$echo .= $current_item;
if (!$activeexists)
$activeexists = 1;//сейчас выводится активный пункт
}
else
{
if ($activeexists == 2)
$activeexists = 3;//активный пункт уже выводился
if ($activeexists == 1)
$activeexists = 2;//сейчас выводится пункт следующий за активным
if ($params['html5'] == 'on')
$echo .= "$simple_item";
else
$echo .= $simple_item;
}
}
//поиск условий
//[IS_ACTIVE??истина::ложь] (активный именно этот пункт, а не кто-то из его подразделов)
preg_match_all("/(?<=\[IS_ACTIVE\?\?)[^\[\]]*(?=\])/", $echo, $conditions_list);
foreach($conditions_list[0] as $item)
{
list($true, $false) = explode("::", $item);
if ((($_GET['cat'] == $cat_id ) || ($_GET['target'] &&
(okts_DetectPlace($_GET['target'],$abase) == $cat_id))) &&
((($articles_options["page"] == $theme) && ($params['feelpage'] == "on")) ||
($params['feelpage'] == "off")))
$sub_echo = $true;
else
$sub_echo = $false;
$once = 1;//так надо (в следующей строке можно использовать только переменную)
$echo = str_replace("[IS_ACTIVE??$item]", $sub_echo, $echo, $once);
}
//[IS_TREE??истина::ложь]
preg_match_all("/(?<=\[IS_TREE\?\?)[^\[\]]*(?=\])/", $echo, $conditions_list);
foreach($conditions_list[0] as $item)
{
list($true, $false) = explode("::", $item);
if (okts_IsFather("articlescat", $cat_id))
$sub_echo = $true;
else
$sub_echo = $false;
$once = 1;//так надо (в следующей строке можно использовать только переменную)
$echo = str_replace("[IS_TREE??$item]", $sub_echo, $echo, $once);
}
//[IS_HAS_ID_идентификатор??истина::ложь]
preg_match_all("/(?<=\[IS_HAS_ID_)[^\[\]]*(?=\])/", $echo, $conditions_list);
foreach($conditions_list[0] as $item)
{
list($id, $temp) = explode("??", $item);
list($true, $false) = explode("::", $temp);
if ($cat_id == $id)
$sub_echo = $true;
else
$sub_echo = $false;
$once = 1;//так надо (в следующей строке можно использовать только переменную)
$echo = str_replace("[IS_HAS_ID_$item]", $sub_echo, $echo, $once);
}
//[IS_HAS_NUMBER_порядковый_номер??истина::ложь]
preg_match_all("/(?<=\[IS_HAS_NUMBER_)[^\[\]]*(?=\])/", $echo, $conditions_list);
foreach($conditions_list[0] as $item)
{
list($number, $temp) = explode("??", $item);
list($true, $false) = explode("::", $temp);
if ($serialnumber == $number)
$sub_echo = $true;
else
$sub_echo = $false;
$once = 1;//так надо (в следующей строке можно использовать только переменную)
$echo = str_replace("[IS_HAS_NUMBER_$item]", $sub_echo, $echo, $once);
}
//[IS_NEXT??истина::ложь]
preg_match_all("/(?<=\[IS_NEXT\?\?)[^\[\]]*(?=\])/", $echo, $conditions_list);
foreach($conditions_list[0] as $item)
{
list($true, $false) = explode("::", $item);
if ($activeexists == 2)
$sub_echo = $true;
else
$sub_echo = $false;
$once = 1;//так надо (в следующей строке можно использовать только переменную)
$echo = str_replace("[IS_NEXT??$item]", $sub_echo, $echo, $once);
}
//[IS_VOID_CAT??истина::ложь]
preg_match_all("/(?<=\[IS_VOID_CAT\?\?)[^\[\]]*(?=\])/", $echo, $conditions_list);
foreach($conditions_list[0] as $item)
{
list($true, $false) = explode("::", $item);
for ($k = 0; $k < $acount; $k++)
{
$tempdata = explode("|", okdb_ReadItem($abase, $k));
if ($tempdata[2] == $cat_id)
$notvoid++;
}
if (!$notvoid)
$sub_echo = $true;
else
$sub_echo = $false;
$once = 1;//так надо (в следующей строке можно использовать только переменную)
$echo = str_replace("[IS_VOID_CAT??$item]", $sub_echo, $echo, $once);
}
if ($j != $in_block[$i]-1)
$echo .= $item_spacer;
//обработка изображения
if (substr_count($echo, "{ARTICLES_CATEGORY_IMAGE_URL}"))
{
if ((!file_exists($catalog_options["image_libpath"] . $cat_img)) && (!substr_count($cat_img, "http://")))
unset($cat_img);
elseif (file_exists($catalog_options["image_libpath"] . $cat_img))
$cat_img = $catalog_options["image_libpath"] . $cat_img;
}
if ($cat_img)
$echo = str_replace("{ARTICLES_CATEGORY_IMAGE_URL}", '/' . $cat_img, $echo);
//обработка эскиза
if (substr_count($echo, "{ARTICLES_CATEGORY_ICON_URL}"))
{
$cat_icon = okim_AutoIcon ($catalog_options["icon_libpath"], 'cat-'.$cat_id, $catalog_options['icon_extention']);
if (!$cat_icon && ($params['defaulticon'] == "show"))
$cat_icon = okim_AutoIcon ($catalog_options["icon_libpath"], "", $catalog_options['icon_extention']);
}
if ($cat_icon)
$echo = str_replace("{ARTICLES_CATEGORY_ICON_URL}", '/' . $cat_icon, $echo);
$echo = str_replace("{ARTICLES_CATEGORY_ID}", $cat_id, $echo);
if ($cat_id)
$echo = str_replace("{ARTICLES_CATEGORY_NAME}", $cat_name, $echo);
$echo = str_replace("{ARTICLES_CATEGORY_DESCRIPTION}", $cat_description, $echo);
$echo = str_replace("{ARTICLES_CATEGORY_KEYS}", $cat_keys, $echo);
$echo = str_replace("{ARTICLES_CATEGORY_URL}", $cat_url, $echo);
//Контент
if (substr_count($echo, "{ARTICLES_CATEGORY_CONTENT}"))
{
$contentId = okcn_CorrectContentID('articlescat',$cat_id);
if ($contentId)
{
$cat_content = file_get_contents("content/articlescat-$contentId.inc");
$echo = str_replace("{ARTICLES_CATEGORY_CONTENT}", $cat_content, $echo);
}
else
$echo = str_replace("{ARTICLES_CATEGORY_CONTENT}", "", $echo);
}
//вызов под{плагинов}
if (substr_count($echo, "{ARTICLES_IN_CATEGORY}"))
{
unset($incount);
for ($k = 0; $k < $acount; $k++)
{
list(,,$in_category) = explode("|", okdb_ReadItem($abase, $k));
if ($in_category == $cat_id)
$incount++;
}
$echo = str_replace("{ARTICLES_IN_CATEGORY}", intval($incount), $echo);
}
if (substr_count($echo, "{ARTICLES_IN_CATEGORY_WITH_TREE}"))
{
unset($incount);
for ($k = 0; $k < $acount; $k++)
{
list(,,$in_category) = explode("|", okdb_ReadItem($abase, $k));
if ($in_category == $cat_id)
$incount++;
}
$tree = okts_Map($cat_id, $cbase);
for ($l = 0; $l < count($tree); $l++)
for ($k = 0; $k < $acount; $k++)
{
list(,,$in_category) = explode("|", okdb_ReadItem($abase, $k));
if ($in_category == $tree[$l]['id'])
$incount++;
}
$echo = str_replace("{ARTICLES_IN_CATEGORY_WITH_TREE}", intval($incount), $echo);
}
if (project::$friendly_url == 'on')
$echo = str_replace("{ARTICLES_PAGE}", "/{$articles_options["page"]}/", $echo);
else
$echo = str_replace("{ARTICLES_PAGE}", "/?theme={$articles_options["page"]}", $echo);
//вызов под{плагинов}
$echo = okwp_PluginDetect($echo);
//увеличение порядкового номера
$serialnumber++;
}
$echo .= $after_block;
if ($i != $params['blocks']-1)
$echo .= $block_spacer;
}
//выводим конец меню
$echo .= $after_menu;
}
$echo = str_replace("{project_design_path}", "/upload/image/design/" . project::$design, $echo);
$echo = okcn_RestoreQuotes($echo);
//включение семантических тегов из HTML5
if ($echo && ($params['html5'] == 'on'))
$echo = "";
?>
//Zion ArticlesMenu 6.10.2
//Вывод указанного меню статей
/*КОММЕНТАРИИ К ДОСТУПНЫМ ПАРАМЕТРАМ:
$params['id'] = id меню
меню, которое нужно отобразить (по умолчанию '') (если указано пустое значение, плагин не выдаст результат)
$params['header'] = name|articles|none|текст
указание на то, какой заголовок следует выводить (по умолчанию 'none')
name: название шаблона меню
articles: название страницы статей
none: заголовок выводить не следует
также может быть указан любой текст (в нём следует заменять пробелы, двоеточия, точки с запятыми и амперсэнты на их HTML-коды)
$params['blocks'] = #
количество блоков, на которые стоит разбить меню (по умолчанию '1') (допускаются только целые положительные числа)
$params['inblock'] = #
количество элементов в блоке: учитывается только, если явно не указан $params['blocks'] (по умолчанию '0' = не учитывать) (допускаются только целые положительные числа)
$params['select'] = all|visible|hidden|only|but|last|linked
указание на то, что следует выбирать
all: все статьи
visible: все статьи, кроме скрытых (по умолчанию)
hidden: только скрытые статьи
only: статьи только из выбранной категории (указывается в factor; если нет, все статьи скрываются)
but: все статьи, кроме выбранной категории (указывается в factor; если нет, все статьи отображаются)
last: последние просмотренные товары (берутся из куков)
linked: отображаются статьи, связанные с записью $params['linkedid'] из базы $params['linkedbase']
$params['linkedid'] = ID записи из базы $params['linkedbase'], с которой могут быть связаны другие записи
не игнорируется при $params['select'] неравном 'linked' и при отсутствии $params['linkedbase']
корректность ID не проверяется
$params['linkedbase'] = база, в которой ищется находится запись $params['linkedbase'], с которой могут быть связаны другие записи
не игнорируется при $params['select'] неравном 'linked' и при отсутствии $params['linkedid']
корректность имени базы не проверяется
$params['factor'] = id категории
если select=only|but, то при указании этого параметра (ID категории) отображаются/скрываются статьи из выбранной категории
на этот параметр влияет $_GET['cat'] (категория)
$params['datefrom'] = начало временно промежутка в виде DateStamp
если указан временной промежуток, то будут отображены записи только за него (по умолчанию - 0 - не указан)
$params['dateto'] = конец временного промежутка в виде DateStamp
если не указан этот параметр, но указан datefrom, то dateto=datefrom+сутки(86400 секунд)
$params['defaulticon'] = show|hide
указание на то, стоит ли показывать эскиз по умолчанию, если для данной статьи он не задан (по умолчанию 'show')
$params['include'] = список пунктов, обязательных для добавления (через запятую, без пробелов)
при указании этого параметра в меню будут включены дополнительные пункты (только, если они существуют)
если эти пункты уже есть в меню, дублирование не произойдёт
$params['exclude'] = список пунктов, обязательных для исключения (через запятую, без пробелов)
при указании этого параметра из меню будут исключены указанные пункты (даже, если они существуют в базе)
если одни и те же пункты должны быть удалены дважды, двойное удаление не произойдёт
этот параметр имеет больший приоритет по сравнению с $params['include']
$params['sort'] = id|-id|categories|-categories|date|-date|none|-none
сортировка списка статей (по умолчанию "-none") (на категории не распространяется)
id: сортировка по ID
date: сортировка по дате
categories: по похожести категорий (за шаблон для сравнения берётся статья из $_GET['target'] (данный пункт будет исключён из списка найденных статей); если $_GET['target'] нет, это парамаетр меняется на '-none')
none: без сортировки - вывод на основе положения в базе
если вначале стоит "-", сортировка идёт в обратном порядке
$params['itemsinlist'] = # записей
количество записей, выводимых на странице (по умолчанию - все) (допускаются только целые положительные числа)
$params['sup'] = show|hide
указание на то, стоит ли отображать в меню, статьи из надкатегорий (по умолчанию 'hide') (работает только при select=only|but)
$params['sub'] = show|hide
указание на то, стоит ли отображать в меню, статьи из подкатегорий (по умолчанию 'show') (работает только при select=only|but)
$params['random'] = #
количество случайных элементов из найденного списка, которые нужно отобразить в случайном же порядке (допускаются целые неотрицательный числа)
(по умолчанию '0' - не использовать случайную выборку, а отобразить все элементы в обычном порядке)
$params['feelpage'] = on|off
учитывать страницу статей при определении активного пункта меню (по умолчанию off)
$params['html5'] = on|off
вставка семантических тегов из HTML5 (по умолчанию выключена - off)
*/
//ПРОВЕРКА И ИСПРАВЛЕНИЕ ПЕРЕДАННЫХ ПАРАМЕТРОВ
//для условий
$serialnumber = 1;//сброс порядкового номера
unset($activeexists);//сброс наличия активного пункта
if ($params['html5'] != 'on')
$params['html5'] = 'off';
$base = "articlesmenus_".project::$design;
$abase = "articles";
$cbase = "{$abase}cat";
if (file_exists("ini/articles.ini"))
include("ini/articles.ini");
if ($params['feelpage'] != 'off')
$params['feelpage'] = 'on';
//проверяем, существует ли указанное меню
if (okdb_ItemExistsByID($base, $params['id']))
{
//проверяем, что нужно делать с заголовком
if (!$params['header'])
//заголовок выводить не надо
$params['header'] = "none";
//проверяем, что нужно выбирать
if (($params['select'] != "all") && ($params['select'] != "hidden") && ($params['select'] != "only") && ($params['select'] != "but") && ($params['select'] != "visible") && ($params['select'] != "last") && ($params['select'] != "linked"))
{
if (($_GET['cat'] && ($theme == $articles_options["page"])) || ($params['feelpage'] == 'off'))
{
$params['select'] = "only";
$params['factor'] = $_GET['cat'];
}
else
$params['select'] = "visible";
}
elseif (($params['select'] == "only") && (!$params['factor'] && $_GET['cat']) && (($theme == $articles_options["page"]) || ($params['feelpage'] == 'off')))
$params['factor'] = $_GET['cat'];
elseif (($params['select'] == "but") && $_GET['cat'] && (($theme == $articles_options["page"]) || ($params['feelpage'] == 'off')))
$params['factor'] = $_GET['cat'];
//определение временного промежутка
$params['datefrom'] = intval($params['datefrom']);
$params['dateto'] = intval($params['dateto']);
if (!$params['dateto'] && $params['datefrom'])
$params['dateto'] = $params['datefrom']+86400;
//проверяем, скрывать ли скрытые
if ($params['hidden'] != "show")
$params['hidden'] = "hide";
//проверяем, отображать ли из надкатегорий
if ($params['sup'] != "show")
$params['sup'] = "hide";
//проверяем, отображать ли из подкатегорий
if ($params['sub'] != "hide")
$params['sub'] = "show";
//определение поля для сортировки
if (($params['sort'] != "id") && ($params['sort'] != "-id") && ($params['sort'] != "date") && ($params['sort'] != "-date") && ($params['sort'] != "categories") && ($params['sort'] != "-categories") && ($params['sort'] != "none"))
$params['sort'] = "-none";
if (($params['sort'] == 'categories') || ($params['sort'] == '-categories'))
{
//если шаблон для сравнения не найден
if (!okdb_ItemExistsByID($abase,$_GET['target']))
$params['sort'] = '-none';
}
//определение количества записей в списке
if ((intval($params['itemsinlist']) != $params['itemsinlist']) || ($params['itemsinlist'] < 1))
$params['itemsinlist'] = 0;
//определение списка
//если только недавно просмотренные
if ($params['select'] == "last")
{
$count = count($_COOKIE['articleslast']);
for ($i = $count-1; $i >= 0; $i--)
if ((count($list) < $params['itemsinlist']) && okdb_ItemExistsByID('catalog',$_COOKIE['articleslast'][$i]))
$list[]=$_COOKIE['articleslast'][$i];
unset($count);//используется дальше
}
elseif ($params['select'] == "linked")
{
$count = okdb_Length('links');
for ($i = 0; $i < $count; $i++)
{
list($hash) = explode('|',okdb_ReadItem('links',$i));
if (substr_count($hash,"{$params['linkedbase']}!{$params['linkedid']}!{$abase}!"))
{
list(,$id) = explode("{$params['linkedbase']}!{$params['linkedid']}!{$abase}!",$hash);
$list[] = $id;
}
}
unset($count);//используется дальше
}
else
{
$acount = okdb_Length($abase);
for ($i = 0; $i < $acount; $i++)
{
$adata = explode("|", okdb_ReadItem($abase, $i));
//если ищем похожие статьия, то исключаем шаблон для сортировки
if ((($params['sort'] == 'categories') || ($params['sort'] == '-categories')) && ($adata[0] == $_GET['target']))
{/*ничего не делаем*/}
else
//если все статьи, то - все статьи
if (($params['select'] == "all") && (!$params["datefrom"] || (($params["datefrom"] <= $adata[3]) && ($adata[3] <= $params["dateto"]))))
$list[] = $adata[0];
//если только видимые, то - только видимые
elseif (($params['select'] == "visible") && (!$params["datefrom"] || (($params["datefrom"] <= $adata[3]) && ($adata[3] <= $params["dateto"]))))
{
if ($adata[2] && ($adata[2] != ' '))
//если категория не скрытая
$list[] = $adata[0];
}
//если только скрытые, то - только срытые
elseif (($params['select'] == "hidden") && (!$params["datefrom"] || (($params["datefrom"] <= $adata[3]) && ($adata[3] <= $params["dateto"]))))
{
if (!$adata[2] || ($adata[2] == ' '))
//если нет категории или скрытая категория верхнего уровня
//статья выводится, если она скрыта (её категория - вне структуры)
$list[] = $adata[0];
elseif (substr_count($adata[2],';'))
{
//если несколько категорий
$articles_category = explode(';',$adata[2]);
unset($found);
for ($j = 0; $j < count($articles_category); $j++)
if (!$articles_category[$j] || ($articles_category[$j] == ' ') || (okts_ChildOfParent($articles_category[$j], "", "articlescat")))
//статья выводится, если она скрыта (её категория - скрыта или вне структуры)
$found++;
if ($found)
$list[] = $adata[0];
}
else
//если одна категория
if (okts_ChildOfParent($adata[2], "", "articlescat"))
//статья выводится, если она скрыта (её категория - подкатегория скрытой)
$list[] = $adata[0];
}
//если только из указанной (и найденной) категории, то...
elseif (($params['select'] == "only") && (!$params["datefrom"] || (($params["datefrom"] <= $adata[3]) && ($adata[3] <= $params["dateto"]))))
{
if (substr_count($adata[2],';'))
{
//если несколько категорий
$articles_category = explode(';',$adata[2]);
unset($found);
for ($j = 0; $j < count($articles_category); $j++)
if (($articles_category[$j] == $params['factor']) || ((okts_ChildOfParent($articles_category[$j], $params['factor'], "articlescat")) && ($params['sub'] == "show")) || ((okts_ChildOfParent($params['factor'], $articles_category[$j], "articlescat")) && ($params['sup'] == "show")))
//статья выводится, если она скрыта (её категория - скрыта или вне структуры)
$found++;
if ($found)
$list[] = $adata[0];
}
elseif (($adata[2] == $params['factor']) || (okts_ChildOfParent($adata[2], $params['factor'], "articlescat")) && ($params['sub'] == "show") || (okts_ChildOfParent($params['factor'], $adata[2], "articlescat")) && ($params['sup'] == "show"))
//если нет категория соответствует указанной или является её под/надкатегорией
$list[] = $adata[0];
}
//если кроме указанной категории, то
elseif (($params['select'] == "but") && (!$params["datefrom"] || (($params["datefrom"] <= $adata[3]) && ($adata[3] <= $params["dateto"]))))
{
if (substr_count($adata[2],';'))
{
//если несколько категорий
$articles_category = explode(';',$adata[2]);
unset($found);
for ($j = 0; $j < count($articles_category); $j++)
if ($articles_category[$j] != $params['factor'])
//статья выводится, если она не соответсвует запрещённой категории
$found++;
if ($found)
$list[] = $adata[0];
}
elseif (($adata[2] != $params['factor']) || ((okts_ChildOfParent($adata[2], $params['factor'], "articlescat")) && ($params['sub'] == "show")) || ((okts_ChildOfParent($params['factor'], $adata[2], "articlescat")) && ($params['sup'] == "show")))
//статья выводится, если она не соответсвует запрещённой категории
$list[] = $adata[0];
}
}
}
//определение того, стоит ли показывать эскиз по умолчанию
if ($params['defaulticon'] != "hide")
$params['defaulticon'] = "show";
//пытаемся добавить дополнительные пункты
if ($params['include'])
{
//разбить по запятой
$includes = explode(",", $params['include']);
for ($i = 0; $i < count($includes); $i++)
{
//проверить, не существует ли уже в списке и существует ли в базе
if (((!$list) || ($list && (!array_search($includes[$i], $list)) && (array_search($includes[$i], $list) !== 0)))
&& okdb_ItemExistsByID($abase, $includes[$i]))
//дополнить список
$list[] = $includes[$i];
}
}
//пытаемся удалить указанные пункты
if ($params['exclude'])
{
unset($templist);
//разбить по запятой
$excludes = explode(",", $params['exclude']);
for ($i = 0; $i < count($list); $i++)
{
//проверить, существует ли уже имеющийся пункт в списке тех пунктов, которые нужно удалить
if (!array_search($list[$i], $excludes) && (array_search($list[$i], $excludes) !== 0))
//добавляем пункт во временный список, если его не надо удалять
$templist[] = $list[$i];
}
//заменяем старый список временным
$list = $templist;
}
if ($list)
{
//запоминаем количество статей (понадобиться для {ARTICLES_COUNT})
$articles_count = count($list);
//сортируем список
if ($params['sort'] == "id")
//сортируем по ID
$list = sort($list);
elseif ($params['sort'] == "-id")
//сортируем по ID в обратном порядке
$list = rsort($list);
elseif (
($params['sort'] == "date")
||
($params['sort'] == "-date")
)
{
for ($i = 0; $i < $articles_count; $i++)
for ($j = 0; $j < $articles_count-1; $j++)
{
list(,,,$date1) = explode('|', okdb_ReadItemByID('articles', $list[$j]));
list(,,,$date2) = explode('|', okdb_ReadItemByID('articles', $list[$j+1]));
if (
($date1 > $date2) && ($params['sort'] == "date")
||
($date1 < $date2) && ($params['sort'] == "-date")
)
{
$temp = $list[$j];
$list[$j] = $list[$j+1];
$list[$j+1] = $temp;
}
}
}
elseif (
($params['sort'] == "categories")
||
($params['sort'] == "-categories")
)
{
list(,,$categories) = explode ('|', okdb_ReadItemByID($abase,$_GET['target']));
if (substr_count($categories,';'))
{
//если в шаблоне несколько категорий
$categories = explode(';',$categories);
}
else
{
//если в шаблоне одна в том числе скрытая категория
$categories[0] == $categories;
}
//приводим пустые категории к единому стандарту: " ", а не ""
for ($i = 0; $i < count($categories); $i++)
if (!$categories[$i])
!$categories[$i] = " ";
for ($i = 0; $i < $articles_count; $i++)
for ($j = 0; $j < $articles_count-1; $j++)
{
list(,,$cats1) = explode('|', okdb_ReadItemByID('articles', $list[$j]));
list(,,$cats2) = explode('|', okdb_ReadItemByID('articles', $list[$j+1]));
$cats1 = ";$cats1;";
$cats2 = ";$cats2;";
$cats1 = str_replace(';;', '; ;', $cats1);
$cats2 = str_replace(';;', '; ;', $cats2);
unset($count1,$count2);
for ($k = 0; $k < count($categories); $k++)
{
if (substr_count($cats1,$categories[$k]))
$count1++;
if (substr_count($cats2,$categories[$k]))
$count2++;
}
if (
($count1 > $count2) && ($params['sort'] == "categories")
||
($count1 < $count2) && ($params['sort'] == "-categories")
)
{
$temp = $list[$j];
$list[$j] = $list[$j+1];
$list[$j+1] = $temp;
}
}
}
elseif ($params['sort'] == "-none")
//разворачиваем массив без сортировки (по умолчанию)
$list = array_reverse($list);
//подрезаем список или лимит
if (!$params['itemsinlist'])
$params['itemsinlist'] = count($list);
if (count($list) > $params['itemsinlist'])
{
//обрезаем массив
for ($i = 0; $i < $params['itemsinlist']; $i++)
$templist[] = $list[$i];
$list = $templist;
}
elseif (count($list) < $params['itemsinlist'])
//уменьшаем лимит
$params['itemsinlist'] = count($list);
//проверяем, нужна ли случайная выборка
$params['random'] = intval($params['random']);
if ($params['random'] > 0)
{
if (count($list) <= $params['random'])
$params['random'] = count($list);
else
{
$temp_list = array_rand($list, $params['random']);
if (!is_array($temp_list))
{
//если у нас один случайный ключ
$rand_list[] = $list[$temp_list];
$list = $rand_list;
}
else
{
//если у нас массив из ключей
for ($i = 0; $i < count($temp_list); $i++)
$rand_list[] = $list[$temp_list[$i]];
$list = $rand_list;
shuffle($list);
}
}
}
//проверяем корректность указания количества блоков
if (!intval($params['blocks']) || ($params['blocks'] < 1))
{
if (($params['inblock'] == intval($params['inblock'])) && ($params['inblock'] > 0))
{
$params['blocks'] = count($list) / $params['inblock'];
if (intval($params['blocks']) != $params['blocks'])
$params['blocks'] = intval($params['blocks'])+1;
}
else
$params['blocks'] = 1;
}
//определяем количество элементов в блоках
$middle = count($list) / $params['blocks'];
if ($middle != intval($middle))
$middle = intval($middle)+1;
while ($count < count($list))
{
$count += $middle;
if ($count > count($list))
//только для последнего блока (если деление на блоки не ровное)
$in_block[] = $middle - ($count - count($list));
else
//для всех блоков, кроме последнего (если деление на блоки не ровное)
$in_block[] = $middle;
}
}
}
//ВЫПОЛНЕНИЕ ВЫВОДА
if ($list)
{
//загружаем данные об оформлении меню
list($id, $name, $before_menu, $after_menu, $before_block, $after_block, $block_spacer, $before_header, $after_header, $simple_item,
$current_item, $item_spacer) = explode("|", okdb_ReadItemByID($base, $params['id']));
$name = okcn_FromBase($name);
$before_menu = okcn_FromBase($before_menu);
$after_menu = okcn_FromBase($after_menu);
$before_block = okcn_FromBase($before_block);
$after_block = okcn_FromBase($after_block);
$block_spacer = okcn_FromBase($block_spacer);
$before_header = okcn_FromBase($before_header);
$after_header = okcn_FromBase($after_header);
$simple_item = okcn_FromBase($simple_item);
$current_item = okcn_FromBase($current_item);
$item_spacer = okcn_FromBase($item_spacer);
//выводим начало меню
$echo .= $before_menu;
//выводим заголовок
if ($params['header'] == "name")
//в качестве заголовка используется имя указанного шаблона меню
$echo .= $before_header . $name . $after_header;
elseif ($params['header'] == "articles")
//в качестве заголовка используется имя страницы статей
$echo .= $before_header . okdb_DetectName("pages", $articles_options["page"]) . $after_header;
elseif ($params['header'] != "none")
//в качестве заголовка используется указнный текст
$echo .= $before_header . $params['header'] . $after_header;
//разбиваем элементы на блоки
for ($i = 0; $i < ($params['blocks']); $i++)
{
$echo .= $before_block;
for ($j = 0; $j < $in_block[$i]; $j++)
{
list($articles_id, $articles_name, $articles_category, $articles_date, $articles_keys, $articles_img, $articles_short) = explode("|", okdb_ReadItemByID($abase, $list[($j+$i*$middle)]));
if (substr_count($articles_category, "\n") || substr_count($articles_category, "\r"))
unset($articles_category);
if (project::$friendly_url == 'on')
$articles_url = "/{$articles_options["page"]}/?target=$articles_id";
else
$articles_url = "/?theme={$articles_options["page"]}&target=$articles_id";
unset($articles_category);//здесь не обрабатывается
//активный или обычный пункт меню
if (($_GET['target'] == $articles_id) && ($theme == $articles_options["page"]) && ((($articles_options["page"] == $theme)
&& ($params['feelpage'] == "on")) || ($params['feelpage'] == "off")))
{
if ($params['html5'] == 'on')
$echo .= "$current_item";
else
$echo .= $current_item;
if (!$activeexists)
$activeexists = 1;//сейчас выводится активный пункт
}
else
{
if ($activeexists == 2)
$activeexists = 3;//активный пункт уже выводился
if ($activeexists == 1)
$activeexists = 2;//сейчас выводится пункт следующий за активным
if ($params['html5'] == 'on')
$echo .= "$simple_item";
else
$echo .= $simple_item;
}
//поиск условий
//[IS_HAS_ID_идентификатор??истина::ложь]
preg_match_all("/(?<=\[IS_HAS_ID_)[^\[\]]*(?=\])/", $echo, $conditions_list);
foreach($conditions_list[0] as $item)
{
list($id, $temp) = explode("??", $item);
list($true, $false) = explode("::", $temp);
if ($articles_id == $id)
$sub_echo = $true;
else
$sub_echo = $false;
$once = 1;//так надо (в следующей строке можно использовать только переменную)
$echo = str_replace("[IS_HAS_ID_$item]", $sub_echo, $echo, $once);
}
//[IS_HAS_NUMBER_порядковый_номер??истина::ложь]
preg_match_all("/(?<=\[IS_HAS_NUMBER_)[^\[\]]*(?=\])/", $echo, $conditions_list);
foreach($conditions_list[0] as $item)
{
list($number, $temp) = explode("??", $item);
list($true, $false) = explode("::", $temp);
if ($serialnumber == $number)
$sub_echo = $true;
else
$sub_echo = $false;
$once = 1;//так надо (в следующей строке можно использовать только переменную)
$echo = str_replace("[IS_HAS_NUMBER_$item]", $sub_echo, $echo, $once);
}
//[IS_NEXT??истина::ложь]
preg_match_all("/(?<=\[IS_NEXT\?\?)[^\[\]]*(?=\])/", $echo, $conditions_list);
foreach($conditions_list[0] as $item)
{
list($true, $false) = explode("::", $item);
if ($activeexists == 2)
$sub_echo = $true;
else
$sub_echo = $false;
$once = 1;//так надо (в следующей строке можно использовать только переменную)
$echo = str_replace("[IS_NEXT??$item]", $sub_echo, $echo, $once);
}
//если указанный файл картинки отсутствует, то картинки не существует - логично :)
if ((!file_exists($articles_options["image_libpath"] . $articles_img)) && (!substr_count($articles_img, "http://")))
unset($articles_img);
//обработка эскиза
if (substr_count($echo, "{ARTICLES_ICON_URL}"))
{
$articles_icon = okim_AutoIcon ($articles_options["icon_libpath"], $articles_id, $articles_options['icon_extention']);
if (!$articles_icon && ($params['defaulticon'] == "show"))
$articles_icon = okim_AutoIcon ($articles_options["icon_libpath"], "", $articles_options['icon_extention']);
}
if ($articles_icon)
$echo = str_replace("{ARTICLES_ICON_URL}", '/' . $articles_icon, $echo);
$echo = str_replace("{ARTICLES_ID}", $articles_id, $echo);
$echo = str_replace("{ARTICLES_NAME}", $articles_name, $echo);
if ($articles_category)
{
$echo = str_replace("{ARTICLES_CATEGORY_ID}", str_replace(';',',',$articles_category), $echo); //ID или список ID (через запятую)
//если несколько категорий
if (substr_count($articles_category,';'))
{
$echo = str_replace("{ARTICLES_CATEGORY_NAME}", '', $echo);
$echo = str_replace("{ARTICLES_CATEGORY_DESCRIPTION}", '', $echo);
$echo = str_replace("{ARTICLES_CATEGORY_KEYS}", '', $echo);
$echo = str_replace("{ARTICLES_CATEGORY_URL}", '', $echo);
}
else
{
list($cat_id,$cat_name,,$cat_description,$cat_keys) = explode('|', okdb_ReadItemByID('articlescat', $articles_category));
$echo = str_replace("{ARTICLES_CATEGORY_NAME}", $cat_name, $echo);
$echo = str_replace("{ARTICLES_CATEGORY_DESCRIPTION}", $cat_description, $echo);
$echo = str_replace("{ARTICLES_CATEGORY_KEYS}", $cat_keys, $echo);
if (project::$friendly_url == 'on')
$cat_url = "/{$articles_options['page']}/?cat=$cat_id";
else
$cat_url = "/?theme={$articles_options['page']}&cat=$cat_id";
$echo = str_replace("{ARTICLES_CATEGORY_URL}", $cat_url, $echo);
}
}
else
$echo = str_replace("{ARTICLES_CATEGORY_ID}", '', $echo);
//отображаем временную метку даты/времени статьи
$echo = str_replace("{ARTICLES_DATE}", $articles_date, $echo);
$echo = str_replace("{ARTICLES_TIME}", $articles_date, $echo);
//отображаем ключевые слова
$echo = str_replace("{ARTICLES_KEYS}", $articles_keys, $echo);
$echo = str_replace("{ARTICLES_SHORT}", $articles_short, $echo);
$echo = str_replace("{ARTICLES_URL}", $articles_url, $echo);
if (project::$friendly_url == 'on')
$echo = str_replace("{ARTICLES_PAGE}", "/{$articles_options["page"]}/", $echo);
else
$echo = str_replace("{ARTICLES_PAGE}", "/?theme={$articles_options["page"]}", $echo);
//Контент
if (substr_count($echo, "{ARTICLES_CONTENT}"))
{
$contentId = okcn_CorrectContentID('articles',$articles_id);
if ($contentId)
{
$articles_content = file_get_contents("content/articles-$contentId.inc");
$echo = str_replace("{ARTICLES_CONTENT}", $articles_content, $echo);
}
else
$echo = str_replace("{ARTICLES_CONTENT}", "", $echo);
}
//вызов под{плагинов}
$echo = okwp_PluginDetect($echo);
if ($j != $in_block[$i]-1)
$echo .= $item_spacer;
//увеличение порядкового номера
$serialnumber++;
}
$echo .= $after_block;
if ($i != $params['blocks']-1)
$echo .= $block_spacer;
}
//выводим конец меню
$echo .= $after_menu;
}
$echo = str_replace("{project_design_path}", "/upload/image/design/" . project::$design, $echo);
$echo = okcn_RestoreQuotes($echo);
//включение семантических тегов из HTML5
if ($echo && ($params['html5'] == 'on'))
$echo = "";
?>