diff --git a/README.md b/README.md index 65a6283..5348c77 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -### Альтернативная версия AVE.CMS v3.29 ALT +### Альтернативная версия AVE.CMS v3.30 ALT #### Основное отличие: ### В версии 🔥v3.29 теперь есть выбор какие запросы использовать, либо из ver 2.09RC1, либо оригинальные из ver 3.28, выбирайте то, с чем привыкли работать. #### Управление запросами находится в разделе Системные настройки → Дополнительные настройки → Запросы @@ -9,7 +9,12 @@ ### Changelog: +#### Версия v3.30 ALT - Шаблонизатор Smarty обновлен до версии 5.6 Проведено обновление кода для совместимости с PHP-8.4; #### Версия v3.29 ALT - удален устаревший Swift Mailer, на замену ему интегрирован Symfony Mailer; #### В Системных настройках, при выборе метода отправки почты: SMTP --> Шифрование, добавлены новые пункты: TLS (без проверки сертификата) и SSL (без проверки сертификата). Это дает возможность полноценно настраивать почту на локальном хосте. Добавлен выбор вариантов запросов. #### + +#### Системные требования: min версия PHP-8.2 и выше; MySQL-8.x + +### Вы можете отправить Баг-репорт в случае выявления ошибки: [ave.gitget.ru](https://ave.gitget.ru) \ No newline at end of file diff --git a/admin/blocks.php b/admin/blocks.php index 6fb590f..6647066 100644 --- a/admin/blocks.php +++ b/admin/blocks.php @@ -65,7 +65,7 @@ case 'alias': if (check_permission_acp('blocks_edit')) { - echo $AVE_Block->blockValidate($_REQUEST['alias'], (int)$_REQUEST['id']); + echo $AVE_Block->blockValidate($_REQUEST['alias'], (int)(isset($_REQUEST['id']) ? $_REQUEST['id'] : 0)); } exit; diff --git a/admin/browser.php b/admin/browser.php index 91e389d..573d861 100644 --- a/admin/browser.php +++ b/admin/browser.php @@ -169,7 +169,10 @@ switch ($action) { break; default: - list($target, $target_id) = explode('__', $_REQUEST['target'] ?? '__'); + //list($target, $target_id) = explode('__', $_REQUEST['target'] ?? '__'); + $parts = explode('__', $_REQUEST['target'] ?? '__'); + $target = $parts[0] ?? null; + $target_id = $parts[1] ?? null; $tval = '/'; @@ -195,4 +198,4 @@ switch ($action) { $out = ob_get_clean(); echo $out; - +?> \ No newline at end of file diff --git a/admin/docs.php b/admin/docs.php index 2740e48..2a3ac92 100644 --- a/admin/docs.php +++ b/admin/docs.php @@ -24,10 +24,10 @@ require(BASE_DIR . '/class/class.navigation.php'); require(BASE_DIR . '/class/class.request.php'); - $AVE_Document = new AVE_Document; - $AVE_Rubric = new AVE_Rubric; + $AVE_Document = new AVE_Document; + $AVE_Rubric = new AVE_Rubric; $AVE_Navigation = new AVE_Navigation; - $AVE_Request = new AVE_Request; + $AVE_Request = new AVE_Request; $AVE_Document->documentTemplateTimeAssign(); @@ -52,11 +52,13 @@ } $AVE_Document->documentListGet(); } - - if (isset($_REQUEST['rubric_id']) && is_numeric($_REQUEST['rubric_id'])) + + // ИСПРАВЛЕНИЕ: Защита $_REQUEST['rubric_id'] + $rubric_id = $_REQUEST['rubric_id'] ?? null; + if ($rubric_id !== null && is_numeric($rubric_id)) // Если существет файл с ID рубрики - if (file_exists(BASE_DIR . '/admin/templates/documents/docs-' .$_REQUEST['rubric_id'] . '.tpl')) - $_docs_template = 'documents/docs-' . $_REQUEST['rubric_id'] . '.tpl'; + if (file_exists(BASE_DIR . '/admin/templates/documents/docs-' . $rubric_id . '.tpl')) + $_docs_template = 'documents/docs-' . $rubric_id . '.tpl'; $AVE_Template->assign('content', $AVE_Template->fetch($_docs_template)); break; @@ -85,7 +87,8 @@ $AVE_Navigation->navigationAllItemList(); $AVE_Request->requestListFetch(); } - $AVE_Document->documentEdit((int)$_REQUEST['Id']); + // ИСПРАВЛЕНИЕ: Защита $_REQUEST['Id'] + $AVE_Document->documentEdit((int)($_REQUEST['Id'] ?? 0)); } break; @@ -94,7 +97,8 @@ { $AVE_Navigation->navigationAllItemList(); $AVE_Request->requestListFetch(); - $AVE_Document->documentCopy((int)$_REQUEST['Id']); + // ИСПРАВЛЕНИЕ: Защита $_REQUEST['Id'] + $AVE_Document->documentCopy((int)($_REQUEST['Id'] ?? 0)); } break; @@ -107,7 +111,8 @@ $AVE_Request->requestListFetch(); } - $AVE_Document->documentNew((int)$_REQUEST['rubric_id']); + // ИСПРАВЛЕНИЕ: Защита $_REQUEST['rubric_id'] + $AVE_Document->documentNew((int)($_REQUEST['rubric_id'] ?? 0)); } break; @@ -129,40 +134,45 @@ case 'open': if (check_permission_acp('document_view')) { - $AVE_Navigation->navigationItemStatusOn((int)$_REQUEST['Id']); - $AVE_Document->documentStatusSet((int)$_REQUEST['Id'], 1); + // ИСПРАВЛЕНИЕ: Защита $_REQUEST['Id'] + $AVE_Navigation->navigationItemStatusOn((int)($_REQUEST['Id'] ?? 0)); + $AVE_Document->documentStatusSet((int)($_REQUEST['Id'] ?? 0), 1); } break; case 'close': if (check_permission_acp('document_view')) { - $AVE_Navigation->navigationItemStatusOff((int)$_REQUEST['Id']); - $AVE_Document->documentStatusSet((int)$_REQUEST['Id'], 0); + // ИСПРАВЛЕНИЕ: Защита $_REQUEST['Id'] + $AVE_Navigation->navigationItemStatusOff((int)($_REQUEST['Id'] ?? 0)); + $AVE_Document->documentStatusSet((int)($_REQUEST['Id'] ?? 0), 0); } break; case 'delete': if (check_permission_acp('document_view')) { - $AVE_Navigation->navigationItemStatusOff((int)$_REQUEST['Id']); - $AVE_Document->documentMarkDelete((int)$_REQUEST['Id']); + // ИСПРАВЛЕНИЕ: Защита $_REQUEST['Id'] + $AVE_Navigation->navigationItemStatusOff((int)($_REQUEST['Id'] ?? 0)); + $AVE_Document->documentMarkDelete((int)($_REQUEST['Id'] ?? 0)); } break; case 'redelete': if (check_permission_acp('document_view')) { - $AVE_Navigation->navigationItemStatusOn((int)$_REQUEST['Id']); - $AVE_Document->documentUnmarkDelete((int)$_REQUEST['Id']); + // ИСПРАВЛЕНИЕ: Защита $_REQUEST['Id'] + $AVE_Navigation->navigationItemStatusOn((int)($_REQUEST['Id'] ?? 0)); + $AVE_Document->documentUnmarkDelete((int)($_REQUEST['Id'] ?? 0)); } break; case 'enddelete': if (check_permission_acp('alles')) { - $AVE_Navigation->navigationItemDeleteFromDoc((int)$_REQUEST['Id']); - $AVE_Document->documentDelete((int)$_REQUEST['Id']); + // ИСПРАВЛЕНИЕ: Защита $_REQUEST['Id'] + $AVE_Navigation->navigationItemDeleteFromDoc((int)($_REQUEST['Id'] ?? 0)); + $AVE_Document->documentDelete((int)($_REQUEST['Id'] ?? 0)); // Выполняем обновление страницы header('Location:index.php?do=docs&cp=' . SESSION); } @@ -171,48 +181,73 @@ case 'revision_recover': if (check_permission_acp('document_view')) { - $AVE_Document->documentRevissionRestore((int)$_REQUEST['doc_id'], (int)$_REQUEST['revission'], (int)$_REQUEST['rubric_id']); + // ИСПРАВЛЕНИЕ: Защита всех ID + $AVE_Document->documentRevissionRestore( + (int)($_REQUEST['doc_id'] ?? 0), + (int)($_REQUEST['revission'] ?? 0), + (int)($_REQUEST['rubric_id'] ?? 0) + ); } break; case 'revision_delete': if (check_permission_acp('document_view')) { - $AVE_Document->documentRevissionDelete((int)$_REQUEST['doc_id'], (int)$_REQUEST['revission'], (int)$_REQUEST['rubric_id']); + // ИСПРАВЛЕНИЕ: Защита всех ID + $AVE_Document->documentRevissionDelete( + (int)($_REQUEST['doc_id'] ?? 0), + (int)($_REQUEST['revission'] ?? 0), + (int)($_REQUEST['rubric_id'] ?? 0) + ); } break; case 'revisions_delete': if (check_permission_acp('document_view')) { - $AVE_Document->documentRevissionsDelete((int) $_REQUEST['doc_id'], (int) $_REQUEST['revission'], (int) $_REQUEST['rubric_id']); + // ИСПРАВЛЕНИЕ: Защита всех ID + $AVE_Document->documentRevissionsDelete( + (int)($_REQUEST['doc_id'] ?? 0), + (int)($_REQUEST['revission'] ?? 0), + (int)($_REQUEST['rubric_id'] ?? 0) + ); } break; case 'remark': if (check_permission_acp('remark_view')) { - $AVE_Document->documentRemarkNew((int)$_REQUEST['Id'], 0); + // ИСПРАВЛЕНИЕ: Защита $_REQUEST['Id'] + $AVE_Document->documentRemarkNew((int)($_REQUEST['Id'] ?? 0), 0); } break; case 'remark_reply': if (check_permission_acp('remark_view')) { - $AVE_Document->documentRemarkNew((int)$_REQUEST['Id'], 1); + // ИСПРАВЛЕНИЕ: Защита $_REQUEST['Id'] + $AVE_Document->documentRemarkNew((int)($_REQUEST['Id'] ?? 0), 1); } break; case 'remark_status': if (check_permission_acp('remark_edit')) { - $AVE_Document->documentRemarkStatus((int)$_REQUEST['Id'], (int)$_REQUEST['remark_status']); + // ИСПРАВЛЕНИЕ: Защита ID и статуса + $AVE_Document->documentRemarkStatus( + (int)($_REQUEST['Id'] ?? 0), + (int)($_REQUEST['remark_status'] ?? 0) + ); } break; case 'remark_del': if (check_permission_acp('remark_edit')) { - $AVE_Document->documentRemarkDelete((int)$_REQUEST['Id'], (int)$_REQUEST['remark_first']); + // ИСПРАВЛЕНИЕ: Защита ID + $AVE_Document->documentRemarkDelete( + (int)($_REQUEST['Id'] ?? 0), + (int)($_REQUEST['remark_first'] ?? 0) + ); } break; @@ -239,14 +274,16 @@ case 'find_user': if (check_permission_acp('document_view')) { - findautor($_REQUEST['q'], 10); + // ИСПРАВЛЕНИЕ: Защита $_REQUEST['q'] + findautor(($_REQUEST['q'] ?? ''), 10); } exit; case 'keywords': if (check_permission_acp('document_view')) { - searchKeywords($_REQUEST['q']); + // ИСПРАВЛЕНИЕ: Защита $_REQUEST['q'] + searchKeywords(($_REQUEST['q'] ?? '')); } exit; @@ -258,11 +295,13 @@ break; case 'image_import': - echo json_encode(array("respons"=>image_multi_import($_REQUEST['path']), "status"=>"error", "action"=>"return")); + // ИСПРАВЛЕНИЕ: Защита $_REQUEST['path'] + echo json_encode(array("respons"=>image_multi_import(($_REQUEST['path'] ?? '')), "status"=>"error", "action"=>"return")); exit; case 'translit': - echo($AVE_Document->documentAliasCreate()); + $alias = $AVE_Document->documentAliasCreate(); + echo($alias ?? ''); // Добавляем защиту на случай, если функция вернула null exit; case 'checkurl': @@ -279,7 +318,8 @@ case 'aliases_doc': if (check_permission_acp('document_view')) { - $AVE_Document->documentAliasListDoc((int)$_REQUEST['doc_id']); + // ИСПРАВЛЕНИЕ: Защита $_REQUEST['doc_id'] + $AVE_Document->documentAliasListDoc((int)($_REQUEST['doc_id'] ?? 0)); } break; diff --git a/admin/functions/func.admin.common.php b/admin/functions/func.admin.common.php index 6fa3607..171eccb 100644 --- a/admin/functions/func.admin.common.php +++ b/admin/functions/func.admin.common.php @@ -171,6 +171,29 @@ function getLogRecords() while ($row = $sql->FetchRow()) $cnts['users_' . $row->status] = $row->cntStatus; + // 1. Проверяем, существует ли переменная $cnts, и если нет, создаем ее как массив + if (!isset($cnts)) { + $cnts = []; + } + + // 2. Инициализируем отсутствующие ключи нулем + if (!isset($cnts['modules_0'])) { + $cnts['modules_0'] = 0; + } + + if (!isset($cnts['modules_1'])) { + $cnts['modules_1'] = 0; + } + + // 3. Инициализируем отсутствующие ключи для ПОЛЬЗОВАТЕЛЕЙ + if (!isset($cnts['users_0'])) { + $cnts['users_0'] = 0; + } + + if (!isset($cnts['users_1'])) { + $cnts['users_1'] = 0; + } + $AVE_Template->assign('cnts', $cnts); } diff --git a/admin/index.php b/admin/index.php index 0860164..3dbd97a 100644 --- a/admin/index.php +++ b/admin/index.php @@ -118,7 +118,7 @@ include_once (BASE_DIR . '/admin/' . $do . '.php'); if (defined('NOPERM')) - $AVE_Template->assign('content', $config_vars['MAIN_NO_PERMISSION']); + $AVE_Template->assign('content', isset($config_vars['MAIN_NO_PERMISSION']) ? $config_vars['MAIN_NO_PERMISSION'] : 'Доступ запрещен.'); //Шаблоны $tpl = (isset($_REQUEST['pop']) && $_REQUEST['pop'] == 1) diff --git a/admin/init.php b/admin/init.php index 8b98bd9..3aa6447 100644 --- a/admin/init.php +++ b/admin/init.php @@ -19,10 +19,12 @@ require (BASE_DIR . '/inc/init.php'); - $AVE_Template = new AVE_Template(BASE_DIR . '/admin/templates'); - $AVE_Template->assign('tpl_dir', ABS_PATH . 'admin/templates'); - require (BASE_DIR . '/admin/functions/func.admin.common.php'); + + $AVE_Template = new AVE_Template(BASE_DIR . '/admin/templates'); + + $AVE_Template->assign('tpl_dir', ABS_PATH . 'admin/templates'); + require (BASE_DIR . '/lib/redactor/ckeditor/adapters/ckeditor.php'); $lang_system = $AVE_DB->Query(" diff --git a/admin/lang/bg/blocks.txt b/admin/lang/bg/blocks.txt index f2fa3fd..751a9a7 100644 --- a/admin/lang/bg/blocks.txt +++ b/admin/lang/bg/blocks.txt @@ -60,7 +60,7 @@ BLOCK_SAVED_ERR = "Неуспешен запис на визуален блок BLOCK_ERROR = "Грешка" BLOCK_SUCCESS = "Изпълнено" -// v 3.2 +# v 3.2 BLOCK_DESCRIPTION = "Кратко описание" BLOCK_ALIAS = "Алиас" BLOCK_I = "Опционално. Алиасът позволява да се използва лесно запомнящсе таг [tag:BLOCK:alias] [tag:BLOCK:id]. Алиасът не може да бъде число, може да съдържа само цифри, латински букви, долна черта, тире и е с дължина не-повече от 20 символа и трябва да бъде уникален в пределите на блоковете." diff --git a/admin/lang/bg/docs.txt b/admin/lang/bg/docs.txt index b7ce593..eff8806 100644 --- a/admin/lang/bg/docs.txt +++ b/admin/lang/bg/docs.txt @@ -285,7 +285,7 @@ DOC_SEARCH_FIELD_TEXT = "Стойност" DOC_TEMPLATE_DEFAULT = "Използвай по подразбиране" DOC_SHOW_LANG = "Покажи" -// 3.2 +# 3.2 DOC_TABS_META = "Meta данни" DOC_TABS_URL = "URL на документа" DOC_TABS_DATE = "Дата на публикация" @@ -300,10 +300,10 @@ DOC_LANG = "Език" DOC_LANG_ID = "Език на документа:" DOC_LANG_SELECT = "Изберете език" -// 3.25 +# 3.25 DOC_CLOSE_SEARCH_RUBRIC = "Върни се в раздела, според параметрите на търсенето" -// 3.26 +# 3.26 DOC_POSITION = "Позиция" DOCUMENT_POSITION = "Позиция на документа" DOCUMENT_POSITION_ERR = "Неуспешен запис на позицията на документа" diff --git a/admin/lang/bg/main.txt b/admin/lang/bg/main.txt index 20032ed..d9a6d68 100644 --- a/admin/lang/bg/main.txt +++ b/admin/lang/bg/main.txt @@ -301,5 +301,5 @@ WRONG_CAPTCHA = "Грешка:
Грешен защитен oficial_site = "Официален сайт" support = "Техническо обслужване" -// 3.1.9 +# 3.1.9 MAIN_BLOCKS = "Визуални блокове" \ No newline at end of file diff --git a/admin/lang/bg/navigation.txt b/admin/lang/bg/navigation.txt index 306a7bb..315c796 100644 --- a/admin/lang/bg/navigation.txt +++ b/admin/lang/bg/navigation.txt @@ -95,14 +95,14 @@ NAVI_ITEM_EDIT = "Редактиране пункт в менюто" NAVI_ITEM_DELETE = "Изтриване на пункта в менюто" NAVI_ITEM_DELETE_CONFIRM = "Сигурни ли сте, че желаете да изтриете този пункт в менюто?" -// v 3.2 +# v 3.2 NAVI_ALIAS = "Алиас" NAVI_I = "Опционално. Алиасът позволява да се използва лесно запомнящсе таг [tag:sysblock:alias] вместо [tag:sysblock:id]. Алиасът не може да бъде чосло, може да съдържа само цифри, латински букви, долна черта, тире и е с дължина не-повече от 20 символа и трябва да бъде уникален в пределите на модула." NAVI_ACCEPT = "Този алиас можр да се използва" NAVI_ER_SYN = "Грешен алиас!
Алиасът не трябва да е число, да съдържа само цифри, латински букви, долна черта, тире и е с дължина не-повече от 20 символа" NAVI_ER_EXISTS = "Грешен алиас!
Този алиас вече е използван в друга контактна форма" -//from templates +# from templates NAVI_NOLINK_DOC = "Липсва свързан документ" NAVI_EDIT_ITEM = "Редактиране на реда в менюто" NAVI_LINK_FILEDOC = "Свържи с документ/файл" diff --git a/admin/lang/bg/request.txt b/admin/lang/bg/request.txt index 53ffc5c..294b62b 100644 --- a/admin/lang/bg/request.txt +++ b/admin/lang/bg/request.txt @@ -179,7 +179,7 @@ REQUEST_REPORT_ERR_RUBRIC= "Не е избрана рубрика" REQUEST_BY_PARENT = "Родителски документ" REQUEST_SHOW_STAT = "Покажи статистиката" -// v 3.1.9 +# v 3.1.9 REQUEST_ALIAS = "Алиас" REQUEST_I = "Опционално. Алиасът позволява да се използва лесно запомнящсе таг [tag:sysblock:alias] вместо [tag:sysblock:id]. Алиасът не може да бъде чосло, може да съдържа само цифри, латински букви, долна черта, тире и е с дължина не-повече от 20 символа и трябва да бъде уникален в пределите на модула." REQUEST_ACCEPT = "Този алиас можр да се използва" @@ -189,7 +189,7 @@ REQUEST_HEADER_EXTERNAL = "Външно обръщание" REQUEST_EXTERNAL = "Разреши външно обръщение" REQUEST_ONLY_AJAX = "Изпълнение само чрез Ajax" -// v 3.2 +# v 3.2 REQUEST_PAGINATION = "Постранична навигация" REQUEST_NAVI_TPL = "Шаблон за постранична навигация" REQUEST_OTHER = "Още" @@ -198,8 +198,8 @@ REQUEST_DOC_ON_PAGE = "Брой елементи на заявката на с REQUEST_PAGES_CURENT = "Номер страница" REQUEST_PAGES_TOTAL = "Общ брой страници" -// v 3.24 +# v 3.24 REQUEST_COUNT_ITEMS = "Получаване на бр. елементи(ако не се използва постранична навигация)" -// v 3.26 +# v 3.26 REQUEST_BY_POSITION = "Позиция на документа" \ No newline at end of file diff --git a/admin/lang/bg/rubs.txt b/admin/lang/bg/rubs.txt index 6b7ff72..9a8740d 100644 --- a/admin/lang/bg/rubs.txt +++ b/admin/lang/bg/rubs.txt @@ -280,7 +280,7 @@ RUBRIC_TMPLS_INNAME = "Въведете наименование на ш RUBRIC_TEMPL_REPORT = "Редайтирал допълнителен шаблон за рубрика" RUBRIC_TMPLS_LOG_DEL = "Изтрил допълнителен шаблон за рубрика" -// 3.24 +# 3.24 RUBRIC_WARNING_TIP = "Внимание! Моля, бъдете внимателни - неверните параметри ще доведат до неработоспособна система." RUBRIK_EDIT_FIELDS = "Управление на полетата" diff --git a/admin/lang/bg/settings.txt b/admin/lang/bg/settings.txt index b03dcd1..23a2b75 100644 --- a/admin/lang/bg/settings.txt +++ b/admin/lang/bg/settings.txt @@ -113,7 +113,7 @@ SETTINGS_COUNT_DELETED_ERR = "Неуспешно изтриване на дне SETTINGS_COUNT_UPDATE = "Занулил дневния брояч на документите" SETTINGS_CACHE_LIFETIME = "Внимание!!! Включено кеширование запроса к настройкам системы. Изменения вступят в силу, только после окончания времени жизни кеша или отключения кеширования" -// v3.2 +# v3.2 SETTINGS_PAGINATION = "Настройка на пагинация" PAGINATION_ADD = "Създай шаблон за пагинация" PAGINATION_NAME = "Наименование" @@ -139,7 +139,7 @@ pagination_end_label = "Текст за линк "Последна"" pagination_next_label = "Текст за линк "Следваща"" pagination_prev_label = "Текст за линк "Предходна"" -// v3.24 +# v3.24 SETTINGS_SAVED_ERR_FILE = "Грешка при записване на файла. Моля, пробвайте отново." SETTINGS_SAVED_FILE = "Файлът е успешно записан." SETTINGS_FILE_EDIT_H = "Редактиране на файла" @@ -147,7 +147,7 @@ SETTINGS_FILE_CONTENT = "Съдържание на файла:" SETTINGS_FILE_ROBOTS = "Файл robots.txt" SETTINGS_FILE_CUSTOM = "Файл func.custom.php" -// v3.25 +# v3.25 _const_auth = "Авторизация" _const_url = "Формиране на URL" _const_themes = "Оформление" diff --git a/admin/lang/bg/sysblocks.txt b/admin/lang/bg/sysblocks.txt index e07037d..79ac648 100644 --- a/admin/lang/bg/sysblocks.txt +++ b/admin/lang/bg/sysblocks.txt @@ -68,7 +68,7 @@ SYSBLOCK_SAVED_ERR = "Неуспешно записване на системн SYSBLOCK_ERROR = "Грешка" SYSBLOCK_SUCCESS = "Изпълнено" -// v 3.2 +# v 3.2 SYSBLOCK_DESCRIPTION = "Кратко описание" SYSBLOCK_ALIAS = "Алиас" SYSBLOCK_I = "Опционално. Алиасът позволява да се използва лесно запомнящсе таг [tag:sysblock:alias] вместо [tag:sysblock:id]. Алиасът не може да бъде чосло, може да съдържа само цифри, латински букви, долна черта, тире и е с дължина не-повече от 20 символа и трябва да бъде уникален в пределите на модула." @@ -76,7 +76,7 @@ SYSBLOCK_ACCEPT = "Този алиас може да се използва" SYSBLOCK_ER_SYN = "Грешен алиас!
Алиасът не трябва да е число, може да съдържа само цифри, латински букви, долна черта, тире и е с дължина не-повече от 20 символа" SYSBLOCK_ER_EXISTS = "Грешен алиас!
Този алиас вече е използван в друг системен блок" -// v 3.26 +# v 3.26 SYSBLOCK_EVAL = "Изпълнявай PHP преди връщане на резултата" SYS_GROUP_NO_TITLE = "Без групи" SYS_GROUP_NO_DESCRIPTION = "Лписва описание" diff --git a/admin/lang/cz/request.txt b/admin/lang/cz/request.txt index ab38283..72fbdcb 100644 --- a/admin/lang/cz/request.txt +++ b/admin/lang/cz/request.txt @@ -169,8 +169,7 @@ REQUEST_REPORT_ERR_TITLE = "Cyhbí název požadavku" REQUEST_REPORT_ERR_TEXT = "Chybí základní šablona designu požadavku" REQUEST_REPORT_ERR_PHP = "Je zakázáno využívat PHP kodu REQUEST_REPORT_ERR_PHP_N = "Pokus využítí PHP kodu v šabloně požadavku při vytvoření požadavku" -REQUEST_REPORT_ERR_PHP_E -= "Pokus použítí PHP kodu v šabloně požadavku" +REQUEST_REPORT_ERR_PHP_E = "Pokus použítí PHP kodu v šabloně požadavku" REQUEST_REPORT_ERR_RUBRIC= "Není vybraná rubrika" REQUEST_BY_PARENT = "Nadřazený dokument" REQUEST_SHOW_STAT = "Zobrazit statistiky" diff --git a/admin/lang/cz/rubs.txt b/admin/lang/cz/rubs.txt index adb95b8..87c6cc4 100644 --- a/admin/lang/cz/rubs.txt +++ b/admin/lang/cz/rubs.txt @@ -187,7 +187,7 @@ RUBRIK_ALIAS_HEAD = "Přiřadit alias pro pole" RUBRIK_ALIAS_HEAD_T = "Můžete použít pouze latinky a čísla
Příklad:! záhlaví " RUBRIK_ALIAS_HEAD_R = "Rubrika" RUBRIK_ALIAS_HEAD_F = "pole" -RUBRIK_ALIAS_ALIAS = "Alias ​​pole" +RUBRIK_ALIAS_ALIAS = "Alias pole" RUBRIK_ALIAS_NAME= "Název aliasu" RUBRIK_ALIAS_BUTT = "Uložit" RUBRIK_ALIAS_ERROR = "Chyba" diff --git a/admin/lang/cz/scripts.js b/admin/lang/cz/scripts.js index ce2e152..df4eb41 100644 --- a/admin/lang/cz/scripts.js +++ b/admin/lang/cz/scripts.js @@ -22,7 +22,7 @@ var ajaxErrorStatusJSON = "Špatná odpověď serveru
Data jsou ve špatné var ajaxErrorStatusTimeOut = "Čas požadavku uplynul."; var ajaxErrorStatusAbort = "Ajax požadavek přerušen."; var ajaxErrorStatusMess = "Cyhba:
"; -var delCascadTitle = "odstranit zobrazení; +var delCascadTitle = "odstranit zobrazení;" var delCascadConfirm = "Opravdu chcete smazat?"; var saveMessageOk = "Data uložena"; diff --git a/admin/lang/pl/docs.txt b/admin/lang/pl/docs.txt index bed7639..45143b4 100644 --- a/admin/lang/pl/docs.txt +++ b/admin/lang/pl/docs.txt @@ -54,10 +54,10 @@ DOC_BUTTON_EDIT_DOCUMENT_NEXT = "Zastosuj (Ctrl + S)" DOC_ADD_DOCUMENT = "Dodaj nowy dokument" DOC_EDIT_DOCUMENT = "Redagowanie dokumentu" DOC_OPTIONS = "Ustawienia dokumentu" -DOC_NAME = "Nazwa dokumentu:
(HTML & lt;title>)" -DOC_URL = "Pseudonim dokumentu:
(SEO alias) " +DOC_NAME = "Nazwa dokumentu:
(HTML & lt;title>)" +DOC_URL = "Pseudonim dokumentu:
(SEO alias) " DOC_URL_LINK = "Podstawianie aliasów" -DOC_URL_INFO = " Aby link na dokument wyglądał, na przykład, tak:
http :
//www.domain.tld/phone/samsung/
zapisz w tym oknie: phone/samsung

Przyrostek linku jest dodawany automatycznie przy wyprowadzeniu
według ustawień określonych w pliku inc/config.php

 W tytule pozwolone jest wykorzystanie:
a-z – liter łacińskich;
а-я - znaków cyrylicy (jeśli jest to dozwolone) ;
 / - ukośnik;
- — kreska
_ -

znak podkreślenia. Tytuł linku nie powinien zawierać:
print /  lub / print /  lub / print; page-XX /  lub / page-XX /  lub / page-XX ;
Apage-XX / lub / Apage-XX /  lub / Apage-XX ;
artpage-XX /  lub / artpage-XX /  lub / artpage-XX ;
 gdzie xx - cyfry " +DOC_URL_INFO = " Aby link na dokument wyglądał, na przykład, tak:
http:
//www.domain.tld/phone/samsung/
zapisz w tym oknie: phone/samsung

Przyrostek linku jest dodawany automatycznie przy wyprowadzeniu
według ustawień określonych w pliku inc/config.php

W tytule pozwolone jest wykorzystanie:
a-z – liter łacińskich;
а-я - znaków cyrylicy (jeśli jest to dozwolone) ;
/ - ukośnik;
- — kreska
_ -

znak podkreślenia. Tytuł linku nie powinien zawierać:
print / lub / print / lub / print;
page-XX / lub / page-XX / lub / page-XX ;
Apage-XX / lub / Apage-XX / lub / Apage-XX ;
artpage-XX / lub / artpage-XX / lub / artpage-XX ;
gdzie xx - cyfry " DOC_URL_LOG = "Wykorzystać historię aliasów, dlia przekierowaninia" DOC_URL_LOG_T = "Zapisywać lub nie zapisywać historię aliasów dokumentu dla następnego przekierowania" DOC_URL_LOG_RUBRIC = "Używać ustawienia rubryki" @@ -68,8 +68,8 @@ DOC_URL_LOG_NOTUSE = "Nie wykorzystywać" DOC_QUERIES = "Dostępne zapytania" DOC_META_TITLE = " TITLE (TYTUŁ) – to szereg, który będzie wyświetlany na pasku tytułowym przeglądarki, znacznik ten ma istotne znaczenie dla optymizacji wyszukiwarek, dla tego system pozwala nim kierować, a także kilkoma innymi znacznikami." DOC_META_KEYWORDS = "Słowa kluczowe:
(meta keywords) " -DOC_META_KEYWORDS_INFO = " opisują zawartość strony, magą być uwzględnione przez wyszukiwarki.

 Niektóre z tych słów muszą być obece w tekście strony. " -DOC_META_DESCRIPTION = "Opis strony:
(meta opis) " +DOC_META_KEYWORDS_INFO = " opisują zawartość strony, magą być uwzględnione przez wyszukiwarki.

Niektóre z tych słów muszą być obece w tekście strony. " +DOC_META_DESCRIPTION = "Opis strony:
(meta opis) " DOC_META_DESCRIPTION_INFO = "Mały tekst, który opisuje zawartość strony, może również zostać uznany przez wyszukiwarki, wyprowadza się jako wyjaśnienie w wynikach wyszukiwania lub katalogów internetowych." DOC_CAN_SEARCH = "Pozwól na przeszukiwanie w dokumencie:
(dla modułu wyszukiwanie) " DOC_INDEX_TYPE = "Typ indeksowania strony":
(meta robots)" @@ -131,18 +131,18 @@ DOC_NOTICE_TEXT = "Notatka" DOC_BUTTON_ADD_NOTICE = "Dodaj notatkę" DOC_SEND_NOTICE_INFO = "Aby dodać nową notatkę do dokumentu, proszę, wypełnij pola w poniższym formularzu." DOC_NEW_NOTICE_TITLE = "Dodaj nową notatkę" -DOC_MAIL_BODY_CHECK = "Użytkownik %USER% dodał nowy dokument o nazwie %TITLE%".% N % Proszę sprawdzić ten dokument przed publikacją." +DOC_MAIL_BODY_CHECK = "Użytkownik %USER% dodał nowy dokument o nazwie %TITLE%".% N% Proszę sprawdzić ten dokument przed publikacją." DOC_MAIL_SUBJECT_CHECK = "Dodano nowy dokument" DOC_MAIL_BODY_USER = "Witamy %USER%.%N% pomyślnie utworzony pzez Pana/Panią dokument był pomyślnie dodany, Administrator otrzymał powiadomienie o sprawdzeniu, po sprawdzeniu dokumentu, zostanie on opublikowany." DOC_MAIL_SUBJECT_USER = "Dokument był dodany, czeka na sprawdzenie" DOC_MAIL_BODY_NOTICE = "Użytkownik % USER% dodał nową notatkę do dokumentu %N% Autoryzuj się w Panelu sterowania, a następnie kliknij na link poniżej, aby zobaczyć notatkę:% N%" %% LINK DOC_MAIL_SUBJECT_NOTICE = "Dodano nową notatkę do dokumentu" DOC_NEW_PAGE = "Dodać nową stronę" -DOC_CLOSE_HELP_WINDOW = "

" +DOC_CLOSE_HELP_WINDOW = "

" DOC_HELP = "Pomoc" -DOC_VIDEO_TYPE_HELP = " Dodanie pliku wideo
Po dodaniu pliku wideo można określić szerokość i wysokość okna, aby obejrzeć wideo. Pierwsza wartość określa szerokość okna, druga - wysokość.

na przykład:

 video.avi | 300 | 300

lub video.avi | 100% | 300 " -DOC_FLASH_TYPE_HELP = " Dodanie filmu Flash
Po dodaniu filmu Flash, można określić szerokość i wysokość okna przy przeglądzie. Pierwsza wartość określa szerokość, druga – wysokość

na przykład:

flash.swf | 300 | 300

lub flash.swf | 100% | 300 " -DOC_FILE_TYPE_HELP = " Dodanie pliku
Po dodaniu pliku, można zadać nazwę linku. Dla tego po nazwie pliku należy podać znak rozpodzielczy | , a następnie wprowadźić nazwę linku

na przykład:

 file.zip | Pobierz plik " +DOC_VIDEO_TYPE_HELP = " Dodanie pliku wideo
Po dodaniu pliku wideo można określić szerokość i wysokość okna, aby obejrzeć wideo. Pierwsza wartość określa szerokość okna, druga - wysokość.

na przykład:

video.avi | 300 | 300

lub video.avi | 100% | 300 " +DOC_FLASH_TYPE_HELP = " Dodanie filmu Flash
Po dodaniu filmu Flash, można określić szerokość i wysokość okna przy przeglądzie. Pierwsza wartość określa szerokość, druga – wysokość

na przykład:

flash.swf | 300 | 300

lub flash.swf | 100% | 300 " +DOC_FILE_TYPE_HELP = " Dodanie pliku
Po dodaniu pliku, można zadać nazwę linku. Dla tego po nazwie pliku należy podać znak rozpodzielczy | , a następnie wprowadźić nazwę linku

na przykład:

file.zip | Pobierz plik " DOC_NO_PERMISSION = "Przepraszamy, ale nie masz uprawnień do edytowania tego dokumentu." DOC_NO_PERMISSION_RUB = "Przepraszamy, ale nie jesteś upoważniony do utworzenia dokumentu w tej rubryce." DOC_NO_DEL_REVISION = "Przepraszamy, ale nie jesteś upoważniony do usunięcia rewizji." @@ -267,7 +267,7 @@ DOC_SEARCH_FIELD_TEXT = "Значення" DOC_TEMPLATE_DEFAULT = "Використовувати по замовчуванню" DOC_SHOW_LANG = "Показати" -// 3.2 +# 3.2 DOC_TABS_META = "Meta дані" DOC_TABS_URL = "URL документа" DOC_TABS_DATE = "Дата публікації" diff --git a/admin/lang/pl/main.txt b/admin/lang/pl/main.txt index 77af7e4..7e07d15 100644 --- a/admin/lang/pl/main.txt +++ b/admin/lang/pl/main.txt @@ -76,7 +76,7 @@ MAIN_BUTTON_SEARCH = "Szukaj" MAIN_TITLE_SEARCH = "Nazwa dokumentu" MAIN_TITLE_DOC_NAME = "Nazwa dokumentu" MAIN_TITLE_DOC_ID = "ID Dokumentu" -MAIN_SEARCH_HELP = Korzystanie z wyszukiwarki
Użyj znak & quot; + & quot; . dla wyraźnego włączenia słowa do wyszukiwarki.
Wykorzystaj znak & quot; - & quot; aby wykluczyć słowa z wyszukiwarki
obowiązkowe jest używanie spacji przed znakami & quot; + & quot; i & quot; - & quot;." +MAIN_SEARCH_HELP = Korzystanie z wyszukiwarki
Użyj znak & quot; + & quot;. dla wyraźnego włączenia słowa do wyszukiwarki.
Wykorzystaj znak & quot; - & quot; aby wykluczyć słowa z wyszukiwarki
obowiązkowe jest używanie spacji przed znakami & quot; + & quot; i & quot; - & quot;." MAIN_ID_SEARCH = "ID Dokumentu" MAIN_SELECT_RUBRIK = "W rubryce" MAIN_ALL_RUBRUKS = "Wszystkie rubryki" @@ -112,7 +112,7 @@ MAIN_BROWSE_DOCUMENTS = "Popatrzeć w dokumentach" MAIN_USERS_LIST = "Lista użytkowników" MAIN_USER_ADD = "Dodaj nowego użytkownika" MAIN_SEARCH_USERS = "Szukaj użytkowników po:" -MAIN_USER_PARAMS = "Imieniu, ID, E-mail, E-mail domena" +MAIN_USER_PARAMS = "Imieniu, ID, E-mail, E-mail domena" MAIN_USER_STATUS = "Ze statusem" MAIN_USER_STATUS_ALL = "Każdy status" MAIN_USER_STATUS_ACTIVE = "Aktywny" @@ -243,7 +243,7 @@ MAIN_ADD_USR = "Użytkownika" MAIN_ADD_GRP = "Grupę" MAIN_BRANCHES = "Sekcje" MAIN_SHOWHIDE = "Pokaż / Ukryj menu" -MAIN_CODEMIRROR_HELP = " Ctrl- F / Cmd-F ( Szukaj) | Ctrl-G / Cmd-G ( Znajdź następny) | Shift-Ctrl -G / shift -Cmd-G (Znajdź poprzedni) | Shift-Ctrl -F / Cmd-Option-F ( Zamień) | Shift-Ctrl -R / Shift-Cmd-Option- F (Zamień wszystkie) | F11 (Pełny ekran) " +MAIN_CODEMIRROR_HELP = " Ctrl-F / Cmd-F (Szukaj) | Ctrl-G / Cmd-G (Znajdź następny) | Shift-Ctrl-G / shift-Cmd-G (Znajdź poprzedni) | Shift-Ctrl-F / Cmd-Option-F (Zamień) | Shift-Ctrl-R / Shift-Cmd-Option-F (Zamień wszystkie) | F11 (Pełny ekran) " TEMPLATES_MESSAGE = " Wiadomość: " TEMPLATES_CACHE_SUCCESS = "Pamięć podręczna została pomyślnie usunięta" TEMPLATES_CACHE_SUCCESS_LOG = "Pamięć podręczna została wyczyszczona" @@ -267,5 +267,5 @@ WRONG_CAPTCHA = " Błąd:
Nieprawidłowy kod bezpiecze oficial_site = "Strona oficjalna" support = "Pomoc techniczna" -// 3.1.9 +# 3.1.9 MAIN_BLOCKS = "Візуальні блоки" \ No newline at end of file diff --git a/admin/lang/pl/navigation.txt b/admin/lang/pl/navigation.txt index 44b188b..52e6de2 100644 --- a/admin/lang/pl/navigation.txt +++ b/admin/lang/pl/navigation.txt @@ -93,14 +93,14 @@ NAVI_ITEM_DELETE = "Usuń ten punkt menu" NAVI_ITEM_DELETE_CONFIRM = "Czy na pewno chcesz usunąć ten punkt menu nawigacyjnego?" -// v 3.2 +# v 3.2 NAVI_ALIAS = "Аліас" NAVI_I = "Опціонально. Аліас дозволяє використовувати легкий для запам’ятовування тег [tag:sysblock:alias] замість [tag:sysblock:id]. Аліас не може бути числом, може містити тільки цифри, латинські літери, дефіс, підкреслення, мати довжину не більше 20 символів та бути унікальним у межах модуля" NAVI_ACCEPT = "Цей аліас можна використовувати" NAVI_ER_SYN = "Неправильний аліас!
Аліас не може бути числом, може містити тільки цифри, латинські літери, дефіс, підкреслення та мати довжину не більше 20 символів" NAVI_ER_EXISTS = "Неправильний аліас!
Цей аліас уже прив’язаний до іншого меню" -//from templates +#from templates NAVI_NOLINK_DOC = "Немає зв’язаного документа" NAVI_EDIT_ITEM = "Редагування пункта меню" NAVI_LINK_FILEDOC = "Зв’язати з документом/файлом" diff --git a/admin/lang/pl/request.txt b/admin/lang/pl/request.txt index c9b275a..a67e48b 100644 --- a/admin/lang/pl/request.txt +++ b/admin/lang/pl/request.txt @@ -22,8 +22,8 @@ REQUEST_DATE_CREATE = "Data utworzenia" REQUEST_ACTIONS = "Działania" REQUEST_NO_DESCRIPTION = "Wniosek bez opisu" REQUEST_NO_REQUST = "Wnioski nieobecne" -REQUEST_DATE_FORMAT = "%d.%m .%w r." -REQUEST_DATE_FORMAT2 = "%d.%m.% w r. w %H:%M" +REQUEST_DATE_FORMAT = "%d.%m.%w r." +REQUEST_DATE_FORMAT2 = "%d.%m.%w r. w %H:%M" REQUEST_IN = "w" REQUEST_COPY = "Kopiuj wniosek" REQUEST_COPY_FAILED = "Nie można skopiować wniosek" @@ -68,7 +68,7 @@ REQUEST_TEMPLATE_INFO = "W tym polu, stosując kod HTML, można określić proje REQUEST_TEMPLATE_SAVED = "Wniosek pomyślnie zapisany" REQUEST_SELECT_IN_LIST = "Proszę wybrać pole rubryki z listy poniżej" REQUEST_RUB_INFO = "Znacznika systemowy, który jest odpowiedzialny za wyjście zawartośći pola rubryki. ID pola. Xxx-liczba znaków do wyświetlania". -REQUEST_LINK_INFO = "Znacznik systemowy, który określa odnośnik do dokumentu, na przykład < a href = "[tag:link]">  odnośnik < /a>" +REQUEST_LINK_INFO = "Znacznik systemowy, który określa odnośnik do dokumentu, na przykład < a href = "[tag:link]"> odnośnik < /a>" REQUEST_RUBRIK_FIELD = "Znacznik systemowy pola" REQUEST_THUMBNAIL = "Znacznik jest odpowiedzialny za tworzenie miniatury (pod warunkiem, że w szablonie pola rubryki (szablon dla wyjścia we wniosku) jest wybrane wyjście: [tag: parametr:0])" REQUEST_FIELD_NAME = "Nazwa pola" @@ -126,8 +126,8 @@ REQUEST_DOCDATE_INFO = "Znacznik systemowy, który odpowiada dacie publikacji do REQUEST_CDOCDATE_INFO = "Znacznik systemowy, który odpowiada dacie publikacji niniejszego dokumentu (w którym wywodzi się wniosek)" REQUEST_DOCTIME_INFO = "Znacznik systemowy, który odpowiada odpowiada dacie i godzinie publikacji dokumentu" REQUEST_CDOCTIME_INFO = "Znacznik systemowy, który odpowiada dacie i godzinie publikacji niniejszego dokumentu (którego wywodzi się wniosek)" -REQUEST_DATE_INFO = "Znacznik systemowy, data i godzina publikacji dokumentu - wygląd konfigurowany
. Przykład: [tag: data: DMY] 
 Można używać dystrybutorów (spacja - /)" -REQUEST_CDATE_INFO = "Znacznik systemowy, data i godzina publikacji dokumentu - wygląd konfigurowany
. Przykład: [tag: data: DMY] 
( W którym wywodzi się wniosek)
Można używać dystrybutorów (spacja - / )". +REQUEST_DATE_INFO = "Znacznik systemowy, data i godzina publikacji dokumentu - wygląd konfigurowany
. Przykład: [tag: data: DMY]
Można używać dystrybutorów (spacja - /)" +REQUEST_CDATE_INFO = "Znacznik systemowy, data i godzina publikacji dokumentu - wygląd konfigurowany
. Przykład: [tag: data: DMY]
(W którym wywodzi się wniosek)
Można używać dystrybutorów (spacja - / )". REQUEST_DOCAUTHOR_INFO = "Znacznik systemowy, który odpowiada autorowi dokumentu" REQUEST_DOCAUTHOR_AVATAR = "Znacznik systemowy, który odpowiada awataru autora dokumentu" REQUEST_CDOCAUTHOR_INFO = "Znacznik systemowy, który odpowiada autoru tego dokumentu (w którym wywodzi się wniosek)" @@ -168,7 +168,7 @@ REQUEST_BY_PARENT = "Dokumentu nadrzędnemu" REQUEST_SHOW_STAT = "Pokaż statystyki" -// v 3.1.9 +# v 3.1.9 REQUEST_ALIAS = "Аліас" REQUEST_I = "Опціонально. Аліас дозволяє використовувати легкий для запам’ятовування тег [tag:request:alias] замість [tag:request:id]. Аліас не повинен бути числом, може містити тільки цифри, латинські літери, дефіс, підкреслення, мати довжину не більше 20 символів та бути унікальним у межах модуля" REQUEST_ACCEPT = "Цей Аліас можна використовувати" @@ -178,7 +178,7 @@ REQUEST_HEADER_EXTERNAL = "Зовнішнє звернення" REQUEST_EXTERNAL = "Дозволити зовнішнє звернення" REQUEST_ONLY_AJAX = "Виконувати тільки по Ajax" -// v 3.2 +# v 3.2 REQUEST_PAGINATION = "Посторінкова навігація" REQUEST_NAVI_TPL = "Шаблон посторінкової навігації" REQUEST_OTHER = "Інше" diff --git a/admin/lang/pl/rubs.txt b/admin/lang/pl/rubs.txt index d800b7b..a2c7774 100644 --- a/admin/lang/pl/rubs.txt +++ b/admin/lang/pl/rubs.txt @@ -120,7 +120,7 @@ RUBRIK_FILED_TEMPLATE_F = "Szablon pola" RUBRIK_DOCID_INFO = "Znacznik systemowy, identyfikator dokumentu" RUBRIK_DOCDATE_INFO = "Znacznik systemowy, data publikacji dokumentu" RUBRIK_DOCTIME_INFO = "Znacznik systemowy, data i godzina publikacji dokumentu" -RUBRIK_DATE_INFO = "Znacznik systemowy, data i godzina publikacji dokumentu - konfigurowalny wygląd
. Przykład: [tag: data: Y] " +RUBRIK_DATE_INFO = "Znacznik systemowy, data i godzina publikacji dokumentu - konfigurowalny wygląd
. Przykład: [tag: data: Y]" RUBRIK_DOCAUTHOR_INFO = "Znacznik systemowy, autor dokumentu" RUBRIK_TITLE_INFO = "Znacznik systemowy, tytuł dokumentu" RUBRIK_PATH_INFO = "Znacznik systemowy, ścieżki do instalacji root" @@ -167,9 +167,9 @@ RUBRIK_TEMPLATES_KEYWORDS = "Słowa kluczowe (Meta - słowa kluczowe)" RUBRIK_TEMPLATES_DESCRIPTION = "Opis strony (Meta - Opis)" RUBRIK_TEMPLATES_INDEXFOLLOW = "Typ indeksowania" RUBRIK_TEMPLATES_PATH = "Ścieżka instalacji root" -RUBRIK_TEMPLATES_MEDIAPATH = "Ścieżka do folderu z szablonem (Przykład: [tag: mediapath] images / logo.gif)" -. RUBRIK_TEMPLATES_CSS = "Kompresuje kilka css-plików w jednym. Zwraca ścieżkę
FFF. - nazwy plików oddzielone przecinkami
P - ścieżki do folderu z plikami nie są wymagane. Domyślne - [tag: mediapath] css / 
 Przykład: href = & quot; [tag: CSS: reset.css, style.css] & quot; " -RUBRIK_TEMPLATES_JS = "Kompresuje kilka js-plików w jeden. Zwraca ścieżkę.
FFF. - nazwy plików oddzielone przecinkami
P ścieżki do folderu z plikami nie są wymagane. Domyślne - [tag: mediapath] js / 
 Przykład: href = & quot; [tag: JS: common.js, main.js] & quot; " +RUBRIK_TEMPLATES_MEDIAPATH = "Ścieżka do folderu z szablonem (Przykład: [tag: mediapath] images /logo.gif)" +. RUBRIK_TEMPLATES_CSS = "Kompresuje kilka css-plików w jednym. Zwraca ścieżkę
FFF. -nazwy plików oddzielone przecinkami
P -ścieżki do folderu z plikami nie są wymagane. Domyślne - [tag: mediapath] css /
Przykład: href = & quot; [tag: CSS: reset.css, style.css] & quot; " +RUBRIK_TEMPLATES_JS = "Kompresuje kilka js-plików w jeden. Zwraca ścieżkę.
FFF. - nazwy plików oddzielone przecinkami
P ścieżki do folderu z plikami nie są wymagane. Domyślne - [tag: mediapath] js /
Przykład: href = " [tag: JS: common.js, main.js] & quot; " RUBRIK_RUB_INFO = "Znacznik systemowy, co odpowiada za wyjście zawartości rubryki. Numer ID pola. XXX - liczba znaków do wyświetlania". RUBRIK_SELECT_IN_LIST = "Proszę wybrać pole rubryki z poniższej listy" RUBRIK_TEMPLATE_ITEMS = "Szablon projektu dla elementów wniosku" @@ -180,15 +180,15 @@ RUBRIK_DOCDATE_INFO = "Znacznik systemowy, który odpowiada dacie publikacji nin RUBRIK_CDOCDATE_INFO = "Znacznik systemowy, który odpowiada dacie publikacji niniejszego dokumentu (w którym wywodzi się wniosek)" RUBRIK_DOCTIME_INFO = "Znacznik systemowy, który odpowiada dacie i godzinie publikacji dokumentu" RUBRIK_CDOCTIME_INFO = "Znacznik systemow, który odpowiada dacie i godzinie publikacji niniejszego dokumentu (w którym wywodzi się wniosek)" -RUBRIK_DATE_INFO = "Znacznik systemowy, data i godzina publikacji dokumentu - konfigurowalny wygląd
. Przykład: [tag: data: DMY] 
 Można używać systemów dystrybucyjnych (Spacja - /)" -RUBRIK_CDATE_INFO = "Znacznik systemowy, data i godzina publikacji dokumentu - konfigurowalny wygląd
. Przykład: [tag: data: DMY] 
(W którym wywodzi się wniosek)
Można używać systemów dystrybucyjnych (spacja - / ) " +RUBRIK_DATE_INFO = "Znacznik systemowy, data i godzina publikacji dokumentu - konfigurowalny wygląd
. Przykład: [tag: data: DMY]
Można używać systemów dystrybucyjnych (Spacja - /)" +RUBRIK_CDATE_INFO = "Znacznik systemowy, data i godzina publikacji dokumentu - konfigurowalny wygląd
. Przykład: [tag: data: DMY]
(W którym wywodzi się wniosek)
Można używać systemów dystrybucyjnych (spacja - / ) " RUBRIK_DOCAUTHOR_INFO = "Znacznik systemowy, który odpowiada autoru dokumentu" RUBRIK_DOCAUTHOR_AVATAR = "Znacznik systemowy, który odpowiada awataru autora dokumentu" RUBRIK_CDOCAUTHOR_INFO = "Znacznik systemowy, który odpowiada autoru tego dokumentu (w którym wywodzi się wniosek)" RUBRIK_VIEWS_INFO = "Znacznik systemowy, który pokazuje liczbę przeglądów dokumentu" RUBRIK_COMMENTS_INFO = "Znacznik systemowy, który pokazuje liczbę przeglądów dokumentu Uwaga! Działa tylko w module " RUBRIK_PATH = "Znacznik systemowy, identyfikujący instalacje root" -RUBRIK_MEDIAPATH = "Znacznik systemowy, który określa ścieżki do folderu z szablonem (Przykład: [TAG: mediapath] images / logo.gif)" +RUBRIK_MEDIAPATH = "Znacznik systemowy, który określa ścieżki do folderu z szablonem (Przykład: [TAG: mediapath] images /logo.gif)" RUBRIK_THUMBNAIL = "Znacznik systemowy jest odpowiedzialny za tworzenie miniatury (Pod warunkiem, że w szablonie pola rubryki (szablon dla wyjścia do wniosku) wybrany hest wyjście: [tag: parametr: 0])" RUBRIK_ALIAS_HEAD = "Przypisywanie aliasu w polu" RUBRIK_ALIAS_HEAD_T = "Można używać tylko łacińskich liter i cyfr
Przykład: header " diff --git a/admin/lang/pl/settings.txt b/admin/lang/pl/settings.txt index 7d72581..2cef7c4 100644 --- a/admin/lang/pl/settings.txt +++ b/admin/lang/pl/settings.txt @@ -43,12 +43,12 @@ SETTINGS_EMAIL_FOOTER = "Tekst podpisu" SETTINGS_ERROR_PAGE = "Strona z błędem HTTP Page 404: Nie znaleziono strony" SETTINGS_PAGE_DEFAULT = "(domyślnie ID: 2)" SETTINGS_TEXT_PERM = "Tekst wiadomości, jeśli użytkownik nie ma praw:" -SETTINGS_HIDDEN_TEXT = "Tekst wiadomości bez praw dostępu do informacji ukrytej znacznikiem [tag: hide: x, x] ... [/ tag: hide]" -SETTINGS_NAVI_BOX = "Kontener nawigacji stronicowanej:
Przykład: & lt; ul & gt; % s & lt; / ul & gt; " -SETTINGS_LINK_BOX = "Kontener dla elementów nawigacji stronicowanej:
Przykład: & lt; li & gt; % s & lt; / li & gt; " -SETTINGS_TOTAL_BOX = "Kontener dla tekstu przed numerami stron:
Przykład: & lt; span & gt; % s & lt; / span & gt; " +SETTINGS_HIDDEN_TEXT = "Tekst wiadomości bez praw dostępu do informacji ukrytej znacznikiem [tag: hide:x, x] ... [/ tag: hide]" +SETTINGS_NAVI_BOX = "Kontener nawigacji stronicowanej:
Przykład: & lt; ul & gt; % s & lt; / ul & gt; " +SETTINGS_LINK_BOX = "Kontener dla elementów nawigacji stronicowanej:
Przykład: & lt; li & gt; % s & lt; / li & gt; " +SETTINGS_TOTAL_BOX = "Kontener dla tekstu przed numerami stron:
Przykład: & lt; span & gt; % s & lt; / span & gt; " SETTINGS_ACTIVE_LINK_BOX = "Kontener dla aktywnego elementu:
Przykład: & lt; span class ="aktywny"& gt;% s & lt; / span & gt; " -SETTINGS_PAGE_SEPAR = "Kontener dla metki obecności stron:
Przykład: & lt; li & gt; % s & lt; / li & gt; " +SETTINGS_PAGE_SEPAR = "Kontener dla metki obecności stron:
Przykład: & lt; li & gt; % s & lt; / li & gt; " SETTINGS_PAGE_BEFORE = "Tekst przed numerami stron:
Przykład: Strona%d od %d" SETTINGS_PAGE_START = "Tekst odnośnika " Pierwsza& quot;:" SETTINGS_PAGE_END = " Tekst odnośnika "Ostatnia":" @@ -103,7 +103,7 @@ SETTINGS_CACHE_LIFETIME = "Uwaga!!! Włączono dodanie do pamięci podręcznej w -// v3.2 +# v3.2 SETTINGS_PAGINATION = "Налаштування пагінації" PAGINATION_ADD = "Створити шаблон пагінації" PAGINATION_NAME = "Найменування" diff --git a/admin/lang/pl/sysblocks.txt b/admin/lang/pl/sysblocks.txt index 6f103cc..05c82ff 100644 --- a/admin/lang/pl/sysblocks.txt +++ b/admin/lang/pl/sysblocks.txt @@ -62,7 +62,7 @@ SYSBLOCK_ERROR = "Błąd" SYSBLOCK_SUCCESS = "Gotowe" -// v 3.2 +# v 3.2 SYSBLOCK_DESCRIPTION = "Короткий опис" SYSBLOCK_ALIAS = "Аліас" SYSBLOCK_I = "Опціонально. Аліас дозволяє використовувати легкий для запам’ятовування тег [tag:sysblock:alias] замість [tag:sysblock:id]. Аліас не повинен бути числом, може містити тільки цифри, латинські літери, дефіс, підкреслення, мати довжину не більше 20 символів та бути унікальним у межах цих блоків" diff --git a/admin/lang/pl/templates.txt b/admin/lang/pl/templates.txt index 1a3e47f..a2091e2 100644 --- a/admin/lang/pl/templates.txt +++ b/admin/lang/pl/templates.txt @@ -9,7 +9,7 @@ TEMPLATES_NAME3 = "Wprowadź nazwę szablonu" TEMPLATES_AUTHOR = "Author" TEMPLATES_DATE = "Utworzony" TEMPLATES_ACTION = "Działania" -TEMPLATES_DATE_FORMAT = "%d.%m.%y r." +TEMPLATES_DATE_FORMAT = "%d.%m.%yr." TEMPLATES_DATE_FORMAT2 = "%H:%M" TEMPLATES_IN = "w" TEMPLATES_EDIT = "Edytuj szablon" @@ -62,8 +62,8 @@ TEMPLATES_INDEXFOLLOW = "Typ indeksowania" TEMPLATES_CANONICAL = "Strona kanoniczna –to zalecana kopia z zestawu stron o bardzo podobnej treści." TEMPLATES_PATH = "Ścieżka instalacji root" TEMPLATES_MEDIAPATH = "Ścieżki do folderu z szablonem (Przykład: [znacznik:mediapath]images/logo.gif)" -TEMPLATES_CSS = "Kompresuje kilka css-plików w jednym. Zwraca ścieżkę.
FFF - nazwy plików oddzielone przecinkami
P - ścieżki do folderu z plikami, nie jest wymagane. Domyślne - [znacznik: mediapath] css / 
 Przykład: href ="[znacznik: CSS: reset.css, style.css]"" -TEMPLATES_JS = "Kompresuje kilka js-plików w jeden. Zwraca ścieżkę.
FFF - nazwy plików oddzielone przecinkami
P - ścieżki do folderu z plikami, nie jest wymagane. Domyślne - [znacznik:mediapath]js/
 Przykład: href ="[znacznik: JS: common.js, main.js] & quot;" +TEMPLATES_CSS = "Kompresuje kilka css-plików w jednym. Zwraca ścieżkę.
FFF - nazwy plików oddzielone przecinkami
P - ścieżki do folderu z plikami, nie jest wymagane. Domyślne - [znacznik: mediapath] css /
Przykład: href ="[znacznik: CSS: reset.css, style.css]"" +TEMPLATES_JS = "Kompresuje kilka js-plików w jeden. Zwraca ścieżkę.
FFF - nazwy plików oddzielone przecinkami
P - ścieżki do folderu z plikami, nie jest wymagane. Domyślne - [znacznik:mediapath]js/
Przykład: href ="[znacznik: JS: common.js, main.js] & quot;" TEMPLATES_MEDIAPATH = "Ścieżki do folderu z szablonem (Przykład: [znacznik: mediapath]images/logo.gif)" TEMPLATES_MAINCONTENT = "Znacznik dla głównej treści" TEMPLATES_QUICKFINDER = "Menu kontekstowe szybkiej nawigacji" diff --git a/admin/lang/pl/user.txt b/admin/lang/pl/user.txt index 603d606..d6ce56b 100644 --- a/admin/lang/pl/user.txt +++ b/admin/lang/pl/user.txt @@ -72,9 +72,9 @@ USER_ERROR_FIRSTNAME = "Pole imię użytkownika zawiera nieprawidłowe znaki." USER_ERROR_USERNAME = "Pole login zawiera nieprawidłowe znaki." USER_NO_LASTNAME = "Pole nazwisko użytkownika jest puste. Proszę podać nazwisko użytkownika" USER_ERROR_LASTNAME = "Pole nazwisko użytkownika zawiera nieprawidłowe znaki." -USER_MAIL_BODY1 = "Witaj %USER%,% N %% N %" +USER_MAIL_BODY1 = "Witaj %USER%,% N %% N%" USER_MAIL_BODY2 = "Twoje konto zostało aktywowane. Proszę używać hasła dostępu dla wejęćia na stronę intwrnetową %HOST%." -USER_MAIL_FOOTER = "%NN%% Z poważaniem, %HOMEPAGENAME%%%%NN%% HOST%" +USER_MAIL_FOOTER = "%NN%% Z poważaniem, %HOMEPAGENAME%%%%NN%%HOST%" USER_MAIL_SUBJECT = "Twoje konto zostało aktywowane" USER_MAIL_PASSWORD = "Informacja o zmianię hasła" USER_MAIL_PASSWORD2 = "Meldujemy o zresetowaniu hasła % N% N %% Nowe hasło: %NEWPASS%" diff --git a/admin/lang/ru/blocks.txt b/admin/lang/ru/blocks.txt index 4cebd00..6027e97 100644 --- a/admin/lang/ru/blocks.txt +++ b/admin/lang/ru/blocks.txt @@ -60,7 +60,7 @@ BLOCK_SAVED_ERR = "Не удалось сохранить визуальный BLOCK_ERROR = "Ошибка" BLOCK_SUCCESS = "Выполнено" -// v 3.2 +# v 3.2 BLOCK_DESCRIPTION = "Краткое описание" BLOCK_ALIAS = "Алиас" BLOCK_I = "Опционально. Алиас позволяет использовать легко запоминающийся тег [tag:BLOCK:alias] вместо [tag:BLOCK:id]. Алиас не должен являться числом, может содержать только цифры, латинские буквы, дефис, подчёркивание, иметь длину не более 20 символов и быть уникальным в пределах данных блоков" diff --git a/admin/lang/ru/docs.txt b/admin/lang/ru/docs.txt index 75ab868..4de3d8c 100644 --- a/admin/lang/ru/docs.txt +++ b/admin/lang/ru/docs.txt @@ -127,6 +127,7 @@ DOC_BUTTON_NOTICE = "Выполнить" DOC_NOTICE_TITLE = "Заголовок:" DOC_NOTICE_TEXT = "Заметка:" DOC_BUTTON_ADD_NOTICE = "Добавить заметку" +DOC_NOTICE_DELETE_ALL = "Удалить все заметки" DOC_SEND_NOTICE_INFO = "Для того, чтобы добавить новую заметку к документу, пожалуйста, заполните поля в форме ниже." DOC_NEW_NOTICE_TITLE = "Добавить новую заметку" DOC_MAIL_BODY_CHECK = "Пользователь %USER% добавил новый документ с названием '%TITLE%'.%N%Пожалуйста, проверьте данный документ перед публикацией." @@ -286,7 +287,7 @@ DOC_SEARCH_FIELD_TEXT = "Значение" DOC_TEMPLATE_DEFAULT = "Использовать по умолчанию" DOC_SHOW_LANG = "Показать" -// 3.2 +# 3.2 DOC_TABS_META = "Meta данные" DOC_TABS_URL = "URL документа" DOC_TABS_DATE = "Дата публикации" @@ -301,10 +302,10 @@ DOC_LANG = "Язык" DOC_LANG_ID = "Язык документа:" DOC_LANG_SELECT = "Выберите язык" -// 3.25 +# 3.25 DOC_CLOSE_SEARCH_RUBRIC = "Вернуться в раздел, учитывая параметры поиска" -// 3.26 +# 3.26 DOC_POSITION = "Позиция" DOCUMENT_POSITION = "Позиция документа" DOCUMENT_POSITION_ERR = "Не удалось сохранить позицию документа" diff --git a/admin/lang/ru/main.txt b/admin/lang/ru/main.txt index 25b5e4f..a4e86e6 100644 --- a/admin/lang/ru/main.txt +++ b/admin/lang/ru/main.txt @@ -299,8 +299,6 @@ WRONG_CAPTCHA = "Ошибка:
Неправильный з oficial_site = "Официальный сайт" support = "Служба технической поддержки" -// 3.1.9 MAIN_BLOCKS = "Визуальные блоки" -// 3.27 MAIN_SETTINGS_SHOWCACHE = "Подробные данные" \ No newline at end of file diff --git a/admin/lang/ru/navigation.txt b/admin/lang/ru/navigation.txt index 9ecf20b..00c93ac 100644 --- a/admin/lang/ru/navigation.txt +++ b/admin/lang/ru/navigation.txt @@ -93,14 +93,14 @@ NAVI_ITEM_EDIT = "Редактировать пункт меню" NAVI_ITEM_DELETE = "Удалить данный пункт меню" NAVI_ITEM_DELETE_CONFIRM = "Вы уверены, что хотите удалить данный пукт меню навигации?" -// v 3.2 +# v 3.2 NAVI_ALIAS = "Алиас" NAVI_I = "Опционально. Алиас позволяет использовать легко запоминающийся тег [tag:sysblock:alias] вместо [tag:sysblock:id]. Алиас не должен являться числом, может содержать только цифры, латинские буквы, дефис, подчёркивание, иметь длину не более 20 символов и быть уникальным в пределах модуля" NAVI_ACCEPT = "Этот алиас можно использовать" NAVI_ER_SYN = "Неверный алиас!
Алиас не должен являться числом, может содержать только цифры, латинские буквы, дефис, подчёркивание и иметь длину не более 20 символов" NAVI_ER_EXISTS = "Неверный алиас!
Данный алиас уже привязан к другому меню" -//from templates +# from templates NAVI_NOLINK_DOC = "Нет связанного документа" NAVI_EDIT_ITEM = "Редактирование пункта меню" NAVI_LINK_FILEDOC = "Связать с документом/файлом" diff --git a/admin/lang/ru/request.txt b/admin/lang/ru/request.txt index 5f9f805..cad7b92 100644 --- a/admin/lang/ru/request.txt +++ b/admin/lang/ru/request.txt @@ -183,7 +183,7 @@ REQUEST_REPORT_ERR_RUBRIC= "Не выбрана рубрика" REQUEST_BY_PARENT = "Родительскому документу" REQUEST_SHOW_STAT = "Показать статистику" -// v 3.1.9 +# v 3.1.9 REQUEST_ALIAS = "Алиас" REQUEST_I = "Опционально. Алиас позволяет использовать легко запоминающийся тег [tag:request:alias] вместо [tag:request:id]. Алиас не должен являться числом, может содержать только цифры, латинские буквы, дефис, подчёркивание, иметь длину не более 20 символов и быть уникальным в пределах модуля" REQUEST_ACCEPT = "Этот алиас можно использовать" @@ -193,7 +193,7 @@ REQUEST_HEADER_EXTERNAL = "Внешнее обращение" REQUEST_EXTERNAL = "Разрешить внешнее обращение" REQUEST_ONLY_AJAX = "Выполнять только по Ajax" -// v 3.2 +# v 3.2 REQUEST_PAGINATION = "Постраничная навигация" REQUEST_NAVI_TPL = "Шаблон постраничной навигации" REQUEST_OTHER = "Прочее" @@ -202,13 +202,13 @@ REQUEST_DOC_ON_PAGE = "Число элементов запроса на ст REQUEST_PAGES_CURENT = "Номер страницы пагинации" REQUEST_PAGES_TOTAL = "Общее кол-во страниц пагинации" -// v 3.24 +# v 3.24 REQUEST_COUNT_ITEMS = "Выводить в тег [tag:doctotal] кол-во элементов, когда не используется постраничная навигация" -// v 3.26 +# v 3.26 REQUEST_BY_POSITION = "Позиция документа" -// v 4.0 +# v 4.0 REQUEST_SORT_TITEL = "Сортировка вывода запросов по параметрам или полям документа. Количество запросов на одной странице" REQUEST_SORT_BY_I = "Сортировка по параметру документа возможна только тогда, когда в выпадающем списке 'Сортировать по полю документа' выбрано пустое значение." REQUEST_SORT_BY_I_2 = "Сортировка по полю документа работает после выбора любого, кроме пустого значения, значение выбранное в выпадающем списке 'Сортировка по параметру документа' будет игнорироваться." diff --git a/admin/lang/ru/rubs.txt b/admin/lang/ru/rubs.txt index 31c66da..80b505e 100644 --- a/admin/lang/ru/rubs.txt +++ b/admin/lang/ru/rubs.txt @@ -280,7 +280,7 @@ RUBRIC_TMPLS_INNAME = "Введите наименование шабл RUBRIC_TEMPL_REPORT = "Отредактировал дополнительный шаблон рубрики" RUBRIC_TMPLS_LOG_DEL = "Удалил дополнительный шаблон рубрики" -// 3.24 +# 3.24 RUBRIC_WARNING_TIP = "Внимание! Пожалуйста, будьте предельно внимательны и помните, что неверные параметры могут сделать систему неработоспособной." RUBRIK_EDIT_FIELDS = "Управление полями" diff --git a/admin/lang/ru/settings.txt b/admin/lang/ru/settings.txt index f3afa1e..8d621b7 100644 --- a/admin/lang/ru/settings.txt +++ b/admin/lang/ru/settings.txt @@ -115,7 +115,7 @@ SETTINGS_COUNT_DELETED_ERR = "Не удалось обнулить поднев SETTINGS_COUNT_UPDATE = "Обнулили подневный счетчик документов" SETTINGS_CACHE_LIFETIME = "Внимание!!! Включено кеширование запроса к настройкам системы. Изменения вступят в силу, только после окончания времени жизни кеша или отключения кеширования" -// v3.2 +# v3.2 SETTINGS_PAGINATION = "Настройка пагинации" PAGINATION_ADD = "Создать шаблон пагинации" PAGINATION_NAME = "Наименование" @@ -141,7 +141,7 @@ pagination_end_label = "Текст ссылки "Последняя"" pagination_next_label = "Текст ссылки "Следующая"" pagination_prev_label = "Текст ссылки "Предыдущая"" -// v3.24 +# v3.24 SETTINGS_SAVED_ERR_FILE = "Ошибка при сохранении файла. Попробуйте снова." SETTINGS_SAVED_FILE = "Файл успешно сохранен." SETTINGS_FILE_EDIT_H = "Редактирование файла" @@ -149,7 +149,7 @@ SETTINGS_FILE_CONTENT = "Содержимое файла:" SETTINGS_FILE_ROBOTS = "Файл robots.txt" SETTINGS_FILE_CUSTOM = "Файл func.custom.php" -// v3.25 +# v3.25 _const_auth = "Авторизация" _const_url = "Формирование URL" _const_themes = "Оформление" @@ -166,7 +166,7 @@ _const_request = "Запросы" _const_database = "База данных" _const_other = "Прочее" -// 3.27 +# 3.27 SETTINGS_CACHE_TITLE = "Работа с кешем" SETTINGS_SHOWCACHE = "Управление кешем" SETTINGS_CACHE_H_TITLE = "Тип кеша" @@ -189,4 +189,5 @@ SETTINGS_CACHE_T_MODULES = "Данные модулей" SETTINGS_CACHE_T_QUERIES = "Данные запросов" SETTINGS_CACHE_T_DOCS = "Данные документов" -SETTINGS_CACHE_T_COMPILED = "Данные скомпилированных документов" \ No newline at end of file +SETTINGS_CACHE_T_COMPILED = "Данные скомпилированных документов" +SETTINGS_LANG_FLAG = "Флаг" \ No newline at end of file diff --git a/admin/lang/ru/sysblocks.txt b/admin/lang/ru/sysblocks.txt index 5febec6..12b953b 100644 --- a/admin/lang/ru/sysblocks.txt +++ b/admin/lang/ru/sysblocks.txt @@ -67,7 +67,7 @@ SYSBLOCK_ERROR = "Ошибка" SYSBLOCK_SUCCESS = "Выполнено" -// v 3.2 +# v 3.2 SYSBLOCK_DESCRIPTION = "Краткое описание" SYSBLOCK_ALIAS = "Алиас" SYSBLOCK_I = "Опционально. Алиас позволяет использовать легко запоминающийся тег [tag:sysblock:alias] вместо [tag:sysblock:id]. Алиас не должен являться числом, может содержать только цифры, латинские буквы, дефис, подчёркивание, иметь длину не более 20 символов и быть уникальным в пределах модуля" @@ -75,7 +75,7 @@ SYSBLOCK_ACCEPT = "Этот алиас можно использовать" SYSBLOCK_ER_SYN = "Неверный алиас!
Алиас не должен являться числом, может содержать только цифры, латинские буквы, дефис, подчёркивание и иметь длину не более 20 символов" SYSBLOCK_ER_EXISTS = "Неверный алиас!
Данный алиас уже привязан к другоому системному блоку" -// v 3.26 +# v 3.26 SYSBLOCK_EVAL = "Выполнять PHP перед возвращением результата" SYS_GROUP_NO_TITLE = "Без группы" SYS_GROUP_NO_DESCRIPTION = "Описание отсутвует" diff --git a/admin/lang/ua/docs.txt b/admin/lang/ua/docs.txt index fda6198..f00ce72 100644 --- a/admin/lang/ua/docs.txt +++ b/admin/lang/ua/docs.txt @@ -286,7 +286,7 @@ DOC_SEARCH_FIELD_TEXT = "Значення" DOC_TEMPLATE_DEFAULT = "Використовувати по замовчуванню" DOC_SHOW_LANG = "Показати" -// 3.2 +# 3.2 DOC_TABS_META = "Meta дані" DOC_TABS_URL = "URL документа" DOC_TABS_DATE = "Дата публікації" @@ -297,15 +297,15 @@ DOC_SAVE_ADD = "Додав" DOC_SAVE_EDIT = "Відредагував" DOC_SAVE_LOG_DOC = " документ" -/* new */ +# /* new */ DOC_LANG = "Мова" DOC_LANG_ID = "Мова документа:" DOC_LANG_SELECT = "Оберіть мову" -// 3.25 +# 3.25 DOC_CLOSE_SEARCH_RUBRIC = "Повернутися у розділ, враховуючи параметри пошуку" -// 3.26 +# 3.26 DOC_POSITION = "Позиція" DOCUMENT_POSITION = "Позиція документа" DOCUMENT_POSITION_ERR = "Не вдалося зберегти позицію документа" diff --git a/admin/lang/ua/main.txt b/admin/lang/ua/main.txt index 03d7372..f2f953e 100644 --- a/admin/lang/ua/main.txt +++ b/admin/lang/ua/main.txt @@ -301,5 +301,5 @@ WRONG_CAPTCHA = "Помилка:
Неправильний oficial_site = "Офіційний сайт" support = "Служба технічної підтримки" -// 3.1.9 +# 3.1.9 MAIN_BLOCKS = "Візуальні блоки" diff --git a/admin/lang/ua/navigation.txt b/admin/lang/ua/navigation.txt index 61f7a72..dc2eca7 100644 --- a/admin/lang/ua/navigation.txt +++ b/admin/lang/ua/navigation.txt @@ -96,14 +96,14 @@ NAVI_ITEM_DELETE = "Видалити цей пункт меню" NAVI_ITEM_DELETE_CONFIRM = "Ви впевнені, що бажаєте видалити цей пукт меню навігації?" -// v 3.2 +# v 3.2 NAVI_ALIAS = "Аліас" NAVI_I = "Опціонально. Аліас дозволяє використовувати легкий для запам’ятовування тег [tag:sysblock:alias] замість [tag:sysblock:id]. Аліас не може бути числом, може містити тільки цифри, латинські літери, дефіс, підкреслення, мати довжину не більше 20 символів та бути унікальним у межах модуля" NAVI_ACCEPT = "Цей аліас можна використовувати" NAVI_ER_SYN = "Неправильний аліас!
Аліас не може бути числом, може містити тільки цифри, латинські літери, дефіс, підкреслення та мати довжину не більше 20 символів" NAVI_ER_EXISTS = "Неправильний аліас!
Цей аліас уже прив’язаний до іншого меню" -//from templates +# from templates NAVI_NOLINK_DOC = "Немає зв’язаного документа" NAVI_EDIT_ITEM = "Редагування пункта меню" NAVI_LINK_FILEDOC = "Зв’язати з документом/файлом" @@ -129,6 +129,6 @@ NAVI_ITEM_ODD = "непарний" NAVI_TAG = "Тег для вставки пунктів" NAVI_LAVEL_TEMPL = "Шаблон рівня" NAVI_CONDITIONS = "Умови" -/**/ +# /**/ NAVI_CLOSE = "Закрити" NAVI_ADD_AFTER = "Додати після" diff --git a/admin/lang/ua/request.txt b/admin/lang/ua/request.txt index 1509812..9da8038 100644 --- a/admin/lang/ua/request.txt +++ b/admin/lang/ua/request.txt @@ -177,7 +177,7 @@ REQUEST_SHOW_STAT = "Показати статистику" -// v 3.1.9 +# v 3.1.9 REQUEST_ALIAS = "Аліас" REQUEST_I = "Опціонально. Аліас дозволяє використовувати легкий для запам’ятовування тег [tag:request:alias] замість [tag:request:id]. Аліас не повинен бути числом, може містити тільки цифри, латинські літери, дефіс, підкреслення, мати довжину не більше 20 символів та бути унікальним у межах модуля" REQUEST_ACCEPT = "Цей Аліас можна використовувати" @@ -187,7 +187,7 @@ REQUEST_HEADER_EXTERNAL = "Зовнішнє звернення" REQUEST_EXTERNAL = "Дозволити зовнішнє звернення" REQUEST_ONLY_AJAX = "Виконувати тільки по Ajax" -// v 3.2 +# v 3.2 REQUEST_PAGINATION = "Посторінкова навігація" REQUEST_NAVI_TPL = "Шаблон посторінкової навігації" REQUEST_OTHER = "Інше" @@ -196,8 +196,8 @@ REQUEST_DOC_ON_PAGE = "Число елементів запиту на сто REQUEST_PAGES_CURENT = "Номер сторінки пагінації" REQUEST_PAGES_TOTAL = "Загальна кількість сторінок пагінації" -// v 3.24 +# v 3.24 REQUEST_COUNT_ITEMS = "Отримувати кількість елементів (якщо не використовується посторінкова навігація)" -// v 3.26 +# v 3.26 REQUEST_BY_POSITION = "Позиція документа" diff --git a/admin/lang/ua/rubs.txt b/admin/lang/ua/rubs.txt index d4aa8c2..2855372 100644 --- a/admin/lang/ua/rubs.txt +++ b/admin/lang/ua/rubs.txt @@ -279,7 +279,7 @@ RUBRIC_TMPLS_INNAME = "Введіть назву шаблона" RUBRIC_TEMPL_REPORT = "Відредагував додатковий шаблон рубрики" RUBRIC_TMPLS_LOG_DEL = "Видалив додатковий шаблон рубрики" -// 3.24 +# 3.24 RUBRIC_WARNING_TIP = "Увага! Будь ласка, будьте максимально уважні та пам'ятайте, що неправильні параметри можуть зробити систему непрацеспроможною." RUBRIK_EDIT_FIELDS = "Керування полями" diff --git a/admin/lang/ua/settings.txt b/admin/lang/ua/settings.txt index b9ea87c..db758de 100644 --- a/admin/lang/ua/settings.txt +++ b/admin/lang/ua/settings.txt @@ -108,7 +108,7 @@ SETTINGS_COUNT_DELETED_ERR = "Не вдалося обнулити поденн SETTINGS_COUNT_UPDATE = "Обнулено поденний лічильник документів" SETTINGS_CACHE_LIFETIME = "Увага!!! Увімкнено кешування запиту до налаштувань системи. Зміни набудуть чинності, тільки після закінчення часу життя кеша або відключення кешування" -// v3.2 +# v3.2 SETTINGS_PAGINATION = "Налаштування пагінації" PAGINATION_ADD = "Створити шаблон пагінації" PAGINATION_NAME = "Найменування" @@ -134,7 +134,7 @@ pagination_end_label = "Текст посилання “Остання”" pagination_next_label = "Текст посилання “Наступна”" pagination_prev_label = "Текст посилання “Попередня”" -// v3.24 +# v3.24 SETTINGS_SAVED_ERR_FILE = "Помилка при збереженні файлу. Спробуйте ще раз." SETTINGS_SAVED_FILE = "Файл успішно збережено." SETTINGS_FILE_EDIT_H = "Редагування файлу" @@ -142,7 +142,7 @@ SETTINGS_FILE_CONTENT = "Вміст файлу:" SETTINGS_FILE_ROBOTS = "Файл robots.txt" SETTINGS_FILE_CUSTOM = "Файл func.custom.php" -// v3.25 +# v3.25 _const_auth = "Авторизація" _const_url = "Формування URL" _const_themes = "Оформлення" diff --git a/admin/lang/ua/sysblocks.txt b/admin/lang/ua/sysblocks.txt index 2178553..7d8fab6 100644 --- a/admin/lang/ua/sysblocks.txt +++ b/admin/lang/ua/sysblocks.txt @@ -68,7 +68,7 @@ SYSBLOCK_SAVED_ERR = "Не вдалося зберегти системний SYSBLOCK_ERROR = "Помилка" SYSBLOCK_SUCCESS = "Виконано" -// v 3.2 +# v 3.2 SYSBLOCK_DESCRIPTION = "Короткий опис" SYSBLOCK_ALIAS = "Аліас" SYSBLOCK_I = "Опціонально. Аліас дозволяє використовувати легкий для запам’ятовування тег [tag:sysblock:alias] замість [tag:sysblock:id]. Аліас не повинен бути числом, може містити тільки цифри, латинські літери, дефіс, підкреслення, мати довжину не більше 20 символів та бути унікальним у межах цих блоків" @@ -76,7 +76,7 @@ SYSBLOCK_ACCEPT = "Цей аліас можна використовувати" SYSBLOCK_ER_SYN = "Неправильний аліас!
Аліас не повинен бути числом, може містити тільки цифри, латинські літери, дефіс, підкреслення та мати довжину не більше 20 символів" SYSBLOCK_ER_EXISTS = "Неправильний аліас!
Такий аліас уже прив’язаний до іншого системного блока" -// v 3.26 +# v 3.26 SYSBLOCK_EVAL = "Виконувати PHP перед поверненням результату" SYS_GROUP_NO_TITLE = "Без групи" SYS_GROUP_NO_DESCRIPTION = "Опис відсутній" diff --git a/admin/navigation.php b/admin/navigation.php index 28ce69a..d54216e 100644 --- a/admin/navigation.php +++ b/admin/navigation.php @@ -80,7 +80,7 @@ case 'itemedit': if (check_permission_acp('navigation_edit')) { - $AVE_Navigation->navigationItemEdit((int)$_REQUEST['navigation_item_id']); + $AVE_Navigation->navigationItemEdit((int)(isset($_REQUEST['navigation_item_id']) ? $_REQUEST['navigation_item_id'] : 0)); } break; @@ -129,7 +129,7 @@ case 'alias': if (check_permission_acp('navigation_edit')) { - echo $AVE_Navigation->navigationValidate($_REQUEST['alias'], (int)$_REQUEST['id']); + echo $AVE_Navigation->navigationValidate($_REQUEST['alias'], (int)(isset($_REQUEST['id']) ? $_REQUEST['id'] : 0)); } exit; } diff --git a/admin/request.php b/admin/request.php index 6abf11d..73a420e 100644 --- a/admin/request.php +++ b/admin/request.php @@ -94,7 +94,7 @@ switch ($_REQUEST['action']) case 'alias': if (check_permission_acp('request_edit')) { - echo $AVE_Request->requestValidate($_REQUEST['alias'], (int)$_REQUEST['id']); + echo $AVE_Request->requestValidate($_REQUEST['alias'], (int)($_REQUEST['id'] ?? 0)); } exit; } diff --git a/admin/rubs.php b/admin/rubs.php index 554f5dc..ccf378e 100644 --- a/admin/rubs.php +++ b/admin/rubs.php @@ -250,7 +250,7 @@ case 'fields': if(check_permission_acp('rubric_edit')) { - $AVE_Rubric->rubricFieldShow((int)$_REQUEST['Id'], $_REQUEST['ajax']); + $AVE_Rubric->rubricFieldShow((int)($_REQUEST['Id'] ?? 0), $_REQUEST['ajax'] ?? ''); } break; diff --git a/admin/settings.php b/admin/settings.php index 685c4ea..f2c374d 100644 --- a/admin/settings.php +++ b/admin/settings.php @@ -68,7 +68,7 @@ } break; - case 'language': +case 'language': if(check_permission_acp('gen_settings_languages')) { if (isset($_REQUEST['func'])) @@ -106,6 +106,11 @@ case 'save': $AVE_Settings->settingsLanguageEditSave(); exit; + + // !!! ДОБАВЛЕНО !!! + case 'editlang': + $AVE_Settings->settingsLanguageEdit(); + break; } } else diff --git a/admin/templates/blocks/form.tpl b/admin/templates/blocks/form.tpl index 7f88d5e..c848e6e 100644 --- a/admin/templates/blocks/form.tpl +++ b/admin/templates/blocks/form.tpl @@ -22,8 +22,8 @@
  • {#BLOCK_LIST_LINK#}
  • -
  • {if $smarty.request.id != ''}{#BLOCK_EDIT_H#}{else}{#BLOCK_INSERT_H#}{/if}
  • -
  • {if $smarty.request.id != ''}{$block_name|escape}{else}{$smarty.request.block_name}{/if}
  • +
  • {if isset($smarty.request.id) && $smarty.request.id != ''}{#BLOCK_EDIT_H#}{else}{#BLOCK_INSERT_H#}{/if}
  • +
  • {if isset($smarty.request.id) && $smarty.request.id != ''}{$block_name|escape}{else}{$smarty.request.block_name}{/if}
  • @@ -31,7 +31,7 @@
    -
    {if $smarty.request.id != ''}{#BLOCK_EDIT_H#}{else}{#BLOCK_INSERT_H#}{/if}
    +
    {if isset($smarty.request.id) && $smarty.request.id != ''}{#BLOCK_EDIT_H#}{else}{#BLOCK_INSERT_H#}{/if}
    @@ -42,14 +42,14 @@ @@ -60,8 +60,8 @@ - - -
    {#BLOCK_NAME#}
    - +
    {#BLOCK_DESCRIPTION#} - +
    -   - +   + @@ -86,7 +86,7 @@
    - {if $smarty.request.id != ''} + {if isset($smarty.request.id) && $smarty.request.id != ''} {else} diff --git a/admin/templates/browser/browser.tpl b/admin/templates/browser/browser.tpl index 63d8c35..18eade3 100644 --- a/admin/templates/browser/browser.tpl +++ b/admin/templates/browser/browser.tpl @@ -52,8 +52,8 @@ {if $dir != '/'}
    -
    - +
    +
    {/if} @@ -61,7 +61,7 @@ {foreach from=$dirs item=dir_link key=dir_name}
    -
    +
    {$dir_name}
    @@ -110,7 +110,7 @@ parent.window.$('.openDialog').prop( {ldelim} - href: 'index.php?do=browser&type={$smarty.request.type|escape}&target={$smarty.request.target|escape}&action=upload&dir=' + parent.document.bForm.bDirName.value + href: 'index.php?do=browser&type={$smarty.request.type|escape}&target={$smarty.request.target|default:''|escape}&action=upload&dir=' + parent.document.bForm.bDirName.value {rdelim}); {literal} @@ -171,7 +171,7 @@ function(b){ldelim} if (b){ldelim} $.alerts._overlay('show'); - parent.frames['zf'].location.href = 'index.php?do=browser&type={$smarty.request.typ|escape}&action=delfile&dir={$dir}&file=' + fName; + parent.frames['zf'].location.href = 'index.php?do=browser&type={$smarty.request.typ|default:''|escape}&action=delfile&dir={$dir}&file=' + fName; $.alerts._overlay('hide'); {rdelim} {rdelim} diff --git a/admin/templates/browser/browser_2frames.tpl b/admin/templates/browser/browser_2frames.tpl index d42337b..fc1df5b 100644 --- a/admin/templates/browser/browser_2frames.tpl +++ b/admin/templates/browser/browser_2frames.tpl @@ -170,7 +170,7 @@ window.opener.CKEDITOR.tools.callFunction(funcNum, fileUrl); {elseif $target=='navi'} - window.opener.document.getElementById('{$smarty.request.id|escape}').value = '/{$mediapath}' + document.bForm.bDirName.value + document.bForm.bFileName.value; + window.opener.document.getElementById('{$smarty.request.id|default:null|escape}').value = '/{$mediapath}' + document.bForm.bDirName.value + document.bForm.bFileName.value; {elseif $target=='img_feld' || $target_img=='img_feld'} let imgSource = '/' + '{$mediapath}' + document.bForm.bDirName.value + document.bForm.bFileName.value; @@ -201,10 +201,10 @@ {/if} {elseif $target!='all'} - {if $smarty.request.fillout=='dl'} + {if isset($smarty.request.fillout) and $smarty.request.fillout == 'dl'} window.opener.document.getElementById('{$smarty.request.target|escape}').value = '/{$mediapath}' + document.bForm.bDirName.value + document.bForm.bFileName.value; {else} - + //window.opener.updatePreview(); {/if} {/if} setTimeout("self.close();", 100); diff --git a/admin/templates/browser/browser_upload.tpl b/admin/templates/browser/browser_upload.tpl index 309449e..eb0bfdb 100644 --- a/admin/templates/browser/browser_upload.tpl +++ b/admin/templates/browser/browser_upload.tpl @@ -5,7 +5,7 @@
    - +
    diff --git a/admin/templates/documents/change.tpl b/admin/templates/documents/change.tpl index 289d9c8..7df0206 100644 --- a/admin/templates/documents/change.tpl +++ b/admin/templates/documents/change.tpl @@ -31,10 +31,13 @@ function ChangeRazd() {ldelim}
    - {foreach from=$rubrics item=rubric} {if $rubric->Show==1} - + {/if} {/foreach} diff --git a/admin/templates/documents/doc_search.tpl b/admin/templates/documents/doc_search.tpl index 8f7c258..1d0073f 100644 --- a/admin/templates/documents/doc_search.tpl +++ b/admin/templates/documents/doc_search.tpl @@ -1,162 +1,179 @@ - - {if $smarty.request.action} - {/if}{if $smarty.request.target_title} - {/if}{if $smarty.request.target} - {/if}{if $smarty.request.doc} - {/if}{if $smarty.request.document_alias} - {/if}{if $smarty.request.idtitle} - {/if}{if $smarty.request.selurl} - {/if}{if $smarty.request.selecturl} - {/if}{if $smarty.request.idonly} - {/if}{if $smarty.request.sort} - {/if}{if $smarty.request.pop} - {/if}{if $smarty.request.CKEditor} - {/if}{if $smarty.request.CKEditorFuncNum} - {/if}{if $smarty.request.langCode} - {/if}{if $smarty.request.function} - {/if} + +{* БЕЗОПАСНОСТЬ PHP 8+: Всегда используем |default:'' и проверку !empty() *} +{if !empty($smarty.request.action)} +{/if}{if !empty($smarty.request.target_title)} +{/if}{if !empty($smarty.request.target)} +{/if}{if !empty($smarty.request.doc)} +{/if}{if !empty($smarty.request.document_alias)} +{/if}{if !empty($smarty.request.idtitle)} +{/if}{if !empty($smarty.request.selurl)} +{/if}{if !empty($smarty.request.selecturl)} +{/if}{if !empty($smarty.request.idonly)} +{/if}{if !empty($smarty.request.sort)} +{/if}{if !empty($smarty.request.pop)} +{/if}{if !empty($smarty.request.CKEditor)} +{/if}{if !empty($smarty.request.CKEditorFuncNum)} +{/if}{if !empty($smarty.request.langCode)} +{/if}{if !empty($smarty.request.function)} +{/if}
    -
    {#MAIN_SEARCH_DOCUMENTS#}
    -
    +
    {#MAIN_SEARCH_DOCUMENTS#}
    +
    - - - - - - - - - - - - - - +++++++ + + + + + + + - - - - - - - + + + + + + + - {if $fields} - - - - - - - {/if} - - - - - - - - - - - - + + - - - - + + + + + + {/if} + + + + + + + - - - + + + + + + + - {if $smarty.request.rubric_id} - {/if} + + + + + {if !empty($smarty.request.rubric_id)} + + {/if} + +
    {#MAIN_TIME_PERIOD#} -
    -
    {#MAIN_TITLE_SEARCH#} [?] -
    -
    {#MAIN_SELECT_RUBRIK#} - -
    {#MAIN_TIME_PERIOD#} +{* ИСПРАВЛЕНИЕ: Используем стандартный блок {if}/{else} для безопасного присвоения значения даты. *} +{if !empty($smarty.request.document_published)} +{assign var="published_date_formatted" value=$smarty.request.document_published|date_format:"%d.%m.%Y"} +{else} +{assign var="published_date_formatted" value=''} +{/if} +
    +
    {#MAIN_TITLE_SEARCH#} [?] +
    +
    {#MAIN_SELECT_RUBRIK#} + +
    -
    -
    {#MAIN_ID_SEARCH#}{#MAIN_DOCUMENT_STATUS#} - -
    + {* ИСПРАВЛЕНИЕ: Используем стандартный блок {if}/{else} для безопасного присвоения значения даты. *} + {if !empty($smarty.request.document_expire)} + {assign var="expire_date_formatted" value=$smarty.request.document_expire|date_format:"%d.%m.%Y"} + {else} + {assign var="expire_date_formatted" value=''} + {/if} +
    +
    {#MAIN_ID_SEARCH#} + + {#MAIN_DOCUMENT_STATUS#} + +
    - {#DOC_SEARCH_FIELD#} - - - - - -
    - -
    -
    - {#DOC_SEARCH_PARAM#} - - - - - -
    - -
    -
    - {#DOC_LANG_ID#} - -
    + {#DOC_SEARCH_FIELD#} + + - - {#MAIN_RESULTS_ON_PAGE#} - - -
    + + +
    + +
    +
    + {#DOC_SEARCH_PARAM#} + + + + + +
    + +
    +
    - -
    + {#DOC_LANG_ID#} + + + + {#MAIN_RESULTS_ON_PAGE#} + + +
    + +
    + + +
    -
    - -
    \ No newline at end of file diff --git a/admin/templates/documents/docs.tpl b/admin/templates/documents/docs.tpl index 6cfc1a2..d42b103 100644 --- a/admin/templates/documents/docs.tpl +++ b/admin/templates/documents/docs.tpl @@ -1,83 +1,85 @@
    -
    {#DOC_SUB_TITLE#}
    +
    {#DOC_SUB_TITLE#}
    -
    - {#DOC_TIPS#} -
    +
    +{#DOC_TIPS#} +
    {if check_permission('document_view')}
    - - - - - - - - - - - - +
    {#MAIN_ADD_IN_RUB#}{#MAIN_SORT_DOCUMENTS#}
    -
    - - - - -   - -
    -
    +++ + + + + + + + + + + + + +
    {#MAIN_ADD_IN_RUB#}{#MAIN_SORT_DOCUMENTS#}
    +
    + + + + +  + +
    +
    +
    + + + +   + +
    +
    + -
    -
    - - - -   - -
    -
    {/if} @@ -85,383 +87,391 @@
    -
    {#MAIN_DOCUMENTS_ALL#}
    - +
    {#MAIN_DOCUMENTS_ALL#}
    +
    -
    - {#DOC_SORT_TEXT#} - - {if $smarty.request.sort=='id'}{elseif $smarty.request.sort=='id_desc'}{/if} - {#DOC_ID#} - +
    +{#DOC_SORT_TEXT#} - - {if $smarty.request.sort=='position'}{elseif $smarty.request.sort=='position_desc'}{/if} - {#DOC_POSITION#} - + +{if $smarty.request.sort|default:''=='id'}{elseif $smarty.request.sort|default:''=='id_desc'}{/if} +{#DOC_ID#} + - - {if $smarty.request.sort=='title'}{elseif $smarty.request.sort=='title_desc'}{/if} - {#DOC_TITLE#} - + +{if $smarty.request.sort|default:''=='position'}{elseif $smarty.request.sort|default:''=='position_desc'}{/if} + {#DOC_POSITION#} + - - {if $smarty.request.sort=='alias'}{elseif $smarty.request.sort=='alias_desc'}{/if} - {#DOC_URL_RUB#} - + +{if $smarty.request.sort|default:''=='title'}{elseif $smarty.request.sort|default:''=='title_desc'}{/if} +{#DOC_TITLE#} + - - {if $smarty.request.sort=='rubric'}{elseif $smarty.request.sort=='rubric_desc'}{/if} - {#DOC_IN_RUBRIK#} - + +{if $smarty.request.sort|default:''=='alias'}{elseif $smarty.request.sort|default:''=='alias_desc'}{/if} +{#DOC_URL_RUB#} + - - {if $smarty.request.sort=='published'}{elseif $smarty.request.sort=='published_desc'}{/if} - {#DOC_CREATED#} - + +{if $smarty.request.sort|default:''=='rubric'}{elseif $smarty.request.sort|default:''=='rubric_desc'}{/if} +{#DOC_IN_RUBRIK#} + - - {if $smarty.request.sort=='changed'}{elseif $smarty.request.sort=='changed_desc'}{/if} - {#DOC_EDIT#} - + +{if $smarty.request.sort|default:''=='published'}{elseif $smarty.request.sort|default:''=='published_desc'}{/if} +{#DOC_CREATED#} + - - {if $smarty.request.sort=='author'}{elseif $smarty.request.sort=='author_desc'}{/if} - {#DOC_AUTHOR#} - + +{if $smarty.request.sort|default:''=='changed'}{elseif $smarty.request.sort|default:''=='changed_desc'}{/if} +{#DOC_EDIT#} + + + +{if $smarty.request.sort|default:''=='author'}{elseif $smarty.request.sort|default:''=='author_desc'}{/if} +{#DOC_AUTHOR#} + + + +{if $smarty.request.sort|default:''=='lang'}{elseif $smarty.request.sort|default:''=='lang_desc'}{/if} + {#DOC_LANG#} + + + +
    - - {if $smarty.request.sort=='lang'}{elseif $smarty.request.sort=='lang_desc'}{/if} - {#DOC_LANG#} - -
    - - - - - - - {if !$smarty.const.ADMIN_EDITMENU}{/if} +++++++{if !$smarty.const.ADMIN_EDITMENU}{/if} - {if $docs} - - - - - - - - - {if !$smarty.const.ADMIN_EDITMENU} - - {/if} - - +{if $docs} + + + + + + + + + {if !$smarty.const.ADMIN_EDITMENU} + {/if} + + +{/if} - - {if $docs} - {foreach from=$docs item=item} - document_deleted==1}class="red"{/if}{if $item->document_status!=1}class="yellow"{/if}> - - + +{if $docs} +{foreach from=$docs item=item} + document_deleted==1}class="red"{/if}{if $item->document_status!=1}class="yellow"{/if}> + + - - - - - - - - - - {if !$smarty.const.ADMIN_EDITMENU} - + + + + + + + + + {if !$smarty.const.ADMIN_EDITMENU} + {/if} - - {/foreach} - {else} - - - - {/if} - {if $docs} - - - - - - - - - {if !$smarty.const.ADMIN_EDITMENU}{/if} + {/if} - - {/if} +{/foreach} +{else} + + + +{/if} +{if $docs} + + + + + + + + + {if !$smarty.const.ADMIN_EDITMENU}{/if} + + +{/if} + +
    -
    - -
    -
    - {#DOC_ID#} - - {#DOC_TITLE#} | {#DOC_URL_RUB#} - - {#DOC_IN_RUBRIK#} - - {#DOC_POSITION#} - - {#DOC_CREATED#} | {#DOC_EDIT#} - - {#DOC_ACTIONS#} -
    +
    + +
    +
    + {#DOC_ID#} + + {#DOC_TITLE#} | {#DOC_URL_RUB#} + + {#DOC_IN_RUBRIK#} + + {#DOC_POSITION#} + + {#DOC_CREATED#} | {#DOC_EDIT#} + + {#DOC_ACTIONS#} +
    cantEdit!=1 || $item->canOpenClose!=1 || $item->canEndDel!=1) && ($item->Id == 1 || $item->Id == $PAGE_NOT_FOUND_ID)}disabled{/if} class="checkbox" />{$item->Id}
    cantEdit!=1 || $item->canOpenClose!=1 || $item->canEndDel!=1) && ($item->Id == 1 || $item->Id == $PAGE_NOT_FOUND_ID)}disabled{/if} class="checkbox" />{$item->Id} -
    - {if $item->cantEdit==1} +
    +
    + {if $item->cantEdit==1} - {if $item->rubric_admin_teaser_template != ""} - {$item->rubric_admin_teaser_template} - {else} - - - {if $item->document_breadcrum_title != ""} - {$item->document_breadcrum_title|stripslashes}{elseif $item->document_title != ""}{$item->document_title|stripslashes}{else}{#DOC_SHOW3_TITLE#} - {/if} + {if $item->rubric_admin_teaser_template != ""} + {$item->rubric_admin_teaser_template} + {else} + + + {if $item->document_breadcrum_title != ""} + {$item->document_breadcrum_title|stripslashes}{elseif $item->document_title != ""}{$item->document_title|stripslashes}{else}{#DOC_SHOW3_TITLE#} + {/if} + + +
    + {$item->document_lang} + url:  + + {$item->document_alias} + +  |  + {#DOC_CLICKS#}: {$item->document_count_view} + {/if} + +
    -
    - {if $item->cantEdit==1} - - {foreach from=$rubrics item=rubric} - {if $item->rubric_id == $rubric->Id} - - {$rubric->rubric_title|escape} - -
    - {if $smarty.const.UGROUP == 1} - {#DOC_AUTHOR#}: {$item->document_author|escape} - {else} - {#DOC_AUTHOR#}: {$item->document_author|escape} - {/if} - {/if} - {/foreach} - - {else} - {foreach from=$rubrics item=rubric} - {if $item->rubric_id == $rubric->Id} - {$rubric->rubric_title|escape} -
    - {#DOC_AUTHOR#}: {$item->document_author|escape} - {/if} - {/foreach} - {/if} -
    - {if $item->cantEdit==1} -
    - - -
    - {/if} -
    -
    -
    - {if $item->ist_remark!='0'} -
    - -
    - {/if} -
    - - {$item->document_published|date_format:$TIME_FORMAT|pretty_date} -
    - {$item->document_changed|date_format:$TIME_FORMAT|pretty_date} -
    -
    -
    - {if check_permission("remarks")} - {if $item->ist_remark=='0'} - - {else} - - {/if} - {else} - {**} - {/if} - - {if $item->cantEdit==1 && $item->Id != 1 && $item->Id != $PAGE_NOT_FOUND_ID} - - {else} - {**} - {/if} - - {if $item->cantEdit==1} - - {else} - {**} - {/if} - - {if $item->document_deleted==1} - {**} - {else} + {if $item->document_status==1} {if $item->canOpenClose==1 && $item->Id != 1 && $item->Id != $PAGE_NOT_FOUND_ID} - - {else} - {if $item->cantEdit==1 && $item->Id != 1 && $item->Id != $PAGE_NOT_FOUND_ID} - {**} - {else} - {**} - {/if} + + + {/if} {else} {if $item->canOpenClose==1} - + + + + {/if} + {/if} + + + + {if $item->document_deleted==1} + + + + {else} + {if $item->canDelete==1} + + + + {/if} + {/if} + + + {if $item->canEndDel==1 && $item->Id != 1 && $item->Id != $PAGE_NOT_FOUND_ID} + + {/if} + + {/if} + + + {else} + + {if $item->document_breadcrum_title != ""} + {$item->document_breadcrum_title|stripslashes}{elseif $item->document_title != ""}{$item->document_title|stripslashes}{else}{#DOC_SHOW3_TITLE#} + {/if} + +
    + url:  + + {$item->document_alias} + +  |  + {#DOC_CLICKS#}: {$item->document_count_view} + {/if} + +
    + {if $item->cantEdit==1} + + {foreach from=$rubrics item=rubric} + {if $item->rubric_id == $rubric->Id} + + {$rubric->rubric_title|escape} + +
    + {if $smarty.const.UGROUP == 1} + {#DOC_AUTHOR#}: {$item->document_author|escape} {else} - {if $item->cantEdit==1 && $item->Id != 1 && $item->Id != $PAGE_NOT_FOUND_ID} - {**} - {else} - {**} - {/if} + {#DOC_AUTHOR#}: {$item->document_author|escape} + {/if} + {/if} + {/foreach} + + {else} + {foreach from=$rubrics item=rubric} + {if $item->rubric_id == $rubric->Id} + {$rubric->rubric_title|escape} +
    + {#DOC_AUTHOR#}: {$item->document_author|escape} + {/if} + {/foreach} + {/if} +
    + {if $item->cantEdit==1} +
    + + +
    + {/if} +
    +
    +
    + {if $item->ist_remark!='0'} +
    + +
    + {/if} +
    + + {* Публикация: Если 0, используем $smarty.now (текущий таймстемп Smarty). *} + {($item->document_published|default:0 == 0 ? $smarty.now : $item->document_published)|date_format:$TIME_FORMAT|pretty_date} +
    + {* Редактирование: Если 0, используем $smarty.now (текущий таймстемп Smarty). *} + {($item->document_changed|default:0 == 0 ? $smarty.now : $item->document_changed)|date_format:$TIME_FORMAT|pretty_date} +
    +
    +
    + {if check_permission("remarks")} + {if $item->ist_remark=='0'} + + {else} + + {/if} + {else} + {**} + {/if} + + {if $item->cantEdit==1 && $item->Id != 1 && $item->Id != $PAGE_NOT_FOUND_ID} + + {else} + {**} + {/if} + + {if $item->cantEdit==1} + + {else} + {**} + {/if} + + {if $item->document_deleted==1} + {**} + {else} + {if $item->document_status==1} + {if $item->canOpenClose==1 && $item->Id != 1 && $item->Id != $PAGE_NOT_FOUND_ID} + + {else} + {if $item->cantEdit==1 && $item->Id != 1 && $item->Id != $PAGE_NOT_FOUND_ID} +     {**} + {else} + {**} + {/if} + {/if} + {else} + {if $item->canOpenClose==1} + + {else} + {if $item->cantEdit==1 && $item->Id != 1 && $item->Id != $PAGE_NOT_FOUND_ID} + {**} + {else} + {**} {/if} {/if} {/if} + {/if} - {if $item->document_deleted==1} - + {if $item->document_deleted==1} + + {else} + {if $item->canDelete==1} + {else} - {if $item->canDelete==1} - - {else} - {**} - {/if} + {**} {/if} - - {if $item->canEndDel==1 && $item->Id != 1 && $item->Id != $PAGE_NOT_FOUND_ID} - - {else} - {**} - {/if} -
    -
      -
    • {#DOC_NO_DOCS#}
    • -
    -
    {#DOC_ID#} - {#DOC_TITLE#} | {#DOC_URL_RUB#} + + {if $item->canEndDel==1 && $item->Id != 1 && $item->Id != $PAGE_NOT_FOUND_ID} + + {else} + {**} + {/if} {#DOC_IN_RUBRIK#}{#DOC_POSITION#}{#DOC_CREATED#} | {#DOC_EDIT#}{#DOC_ACTIONS#}
    +
      +
    • {#DOC_NO_DOCS#}
    • +
    +
    {#DOC_ID#} + {#DOC_TITLE#} | {#DOC_URL_RUB#} + {#DOC_IN_RUBRIK#}{#DOC_POSITION#}{#DOC_CREATED#} | {#DOC_EDIT#}{#DOC_ACTIONS#}
    {if check_permission('alle')} +
    -
    - -    -
    +
    + +   +
    {/if} @@ -480,10 +490,10 @@ \ No newline at end of file diff --git a/admin/templates/documents/docs_simple.tpl b/admin/templates/documents/docs_simple.tpl index 3d65caa..5997a2f 100644 --- a/admin/templates/documents/docs_simple.tpl +++ b/admin/templates/documents/docs_simple.tpl @@ -66,10 +66,11 @@ function insertLinkCK(data) {ldelim} - {#DOC_ID#} + {* ИСПРАВЛЕНИЕ: Добавлены |default:'' для sort и |default:'1' для page *} + {#DOC_ID#}   - {#DOC_TITLE#} - {#DOC_IN_RUBRIK#} + {#DOC_TITLE#} + {#DOC_IN_RUBRIK#}   @@ -87,20 +88,21 @@ function insertLinkCK(data) {ldelim} {if $item->document_breadcrum_title != ""}{$item->document_breadcrum_title|stripslashes}{elseif $item->document_title != ""}{$item->document_title|stripslashes}{else}{#DOC_SHOW3_TITLE#}{/if}
    {$item->document_alias} {$item->RubName|escape} - {if $smarty.request.idonly == 1} - - {elseif $smarty.request.idtitle == 1} - document_breadcrum_title|stripslashes}{elseif $item->document_title != ""}{$item->document_title|stripslashes}{else}{#DOC_SHOW3_TITLE#}{/if}'{rdelim});" class="whiteBtn" type="button" value="{#DOC_BUTTON_INSERT_LINK#}" /> - {elseif $smarty.request.selurl == 1} - - {elseif $smarty.request.selecturl == 1} + {* ИСПРАВЛЕНИЕ: Добавлены |default:'' к параметрам запроса в JavaScript вызовах *} + {if $smarty.request.idonly|default:'' == 1} + + {elseif $smarty.request.idtitle|default:'' == 1} + document_breadcrum_title|stripslashes}{elseif $item->document_title != ""}{$item->document_title|stripslashes}{else}{#DOC_SHOW3_TITLE#}{/if}'{rdelim});" class="whiteBtn" type="button" value="{#DOC_BUTTON_INSERT_LINK#}" /> + {elseif $smarty.request.selurl|default:'' == 1} + + {elseif $smarty.request.selecturl|default:'' == 1} - {elseif $smarty.request.alias == 1} - - {elseif $smarty.request.function == 1} - + {elseif $smarty.request.alias|default:'' == 1} + + {elseif $smarty.request.function|default:'' == 1} + {else} - document_breadcrum_title|stripslashes}{elseif $item->document_title != ""}{$item->document_title|stripslashes}{else}{#DOC_SHOW3_TITLE#}{/if}',{$smarty.request.document_alias|escape}:'{$item->document_alias}'{rdelim});" class="whiteBtn" type="button" value="{#DOC_BUTTON_INSERT_LINK#}" /> + document_breadcrum_title|stripslashes}{elseif $item->document_title != ""}{$item->document_title|stripslashes}{else}{#DOC_SHOW3_TITLE#}{/if}',{$smarty.request.document_alias|default:''|escape}:'{$item->document_alias}'{rdelim});" class="whiteBtn" type="button" value="{#DOC_BUTTON_INSERT_LINK#}" /> {/if} diff --git a/admin/templates/documents/form.tpl b/admin/templates/documents/form.tpl index b3bad04..0d6d56f 100644 --- a/admin/templates/documents/form.tpl +++ b/admin/templates/documents/form.tpl @@ -71,7 +71,7 @@ function openFileWin(target,id) {ldelim} $(document).ready(function(){ldelim} - {if $smarty.request.feld != ''} + {if isset($smarty.request.feld) && $smarty.request.feld != ''} $("#feld_{$smarty.request.feld|escape}").css({ldelim} 'border' : '2px solid red', 'font' : '120% verdana,arial', @@ -88,10 +88,10 @@ $(document).ready(function(){ldelim}
    {#DOC_EDIT_DOCUMENT#} ID: {$smarty.request.Id}
    {foreach from=$smarty.session.accept_langs key=lang_id item=lang} - {if $document->lang_pack[$lang_id]>''} + {if isset($document->lang_pack[$lang_id]) && $document->lang_pack[$lang_id] > ''} {$lang_id} {else} - {$lang_id} + {$lang_id} {/if} {/foreach}
    @@ -102,10 +102,11 @@ $(document).ready(function(){ldelim}
    {#DOC_ADD_DOCUMENT#}
    {foreach from=$smarty.session.accept_langs key=lang_id item=lang} - {if $document->lang_pack[$lang_id]>''} + {if isset($document->lang_pack[$lang_id]) && $document->lang_pack[$lang_id] > ''} {$lang_id} {else} - {$lang_id} + {* ИСПРАВЛЕНИЕ: Добавлен |default:0 для rubric_id *} + {$lang_id} {/if} {/foreach}
    @@ -128,20 +129,22 @@ $(document).ready(function(){ldelim} {else}
  • {#DOC_ADD_DOCUMENT#}
  • {#DOC_IN_RUBRIK#} > {$document->rubric_title|escape}
  • -
  • {if $smarty.request.document_title != ""}{$smarty.request.document_title}{else}{#DOC_IN_NEW#}{/if}
  • + {* ИСПРАВЛЕНИЕ: Добавлена проверка isset() *} +
  • {if isset($smarty.request.document_title) && $smarty.request.document_title != ""}{$smarty.request.document_title}{else}{#DOC_IN_NEW#}{/if}
  • {/if}
    - + - + - {if ($smarty.request.Id == 1 || $smarty.request.Id == $PAGE_NOT_FOUND_ID) && $smarty.request.action != 'new' && $smarty.request.action != 'copy'} - {assign var=dis value = 'disabled'} - {/if} +{* ИСПРАВЛЕНИЕ: Добавлена проверка isset() для Id, чтобы избежать Undefined array key *} +{if isset($smarty.request.Id) && ($smarty.request.Id == 1 || $smarty.request.Id == $PAGE_NOT_FOUND_ID) && $smarty.request.action != 'new' && $smarty.request.action != 'copy'} + {assign var=dis value = 'disabled'} +{/if}
    @@ -163,14 +166,14 @@ $(document).ready(function(){ldelim} {#DOC_NAME#} [?] -
    +
    {#DOC_META_KEYWORDS#} [?]
    - +
    @@ -179,7 +182,7 @@ $(document).ready(function(){ldelim} {#DOC_META_DESCRIPTION#} [?]
    - +
    @@ -188,9 +191,9 @@ $(document).ready(function(){ldelim} {#DOC_INDEX_TYPE#} @@ -198,30 +201,32 @@ $(document).ready(function(){ldelim} {#DOC_SITEMAP_FREQ#} [?] - + {* ИСПРАВЛЕНИЕ: Добавлен |default:'' ко всем проверкам свойства *} + + + + + + + {#DOC_SITEMAP_PRIORITY#} [?] - + {* ИСПРАВЛЕНИЕ: Добавлен |default:'' ко всем проверкам свойства *} + + + + + + + + + + + @@ -239,20 +244,24 @@ $(document).ready(function(){ldelim} {#DOC_CHOOSE_LANG#} - + @@ -260,13 +269,13 @@ $(document).ready(function(){ldelim} {#DOC_URL#} [?]
    - - + + - {if $smarty.request.Id != 1 && $smarty.request.Id != $PAGE_NOT_FOUND_ID} + {if isset($smarty.request.Id) && $smarty.request.Id != 1 && $smarty.request.Id != $PAGE_NOT_FOUND_ID} {/if} - {if $smarty.request.Id && $smarty.request.Id != $PAGE_NOT_FOUND_ID} + {if isset($smarty.request.Id) && $smarty.request.Id && $smarty.request.Id != $PAGE_NOT_FOUND_ID} История {/if} @@ -278,10 +287,11 @@ $(document).ready(function(){ldelim} {#DOC_URL_LOG#} [?]
    - + {* ИСПРАВЛЕНИЕ: Добавлен |default:'' ко всем проверкам свойства *} + + +
    @@ -320,13 +330,15 @@ $(document).ready(function(){ldelim} {#DOC_START_PUBLICATION#} - - + + {#DOC_END_PUBLICATION#} - + @@ -357,7 +369,7 @@ $(document).ready(function(){ldelim} {#DOC_CAN_SEARCH#} - document_in_search==1 || $smarty.request.action=='new'}checked{/if} /> + document_in_search|default:0==1 || $smarty.request.action=='new'}checked{/if} /> @@ -403,9 +415,9 @@ $(document).ready(function(){ldelim} {#DOC_USE_BREADCRUMB#} -   +   {#DOC_BREADCRUMB_BTN#} -  {if $document->parent}{#DOC_BREADCRUMB_WITH#} « {$document->parent->document_title|stripslashes} »{/if} +  {if isset($document->parent)}{#DOC_BREADCRUMB_WITH#} « {$document->parent->document_title|stripslashes} »{/if} @@ -414,7 +426,7 @@ $(document).ready(function(){ldelim} {#DOC_SHOW_LANG#}
    - +
    @@ -423,7 +435,7 @@ $(document).ready(function(){ldelim} {#DOCUMENT_POSITION#}
    - +
    @@ -432,7 +444,7 @@ $(document).ready(function(){ldelim} {#DOC_PROPERTY#} - + @@ -466,7 +478,7 @@ $(document).ready(function(){ldelim} {foreach from=$document_field_group.fields item=field} - {$field.Id} + {$field.Id} {$field.rubric_field_title|escape} @@ -523,13 +535,13 @@ $(document).ready(function(){ldelim} - {if $document->canDelRev == 1} + {if $document->canDelRev|default:0 == 1} @@ -547,7 +559,7 @@ $(document).ready(function(){ldelim} {if $document_rev} - {foreach from=$document_rev item=doc_rev} + {foreach from=$document_rev item=doc_rev} - {if $document->canDelRev == 1} + {if $document->canDelRev|default:0 == 1} {/if} diff --git a/admin/templates/documents/nav.tpl b/admin/templates/documents/nav.tpl index a37ade7..38d845f 100644 --- a/admin/templates/documents/nav.tpl +++ b/admin/templates/documents/nav.tpl @@ -1,15 +1,16 @@
  • - {#MAIN_NAVI_DOCUMENTS#} - {if $smarty.request.do=='docs'} -
      - {foreach from=$rubrics item=rubric} - {if $rubric->Show==1 && $rubric->rubric_docs_active==1} -
    • Id==$smarty.request.rubric_id}class="active"{/if}> - {$rubric->rubric_title|escape} - -
    • - {/if} - {/foreach} -
    - {/if} +{#MAIN_NAVI_DOCUMENTS#} +{if $smarty.request.do=='docs'} +
      +{foreach from=$rubrics item=rubric} +{if $rubric->Show==1 && $rubric->rubric_docs_active==1} +{* ИСПРАВЛЕНО: Добавлен |default:'' к rubric_id, чтобы избежать PHP Warning, если ключ отсутствует в $_REQUEST. *} +
    • Id==$smarty.request.rubric_id|default:''}class="active"{/if}> +{$rubric->rubric_title|escape} + +
    • +{/if} +{/foreach} +
    +{/if}
  • \ No newline at end of file diff --git a/admin/templates/documents/replyform.tpl b/admin/templates/documents/replyform.tpl index 906c5d9..76ca64f 100644 --- a/admin/templates/documents/replyform.tpl +++ b/admin/templates/documents/replyform.tpl @@ -21,9 +21,9 @@ -
    {$doc_rev->doc_revision|date_format:$TIME_FORMAT|pretty_date} @@ -558,12 +570,14 @@ $(document).ready(function(){ldelim} - + {* ИСПРАВЛЕНИЕ 1: Добавлен |default:0 *} + - + {* ИСПРАВЛЕНИЕ 2: Добавлен |default:0 *} +
    + - {#DOC_NOTICE_DELETE_ALL#} + {#DOC_NOTICE_DELETE_ALL#}
    diff --git a/admin/templates/groups/perms.tpl b/admin/templates/groups/perms.tpl index f28bed2..b2f6935 100644 --- a/admin/templates/groups/perms.tpl +++ b/admin/templates/groups/perms.tpl @@ -72,10 +72,13 @@ {/if} {foreach from=$g_all_permissions item=perm} - {assign var="header" value="_"|explode:$perm} - - {if $header.0!="$headers"} - {assign var="headers" value=$header.0} + + {* ИСПРАВЛЕНИЕ: Используем regex_replace для извлечения префикса (например, "user" из "user_view"). + Это обходит проблему с устаревшим explode и ошибкой "unknown modifier strpos". *} + {assign var="header_prefix" value=$perm|regex_replace:'/_(.*)$/':'':1} + + {if $header_prefix!=$headers} + {assign var="headers" value=$header_prefix} {$smarty.config.$headers} @@ -94,7 +97,6 @@ -
     {#UGROUP_OR#}  diff --git a/admin/templates/login.tpl b/admin/templates/login.tpl index 309fe51..ff0a7ed 100644 --- a/admin/templates/login.tpl +++ b/admin/templates/login.tpl @@ -66,7 +66,7 @@
    - +
    diff --git a/admin/templates/main.tpl b/admin/templates/main.tpl index a25c013..13e8748 100644 --- a/admin/templates/main.tpl +++ b/admin/templates/main.tpl @@ -176,8 +176,8 @@ -
    - +
    +
    @@ -209,7 +209,7 @@ {/if} -
    - + +
    {#RUBRIK_ALIAS_ALIAS#}
    @@ -37,7 +41,12 @@ {#RUBRIK_ALIAS_NAME#}
    - +
    @@ -83,10 +92,10 @@ if (success) {ldelim} - $('#alias_' + {$smarty.request.field_id|escape}).val("{$smarty.request.rubric_field_alias|escape}"); - $('#ajax-dialog-rft-alias-' + {$smarty.request.field_id|escape}).dialog('destroy').remove(); + {* ИСПРАВЛЕНИЕ 3: Защита ключей Smarty.request в JavaScript *} + $('#alias_' + {$smarty.request.field_id|default:0|escape}).val("{$smarty.request.rubric_field_alias|default:''|escape}"); + $('#ajax-dialog-rft-alias-' + {$smarty.request.field_id|default:0|escape}).dialog('destroy').remove(); {rdelim} -
    - +
    \ No newline at end of file diff --git a/admin/templates/rubs/list.tpl b/admin/templates/rubs/list.tpl index 6566a8e..69d857a 100644 --- a/admin/templates/rubs/list.tpl +++ b/admin/templates/rubs/list.tpl @@ -76,7 +76,7 @@ $(function() {ldelim} %d-%m-%Y - {#RUBRIK_FORMAT_TIME#}
    %id - {#RUBRIK_FORMAT_ID#}
    - + diff --git a/admin/templates/rubs/multi.tpl b/admin/templates/rubs/multi.tpl index 8884026..8d96f6f 100644 --- a/admin/templates/rubs/multi.tpl +++ b/admin/templates/rubs/multi.tpl @@ -30,13 +30,13 @@ - + - + diff --git a/admin/templates/rubs/rubnew.tpl b/admin/templates/rubs/rubnew.tpl index 9090d8c..d51b7b0 100644 --- a/admin/templates/rubs/rubnew.tpl +++ b/admin/templates/rubs/rubnew.tpl @@ -33,7 +33,7 @@ - + diff --git a/admin/templates/settings/pagination_edit.tpl b/admin/templates/settings/pagination_edit.tpl index 74462e4..3fadfcb 100644 --- a/admin/templates/settings/pagination_edit.tpl +++ b/admin/templates/settings/pagination_edit.tpl @@ -17,7 +17,7 @@ diff --git a/admin/templates/settings/settings_case.tpl b/admin/templates/settings/settings_case.tpl index 4d4c174..871555d 100644 --- a/admin/templates/settings/settings_case.tpl +++ b/admin/templates/settings/settings_case.tpl @@ -72,23 +72,21 @@ {if $def.TYPE=="dropdown"} {/if} {if $def.TYPE=="string"} - + {/if} {if $def.TYPE=="integer"} - + {/if} {if $def.TYPE=="bool"} - _tpl_vars['_var']) ? 'checked' : "");{/php} /> - _tpl_vars['_var']) ? '' : "checked");{/php} /> + + {/if} diff --git a/admin/templates/settings/settings_lang_edit.tpl b/admin/templates/settings/settings_lang_edit.tpl index ef6cba1..389906b 100644 --- a/admin/templates/settings/settings_lang_edit.tpl +++ b/admin/templates/settings/settings_lang_edit.tpl @@ -3,21 +3,21 @@
    {#SETTINGS_LANG_EDIT#}
    -
    +
    {#SETTINGS_LANG_TITLE#} -
    +
    - +
    {#RUBRIK_NAME#}
    {#RUBRIK_URL_PREFIX#}
    {#RUBRIK_URL_PREFIX2#}
    @@ -32,14 +32,36 @@ - - - + + + + + + + + + + + - + {/foreach}
    + {#SETTINGS_LANG_FLAG#}: + + {* Если это режим редактирования, показываем текущий флаг *} + {if !empty($items->lang_key)} + + {$items->lang_name|default:''} + + {/if} + +
    + +
    +
    +
    - - {if $smarty.request.Id==''} + + {if ($smarty.request.Id|default:'')==''} {else} diff --git a/admin/templates/start.tpl b/admin/templates/start.tpl index c1bb3b8..d43c3ab 100644 --- a/admin/templates/start.tpl +++ b/admin/templates/start.tpl @@ -99,7 +99,12 @@ {#MAIN_START_DOC_AUTOR#}: {$item->document_author|escape} {/if} {$item->document_published|date_format:$TIME_FORMAT|pretty_date} + + {* Публикация: Если 0, используем $smarty.now (текущий таймстемп Smarty). *} + {($item->document_published|default:0 == 0 ? $smarty.now : $item->document_published)|date_format:$TIME_FORMAT|pretty_date} + +
    @@ -180,7 +185,7 @@ {#MAIN_STAT_MODULES#} - {$cnts.modules_0+$cnts.modules_1} + {$cnts.modules_0|default:0 + $cnts.modules_1|default:0} {if $cnts.modules_0} @@ -190,7 +195,7 @@ {/if} {#MAIN_STAT_USERS#} - {$cnts.users_0+$cnts.users_1} + {$cnts.users_0|default:0+$cnts.users_1|default:0} {if $cnts.users_0} diff --git a/admin/templates/sysblocks/form.tpl b/admin/templates/sysblocks/form.tpl index 34a33b1..f70f6f7 100644 --- a/admin/templates/sysblocks/form.tpl +++ b/admin/templates/sysblocks/form.tpl @@ -22,8 +22,8 @@
  • {#SYSBLOCK_LIST_LINK#}
  • -
  • {if $smarty.request.id != ''}{#SYSBLOCK_EDIT_H#}{else}{#SYSBLOCK_INSERT_H#}{/if}
  • -
  • {if $smarty.request.id != ''}{$sysblock_name|escape|default:'New'}{else}{$smarty.request.sysblock_name|default:'New'}{/if}
  • +
  • {if isset($smarty.request.id) && $smarty.request.id != ''}{#SYSBLOCK_EDIT_H#}{else}{#SYSBLOCK_INSERT_H#}{/if}
  • +
  • {if isset($smarty.request.id) && $smarty.request.id != ''}{$sysblock_name|escape|default:'New'}{else}{$smarty.request.sysblock_name|default:'New'}{/if}
  • @@ -55,7 +55,7 @@
    -
    {if $smarty.request.id != ''}{#SYSBLOCK_EDIT_H#}{else}{#SYSBLOCK_INSERT_H#}{/if}
    +
    {if isset($smarty.request.id) && $smarty.request.id != ''}{#SYSBLOCK_EDIT_H#}{else}{#SYSBLOCK_INSERT_H#}{/if}
    @@ -68,14 +68,14 @@ @@ -86,8 +86,8 @@
    - +
    {#SYSBLOCK_DESCRIPTION#} - +
    -   - +   + @@ -103,7 +103,7 @@
    {else} diff --git a/admin/templates/sysblocks/start.tpl b/admin/templates/sysblocks/start.tpl index 4c05aca..0a1bdc8 100644 --- a/admin/templates/sysblocks/start.tpl +++ b/admin/templates/sysblocks/start.tpl @@ -51,7 +51,7 @@ {foreach from=$groups item=group} - {assign var="group_id" value=$group.id} + {assign var="group_id" value=$group.id|default:0} {if $group_id == null} {assign var="group_id" value='0'} @@ -59,12 +59,12 @@
    -
    {if $group.title}{$group.title}{else}{#SYS_GROUP_NO_TITLE#}{/if} ({$group.count})
    +
    {if isset($group.title) && $group.title}{$group.title}{else}{#SYS_GROUP_NO_TITLE#}{/if} ({$group.count})
    - {if $group.description}{$group.description}{else}{#SYS_GROUP_NO_DESCRIPTION#}{/if} + {if isset($group.description) && $group.description}{$group.description}{else}{#SYS_GROUP_NO_DESCRIPTION#}{/if}
    @@ -97,7 +97,7 @@ - {foreach from=$sysblocks.$group_id item=sysblock} + {foreach from=$sysblocks.$group_id|default:[] item=sysblock} - + - + - + - + @@ -138,7 +138,7 @@ function mail_status(){ @@ -156,37 +156,37 @@ function mail_status(){ - + - + - + - + - + - + - + -{assign var=u_group value=$row->user_group|lower|escape|stripslashes} +{assign var=u_group value=($row && $row->user_group) ? $row->user_group : ''|lower|escape|stripslashes} @@ -267,10 +274,10 @@ function mail_status(){
    {if check_permission('user_perms')} {foreach from=$ugroups item=groups} - user_group == $row->user_group} disabled="disabled"{/if} - {if $us_groups|@is_array && in_array($groups->user_group, $us_groups)} checked="checked"{/if} - > +user_group == (($row && $row->user_group) ? $row->user_group : 0)} disabled="disabled"{/if} +{if $us_groups|@is_array && in_array($groups->user_group, $us_groups)} checked="checked"{/if} +>
    {/foreach} @@ -283,10 +290,10 @@ function mail_status(){
    - + - + {/if} diff --git a/admin/templates/user/users.tpl b/admin/templates/user/users.tpl index 1175099..573f377 100644 --- a/admin/templates/user/users.tpl +++ b/admin/templates/user/users.tpl @@ -51,20 +51,20 @@ $(document).ready(function(){ldelim} - + diff --git a/class/class.blocks.php b/class/class.blocks.php index 8b84248..d9d0a20 100644 --- a/class/class.blocks.php +++ b/class/class.blocks.php @@ -94,7 +94,7 @@ id = '" . $block_id . "' "); - if ($sql->_result === false) + if (is_object($sql) && $sql->_result === false) { $message = $AVE_Template->get_config_vars('BLOCK_SAVED_ERR'); $header = $AVE_Template->get_config_vars('BLOCK_ERROR'); diff --git a/class/class.core.php b/class/class.core.php index 3cfc8ca..ac9780e 100644 --- a/class/class.core.php +++ b/class/class.core.php @@ -1179,10 +1179,17 @@ $cacheCompile = false; +/* // Определяем рубрику + define('RUB_ID', ! empty ($rub_id) + ? $rub_id + : $this->curentdoc->rubric_id);*/ + // Определяем рубрику define('RUB_ID', ! empty ($rub_id) ? $rub_id - : $this->curentdoc->rubric_id); + // ИСПРАВЛЕНИЕ: Проверяем, что $this->curentdoc является объектом + : (is_object($this->curentdoc) ? $this->curentdoc->rubric_id : 0) + ); $main_content = ''; @@ -2025,13 +2032,13 @@ $GLOBALS['block_generate']['DOCUMENT']['URL_PARSE'] = Debug::endTime('URL_PARSE'); - //-- Перенаправление на адреса с суффиксом + //-- Перенаправление на адреса с суффиксом if ( $check_url !== $get_url . URL_SUFF && ! $pages && $check_url - && ! $_REQUEST['print'] - && ! $_REQUEST['module'] - && ! $_REQUEST['tag'] + && ! ($_REQUEST['print'] ?? '') + && ! ($_REQUEST['module'] ?? '') + && ! ($_REQUEST['tag'] ?? '') && REWRITE_MODE ) { @@ -2045,7 +2052,7 @@ } } // Иначе ищем URL в редиректах - else +/* else { $sql = " SELECT @@ -2076,7 +2083,46 @@ if (! (! empty($_REQUEST['sysblock']) || ! empty($_REQUEST['module']) || ! empty($_REQUEST['request']))) $_GET['id'] = $_REQUEST['id'] = PAGE_NOT_FOUND_ID; - } + }*/ + + +// Иначе ищем URL в редиректах + else + { + $sql = " + SELECT + # REDIRECT = $get_url + a.document_alias, + h.document_alias_header + FROM + ".PREFIX."_document_alias_history AS h, + ".PREFIX."_documents AS a + WHERE + h.document_id = a.Id + AND + h.document_alias = '" . $get_url . "' + "; + + $redirect_alias = $AVE_DB->Query($sql)->FetchRow(); + + $GLOBALS['block_generate']['DOCUMENT']['URL_PARSE'] = Debug::endTime('URL_PARSE'); + + // ИСПРАВЛЕНИЕ: Используем оператор Nullsafe (?->) + if ($redirect_alias?->document_alias) + { + $redirect_alias = ABS_PATH . $redirect_alias->document_alias . URL_SUFF; + $redirect_alias = str_replace('//', '/', $redirect_alias); + + // ДОПОЛНИТЕЛЬНОЕ ИСПРАВЛЕНИЕ: Безопасный доступ к document_alias_header + // Это может быть причиной другой ошибки, если $redirect_alias->document_alias_header не существует + $header_code = $redirect_alias->document_alias_header ?? 301; + header('Location:' . $redirect_alias, true, $header_code); + exit; + } + + if (! (! empty($_REQUEST['sysblock']) || ! empty($_REQUEST['module']) || ! empty($_REQUEST['request']))) + $_GET['id'] = $_REQUEST['id'] = PAGE_NOT_FOUND_ID; + } unset ($sql, $query); } diff --git a/class/class.database.php b/class/class.database.php index db8edec..99c51ce 100644 --- a/class/class.database.php +++ b/class/class.database.php @@ -139,10 +139,15 @@ return false; } - if ($this->NumRows()) + if ($this->NumRows()) { $a = mysqli_fetch_row($this->_result); - return $a[0]; + + // Проверяем, что $a является массивом перед доступом к индексу 0 + if (is_array($a)) { + return $a[0]; + } + // Если $a не является массивом (т.е., null/false), падаем на return false ниже. } return false; diff --git a/class/class.debug.php b/class/class.debug.php index b1e80c7..6f24c4f 100644 --- a/class/class.debug.php +++ b/class/class.debug.php @@ -870,7 +870,9 @@ { global $AVE_DB; - define ('START_MEMORY', memory_get_usage()); + if (!defined('START_MEMORY')) { + define('START_MEMORY', memory_get_usage()); + } $stat = null; @@ -973,7 +975,9 @@ else if ($type == 'globals') var_dump($GLOBALS); else if ($type == 'blocks') - var_dump($GLOBALS['block_generate']); + if (isset($GLOBALS['block_generate'])) { + var_dump($GLOBALS['block_generate']); + } $stat = ob_get_contents(); $stat = preg_replace('/=>(\s+|\s$)/', ' => ', $stat); $stat = htmlspecialchars($stat); @@ -986,7 +990,7 @@ } - public static function getDocumentInfo () +public static function getDocumentInfo () { global $AVE_Template; @@ -999,21 +1003,31 @@ 'NAVIAGTIONS' => '/admin/index.php?do=navigation&action=templates&navigation_id=' ]; - $doc = get_document($_REQUEST['id']); + // ИСПРАВЛЕНИЕ : Безопасно получаем 'id' из $_REQUEST + $doc = get_document($_REQUEST['id'] ?? ''); $_edit = []; - $_edit['DOC'][$doc['Id']] = $_arr['DOC'] . $doc['Id']; - $_edit['RUBRIC'][$doc['rubric_id']] = $_arr['RUBRIC'] . $doc['rubric_id']; + // ИСПРАВЛЕНИЕ : Проверяем, что $doc содержит данные и нужные ключи + if (!empty($doc) && isset($doc['Id'], $doc['rubric_id'])) { + $_edit['DOC'][$doc['Id']] = $_arr['DOC'] . $doc['Id']; + $_edit['RUBRIC'][$doc['rubric_id']] = $_arr['RUBRIC'] . $doc['rubric_id']; + } + + // ИСПРАВЛЕНИЕ : Проверяем, что $GLOBALS['block_generate'] существует и является массивом/объектом + if (isset($GLOBALS['block_generate']) && (is_array($GLOBALS['block_generate']) || $GLOBALS['block_generate'] instanceof Traversable)) { + foreach ($GLOBALS['block_generate'] AS $k => $v) + { + if (! in_array($k, array_keys($_arr))) { + continue; + } - foreach ($GLOBALS['block_generate'] AS $k => $v) - { - if (! in_array($k, array_keys($_arr))) { - continue; - } - - foreach ($v as $key => $value) { - $_edit[$k][$key] = $_arr[$k] . $key; + // Защита внутреннего цикла + if (is_array($v) || $v instanceof Traversable) { + foreach ($v as $key => $value) { + $_edit[$k][$key] = $_arr[$k] . $key; + } + } } } diff --git a/class/class.docs.php b/class/class.docs.php index a9df968..34289b8 100644 --- a/class/class.docs.php +++ b/class/class.docs.php @@ -1024,7 +1024,7 @@ } } - /** +/** * Метод, предназначенный для сохранения ревизии документа в БД * */ @@ -1049,6 +1049,11 @@ $rows = array(); + // Проверка на случай, если запрос не вернул результат + if (!is_object($sql)) { + return $rows; + } + while ($row = $sql->FetchAssocArray()) { $row['field_value'] = (string)$row['field_value'] . (string)$row['more']; @@ -1057,17 +1062,28 @@ $dtime = $AVE_DB->Query('SELECT document_changed FROM ' . PREFIX . '_documents WHERE Id = ' . $document_id)->GetCell(); - $last_rev = @unserialize($AVE_DB->Query("SELECT doc_data FROM " . PREFIX . "_document_rev WHERE doc_id=" . $document_id . " ORDER BY doc_revision DESC LIMIT 1")->GetCell()); - // это я долго пытался понять почему всегда старая ревизия не равна новой даже если просто нажали лишний раз сохранить - // оказывается редактор подсовывет alt="" если альта в имге нету и сносит его если он есть там пустой )))))))))) - // но пусть проверка будет - может редакторы сменятся/апдейтятся а может кто просто хардкором будет код править))) + // Получаем последнюю ревизию и безопасно десериализуем. Если ревизий нет, $last_rev будет не массивом. + $last_rev_data = $AVE_DB->Query("SELECT doc_data FROM " . PREFIX . "_document_rev WHERE doc_id=" . $document_id . " ORDER BY doc_revision DESC LIMIT 1")->GetCell(); + $last_rev = @unserialize($last_rev_data); + + // Начинаем с предположения, что ревизия не нужна $dorev = false; - foreach ($rows as $k => $v) - { - if ($rows[$k] <> $last_rev[$k]) + // ИСПРАВЛЕНИЕ: Если $last_rev не массив (т.е. ревизия первая), форсируем запись. + if (!is_array($last_rev)) { + $dorev = true; + } + + // Если ревизия еще не помечена к записи (т.е. она не первая), проверяем изменения. + if (!$dorev) { + foreach ($rows as $k => $v) { - $dorev = true; + // Безопасно проверяем, существует ли ключ в старой ревизии и изменилось ли его значение. + if (isset($last_rev[$k]) && $rows[$k] <> $last_rev[$k]) + { + $dorev = true; + break; // Изменение найдено, можно прервать цикл + } } } @@ -2002,7 +2018,7 @@ $iid = $this->documentSave($rubric_id, null, $_POST, true); - if ($_REQUEST['doc_after']) + if ($_REQUEST['doc_after'] ?? false) header('Location:index.php?do=docs&action=after&document_id=' . $iid . '&rubric_id=' . $rubric_id . '&cp=' . SESSION . $innavi); else header('Location:index.php?do=docs&action=edit&Id=' . $iid . '&rubric_id=' . $rubric_id . '&cp=' . SESSION); @@ -2111,7 +2127,16 @@ $document->lang_pack=$lang_pack; $document->fields = $fields_list; $document->rubric_title = $AVE_Rubric->rubricNameByIdGet($rubric_id)->rubric_title; - $document->rubric_url_prefix = strftime(str_ireplace("%id", $maxId+1, $AVE_Rubric->rubricNameByIdGet($rubric_id)->rubric_alias)); + //Устарело в PHP - 8.4 + //$document->rubric_url_prefix = strftime(str_ireplace("%id", $maxId+1, $AVE_Rubric->rubricNameByIdGet($rubric_id)->rubric_alias)); + // ИСПРАВЛЕНИЕ: Замена устаревшей strftime() на безопасные date() и str_ireplace() + $alias_template = $AVE_Rubric->rubricNameByIdGet($rubric_id)->rubric_alias; + $alias_template = str_ireplace( + array('%Y', '%y', '%m', '%d'), // Шаблоны strftime + array(date('Y'), date('y'), date('m'), date('d')), // Эквиваленты date() + $alias_template + ); + $document->rubric_url_prefix = str_ireplace("%id", $maxId+1, $alias_template); $document->formaction = 'index.php?do=docs&action=new&sub=save&rubric_id=' . $rubric_id . ((isset($_REQUEST['pop']) && $_REQUEST['pop']==1) ? 'pop=1' : '') . '&cp=' . SESSION; $document->count_groups = count($fields_list); $document->document_published = time(); @@ -2737,7 +2762,8 @@ $fields_list[$group_id]['group_position'] = ($field->group_position) ? $field->group_position : 100; $fields_list[$group_id]['group_title'] = $field->group_title; $fields_list[$group_id]['fields'][$field->Id]['Id'] = $field->Id; - $fields_list[$group_id]['fields'][$field->Id]['rubric_id'] = $row->rubric_id; + //$fields_list[$group_id]['fields'][$field->Id]['rubric_id'] = $row->rubric_id; + $fields_list[$group_id]['fields'][$field->Id]['rubric_id'] = (int)($row->rubric_id ?? 0); $fields_list[$group_id]['fields'][$field->Id]['rubric_field_title'] = $field->rubric_field_title; $fields_list[$group_id]['fields'][$field->Id]['rubric_field_description'] = $field->rubric_field_description; $fields_list[$group_id]['fields'][$field->Id]['result'] = $field->field; @@ -2753,7 +2779,16 @@ $document->count_groups = count($fields_list); $document->document_alias = ''; $document->rubric_title = $AVE_Rubric->rubricNameByIdGet($_REQUEST['rubric_id'])->rubric_title; - $document->rubric_url_prefix = strftime(str_ireplace("%id", $maxId+1, $AVE_Rubric->rubricNameByIdGet($_REQUEST['rubric_id'])->rubric_alias)); + //Устарело в PHP - 8.4 + //$document->rubric_url_prefix = strftime(str_ireplace("%id", $maxId+1, $AVE_Rubric->rubricNameByIdGet($_REQUEST['rubric_id'])->rubric_alias)); + // ИСПРАВЛЕНИЕ: Замена устаревшей strftime() на безопасные date() и str_ireplace() + $alias_template = $AVE_Rubric->rubricNameByIdGet($_REQUEST['rubric_id'])->rubric_alias; + $alias_template = str_ireplace( + array('%Y', '%y', '%m', '%d'), // Шаблоны strftime + array(date('Y'), date('y'), date('m'), date('d')), // Эквиваленты date() + $alias_template + ); + $document->rubric_url_prefix = str_ireplace("%id", $maxId+1, $alias_template); $document->formaction = 'index.php?do=docs&action=copy&sub=save&rubric_id=' . $_REQUEST['rubric_id'] . ((isset($_REQUEST['pop']) && $_REQUEST['pop']==1) ? 'pop=1' : '') . '&cp=' . SESSION; $document->document_published = time(); $document->document_expire = mktime(date("H"), date("i"), 0, date("m"), date("d"), date("Y") + 10); @@ -3906,7 +3941,7 @@ TRUNCATE TABLE " . PREFIX . "_document_rev "); - if ($sql->_result === false) + if (is_object($sql) && $sql->_result === false) { $message = $AVE_Template->get_config_vars('SETTINGS_REV_DELETED_ERR'); $header = $AVE_Template->get_config_vars('SETTINGS_ERROR'); @@ -3953,7 +3988,7 @@ " . PREFIX . "_view_count "); - if ($sql->_result === false) + if (is_object($sql) && $sql->_result === false) { $message = $AVE_Template->get_config_vars('SETTINGS_COUNT_DELETED_ERR'); $header = $AVE_Template->get_config_vars('SETTINGS_ERROR'); diff --git a/class/class.hooks.php b/class/class.hooks.php index c962ee7..f829c1d 100644 --- a/class/class.hooks.php +++ b/class/class.hooks.php @@ -8,14 +8,14 @@ * This source file is part of the AVE.cms. More information, * documentation and tutorials can be found at http://www.ave-cms.ru * - * @package AVE.cms - * @file system/helpers/hooks.php - * @author @ - * @copyright 2007-2016 (c) AVE.cms - * @link http://www.ave-cms.ru - * @version 4.0 - * @since $date$ - * @license license GPL v.2 http://www.ave-cms.ru/license.txt + * @package AVE.cms + * @file system/helpers/hooks.php + * @author @ + * @copyright 2007-2016 (c) AVE.cms + * @link http://www.ave-cms.ru + * @version 4.0 + * @since $date$ + * @license license GPL v.2 http://www.ave-cms.ru/license.txt */ class Hooks @@ -74,20 +74,20 @@ /** * Do Hook */ - public static function trigger ($name, $arguments = "") + public static function trigger ($hook_name, $arguments = "") { // Oh, no you didn't. Are you trying to run an action hook that doesn't exist? - if (! isset(self::$hooks[$name])) + if (! isset(self::$hooks[$hook_name])) { return $arguments; } // Set the current running hook to this - self::$current_hook = $name; + self::$current_hook = $hook_name; // Key sort our action hooks - ksort(self::$hooks[$name]); - foreach (self::$hooks[$name] AS $priority => $names) + ksort(self::$hooks[$hook_name]); + foreach (self::$hooks[$hook_name] AS $priority => $names) { if (is_array($names)) { @@ -102,7 +102,9 @@ $arguments = $return; } - self::$run_hooks[$name][$priority]; + // ИСПРАВЛЕНИЕ: Устранение Fatal Error и Warning. + // Используем $hook_name (строка) в качестве ключа. + self::$run_hooks[$hook_name][$priority] = (self::$run_hooks[$hook_name][$priority] ?? 0) + 1; } } } diff --git a/class/class.logs.php b/class/class.logs.php index 6e5a080..6ec8c55 100644 --- a/class/class.logs.php +++ b/class/class.logs.php @@ -37,7 +37,7 @@ * Внешние методы класса */ - /** +/** * Метод, предназначенный для отображения всех записей Журнала событий * */ @@ -60,21 +60,22 @@ while (!feof($fp)) { - $event = fgetcsv($fp, $_slice); + // ИСПРАВЛЕНИЕ: Добавляем обязательные параметры: разделитель (','), ограничитель ('"'), экранирование ('\\') + $event = fgetcsv($fp, $_slice, ',', '"', '\\'); if (empty($event[0]) || count($event) < 3) { continue; } - $_lines[] = [ - 'log_time' => $event['0'], - 'log_ip' => $event['1'], - 'log_url' => $event['2'], - 'log_user_id' => $event['3'], - 'log_user_name' => $event['4'], - 'log_text' => $event['5'], - 'log_type' => $event['6'], - 'log_rubric' => $event['7'] + $_lines[] = [ + 'log_time' => $event['0'] ?? '', + 'log_ip' => $event['1'] ?? '', + 'log_url' => $event['2'] ?? '', + 'log_user_id' => $event['3'] ?? '', + 'log_user_name' => $event['4'] ?? '', + 'log_text' => $event['5'] ?? '', + 'log_type' => $event['6'] ?? '', + 'log_rubric' => $event['7'] ?? '' ]; } @@ -109,7 +110,7 @@ while (!feof($fp)) { - $event = fgetcsv($fp, $_slice); + $event = fgetcsv($fp, $_slice, ',', '"', '\\'); if (empty($event[0]) || count($event) < 3) { continue; diff --git a/class/class.navigation.php b/class/class.navigation.php index 73d2b04..778234c 100644 --- a/class/class.navigation.php +++ b/class/class.navigation.php @@ -217,28 +217,28 @@ // Если пользователь нажал на кнопку Сохранить изменения case 'save': - // Выполняем запрос к БД и обновляем информацию в таблице для данного меню + // Выполняем запрос к БД и обновляем информацию в таблице для данного меню $sql = $AVE_DB->Query(" UPDATE " . PREFIX . "_navigation SET - title = '" . $_REQUEST['title'] . "', - alias = '" . $_REQUEST['alias'] . "', - level1 = '" . $_REQUEST['level1'] . "', - level1_active = '" . $_REQUEST['level1_active'] . "', - level2 = '" . $_REQUEST['level2'] . "', - level2_active = '" . $_REQUEST['level2_active'] . "', - level3 = '" . $_REQUEST['level3'] . "', - level3_active = '" . $_REQUEST['level3_active'] . "', - level1_begin = '" . $_REQUEST['level1_begin'] . "', - level2_begin = '" . $_REQUEST['level2_begin'] . "', - level3_begin = '" . $_REQUEST['level3_begin'] . "', - level1_end = '" . $_REQUEST['level1_end'] . "', - level2_end = '" . $_REQUEST['level2_end'] . "', - level3_end = '" . $_REQUEST['level3_end'] . "', - begin = '" . $_REQUEST['begin'] . "', - end = '" . $_REQUEST['end'] . "', + title = '" . (isset($_REQUEST['title']) ? $_REQUEST['title'] : '') . "', + alias = '" . (isset($_REQUEST['alias']) ? $_REQUEST['alias'] : '') . "', + level1 = '" . (isset($_REQUEST['level1']) ? $_REQUEST['level1'] : '') . "', + level1_active = '" . (isset($_REQUEST['level1_active']) ? $_REQUEST['level1_active'] : '') . "', + level2 = '" . (isset($_REQUEST['level2']) ? $_REQUEST['level2'] : '') . "', + level2_active = '" . (isset($_REQUEST['level2_active']) ? $_REQUEST['level2_active'] : '') . "', + level3 = '" . (isset($_REQUEST['level3']) ? $_REQUEST['level3'] : '') . "', + level3_active = '" . (isset($_REQUEST['level3_active']) ? $_REQUEST['level3_active'] : '') . "', + level1_begin = '" . (isset($_REQUEST['level1_begin']) ? $_REQUEST['level1_begin'] : '') . "', + level2_begin = '" . (isset($_REQUEST['level2_begin']) ? $_REQUEST['level2_begin'] : '') . "', + level3_begin = '" . (isset($_REQUEST['level3_begin']) ? $_REQUEST['level3_begin'] : '') . "', + level1_end = '" . (isset($_REQUEST['level1_end']) ? $_REQUEST['level1_end'] : '') . "', + level2_end = '" . (isset($_REQUEST['level2_end']) ? $_REQUEST['level2_end'] : '') . "', + level3_end = '" . (isset($_REQUEST['level3_end']) ? $_REQUEST['level3_end'] : '') . "', + begin = '" . (isset($_REQUEST['begin']) ? $_REQUEST['begin'] : '') . "', + end = '" . (isset($_REQUEST['end']) ? $_REQUEST['end'] : '') . "', user_group = '" . (empty($_REQUEST['user_group']) ? '' : implode(',', $_REQUEST['user_group'])) . "', - expand_ext = '" . $_REQUEST['expand_ext'] . "' + expand_ext = '" . (isset($_REQUEST['expand_ext']) ? $_REQUEST['expand_ext'] : '') . "' WHERE navigation_id = '" . $navigation_id . "' "); @@ -643,7 +643,7 @@ $AVE_Template->assign('content', $AVE_Template->fetch('navigation/item_new.tpl')); break; - case 'edit': + case 'edit': $item = $AVE_DB->Query(" SELECT @@ -656,15 +656,17 @@ $item->css_style = stripslashes($item->css_style); + // <<< КЛЮЧЕВОЕ ИСПРАВЛЕНИЕ: ИНИЦИАЛИЗАЦИЯ >>> + $doc_info = array(); + if ($item->document_id) $doc_info = get_document((int)$item->document_id); - - $item->document_title = (($doc_info['document_breadcrum_title']) + + $item->document_title = ((isset($doc_info['document_breadcrum_title']) && $doc_info['document_breadcrum_title']) ? $doc_info['document_breadcrum_title'] - : $doc_info['document_title']); - - $item->document_alias = $doc_info['document_alias']; + : ($doc_info['document_title'] ?? '')); + $item->document_alias = $doc_info['document_alias'] ?? ''; $AVE_Template->assign('item', $item); $AVE_Template->assign('content', $AVE_Template->fetch('navigation/item_edit.tpl')); break; @@ -720,11 +722,11 @@ ")->GetCell(); //-- Стираем кеш навигации - $this->clearCache($_REQUEST['navigation_id'], $alias); + $this->clearCache((isset($_REQUEST['navigation_id']) ? $_REQUEST['navigation_id'] : ''), $alias); } else { - if ($_REQUEST['after']) + if (isset($_REQUEST['after']) && $_REQUEST['after']) $after = $AVE_DB->Query("SELECT * FROM ".PREFIX."_navigation_items WHERE navigation_item_id = '" . $_REQUEST['after'] . "' ")->FetchArray(); else $after = array('parent_id' => 0, 'level' => 1, 'position' => 0); @@ -774,7 +776,7 @@ 'message' => $message, 'header' => $header, 'theme' => $theme, - 'after' => $_REQUEST['after'], + 'after' => (isset($_REQUEST['after']) ? $_REQUEST['after'] : null), 'item_id' => $navigation_item_id) ); exit; @@ -1081,6 +1083,7 @@ return; // Выполняем запрос к БД и получаем id пункта меню, который соответствует идентификатору документа в ссылке + $item = $AVE_DB->Query(" SELECT * @@ -1090,14 +1093,19 @@ navigation_item_id = '" . $navigation_item_id . "' ")->FetchAssocArray(); + // ИНИЦИАЛИЗАЦИЯ: Убеждаемся, что $doc_info всегда существует + $doc_info = array(); // <--- КЛЮЧЕВОЕ ИСПРАВЛЕНИЕ + if ($item['document_id']) $doc_info = get_document((int)$item['document_id']); - - $item['document_title'] = (($doc_info['document_breadcrum_title']) + + // Теперь все последующие обращения безопасны: + + $item['document_title'] = ((isset($doc_info['document_breadcrum_title']) && $doc_info['document_breadcrum_title']) ? $doc_info['document_breadcrum_title'] - : $doc_info['document_title']); + : ($doc_info['document_title'] ?? '')); // Безопасный доступ - $item['document_alias'] = $doc_info['document_alias']; + $item['document_alias'] = $doc_info['document_alias'] ?? ''; // Безопасный доступ $nav = $AVE_DB->Query(" SELECT @@ -1142,7 +1150,7 @@ navigation_id = " . $navigation_id . " "); - if (is_array($item['children'])) + if (isset($item['children']) && is_array($item['children'])) { $this->navigationSortNested($item['children'], $item['id'], $level, $navigation_id); } @@ -1199,7 +1207,7 @@ navigation_id = " . $navigation_id . " "); - if (is_array($value['children'])) + if (isset($value['children']) && is_array($value['children'])) { $this->navigationSortNested($value['children'], $value['id'], $level, $navigation_id); } @@ -1284,8 +1292,11 @@ function clearCacheNav($id, $alias) { + //$cache_id = explode('_', $id); + //$cache_id = 'navigations/' . $cache_id[1]; + $cache_id = explode('_', $id); - $cache_id = 'navigations/' . $cache_id[1]; + $cache_id = 'navigations/' . (isset($cache_id[1]) ? $cache_id[1] : $id); // Используем $id, если нет второй части $cache_dir = BASE_DIR . '/tmp/cache/sql/' . (trim($cache_id) > '' ? trim($cache_id) . '/' @@ -1293,8 +1304,11 @@ rrmdir($cache_dir); + //$cache_id = explode('_', $alias); + //$cache_id = 'navigations/' . $cache_id[1]; + $cache_id = explode('_', $alias); - $cache_id = 'navigations/' . $cache_id[1]; + $cache_id = 'navigations/' . (isset($cache_id[1]) ? $cache_id[1] : $alias); // Используем $alias, если нет второй части $cache_dir = BASE_DIR . '/tmp/cache/sql/' . (trim($cache_id) > '' ? trim($cache_id) . '/' diff --git a/class/class.registry.php b/class/class.registry.php index cd50893..5fc6c88 100644 --- a/class/class.registry.php +++ b/class/class.registry.php @@ -133,13 +133,13 @@ } - private function __sleep () + public function __sleep () // ИСПРАВЛЕНО { self::$_storage = serialize (self::$_storage); } - private function __wakeup () + public function __wakeup () // ИСПРАВЛЕНО { self::$_storage = unserialize (self::$_storage); } diff --git a/class/class.request.php b/class/class.request.php index 2446a4a..3f6d77f 100644 --- a/class/class.request.php +++ b/class/class.request.php @@ -742,7 +742,7 @@ class AVE_Request condition_field_id = '" . $val['condition_field_id'] . "', condition_value = '" . (! empty($val['condition_value']) ? $val['condition_value'] : '') . "', condition_join = '" . $val['condition_join'] . "', - condition_status = '" . ((! empty($val['condition_value'])) ? (($val['condition_status'] == '1') ? '1' : '0') : ''). "' + condition_status = '" . ((! empty($val['condition_value'])) ? ((isset($val['condition_status']) && $val['condition_status'] == '1') ? '1' : '0') : ''). "' WHERE Id = '" . $condition_id . "' "); @@ -825,6 +825,7 @@ class AVE_Request // Если пользователь добавил новое условие case 'new': + $message = ''; if ($_POST['new_value'] !== '') { // Выполняем запрос к БД на добавление нового условия @@ -839,7 +840,7 @@ class AVE_Request condition_join = '" . $_POST['oper_new'] . "' "); - if ($sql->_result === false) + if (is_object($sql) && $sql->_result === false) { $message = $AVE_Template->get_config_vars('REQUEST_COND_NEW_ERR'); $header = $AVE_Template->get_config_vars('REQUEST_ERROR'); diff --git a/class/class.rubs.php b/class/class.rubs.php index f9adb11..312b93b 100644 --- a/class/class.rubs.php +++ b/class/class.rubs.php @@ -546,7 +546,7 @@ * * @param int $rubric_id идентификатор рубрики */ - function rubricFieldShow($rubric_id = 0, $ajax) + function rubricFieldShow($rubric_id = 0, $ajax = null) { global $AVE_DB, $AVE_Template; @@ -796,12 +796,12 @@ } } - /** +/** * Создание нового поля рубрики * * @param int $rubric_id идентификатор рубрики */ - function rubricFieldNew($rubric_id = 0, $ajax) + function rubricFieldNew($rubric_id = 0, $ajax= null) { global $AVE_DB, $AVE_Template; @@ -818,27 +818,28 @@ if ($_POST['rub_type_new'] == 'dropdown') { - $rubric_field_default = trim($_POST['default_value']); + $rubric_field_default = trim($_POST['default_value'] ?? ''); $rubric_field_default = preg_split('/\s*,\s*/', $rubric_field_default); $rubric_field_default = implode(',', $rubric_field_default); } else { - $rubric_field_default = $_POST['default_value']; + // ИСПРАВЛЕНО (строка 827): Защита от отсутствия ключа 'default_value' + $rubric_field_default = $_POST['default_value'] ?? ''; } $AVE_DB->Query(" INSERT " . PREFIX . "_rubric_fields SET - rubric_id = '" . $rubric_id . "', - rubric_field_group = '" . (($_POST['group_new'] != '') ? (int)$_POST['group_new'] : '0') . "', - rubric_field_title = '" . $_POST['title_new'] . "', - rubric_field_type = '" . $_POST['rub_type_new'] . "', + rubric_id = '" . $rubric_id . "', + rubric_field_group = '" . (($_POST['group_new'] ?? '') != '' ? (int)($_POST['group_new'] ?? 0) : '0') . "', + rubric_field_title = '" . $_POST['title_new'] . "', + rubric_field_type = '" . $_POST['rub_type_new'] . "', rubric_field_position = '" . $position . "', - rubric_field_default = '" . $rubric_field_default . "', - rubric_field_numeric = '" . (($_POST['rubric_field_numeric'] == 1) ? $_POST['rubric_field_numeric'] : '0') . "', - rubric_field_search = '" . (($_POST['rubric_field_search'] == 1) ? $_POST['rubric_field_search'] : '0') . "' + rubric_field_default = '" . $rubric_field_default . "', + rubric_field_numeric = '" . ((($_POST['rubric_field_numeric'] ?? 0) == 1) ? 1 : 0) . "', + rubric_field_search = '" . ((($_POST['rubric_field_search'] ?? 0) == 1) ? 1 : 0) . "' "); $UpdateRubricField = $AVE_DB->InsertId(); @@ -1076,7 +1077,8 @@ } } - foreach ($_POST['del'] as $id => $Del) + // ИСПРАВЛЕНИЕ: Используем оператор объединения с null (??) для защиты от отсутствия ключа 'del' + foreach ($_POST['del'] ?? [] as $id => $Del) { if (! empty($Del)) { @@ -2400,7 +2402,7 @@ } - function EditFieldTpl($id = '', $fld, $type) + function EditFieldTpl($id = '', $fld = null, $type = null) { global $AVE_DB, $AVE_Template, $_fm_dir; @@ -2465,7 +2467,7 @@ * Сохранение шаблона * */ - function SaveFieldTpl($id = '', $fld, $type, $func) + function SaveFieldTpl($id = '', $fld = null, $type = null, $func = null) { global $AVE_DB; @@ -2573,10 +2575,14 @@ } - function clearChanges() + function clearChanges() { $cache_file = BASE_DIR . '/tmp/cache/sql/rubrics/all/rubrics.cahnges'; - unlink($cache_file); + + // ИСПРАВЛЕНИЕ: Проверяем существование файла перед удалением + if (file_exists($cache_file)) { + unlink($cache_file); + } } } ?> \ No newline at end of file diff --git a/class/class.settings.php b/class/class.settings.php index 8400b5a..843eacf 100644 --- a/class/class.settings.php +++ b/class/class.settings.php @@ -487,7 +487,7 @@ function settingsSave() Id = 1 "); - if ($sql->_result === false) + if (is_object($sql) && $sql->_result === false) { $message = $AVE_Template->get_config_vars('SETTINGS_SAVED_ERR'); $header = $AVE_Template->get_config_vars('SETTINGS_ERROR'); @@ -600,68 +600,111 @@ function settingsSave() } - /** - * Метод Редактирования параметров языков - * - */ - function settingsLanguageEdit() - { - global $AVE_DB, $AVE_Template; +/** + * Метод Редактирования параметров языков + * + */ + function settingsLanguageEdit() + { + global $AVE_DB, $AVE_Template; - if (isset($_REQUEST["Id"])) - { - $items = $AVE_DB->Query(" - SELECT - * - FROM - " . PREFIX . "_settings_lang - WHERE - Id = '" . $_REQUEST["Id"] . "' - ")->FetchRow(); + // Инициализируем $items как null, чтобы шаблон работал при добавлении + $items = null; + + // Безопасно получаем ID (используем 'id' или 'Id', если что-то передано) + $lang_id = (int)($_REQUEST['id'] ?? $_REQUEST['Id'] ?? 0); - $AVE_Template->assign('items', $items); - } + if ($lang_id > 0) + { + $result = $AVE_DB->Query(" + SELECT + * + FROM + " . PREFIX . "_settings_lang + WHERE + Id = '" . $lang_id . "' + "); + + // Безопасное получение данных + if (is_object($result)) { + $items = $result->FetchRow(); + } + } - $AVE_Template->assign('content', $AVE_Template->fetch('settings/settings_lang_edit.tpl')); - } + // Передаем $items (либо объект, либо null) в шаблон + $AVE_Template->assign('items', $items); + $AVE_Template->assign('content', $AVE_Template->fetch('settings/settings_lang_edit.tpl')); + } - function settingsLanguageEditSave() - { - global $AVE_DB, $AVE_Template; +function settingsLanguageEditSave() + { + global $AVE_DB, $AVE_Template; + + // 1. Сохранение/Обновление данных языка в БД (Ваш оригинальный код) - if (! empty($_REQUEST["Id"])) - { - $AVE_DB->Query(" - UPDATE - " . PREFIX . "_settings_lang - SET - lang_key = '" .$_REQUEST['lang_key']. "', - lang_alias_pref = '" .$_REQUEST['lang_alias_pref']. "', - lang_name = '" .$_REQUEST['lang_name']. "' - WHERE - Id = '" . $_REQUEST["Id"] . "' - "); - } - else - { - $AVE_DB->Query(" - INSERT INTO - " . PREFIX . "_settings_lang - SET - lang_key = '" .$_REQUEST['lang_key']. "', - lang_name = '" .$_REQUEST['lang_name']. "', - lang_alias_pref = '" .$_REQUEST['lang_alias_pref']. "', - lang_default = '0', - lang_status = '0' - "); + if (! empty($_REQUEST["Id"])) + { + $AVE_DB->Query(" + UPDATE + " . PREFIX . "_settings_lang + SET + lang_key = '" .$_REQUEST['lang_key']. "', + lang_alias_pref = '" .$_REQUEST['lang_alias_pref']. "', + lang_name = '" .$_REQUEST['lang_name']. "' + WHERE + Id = '" . $_REQUEST["Id"] . "' + "); + } + else + { + $AVE_DB->Query(" + INSERT INTO + " . PREFIX . "_settings_lang + SET + lang_key = '" .$_REQUEST['lang_key']. "', + lang_name = '" .$_REQUEST['lang_name']. "', + lang_alias_pref = '" .$_REQUEST['lang_alias_pref']. "', + lang_default = '0', + lang_status = '0' + "); - } + } - $AVE_DB->clearCache('langs'); + // 2. Логика сохранения загруженного флага (ДОБАВЛЕНО) - echo ""; - } + $lang_key = $_REQUEST['lang_key'] ?? ''; + + if (!empty($lang_key) && isset($_FILES['lang_flag']) && $_FILES['lang_flag']['error'] === UPLOAD_ERR_OK) { + + $file = $_FILES['lang_flag']; + + // ПУТЬ: BASE_DIR/lib/flags/ + $upload_dir = BASE_DIR . '/lib/flags/'; + + // Проверяем и создаем папку, если нужно + if (!is_dir($upload_dir)) { + @mkdir($upload_dir, 0777, true); + } + + // Ожидаем PNG-файл + if ($file['type'] === 'image/png') { + $target_file = $upload_dir . $lang_key . '.png'; + + // Сохраняем файл + if (move_uploaded_file($file['tmp_name'], $target_file)) { + // Успех + } else { + // Ошибка: проверить права доступа к /lib/flags/ + } + } + } + + // 3. Очистка кэша и закрытие окна + $AVE_DB->clearCache('langs'); + + echo ""; + } function settingsPaginationsList() diff --git a/class/class.sysblocks.php b/class/class.sysblocks.php index dad5e76..f971f59 100644 --- a/class/class.sysblocks.php +++ b/class/class.sysblocks.php @@ -417,7 +417,7 @@ } - /* +/* |-------------------------------------------------------------------------------------- | editBlock |-------------------------------------------------------------------------------------- @@ -429,39 +429,39 @@ { global $AVE_DB, $AVE_Template; - $sysblock_id = $_REQUEST['id'] + $sysblock_id = ($_REQUEST['id'] ?? null) ? (int)$_REQUEST['id'] : null; if (is_numeric($sysblock_id)) { - - $_REQUEST['sysblock_external'] = (isset($_REQUEST['sysblock_external'])) ? $_REQUEST['sysblock_external'] : 0; - $_REQUEST['sysblock_ajax'] = (isset($_REQUEST['sysblock_ajax'])) ? $_REQUEST['sysblock_ajax'] : 0; - $_REQUEST['sysblock_eval'] = (isset($_REQUEST['sysblock_eval'])) ? $_REQUEST['sysblock_eval'] : 0; - $_REQUEST['sysblock_visual'] = (isset($_REQUEST['sysblock_visual'])) ? $_REQUEST['sysblock_visual'] : 0; - $_REQUEST['sysblock_alias'] = isset($_REQUEST['sysblock_alias']) ? $_REQUEST['sysblock_alias'] : ''; + // ❌ Удалены избыточные строки инициализации: + // $_REQUEST['sysblock_external'] = (isset($_REQUEST['sysblock_external'])) ? $_REQUEST['sysblock_external'] : 0; + // $_REQUEST['sysblock_ajax'] = (isset($_REQUEST['sysblock_ajax'])) ? $_REQUEST['sysblock_ajax'] : 0; + // $_REQUEST['sysblock_eval'] = (isset($_REQUEST['sysblock_eval'])) ? $_REQUEST['sysblock_eval'] : 0; + // $_REQUEST['sysblock_visual'] = (isset($_REQUEST['sysblock_visual'])) ? $_REQUEST['sysblock_visual'] : 0; + // $_REQUEST['sysblock_alias'] = isset($_REQUEST['sysblock_alias']) ? $_REQUEST['sysblock_alias'] : ''; $sql = " UPDATE " . PREFIX . "_sysblocks SET - sysblock_group_id = '" . (int)$_REQUEST['sysblock_group_id'] . "', - sysblock_name = '" . $_REQUEST['sysblock_name'] . "', - sysblock_description = '" . addslashes($_REQUEST['sysblock_description']) . "', - sysblock_alias = '" . $_REQUEST['sysblock_alias'] . "', - sysblock_text = '" . $_REQUEST['sysblock_text'] . "', - sysblock_eval = '" . (int)$_REQUEST['sysblock_eval'] . "', - sysblock_external = '" . (int)$_REQUEST['sysblock_external'] . "', - sysblock_ajax = '" . (int)$_REQUEST['sysblock_ajax'] . "', - sysblock_visual = '" . (int)$_REQUEST['sysblock_visual'] . "' + sysblock_group_id = '" . (int)($_REQUEST['sysblock_group_id'] ?? 0) . "', + sysblock_name = '" . ($_REQUEST['sysblock_name'] ?? '') . "', + sysblock_description = '" . addslashes($_REQUEST['sysblock_description'] ?? '') . "', + sysblock_alias = '" . ($_REQUEST['sysblock_alias'] ?? '') . "', + sysblock_text = '" . ($_REQUEST['sysblock_text'] ?? '') . "', + sysblock_eval = '" . (int)($_REQUEST['sysblock_eval'] ?? 0) . "', + sysblock_external = '" . (int)($_REQUEST['sysblock_external'] ?? 0) . "', + sysblock_ajax = '" . (int)($_REQUEST['sysblock_ajax'] ?? 0) . "', + sysblock_visual = '" . (int)($_REQUEST['sysblock_visual'] ?? 0) . "' WHERE id = '" . $sysblock_id . "' "; $query = $AVE_DB->Query($sql); - if ($query->_result === false) + if (is_object($query) && $query->_result === false) { $message = $AVE_Template->get_config_vars('SYSBLOCK_SAVED_ERR'); $header = $AVE_Template->get_config_vars('SYSBLOCK_ERROR'); @@ -474,10 +474,10 @@ $theme = 'accept'; //-- Стираем кеш сисблока - self::clearCache($sysblock_id, $_REQUEST['sysblock_alias']); + self::clearCache($sysblock_id, $_REQUEST['sysblock_alias'] ?? ''); // Также используем ?? для безопасности //-- Сохраняем системное сообщение в журнал - reportLog($AVE_Template->get_config_vars('SYSBLOCK_SQLUPDATE') . " (" . stripslashes($_REQUEST['sysblock_name']) . ") (id: $sysblock_id)"); + reportLog($AVE_Template->get_config_vars('SYSBLOCK_SQLUPDATE') . " (" . stripslashes($_REQUEST['sysblock_name'] ?? '') . ") (id: $sysblock_id)"); } if (isAjax()) @@ -498,16 +498,16 @@ INSERT INTO " . PREFIX . "_sysblocks SET - sysblock_group_id = '" . (int)$_REQUEST['sysblock_group_id'] . "', - sysblock_name = '" . $_REQUEST['sysblock_name'] . "', - sysblock_description = '" . addslashes($_REQUEST['sysblock_description']) . "', - sysblock_alias = '" . $_REQUEST['sysblock_alias'] . "', - sysblock_text = '" . $_REQUEST['sysblock_text'] . "', - sysblock_author_id = '" . (int)$_SESSION['user_id'] . "', - sysblock_eval = '" . (int)$_REQUEST['sysblock_eval'] . "', - sysblock_external = '" . (int)$_REQUEST['sysblock_external'] . "', - sysblock_ajax = '" . (int)$_REQUEST['sysblock_ajax'] . "', - sysblock_visual = '" . (int)$_REQUEST['sysblock_visual'] . "', + sysblock_group_id = '" . (int)($_REQUEST['sysblock_group_id'] ?? 0) . "', + sysblock_name = '" . ($_REQUEST['sysblock_name'] ?? '') . "', + sysblock_description = '" . addslashes($_REQUEST['sysblock_description'] ?? '') . "', + sysblock_alias = '" . ($_REQUEST['sysblock_alias'] ?? '') . "', + sysblock_text = '" . ($_REQUEST['sysblock_text'] ?? '') . "', + sysblock_author_id = '" . (int)($_SESSION['user_id'] ?? 0) . "', + sysblock_eval = '" . (int)($_REQUEST['sysblock_eval'] ?? 0) . "', + sysblock_external = '" . (int)($_REQUEST['sysblock_external'] ?? 0) . "', + sysblock_ajax = '" . (int)($_REQUEST['sysblock_ajax'] ?? 0) . "', + sysblock_visual = '" . (int)($_REQUEST['sysblock_visual'] ?? 0) . "', sysblock_created = '" . time() . "' "; @@ -516,7 +516,7 @@ $sysblock_id = $AVE_DB->InsertId(); //-- Сохраняем системное сообщение в журнал - reportLog($AVE_Template->get_config_vars('SYSBLOCK_SQLNEW') . " (" . stripslashes($_REQUEST['sysblock_name']) . ") (id: $sysblock_id)"); + reportLog($AVE_Template->get_config_vars('SYSBLOCK_SQLNEW') . " (" . stripslashes($_REQUEST['sysblock_name'] ?? '') . ") (id: $sysblock_id)"); } if (! isset($_REQUEST['next_edit'])) diff --git a/class/class.template.php b/class/class.template.php index cb88bfc..67e8852 100644 --- a/class/class.template.php +++ b/class/class.template.php @@ -1,34 +1,39 @@ register_function('check_permission', 'check_permission'); - $this->register_function('get_home_link', 'get_home_link'); - $this->register_function('num_format', 'num_format'); - $this->register_function('thumb', 'make_thumbnail'); + if (function_exists('check_permission')) { + $this->registerPlugin('function', 'check_permission', 'check_permission'); + } + if (function_exists('get_home_link')) { + $this->registerPlugin('function', 'get_home_link', 'get_home_link'); + } + if (function_exists('num_format')) { + $this->registerPlugin('function', 'num_format', 'num_format'); + } + // Исправленная строка: Проверяем make_thumbnail перед регистрацией 'thumb' + if (function_exists('make_thumbnail')) { + $this->registerPlugin('function', 'thumb', 'make_thumbnail'); + } /** * Регистрация плагинов-модификаторов Smarty. - * Передается имя модификатора и имя функции, реализующей его. + * АДАПТАЦИЯ: register_modifier заменен на registerPlugin('modifier', ...) для Smarty 5. */ - $this->register_modifier('pretty_date', 'pretty_date'); - $this->register_modifier('translate_date', 'translate_date'); - $this->register_modifier('utf8', 'utf8'); + if (function_exists('pretty_date')) { + $this->registerPlugin('modifier', 'pretty_date', 'pretty_date'); + } + if (function_exists('translate_date')) { + $this->registerPlugin('modifier', 'translate_date', 'translate_date'); + } + if (function_exists('utf8')) { + $this->registerPlugin('modifier', 'utf8', 'utf8'); + } + if (function_exists('check_permission')) { + // Регистрируем как модификатор, если функция существует + $this->registerPlugin('modifier', 'check_permission', 'check_permission'); + } + // stripslashes - это нативная PHP-функция, проверка не нужна + $this->registerPlugin('modifier', 'stripslashes', 'stripslashes'); + + if (function_exists('htmlspecialchars')) { + // Регистрируем как модификатор, если функция существует + $this->registerPlugin('modifier', 'htmlspecialchars', 'htmlspecialchars'); + } + + if (function_exists('trim')) { + // Регистрируем как модификатор, если функция существует + $this->registerPlugin('modifier', 'trim', 'trim'); + } + + if (function_exists('format_size')) { + // Регистрируем как модификатор, если функция существует + $this->registerPlugin('modifier', 'format_size', 'format_size'); + } + + if (function_exists('urldecode')) { + // Регистрируем как модификатор, если функция существует + $this->registerPlugin('modifier', 'urldecode', 'urldecode'); + } + + if (function_exists('strtolower')) { + // Регистрируем как модификатор, если функция существует + $this->registerPlugin('modifier', 'strtolower', 'strtolower'); + } + + if (function_exists('constant')) { + // Регистрируем как модификатор, если функция существует + $this->registerPlugin('modifier', 'constant', 'constant'); + } + // плагин позволяющий поставить метки шаблонов // для быстрого поиска шаблона отвечающего за вывод @@ -120,10 +181,10 @@ * Можно явно передавать пары имя/значение, * или ассоциативные массивы, содержащие пары имя/значение. */ - $assign['BASE_DIR'] = BASE_DIR; - $assign['ABS_PATH'] = ABS_PATH; - $assign['DATE_FORMAT'] = DATE_FORMAT; - $assign['TIME_FORMAT'] = TIME_FORMAT; + $assign['BASE_DIR'] = BASE_DIR; + $assign['ABS_PATH'] = ABS_PATH; + $assign['DATE_FORMAT'] = DATE_FORMAT; + $assign['TIME_FORMAT'] = TIME_FORMAT; $assign['PAGE_NOT_FOUND_ID'] = PAGE_NOT_FOUND_ID; $this->assign($assign); @@ -153,59 +214,82 @@ * ВНЕШНИЕ МЕТОДЫ */ + /** + * АДАПТАЦИЯ PHP 8 / SMARTY 5: + * Smarty 5 перешел на camelCase (getConfigVars), но старый код использует snake_case (get_config_vars). + * Создаем алиас для обратной совместимости. + */ + function get_config_vars($variable = null, $section = null) + { + return parent::getConfigVars($variable, $section); + } + + /** * Переопределение одноименного метода Smarty * для конфигурационных файлов созданных в теме дизайна. * + * ИСПРАВЛЕНИЕ: Добавлен default = null к $file для совместимости с PHP 8/Smarty 5 + * * @param string $file * @param string $section * @param string $scope */ - function config_load($file, $section = null, $scope = 'global') + function config_load($file = null, $section = null, $scope = 'global') { - Smarty::config_load($this->_redefine_template($file), $section, $scope); + // Используем parent::configLoad + parent::configLoad($this->_redefine_template($file), $section, $scope); } /** * Переопределение одноименного метода Smarty * для пользовательских шаблонов созданных в теме дизайна. * + * ИСПРАВЛЕНИЕ: Добавлен default = null к $tpl_file для совместимости с PHP 8/Smarty 5 + * * @param string $tpl_file name of template file * @param string $cache_id * @param string $compile_id * @return string|false results of {@link _read_cache_file()} */ - function is_cached($tpl_file, $cache_id = null, $compile_id = null) + function is_cached($tpl_file = null, $cache_id = null, $compile_id = null) { - return Smarty::is_cached($this->_redefine_template($tpl_file), $cache_id, $compile_id); + // Используем parent::isCached + return parent::isCached($this->_redefine_template($tpl_file), $cache_id, $compile_id); } /** * Переопределение одноименного метода Smarty * для пользовательских шаблонов созданных в теме дизайна. * + * ИСПРАВЛЕНИЕ: Добавлен default = null к $resource_name для совместимости с PHP 8/Smarty 5 + * * @param string $resource_name * @param string $cache_id * @param string $compile_id - * @param boolean $display + * @return string */ - function fetch($resource_name, $cache_id = null, $compile_id = null, $display = false) + function fetch($resource_name = null, $cache_id = null, $compile_id = null) { - return Smarty::fetch($this->_redefine_template($resource_name), $cache_id, $compile_id, $display); + // Вызываем родительский fetch + return parent::fetch($this->_redefine_template($resource_name), $cache_id, $compile_id); } /** * Переопределение одноименного метода Smarty * для пользовательских шаблонов созданных в теме дизайна. * + * ИСПРАВЛЕНИЕ: Добавлен default = null к $resource_name для совместимости с PHP 8/Smarty 5 + * * @param string $resource_name * @param string $cache_id * * @param string $compile_id */ - function display($resource_name, $cache_id = null, $compile_id = null) + function display($resource_name = null, $cache_id = null, $compile_id = null) { - $this->fetch($resource_name, $cache_id, $compile_id, true); + // Вызываем родительский display + parent::display($this->_redefine_template($resource_name), $cache_id, $compile_id); } @@ -225,7 +309,7 @@ unlink($file->getRealPath()); } - rmdir($dir); + @rmdir($dir); } @@ -243,7 +327,7 @@ if (isset($_REQUEST['templateCache']) && $_REQUEST['templateCache'] == '1') { // Smarty clear cache - $this->clear_all_cache(); + $this->clearAllCache(); foreach (glob($this->cache_dir_root . "/cache_*") as $filename) @unlink($filename); @@ -253,11 +337,13 @@ // Memcached if (defined('MEMCACHED_SERVER') && defined('MEMCACHED_PORT') && MEMCACHED_SERVER && MEMCACHED_PORT) { - $m = new Memcached(); + $m = new \Memcached(); $m->addServer(MEMCACHED_SERVER, MEMCACHED_PORT); $m->flush(); } + // Здесь используется getConfigVars, но вызывается через старый get_config_vars, + // что теперь будет работать благодаря алиасу $message[] = $AVE_Template->get_config_vars('TEMPLATES_CACHE_SUCCESS'); reportLog($AVE_Template->get_config_vars('TEMPLATES_CACHE_SUCCESS_LOG')); @@ -278,7 +364,7 @@ if (isset($_REQUEST['templateCompiledTemplate']) && $_REQUEST['templateCompiledTemplate'] == '1') { // Smarty compiled cache - $this->clear_compiled_tpl(); + $this->clearCompiledTemplate(); write_htaccess_deny($this->compile_dir . '/'); @@ -295,8 +381,8 @@ if (is_dir($this->module_cache_dir)) { $this->recursivDelete($this->module_cache_dir); } - - mkdir($this->module_cache_dir, 0777, true); + + @mkdir($this->module_cache_dir, 0777, true); write_htaccess_deny($this->module_cache_dir . '/'); @@ -312,7 +398,7 @@ $this->recursivDelete($this->session_dir); } - mkdir($this->session_dir, 0777, true); + @mkdir($this->session_dir, 0777, true); write_htaccess_deny($this->session_dir . '/'); @@ -328,7 +414,7 @@ $this->recursivDelete($this->sql_cache_dir); } - mkdir($this->sql_cache_dir, 0777, true); + @mkdir($this->sql_cache_dir, 0777, true); write_htaccess_deny($this->sql_cache_dir . '/'); @@ -340,7 +426,7 @@ } - /** +/** * Метод очистки миниатюр * */ @@ -367,11 +453,15 @@ } $hid_cat = (glob("$dirname/{.tmb}*", GLOB_ONLYDIR|GLOB_BRACE)); + + // ИСПРАВЛЕНИЕ: Проверяем, существует ли элемент [0] + if (!empty($hid_cat)) + { + $hid_tmb = $hid_cat[0]; - $hid_tmb = $hid_cat[0]; - - foreach (glob("$hid_cat[0]/*.png", GLOB_NOSORT) AS $filename) - unlink("$filename"); + foreach (glob("$hid_cat[0]/*.png", GLOB_NOSORT) AS $filename) + unlink("$filename"); + } rrmdir(BASE_DIR . '/' . UPLOAD_DIR . '/' . THUMBNAIL_DIR); } diff --git a/class/class.templates.php b/class/class.templates.php index 440bcff..ee3b29c 100644 --- a/class/class.templates.php +++ b/class/class.templates.php @@ -351,14 +351,14 @@ } else { - $sql = $AVE_DB->Query(" + $sql = $AVE_DB->Query(" INSERT INTO " . PREFIX . "_templates SET - Id = '', - template_title = '" . $_REQUEST['template_title'] . "', - template_text = '" . addslashes(pretty_chars($_REQUEST['template_text'])) . "', + Id = '', + template_title = '" . $_REQUEST['template_title'] . "', + template_text = '" . addslashes(pretty_chars($_REQUEST['template_text'])) . "', template_author_id = '" . $_SESSION['user_id'] . "', template_created = '" . time() . "' "); @@ -368,12 +368,14 @@ // Сохраняем шаблон в файле self::setTemplate($template_id); - reportLog($AVE_Template->get_config_vars('TEMPLATES_REPORT_NEW') . '(' . stripslashes(htmlspecialchars($_REQUEST['template_text'], ENT_QUOTES)) . ') (Id:' . (int)$iid . ')'); + // ИСПРАВЛЕНО: $iid заменено на $template_id + reportLog($AVE_Template->get_config_vars('TEMPLATES_REPORT_NEW') . '(' . stripslashes(htmlspecialchars($_REQUEST['template_text'], ENT_QUOTES)) . ') (Id:' . (int)$template_id . ')'); if (! $_REQUEST['next_edit']) header('Location:index.php?do=templates&cp=' . SESSION); else - header('Location:index.php?do=templates&action=edit&Id=' . (int)$template_new . '&cp=' . SESSION); + // ИСПРАВЛЕНО: $template_new заменено на $template_id + header('Location:index.php?do=templates&action=edit&Id=' . (int)$template_id . '&cp=' . SESSION); exit; } diff --git a/class/class.thumbnail.php b/class/class.thumbnail.php index cbefe01..9a7bc2a 100644 --- a/class/class.thumbnail.php +++ b/class/class.thumbnail.php @@ -61,6 +61,12 @@ */ public $_error_prefix = 'Image: '; + protected $_gd_version_string; + protected $_gd_version_number; + protected $_gd_version; + protected $_gd_ttf; + protected $_gd_ps; + /** * Defines imagetypes and how they are supported by the server diff --git a/class/class.user.php b/class/class.user.php index 1cc3d7f..2ca587f 100644 --- a/class/class.user.php +++ b/class/class.user.php @@ -363,7 +363,7 @@ if (is_numeric($user_group_id)) { "); } - if ($sql->_result === false) { + if (is_object($sql) && $sql->_result === false) { $message = $AVE_Template->get_config_vars('UGROUP_SAVED_ERR'); $header = $AVE_Template->get_config_vars('UGROUP_ERROR'); $theme = 'error'; diff --git a/fields/code/field.php b/fields/code/field.php index 7b8cc13..001e7d3 100644 --- a/fields/code/field.php +++ b/fields/code/field.php @@ -29,10 +29,12 @@ switch ($action) { - case 'edit': + case 'edit': $AVE_Template->assign('field_id', $field_id); $AVE_Template->assign('field_value', $field_value); - $AVE_Template->assign('doc_id', (int)$_REQUEST['Id']); + + $AVE_Template->assign('doc_id', $doc_id); + $AVE_Template->assign('rubric_id', $rubric_id); $AVE_Template->assign('f_id', $field_id . '_' . $doc_id); diff --git a/fields/code_small/field.php b/fields/code_small/field.php index 2ee8e19..62553de 100644 --- a/fields/code_small/field.php +++ b/fields/code_small/field.php @@ -32,7 +32,7 @@ case 'edit': $AVE_Template->assign('field_id', $field_id); $AVE_Template->assign('field_value', $field_value); - $AVE_Template->assign('doc_id', (int)$_REQUEST['Id']); + $AVE_Template->assign('doc_id', $doc_id); $AVE_Template->assign('rubric_id', $rubric_id); $AVE_Template->assign('f_id', $field_id . '_' . $doc_id); diff --git a/functions/func.common.php b/functions/func.common.php index 2236d7f..96bda27 100644 --- a/functions/func.common.php +++ b/functions/func.common.php @@ -1304,6 +1304,28 @@ function get_settings($field = '') } } + if (defined('PROFILING') && PROFILING == 'dev') + { + $dev_output = ''; + $dev_output .= "\r\n" . "------ Time generation: ".Debug::getStatistic('time')." sec ----- "; + $dev_output .= "\r\n" . "------ Memory usage: ".Debug::getStatistic('memory')." ----- "; + $dev_output .= "\r\n" . "------ Memory peak usage: ".Debug::getStatistic('peak')." ----- "; + + if (defined('SQL_PROFILING') && SQL_PROFILING) + $dev_output .= "\r\n" . "------ SQL Queries: ".$AVE_DB->DBProfilesGet('count')." for ".$AVE_DB->DBProfilesGet('time')." sec ----- "; + + // Добавляем стилизованный
     блок
    +			if (! (defined('HTML_COMPRESSION') && HTML_COMPRESSION)) {
    +				$data .= "
    ";
    +			}
    +
    +			$data .= $dev_output;
    +			
    +			if (! (defined('HTML_COMPRESSION') && HTML_COMPRESSION)) {
    +				$data .= "\r\n" . "
    "; + } + } + if ($Gzip && (defined('GZIP_COMPRESSION') && GZIP_COMPRESSION)) { $data = gzencode($data, 9); diff --git a/functions/func.helpers.php b/functions/func.helpers.php index 66a78de..b1d08ff 100644 --- a/functions/func.helpers.php +++ b/functions/func.helpers.php @@ -281,10 +281,13 @@ { function sanitize($string, $trim = false, $int = false, $str = false) { - $string = filter_var($string, FILTER_SANITIZE_STRING); + // Приводим к строке, чтобы избежать ошибок, если $string не является строкой. + // Устаревшая константа FILTER_SANITIZE_STRING удалена. + $string = (string)$string; + $string = trim($string); $string = stripslashes($string); - $string = strip_tags($string); + $string = strip_tags($string); $string = str_replace( array( '‘', diff --git a/functions/func.hidden.php b/functions/func.hidden.php index 17820fe..bd1b772 100644 --- a/functions/func.hidden.php +++ b/functions/func.hidden.php @@ -28,12 +28,12 @@ $count_matches = count($matches); - if ($count_matches > 0) + if ($count_matches > 0) { for ($i=0; $i <= $count_matches; $i++) { - - $hidden_text = substr(@$matches[$i][3], 1); + // Безопасная передача строки в substr() + $hidden_text = substr($matches[$i][3] ?? '', 1); if ($hidden_text == "") $hidden_text = trim(get_settings('hidden_text')); diff --git a/functions/func.locale.php b/functions/func.locale.php index a76ee7f..a4d86d6 100644 --- a/functions/func.locale.php +++ b/functions/func.locale.php @@ -183,8 +183,8 @@ ); break; - //болгарский - case 'bg': + //болгарский + case 'bg': $table = array( //-- Заглавные 'А' => 'A', @@ -515,8 +515,12 @@ */ function pretty_date($string, $language = '') { + // БЕЗОПАСНОСТЬ PHP 8: Приводим к строке, чтобы избежать ошибки NULL в strtr() + $string = (string)$string; + // пытаемся решить проблему для кодировки дат на лок. серверах - if (! mb_check_encoding($string, 'UTF-8')) + // БЕЗОПАСНОСТЬ PHP 8: Проверяем !empty(), чтобы избежать ошибки mb_check_encoding() + if (!empty($string) && ! mb_check_encoding($string, 'UTF-8')) { $string = iconv('Windows-1251', 'UTF-8', $string); } @@ -549,13 +553,13 @@ case 'ua': case 'uk': $pretty = array( - 'Січень' =>'січня', 'Лютий' =>'лютого', 'Березень'=>'березня', - 'Квітень'=>'квітня', 'Травень' =>'травня', 'Червень' =>'червня', - 'Липень' =>'липня', 'Серпень' =>'серпня', 'Вересень'=>'вересня', + 'Січень' =>'січня', 'Лютий' =>'лютого', 'Березень'=>'березня', + 'Квітень'=>'квітня', 'Травень' =>'травня', 'Червень' =>'червня', + 'Липень' =>'липня', 'Серпень' =>'серпня', 'Вересень'=>'вересня', 'Жовтень'=>'жовтня', 'Листопад' =>'листопада', 'Грудень' =>'грудня', 'неділя' =>'Неділя', 'понеділок'=>'Понеділок', 'вівторок'=>'Вівторок', - 'середа' =>'Середа', 'четвер' =>'Четвер', 'п’ятниця'=>'П’ятниця', + 'середа' =>'Середа', 'четвер' =>'Четвер', 'п’ятниця'=>'П’ятниця', 'субота' =>'Субота' ); break; diff --git a/functions/func.logs.php b/functions/func.logs.php index bd332c6..29e2788 100644 --- a/functions/func.logs.php +++ b/functions/func.logs.php @@ -4,9 +4,9 @@ * AVE.cms * * @package AVE.cms - * @version 3.x + * @version 4.x * @filesource - * @copyright © 2007-2014 AVE.cms, http://www.ave-cms.ru + * @copyright © 2007-2025 AVE.cms, https://www.ave.gitget.ru * * @license GPL v.2 */ @@ -39,7 +39,8 @@ { if (flock($f_log, LOCK_EX)) { - fputcsv($f_log, $logData); + // Исправлено: Явно указаны разделитель (','), ограничитель ('"') и символ экранирования ('\\') для совместимости с PHP 8.1+ + fputcsv($f_log, $logData, ',', '"', '\\'); flock($f_log, LOCK_UN); } @@ -70,7 +71,8 @@ { if (flock($f_log, LOCK_EX)) { - fputcsv($f_log, $logData); + // Исправлено: Явно указаны разделитель (','), ограничитель ('"') и символ экранирования ('\\') для совместимости с PHP 8.1+ + fputcsv($f_log, $logData, ',', '"', '\\'); flock($f_log, LOCK_UN); } @@ -101,7 +103,8 @@ { if (flock($f_log, LOCK_EX)) { - fputcsv($f_log, $logData); + // Исправлено: Явно указаны разделитель (','), ограничитель ('"') и символ экранирования ('\\') для совместимости с PHP 8.1+ + fputcsv($f_log, $logData, ',', '"', '\\'); flock($f_log, LOCK_UN); } diff --git a/functions/func.sysblock.php b/functions/func.sysblock.php index fe25ba0..b255609 100644 --- a/functions/func.sysblock.php +++ b/functions/func.sysblock.php @@ -22,6 +22,9 @@ { global $AVE_DB, $sysParams; + // <<< ИСПРАВЛЕНИЕ: Гарантируем, что $params всегда строка >>> + $params = $params ?? ''; + $sysblock_eval = _getSysBlock($id, 'sysblock_eval'); $sparams_id = $id . md5($params); // Создаем уникальный id для каждого набора параметров diff --git a/inc/config.php b/inc/config.php index bb64c20..1ffeed8 100644 --- a/inc/config.php +++ b/inc/config.php @@ -4,15 +4,15 @@ * AVE.cms * * @package AVE.cms - * @version 3.x + * @version 4.x * @filesource - * @copyright © 2007-2014 AVE.cms, https://ave-cms.ru + * @copyright © 2007-2025 AVE.cms, https://ave.gitget.ru * * @license GPL v.2 */ define('APP_NAME', 'AVE.cms'); - define('APP_VERSION', '3.29 ALT'); + define('APP_VERSION', '3.30 ALT'); define('APP_INFO', 'Ave-Cms.Ru '.'© 2007-' . date('Y')); $themes = []; @@ -322,13 +322,21 @@ 'VARIANT' => '' ]; - //-- Включить стандартную обработку ошибок PHP - $GLOBALS['CMS_CONFIG']['_CONST_DEV']['PHP_DEBUGGING'] = [ - 'DESCR' => 'Включить стандартную обработку ошибок PHP', - 'DEFAULT' => false, - 'TYPE' => 'bool', - 'VARIANT' => '' - ]; + //-- Включить стандартную обработку ошибок PHP с выводом на экран + $GLOBALS['CMS_CONFIG']['_CONST_DEV']['PHP_DEBUGGING'] = [ + 'DESCR' => 'Включить стандартную обработку ошибок PHP с выводом на экран', + 'DEFAULT' => true, + 'TYPE' => 'bool', + 'VARIANT' => '' + ]; + + //-- Включить стандартную обработку ошибок PHP с записью в PHP-лог + $GLOBALS['CMS_CONFIG']['_CONST_DEV']['PHP_DEBUGGING_LOG'] = [ + 'DESCR' => 'Включить стандартную обработку ошибок PHP с записью в PHP-лог', + 'DEFAULT' => true, + 'TYPE' => 'bool', + 'VARIANT' => '' + ]; //-- Включить обработку ошибок PHP через обработчик cms $GLOBALS['CMS_CONFIG']['_CONST_DEV']['PHP_DEBUGGING_FILE'] = [ diff --git a/inc/init.php b/inc/init.php index 511a5e4..60cacf5 100644 --- a/inc/init.php +++ b/inc/init.php @@ -21,18 +21,32 @@ //-- Подключаем файл настроек require_once (BASE_DIR . '/inc/config.php'); - //-- Вкл/Выкл отображения ошибок php - if (! PHP_DEBUGGING) - { - error_reporting(E_ERROR); - ini_set('display_errors', 7); - } - else - { - error_reporting(E_ALL); - ini_set('display_errors', false); - } +// Константы для работы с PHP ошибками +$debug_display = (bool)PHP_DEBUGGING; // Вывод ошибок на экран +$debug_log = (bool)PHP_DEBUGGING_LOG; // Запись ошибок в лог +// --- 1. Установка режима отображения и логирования (display_errors и log_errors) + +// Display_errors: Включить, только если включена константа PHP_DEBUGGING +ini_set('display_errors', $debug_display ? 1 : 0); + +// Log_errors: Включить, только если включена константа PHP_DEBUGGING_LOG +ini_set('log_errors', $debug_log ? 1 : 0); + + +// --- 2. Установка общего уровня error_reporting() + +if ($debug_display || $debug_log) +{ + // Включаем АБСОЛЮТНО ВСЕ ошибки (E_ALL), включая Deprecated и Strict. + error_reporting(E_ALL); +} +else +{ + // Если ОБА режима выключены, устанавливаем режим "Продакшен": + // показываем только фатальные ошибки. + error_reporting(E_ALL & ~E_WARNING & ~E_NOTICE & ~E_DEPRECATED & ~E_STRICT); +} if (PHP_DEBUGGING_FILE && !defined('ACP')) { diff --git a/inc/query_variants/original_files/admin/request.php b/inc/query_variants/original_files/admin/request.php index df16c5f..9f417fd 100644 --- a/inc/query_variants/original_files/admin/request.php +++ b/inc/query_variants/original_files/admin/request.php @@ -95,10 +95,18 @@ } break; - case 'alias': + case 'alias': if (check_permission_acp('request_edit')) { - echo $AVE_Request->requestValidate($_REQUEST['alias'], (int)$_REQUEST['id']); + // Используем ?? оператор для безопасного получения значений. + // Если 'alias' отсутствует, подставится пустая строка (''). + $alias = $_REQUEST['alias'] ?? ''; + + // Если 'id' отсутствует, подставится null. + // (int)null преобразуется в 0, что идеально для нового элемента. + $id = (int)($_REQUEST['id'] ?? null); + + echo $AVE_Request->requestValidate($alias, $id); } exit; } diff --git a/inc/query_variants/original_files/admin/templates/request/cond_list.tpl b/inc/query_variants/original_files/admin/templates/request/cond_list.tpl index f4ebfef..6abc40b 100644 --- a/inc/query_variants/original_files/admin/templates/request/cond_list.tpl +++ b/inc/query_variants/original_files/admin/templates/request/cond_list.tpl @@ -95,13 +95,13 @@
    {$sysblock.id} diff --git a/admin/templates/templates/form.tpl b/admin/templates/templates/form.tpl index 80f04c4..146a0f6 100644 --- a/admin/templates/templates/form.tpl +++ b/admin/templates/templates/form.tpl @@ -11,7 +11,7 @@
    • {#MAIN_PAGE#}
    • {#TEMPLATES_SUB_TITLE#}
    • -
    • {if $smarty.request.template_title}{$smarty.request.template_title|escape:html}{else}{$row->template_title|escape:html}{/if}
    • +
    • {if $smarty.request.template_title|default:''}{$smarty.request.template_title|escape:html}{else}{$row->template_title|escape:html}{/if}
    @@ -43,7 +43,7 @@
    - +
    diff --git a/admin/templates/user/form.tpl b/admin/templates/user/form.tpl index a0df04b..96595f0 100644 --- a/admin/templates/user/form.tpl +++ b/admin/templates/user/form.tpl @@ -74,7 +74,7 @@ function mail_status(){ {if $smarty.request.action=='edit'} - + {/if}
    @@ -87,22 +87,22 @@ function mail_status(){
    {#USER_LOGIN#}
    {#USER_FIRSTNAME#}
    {#USER_LASTNAME#}
    {#USER_EMAIL#}
    {#USER_AVATAR#}
    - {if $row->avatar}{/if} + {if $row && $row->avatar}{/if}
    {#USER_COMPANY#}
    {#USER_HOUSE_STREET#}
    -   - +   +
    {#USER_ZIP_CODE#}
    {#USER_CITY#}
    {#USER_COUNTRY#}
    - {if $smarty.request.action=='new'} {assign var=sL value=$smarty.request.country|default:$smarty.session.user_language|lower|escape|stripslashes} {else} - {assign var=sL value=$row->country|lower|escape|stripslashes} + {* Используем тернарный оператор Smarty для безопасного доступа к свойству $row->country *} + {assign var=sL value=($row && $row->country) ? $row->country : ''|lower|escape|stripslashes} {/if} - {assign var=sL value=$row->country|escape|stripslashes} {foreach from=$available_countries item=land} @@ -197,67 +197,74 @@ function mail_status(){
    {#USER_PHONE#}
    {#USER_FAX#}
    {#USER_BIRTHDAY#} {#USER_BIRTHDAY_FORMAT#}
    {#USER_NOTICE#}
    {#USER_MAIN_GROUP#} -
    - {if check_permission('user_perms')} - {if ($smarty.session.user_id == $row->Id) && $row->user_group != 1} - - {else} - - {/if} - {else} - - {/if} -
    +
    + {if check_permission('user_perms')} + {* Блок 1: Пользователь редактирует себя (не админ) *} + {if $row && ($smarty.session.user_id == $row->Id) && $row->user_group != 1} + + {else} + {* Блок 2: Все остальные (включая Админа и Новый Пользователь) *} + + {/if} + {else} + {* Блок 3: Нет прав user_perms *} + + {/if} +
    {#USER_STATUS#}
    - +
    {if $smarty.request.action=='edit'}
    {#USER_MESSAGE_SUBJECT#}
    {#USER_MESSAGE_TEXT#}
    - {if $conditions} -
    - +{if $conditions} +
    +
    {#REQUEST_OR#}   - {if $smarty.request.pop} + {if isset($smarty.request.pop)} {/if}
    diff --git a/inc/query_variants/original_files/admin/templates/request/conditions.tpl b/inc/query_variants/original_files/admin/templates/request/conditions.tpl index 270c06e..cc3cffc 100644 --- a/inc/query_variants/original_files/admin/templates/request/conditions.tpl +++ b/inc/query_variants/original_files/admin/templates/request/conditions.tpl @@ -2,7 +2,7 @@ var sess = '{$sess}'; -
    +
    {#REQUEST_CONDITIONS#}
    @@ -98,10 +98,10 @@
    - +
    @@ -122,7 +122,7 @@
    {#REQUEST_CONDITION#}
    - {if !$smarty.request.pop} + {if !isset($smarty.request.pop)} @@ -226,13 +226,13 @@ {/if}
    - {if $conditions} -
    - +{if $conditions} +
    +
    {#REQUEST_OR#}   - {if $smarty.request.pop} + {if isset($smarty.request.pop)} {/if}
    @@ -251,7 +251,7 @@ $(document).ready(function(){ldelim} {if check_permission('request_edit')} - {if $smarty.request.onlycontent} + {if isset($smarty.request.onlycontent)} AveAdmin.ajax(); {/if} @@ -265,7 +265,7 @@ $(document).ready(function(){ldelim} Mousetrap.bind(['ctrl+s', 'command+s'], function(event) {ldelim} event.preventDefault(); $("#CondList").ajaxSubmit({ldelim} - url: 'index.php?do=request&action=conditions&sub=save&rubric_id={$smarty.request.rubric_id|escape}&Id={$smarty.request.Id|escape}&cp={$sess}&ajax=1{if $smarty.request.pop}&pop=1{/if}', + url: 'index.php?do=request&action=conditions&sub=save&rubric_id={$smarty.request.rubric_id|escape}&Id={$smarty.request.Id|escape}&cp={$sess}&ajax=1{if isset($smarty.request.pop)}&pop=1{/if}', dataType: 'json', beforeSubmit: function(){ldelim} $.alerts._overlay('show'); @@ -284,7 +284,7 @@ $(document).ready(function(){ldelim} $(".AddNewCond").on('click', function(event){ldelim} event.preventDefault(); $("#NewCond").ajaxSubmit({ldelim} - url: 'index.php?do=request&action=conditions&sub=new&rubric_id={$smarty.request.rubric_id|escape}&Id={$smarty.request.Id|escape}&cp={$sess}&ajax=1{if $smarty.request.pop}&pop=1{/if}', + url: 'index.php?do=request&action=conditions&sub=new&rubric_id={$smarty.request.rubric_id|escape}&Id={$smarty.request.Id|escape}&cp={$sess}&ajax=1{if isset($smarty.request.pop)}&pop=1{/if}', dataType: 'json', beforeSubmit: function(){ldelim} $.alerts._overlay('show'); @@ -309,7 +309,7 @@ $(document).ready(function(){ldelim} function ajaxConditions(){ldelim} $.ajax({ldelim} - url: 'index.php?do=request&action=conditions&rubric_id={$smarty.request.rubric_id|escape}&Id={$smarty.request.Id|escape}&cp={$sess}&ajax=1&onlycontent=1{if $smarty.request.pop}&pop=1{/if}', + url: 'index.php?do=request&action=conditions&rubric_id={$smarty.request.rubric_id|escape}&Id={$smarty.request.Id|escape}&cp={$sess}&ajax=1&onlycontent=1{if isset($smarty.request.pop)}&pop=1{/if}', type: 'POST', beforeSend: function () {ldelim} {rdelim}, @@ -324,7 +324,7 @@ $(document).ready(function(){ldelim} $(".SaveEditCond").on('click', function(event){ldelim} event.preventDefault(); $("#CondList").ajaxSubmit({ldelim} - url: 'index.php?do=request&action=conditions&sub=save&rubric_id={$smarty.request.rubric_id|escape}&Id={$smarty.request.Id|escape}&cp={$sess}&ajax=1{if $smarty.request.pop}&pop=1{/if}', + url: 'index.php?do=request&action=conditions&sub=save&rubric_id={$smarty.request.rubric_id|escape}&Id={$smarty.request.Id|escape}&cp={$sess}&ajax=1{if isset($smarty.request.pop)}&pop=1{/if}', dataType: 'json', beforeSubmit: function(){ldelim} $.alerts._overlay('show'); diff --git a/inc/query_variants/original_files/admin/templates/request/form.tpl b/inc/query_variants/original_files/admin/templates/request/form.tpl index 143a216..35e0334 100644 --- a/inc/query_variants/original_files/admin/templates/request/form.tpl +++ b/inc/query_variants/original_files/admin/templates/request/form.tpl @@ -55,7 +55,11 @@ function changeRub(select) {ldelim} {else}
  • {#REQUEST_NEW#}
  • {/if} -
  • {$smarty.request.request_title_new|stripslashes|default:$row->request_title|escape}
  • +
  • + + {($smarty.request.request_title_new|default:'')|stripslashes|default:$row->request_title|escape} + +
  • @@ -80,7 +84,7 @@ function changeRub(select) {ldelim} {/if} -{if $smarty.request.Id == ''} +{if !isset($smarty.request.Id) || $smarty.request.Id == ''} {assign var=iframe value='no'} {/if} @@ -129,7 +133,7 @@ function changeRub(select) {ldelim} {#REQUEST_NAME2#} - + @@ -140,8 +144,8 @@ function changeRub(select) {ldelim}
    -   - +   + @@ -151,9 +155,9 @@ function changeRub(select) {ldelim} {#REQUEST_CACHE#} - + {#REQUEST_CACHE_ELEMENTS#} - request_cache_elements}checked="checked"{/if}/> + request_cache_elements}checked="checked"{/if}/> @@ -173,7 +177,7 @@ function changeRub(select) {ldelim} {#REQUEST_DESCRIPTION#}
    {#REQUEST_INTERNAL_INFO#} - + @@ -201,16 +205,16 @@ function changeRub(select) {ldelim} {#REQUEST_HIDE_CURRENT#} - request_hide_current}checked="checked"{/if}/> + request_hide_current}checked="checked"{/if}/> {#REQUEST_ONLY_OWNER#} - request_only_owner}checked="checked"{/if}/> + request_only_owner}checked="checked"{/if}/> {#REQUEST_SORT_BY_NAT#} - {foreach from=$fields_list item=field_group} @@ -218,8 +222,8 @@ function changeRub(select) {ldelim} {/if} - {foreach from=$field_group.fields item=field} - + {foreach from=$field_group.fields item=field} + {/foreach} {if $groups_count > 1} @@ -232,39 +236,39 @@ function changeRub(select) {ldelim} {#REQUEST_SORT_BY#} - + {#REQUEST_ASC_DESC#} - + {#REQUEST_DOC_PER_PAGE#} - + @@ -277,7 +281,7 @@ function changeRub(select) {ldelim} {#REQUEST_SHOW_NAVI#} - request_show_pagination=='1'} checked="checked"{/if} /> + request_show_pagination == '1'} checked="checked"{/if} /> {#REQUEST_NAVI_TPL#} @@ -290,9 +294,9 @@ function changeRub(select) {ldelim} {#REQUEST_COUNT_ITEMS#} - request_count_items == '1'} checked="checked"{/if} /> + request_count_items == '1'} checked="checked"{/if} /> {#REQUEST_USE_QUERY#} - request_use_query == '1'} checked="checked"{/if} /> + request_use_query == '1'} checked="checked"{/if} /> @@ -304,13 +308,13 @@ function changeRub(select) {ldelim} {#REQUEST_USE_LANG#} - request_lang == '1'} checked="checked"{/if} /> + request_lang == '1'} checked="checked"{/if} /> {#REQUEST_SHOW_STAT#} - request_show_statistic == '1'} checked="checked"{/if} /> + request_show_statistic == '1'} checked="checked"{/if} /> {#REQUEST_SHOW_SQL#} - request_show_sql == '1'} checked="checked"{/if} /> + request_show_sql == '1'} checked="checked"{/if} /> @@ -322,9 +326,9 @@ function changeRub(select) {ldelim} {#REQUEST_EXTERNAL#} - request_external == '1'} checked="checked"{/if} /> + request_external == '1'} checked="checked"{/if} /> {#REQUEST_ONLY_AJAX#} - request_ajax == '1'} checked="checked"{/if} /> + request_ajax == '1'} checked="checked"{/if} /> @@ -340,7 +344,7 @@ function changeRub(select) {ldelim} [tag:content] - +
    • {#MAIN_CODEMIRROR_HELP#} @@ -474,7 +478,7 @@ function changeRub(select) {ldelim}  |
    - +
    • {#MAIN_CODEMIRROR_HELP#} diff --git a/inc/query_variants/original_files/class/class.request.php b/inc/query_variants/original_files/class/class.request.php index 01e6bd5..75fb6e4 100644 --- a/inc/query_variants/original_files/class/class.request.php +++ b/inc/query_variants/original_files/class/class.request.php @@ -752,10 +752,10 @@ SET request_id = '" . $request_id . "', condition_compare = '" . $val['condition_compare'] . "', - condition_field_id = '" . $val['condition_field_id'] . "', + condition_field_id = '" . ($val['condition_field_id'] ?? 0) . "', condition_value = '" . (! empty($val['condition_value']) ? $val['condition_value'] : '') . "', condition_join = '" . $val['condition_join'] . "', - condition_status = '" . ((! empty($val['condition_value'])) ? (($val['condition_status'] == '1') ? '1' : '0') : ''). "' + condition_status = '" . ((! empty($val['condition_value'])) ? ((($val['condition_status'] ?? '0') == '1') ? '1' : '0') : ''). "' WHERE Id = '" . $condition_id . "' "); @@ -836,8 +836,11 @@ break; - // Если пользователь добавил новое условие + // Если пользователь добавил новое условие case 'new': + // Исправление 2: Инициализация переменной для избежания "Undefined variable $message" + $message = ''; + if ($_POST['new_value'] !== '') { // Выполняем запрос к БД на добавление нового условия @@ -846,13 +849,15 @@ " . PREFIX . "_request_conditions SET request_id = '" . $request_id . "', - condition_compare = '" . $_POST['new_operator'] . "', + condition_compare = '" . $_POST['new_operator'] . "', condition_field_id = '" . $_POST['field_new'] . "', - condition_value = '" . $_POST['new_value'] . "', - condition_join = '" . $_POST['oper_new'] . "' + condition_value = '" . $_POST['new_value'] . "', + condition_join = '" . $_POST['oper_new'] . "' "); - if ($sql->_result === false) + // Безопасная проверка результата запроса + // Проверяем, вернул ли Query false (ошибка) или объект с ошибкой + if ($sql === false || (is_object($sql) && $sql->_result === false)) { $message = $AVE_Template->get_config_vars('REQUEST_COND_NEW_ERR'); $header = $AVE_Template->get_config_vars('REQUEST_ERROR'); @@ -895,6 +900,7 @@ } else { + // $message теперь гарантированно определена if (! $message) { $message = $AVE_Template->get_config_vars('REQUEST_COND_NEW_SUC'); diff --git a/inc/query_variants/original_files/functions/func.parserequest.php b/inc/query_variants/original_files/functions/func.parserequest.php index 8bf0404..cb31319 100644 --- a/inc/query_variants/original_files/functions/func.parserequest.php +++ b/inc/query_variants/original_files/functions/func.parserequest.php @@ -571,8 +571,9 @@ $item = str_replace('[tag:doctitle]', stripslashes(htmlspecialchars_decode($row->document_title)), $item); $item = str_replace('[tag:docparent]', $row->document_parent, $item); $item = str_replace('[tag:doclang]', $row->document_lang, $item); - $item = str_replace('[tag:docdate]', translate_date(strftime(DATE_FORMAT, $row->document_published)), $item); - $item = str_replace('[tag:doctime]', translate_date(strftime(TIME_FORMAT, $row->document_published)), $item); + // ИСПРАВЛЕНИЕ: Замена strftime() на date() (PHP 8.1+) + $item = str_replace('[tag:docdate]', translate_date(date(DATE_FORMAT, $row->document_published)), $item); + $item = str_replace('[tag:doctime]', translate_date(date(TIME_FORMAT, $row->document_published)), $item); $item = str_replace('[tag:humandate]', human_date($row->document_published), $item); $item = preg_replace_callback('/\[tag:date:([a-zA-Z0-9-. \/]+)\]/', @@ -1125,9 +1126,9 @@ //-- Время - 1 день назад '[tag:humandate]' => human_date($AVE_Core->curentdoc->document_published), //-- Дата создания - '[tag:docdate]' => pretty_date(strftime(DATE_FORMAT, $AVE_Core->curentdoc->document_published)), + '[tag:docdate]' => pretty_date(date(DATE_FORMAT, $AVE_Core->curentdoc->document_published)), //-- Время создания - '[tag:doctime]' => pretty_date(strftime(TIME_FORMAT, $AVE_Core->curentdoc->document_published)), + '[tag:doctime]' => pretty_date(date(TIME_FORMAT, $AVE_Core->curentdoc->document_published)), //-- Домен '[tag:domain]' => getSiteUrl(), //-- Заменяем тег пагинации на пагинацию diff --git a/inc/query_variants/safe_files/admin/request.php b/inc/query_variants/safe_files/admin/request.php index 6abf11d..73a420e 100644 --- a/inc/query_variants/safe_files/admin/request.php +++ b/inc/query_variants/safe_files/admin/request.php @@ -94,7 +94,7 @@ switch ($_REQUEST['action']) case 'alias': if (check_permission_acp('request_edit')) { - echo $AVE_Request->requestValidate($_REQUEST['alias'], (int)$_REQUEST['id']); + echo $AVE_Request->requestValidate($_REQUEST['alias'], (int)($_REQUEST['id'] ?? 0)); } exit; } diff --git a/inc/query_variants/safe_files/admin/templates/request/cond_list.tpl b/inc/query_variants/safe_files/admin/templates/request/cond_list.tpl index f7ff5c3..99a1aca 100644 --- a/inc/query_variants/safe_files/admin/templates/request/cond_list.tpl +++ b/inc/query_variants/safe_files/admin/templates/request/cond_list.tpl @@ -80,18 +80,18 @@ - {if $conditions} -
      - - - {#REQUEST_OR#} -   - {if $smarty.request.pop} - - {/if} -
      -
    - {/if} +{if $conditions} +
    +
    + + {#REQUEST_OR#} +   + {if $smarty.request.pop|default:''} + + {/if} +
    +
    +{/if}
    {if $conditions} diff --git a/inc/query_variants/safe_files/admin/templates/request/conditions.tpl b/inc/query_variants/safe_files/admin/templates/request/conditions.tpl index cab902b..fcf5da3 100644 --- a/inc/query_variants/safe_files/admin/templates/request/conditions.tpl +++ b/inc/query_variants/safe_files/admin/templates/request/conditions.tpl @@ -2,7 +2,7 @@ var sess = '{$sess}'; -
    +
    {#REQUEST_CONDITIONS#}
    @@ -83,10 +83,10 @@ - +
    @@ -107,7 +107,7 @@
    {#REQUEST_CONDITION#}
    - {if !$smarty.request.pop} + {if !$smarty.request.pop|default:''} @@ -196,18 +196,18 @@ {/if} - {if $conditions} -
    -
    - - {#REQUEST_OR#} -   - {if $smarty.request.pop} - - {/if} -
    -
    - {/if} +{if $conditions} +
    +
    + + {#REQUEST_OR#} +   + {if $smarty.request.pop|default:''} + + {/if} +
    +
    +{/if}
    @@ -221,7 +221,7 @@ $(document).ready(function(){ldelim} {if check_permission('request_edit')} - {if $smarty.request.onlycontent} + {if $smarty.request.onlycontent|default:''} AveAdmin.ajax(); {/if} @@ -235,7 +235,7 @@ $(document).ready(function(){ldelim} Mousetrap.bind(['ctrl+s', 'command+s'], function(event) {ldelim} event.preventDefault(); $("#CondList").ajaxSubmit({ldelim} - url: 'index.php?do=request&action=conditions&sub=save&rubric_id={$smarty.request.rubric_id|escape}&Id={$smarty.request.Id|escape}&cp={$sess}&ajax=1{if $smarty.request.pop}&pop=1{/if}', + url: 'index.php?do=request&action=conditions&sub=save&rubric_id={$smarty.request.rubric_id|default:''|escape}&Id={$smarty.request.Id|default:''|escape}&cp={$sess}&ajax=1{if $smarty.request.pop|default:''}&pop=1{/if}', dataType: 'json', beforeSubmit: function(){ldelim} $.alerts._overlay('show'); @@ -254,7 +254,7 @@ $(document).ready(function(){ldelim} $(".AddNewCond").on('click', function(event){ldelim} event.preventDefault(); $("#NewCond").ajaxSubmit({ldelim} - url: 'index.php?do=request&action=conditions&sub=new&rubric_id={$smarty.request.rubric_id|escape}&Id={$smarty.request.Id|escape}&cp={$sess}&ajax=1{if $smarty.request.pop}&pop=1{/if}', + url: 'index.php?do=request&action=conditions&sub=new&rubric_id={$smarty.request.rubric_id|default:''|escape}&Id={$smarty.request.Id|default:''|escape}&cp={$sess}&ajax=1{if $smarty.request.pop|default:''}&pop=1{/if}', dataType: 'json', beforeSubmit: function(){ldelim} $.alerts._overlay('show'); @@ -279,7 +279,7 @@ $(document).ready(function(){ldelim} function ajaxConditions(){ldelim} $.ajax({ldelim} - url: 'index.php?do=request&action=conditions&rubric_id={$smarty.request.rubric_id|escape}&Id={$smarty.request.Id|escape}&cp={$sess}&ajax=1&onlycontent=1{if $smarty.request.pop}&pop=1{/if}', + url: 'index.php?do=request&action=conditions&rubric_id={$smarty.request.rubric_id|default:''|escape}&Id={$smarty.request.Id|default:''|escape}&cp={$sess}&ajax=1&onlycontent=1{if $smarty.request.pop|default:''}&pop=1{/if}', type: 'POST', beforeSend: function () {ldelim} {rdelim}, @@ -294,7 +294,7 @@ $(document).ready(function(){ldelim} $(".SaveEditCond").on('click', function(event){ldelim} event.preventDefault(); $("#CondList").ajaxSubmit({ldelim} - url: 'index.php?do=request&action=conditions&sub=save&rubric_id={$smarty.request.rubric_id|escape}&Id={$smarty.request.Id|escape}&cp={$sess}&ajax=1{if $smarty.request.pop}&pop=1{/if}', + url: 'index.php?do=request&action=conditions&sub=save&rubric_id={$smarty.request.rubric_id|default:''|escape}&Id={$smarty.request.Id|default:''|escape}&cp={$sess}&ajax=1{if $smarty.request.pop|default:''}&pop=1{/if}', dataType: 'json', beforeSubmit: function(){ldelim} $.alerts._overlay('show'); diff --git a/inc/query_variants/safe_files/admin/templates/request/form.tpl b/inc/query_variants/safe_files/admin/templates/request/form.tpl index 8ad869c..051c0a3 100644 --- a/inc/query_variants/safe_files/admin/templates/request/form.tpl +++ b/inc/query_variants/safe_files/admin/templates/request/form.tpl @@ -54,7 +54,7 @@ function changeRub(select) {ldelim} {else}
  • {#REQUEST_NEW#}
  • {/if} -
  • {$smarty.request.request_title_new|stripslashes|default:$row->request_title|escape}
  • +
  • {$smarty.request.request_title_new|default:''|stripslashes|default:$row->request_title|escape}
  • @@ -78,8 +78,8 @@ function changeRub(select) {ldelim} {/if} -{if $smarty.request.Id == ''} - {assign var=iframe value='no'} +{if $smarty.request.Id|default:'' == ''} + {assign var=iframe value='no'} {/if} {if $smarty.request.action == 'new' && $smarty.request.rubric_id == ''} @@ -131,7 +131,7 @@ function changeRub(select) {ldelim} {#REQUEST_NAME2#} - + @@ -143,8 +143,8 @@ function changeRub(select) {ldelim}
    -   - +   + @@ -154,9 +154,9 @@ function changeRub(select) {ldelim} {#REQUEST_CACHE#} - + {#REQUEST_CACHE_ELEMENTS#} - request_cache_elements}checked="checked"{/if}/> + request_cache_elements}checked="checked"{/if}/> @@ -178,7 +178,7 @@ function changeRub(select) {ldelim} {#REQUEST_DESCRIPTION#}
    {#REQUEST_INTERNAL_INFO#} - + @@ -207,10 +207,10 @@ function changeRub(select) {ldelim} {#REQUEST_HIDE_CURRENT#} - request_hide_current}checked="checked"{/if}/> + request_hide_current}checked="checked"{/if}/> {#REQUEST_ONLY_OWNER#} - request_only_owner}checked="checked"{/if}/> + request_only_owner}checked="checked"{/if}/> @@ -219,14 +219,14 @@ function changeRub(select) {ldelim}
    - +
    @@ -243,7 +243,7 @@ function changeRub(select) {ldelim} {/if} {foreach from=$field_group.fields item=field} - + {/foreach} {if $groups_count > 1} @@ -259,16 +259,16 @@ function changeRub(select) {ldelim} {#REQUEST_ASC_DESC#} - + {#REQUEST_DOC_PER_PAGE#} @@ -282,7 +282,7 @@ function changeRub(select) {ldelim} {#REQUEST_SHOW_NAVI#} - request_show_pagination=='1'} checked="checked"{/if} /> + request_show_pagination=='1'} checked="checked"{/if} /> {#REQUEST_NAVI_TPL#} @@ -295,9 +295,9 @@ function changeRub(select) {ldelim} {#REQUEST_COUNT_ITEMS#} - request_count_items == '1'} checked="checked"{/if} /> + request_count_items == '1'} checked="checked"{/if} /> {#REQUEST_USE_QUERY#} - request_use_query == '1'} checked="checked"{/if} /> + request_use_query == '1'} checked="checked"{/if} /> @@ -308,13 +308,13 @@ function changeRub(select) {ldelim} {#REQUEST_USE_LANG#} - request_lang == '1'} checked="checked"{/if} /> + request_lang == '1'} checked="checked"{/if} /> {#REQUEST_SHOW_STAT#} - request_show_statistic == '1'} checked="checked"{/if} /> + request_show_statistic == '1'} checked="checked"{/if} /> {#REQUEST_SHOW_SQL#} - request_show_sql == '1'} checked="checked"{/if} /> + request_show_sql == '1'} checked="checked"{/if} /> @@ -329,12 +329,12 @@ function changeRub(select) {ldelim} [?] {#REQUEST_EXTERNAL#}
    - request_external == '1'} checked="checked"{/if} /> + request_external == '1'} checked="checked"{/if} /> {#REQUEST_ONLY_AJAX#} - request_ajax == '1'} checked="checked"{/if} /> + request_ajax == '1'} checked="checked"{/if} /> - {if $row->request_external == '1'} + {if isset($row) && $row->request_external == '1'}
      @@ -364,7 +364,7 @@ function changeRub(select) {ldelim} {/if} - +
      • {#MAIN_CODEMIRROR_HELP#} @@ -502,7 +502,7 @@ function changeRub(select) {ldelim}  |
      - +
      • {#MAIN_CODEMIRROR_HELP#} diff --git a/inc/query_variants/safe_files/admin/templates/request/request.tpl b/inc/query_variants/safe_files/admin/templates/request/request.tpl index 031797d..0b2fc6f 100644 --- a/inc/query_variants/safe_files/admin/templates/request/request.tpl +++ b/inc/query_variants/safe_files/admin/templates/request/request.tpl @@ -125,7 +125,7 @@ {if check_permission('request_edit')} - + {else} {/if} diff --git a/inc/query_variants/safe_files/class/class.request.php b/inc/query_variants/safe_files/class/class.request.php index 2446a4a..3f6d77f 100644 --- a/inc/query_variants/safe_files/class/class.request.php +++ b/inc/query_variants/safe_files/class/class.request.php @@ -742,7 +742,7 @@ class AVE_Request condition_field_id = '" . $val['condition_field_id'] . "', condition_value = '" . (! empty($val['condition_value']) ? $val['condition_value'] : '') . "', condition_join = '" . $val['condition_join'] . "', - condition_status = '" . ((! empty($val['condition_value'])) ? (($val['condition_status'] == '1') ? '1' : '0') : ''). "' + condition_status = '" . ((! empty($val['condition_value'])) ? ((isset($val['condition_status']) && $val['condition_status'] == '1') ? '1' : '0') : ''). "' WHERE Id = '" . $condition_id . "' "); @@ -825,6 +825,7 @@ class AVE_Request // Если пользователь добавил новое условие case 'new': + $message = ''; if ($_POST['new_value'] !== '') { // Выполняем запрос к БД на добавление нового условия @@ -839,7 +840,7 @@ class AVE_Request condition_join = '" . $_POST['oper_new'] . "' "); - if ($sql->_result === false) + if (is_object($sql) && $sql->_result === false) { $message = $AVE_Template->get_config_vars('REQUEST_COND_NEW_ERR'); $header = $AVE_Template->get_config_vars('REQUEST_ERROR'); diff --git a/install/index.php b/install/index.php index 812a255..e3a773d 100644 --- a/install/index.php +++ b/install/index.php @@ -4,9 +4,9 @@ * AVE.cms * * @package AVE.cms - * @version 3.x + * @version 4.x * @filesource - * @copyright © 2007-2014 AVE.cms, http://www.ave-cms.ru + * @copyright © 2007-2025 AVE.cms, https://ave.gitget.ru * * @license GPL v.2 */ @@ -363,8 +363,8 @@ $AVE_Template->config_load($lang_file); $ver = APP_NAME . ' v' . APP_VERSION; -$db_connect = check_db_connect($config['dbhost'], $config['dbuser'], $config['dbpass'], $config['dbname']); -$check_installed = check_installed($config['dbpref']); +$db_connect = check_db_connect($config['dbhost'] ?? '', $config['dbuser'] ?? '', $config['dbpass'] ?? '', $config['dbname'] ?? ''); +$check_installed = check_installed($config['dbpref'] ?? ''); if ((true === $db_connect) && $_REQUEST['step'] != 'finish' && check_installed($config['dbpref'])) { @@ -526,7 +526,7 @@ switch ($_REQUEST['step']) } } - $check_installed = check_installed($_POST['dbpref']); + $check_installed = check_installed($_POST['dbpref'] ?? ''); $connect = check_db_connect($_POST['dbhost'], $_POST['dbuser'], $_POST['dbpass'], $_POST['dbname']); @@ -653,7 +653,7 @@ switch ($_REQUEST['step']) // <, >, ", ', ` $regex_forbidden = '/[<>\"\'`]/'; $regex_password = '/[^\x20-\xFF]/'; - $regex_password = '/[^\x20-\xFF]/'; + $regex_username = '/[^\w-]/'; $regex_email = '/^[\w.-]+@[a-z0-9.-]+\.(?:[a-z]{2}|com|org|net|edu|gov|mil|biz|info|mobi|name|aero|asia|jobs|museum)$/i'; // Класс для работы с БД @@ -723,8 +723,8 @@ switch ($_REQUEST['step']) $dbin = str_replace('%%SALT%%', $salt, $dbin); $dbin = str_replace('%%PASS%%', $hash, $dbin); $dbin = str_replace('%%TIME%%', time(), $dbin); - $dbin = str_replace('%%FIRSTNAME%%', $_POST['firstname'], $dbin); - $dbin = str_replace('%%LASTNAME%%', $_POST['lastname'], $dbin); + $dbin = str_replace('%%FIRSTNAME%%', $_POST['firstname'] ?? '', $dbin); + $dbin = str_replace('%%LASTNAME%%', $_POST['lastname'] ?? '', $dbin); $dbin = str_replace('%%USERNAME%%', $_POST['username'], $dbin); $ar = explode('#inst#', $dbin); @@ -741,4 +741,4 @@ switch ($_REQUEST['step']) $AVE_Template->display('step5.tpl'); break; } -?> +?> \ No newline at end of file diff --git a/install/tpl/step4.tpl b/install/tpl/step4.tpl index 2deffa8..95ab97c 100644 --- a/install/tpl/step4.tpl +++ b/install/tpl/step4.tpl @@ -1,191 +1,194 @@ + - + - {#bread_database_setting#} - {$smarty.const.APP_NAME} v{$smarty.const.APP_VERSION} +{#bread_database_setting#} - {$smarty.const.APP_NAME} v{$smarty.const.APP_VERSION} - - - - + + + + - - - + + + - - - - - - - - + + + + + + + + - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + - -
        -
        -
        -
        - -
        -
        -
        -
        -
        +
        +
        +
        + +
        +
        +
        +
        +
        -
        - + -
        +
        -
        {#install#} {$smarty.const.APP_NAME} v{$smarty.const.APP_VERSION}
        +
        {#install#} {$smarty.const.APP_NAME} v{$smarty.const.APP_VERSION}
        - - -
        - {if $warning} -
          -
        • - {$warning} -
        • + -
          -
          {#bread_database_setting#}
          {#install_step#} 4
          -
          {#database_setting#}
          - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
          ?{#col_parametr#}{#col_requered#}
          [?]{#dbserver#}
          [?]{#dbuser#}
          [?]{#dbpass#}
          [?]{#dbname#}
          [?]{#dbprefix#}
          [?]{#dbcreat#}
          [?]{#dbclear#}
          -
            -
          • {#database_setting_foot#}
          • -
          -
          - - +
          + {if $warning} +
            +
          • + {$warning} +
          • +
          + {elseif $installed} +
            +
          • + {$installed} +
          • +
          + {/if} +
          + +
          +
          {#bread_database_setting#}
          {#install_step#} 4
          +
          {#database_setting#}
          + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          ?{#col_parametr#}{#col_requered#}
          [?]{#dbserver#}
          [?]{#dbuser#}
          [?]{#dbpass#}
          [?]{#dbname#}
          [?]{#dbprefix#}
          [?]{#dbcreat#}
          [?]{#dbclear#}
          +
            +
          • {#database_setting_foot#}
          • +
          +
          + + +
          + +
          +
          + +   +
          +
          -
          -
          - -   - -
          -
          + + - - - -
          +  +
        + diff --git a/install/tpl/step5.tpl b/install/tpl/step5.tpl index a719606..1553e6e 100644 --- a/install/tpl/step5.tpl +++ b/install/tpl/step5.tpl @@ -1,166 +1,177 @@ + - + - + - {#bread_stepstatus#} - {$smarty.const.APP_NAME} v{$smarty.const.APP_VERSION} + {#bread_stepstatus#} - {$smarty.const.APP_NAME} v{$smarty.const.APP_VERSION} - - - - + + + + - - - + + + - - - - - - - - + + + + + + + + - - - - - - - - - - - - - - + + + + + + + + + + + + + + - - + + - - + + -
        -
        -
        -
        - -
        -
        -
        -
        -
        -
        - - -
        - -
        -
        - -
        - -
        {#install#} {$version_setup}
        - - - -
        - {if $errors} -
          - -
        • - {foreach from=$errors item="error"} - • {$error}
          - {/foreach} +
          +
          +
          +
          + - {/if}
          - -
          -
          {#bread_stepstatus#}
          {#install_step#} 5
          -
          {#header_logindata#}
          - - - - - - - - - - - - - - - - - - - - - - - - - - -
          {#col_parametr#}{#col_requered#}
          * {#username#}:
          * {#email#}:
          * {#password#}:
          -
            -
          • {#loginstar#}
          • -
          -
          - - +
          - -
          -
          - -   - -
          -
          - - - - - -
          - -
          -
          - - - +
          + + +
          + +
          +
          + +
          + +
          {#install#} {$version_setup}
          + + + +
          + {if $errors} +
            + +
          • + {foreach from=$errors item="error"} + • {$error}
            + {/foreach} +
          • + +
          + {/if} +
          + + + {assign var="username_val" value=$smarty.request.username|default:'Admin'} + {assign var="email_val" value=$smarty.request.email|default:''} + {assign var="pass_val" value=$smarty.request.pass|default:''} + + +
          +
          {#bread_stepstatus#}
          {#install_step#} 5
          +
          {#header_logindata#}
          + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          {#col_parametr#}{#col_requered#}
          * {#username#}:
          * {#email#}:
          * {#password#}:
          +
            +
          • {#loginstar#}
          • +
          +
          + + +
          + +
          +
          + +   + +
          +
          + + + + +
          +
          + +
          +
          + + + + + - \ No newline at end of file diff --git a/lib/Smarty/.htaccess b/lib/Smarty/.htaccess deleted file mode 100644 index 3418e55..0000000 --- a/lib/Smarty/.htaccess +++ /dev/null @@ -1 +0,0 @@ -deny from all \ No newline at end of file diff --git a/lib/Smarty/Config_File.class.php b/lib/Smarty/Config_File.class.php deleted file mode 100644 index 6d8c298..0000000 --- a/lib/Smarty/Config_File.class.php +++ /dev/null @@ -1,393 +0,0 @@ - - * @access public - * @package Smarty - */ - -/* $Id$ */ - -/** - * Config file reading class - * @package Smarty - */ -class Config_File { - /**#@+ - * Options - * @var boolean - */ - /** - * Controls whether variables with the same name overwrite each other. - */ - var $overwrite = true; - - /** - * Controls whether config values of on/true/yes and off/false/no get - * converted to boolean values automatically. - */ - var $booleanize = true; - - /** - * Controls whether hidden config sections/vars are read from the file. - */ - var $read_hidden = true; - - /** - * Controls whether or not to fix mac or dos formatted newlines. - * If set to true, \r or \r\n will be changed to \n. - */ - var $fix_newlines = true; - /**#@-*/ - - /** @access private */ - var $_config_path = ""; - var $_config_data = array(); - /**#@-*/ - - /** - * Constructs a new config file class. - * - * @param string $config_path (optional) path to the config files - */ - public function __construct($config_path = NULL) - { - if (isset($config_path)) - $this->set_path($config_path); - } - - - /** - * Set the path where configuration files can be found. - * - * @param string $config_path path to the config files - */ - function set_path($config_path) - { - if (!empty($config_path)) { - if (!is_string($config_path) || !file_exists($config_path) || !is_dir($config_path)) { - $this->_trigger_error_msg("Bad config file path '$config_path'"); - return; - } - if(substr($config_path, -1) != DIRECTORY_SEPARATOR) { - $config_path .= DIRECTORY_SEPARATOR; - } - - $this->_config_path = $config_path; - } - } - - - /** - * Retrieves config info based on the file, section, and variable name. - * - * @param string $file_name config file to get info for - * @param string $section_name (optional) section to get info for - * @param string $var_name (optional) variable to get info for - * @return string|array a value or array of values - */ - function get($file_name, $section_name = NULL, $var_name = NULL) - { - if (empty($file_name)) { - $this->_trigger_error_msg('Empty config file name'); - return; - } else { - $file_name = $this->_config_path . $file_name; - if (!isset($this->_config_data[$file_name])) - $this->load_file($file_name, false); - } - - if (!empty($var_name)) { - if (empty($section_name)) { - return $this->_config_data[$file_name]["vars"][$var_name]; - } else { - if(isset($this->_config_data[$file_name]["sections"][$section_name]["vars"][$var_name])) - return $this->_config_data[$file_name]["sections"][$section_name]["vars"][$var_name]; - else - return array(); - } - } else { - if (empty($section_name)) { - return (array)$this->_config_data[$file_name]["vars"]; - } else { - if(isset($this->_config_data[$file_name]["sections"][$section_name]["vars"])) - return (array)$this->_config_data[$file_name]["sections"][$section_name]["vars"]; - else - return array(); - } - } - } - - - /** - * Retrieves config info based on the key. - * - * @param $file_name string config key (filename/section/var) - * @return string|array same as get() - * @uses get() retrieves information from config file and returns it - */ - function &get_key($config_key) - { - list($file_name, $section_name, $var_name) = explode('/', $config_key, 3); - $result = &$this->get($file_name, $section_name, $var_name); - return $result; - } - - /** - * Get all loaded config file names. - * - * @return array an array of loaded config file names - */ - function get_file_names() - { - return array_keys($this->_config_data); - } - - - /** - * Get all section names from a loaded file. - * - * @param string $file_name config file to get section names from - * @return array an array of section names from the specified file - */ - function get_section_names($file_name) - { - $file_name = $this->_config_path . $file_name; - if (!isset($this->_config_data[$file_name])) { - $this->_trigger_error_msg("Unknown config file '$file_name'"); - return; - } - - return array_keys($this->_config_data[$file_name]["sections"]); - } - - - /** - * Get all global or section variable names. - * - * @param string $file_name config file to get info for - * @param string $section_name (optional) section to get info for - * @return array an array of variables names from the specified file/section - */ - function get_var_names($file_name, $section = NULL) - { - if (empty($file_name)) { - $this->_trigger_error_msg('Empty config file name'); - return; - } else if (!isset($this->_config_data[$file_name])) { - $this->_trigger_error_msg("Unknown config file '$file_name'"); - return; - } - - if (empty($section)) - return array_keys($this->_config_data[$file_name]["vars"]); - else - return array_keys($this->_config_data[$file_name]["sections"][$section]["vars"]); - } - - - /** - * Clear loaded config data for a certain file or all files. - * - * @param string $file_name file to clear config data for - */ - function clear($file_name = NULL) - { - if ($file_name === NULL) - $this->_config_data = array(); - else if (isset($this->_config_data[$file_name])) - $this->_config_data[$file_name] = array(); - } - - - /** - * Load a configuration file manually. - * - * @param string $file_name file name to load - * @param boolean $prepend_path whether current config path should be - * prepended to the filename - */ - function load_file($file_name, $prepend_path = true) - { - if ($prepend_path && $this->_config_path != "") - $config_file = $this->_config_path . $file_name; - else - $config_file = $file_name; - - ini_set('track_errors', true); - $fp = @fopen($config_file, "r"); - if (!is_resource($fp)) { - $this->_trigger_error_msg("Could not open config file '$config_file'"); - return false; - } - - $contents = ($size = filesize($config_file)) ? fread($fp, $size) : ''; - fclose($fp); - - $this->_config_data[$config_file] = $this->parse_contents($contents); - return true; - } - - /** - * Store the contents of a file manually. - * - * @param string $config_file file name of the related contents - * @param string $contents the file-contents to parse - */ - function set_file_contents($config_file, $contents) - { - $this->_config_data[$config_file] = $this->parse_contents($contents); - return true; - } - - /** - * parse the source of a configuration file manually. - * - * @param string $contents the file-contents to parse - */ - function parse_contents($contents) - { - if($this->fix_newlines) { - // fix mac/dos formatted newlines - $contents = preg_replace('!\r\n?!', "\n", $contents); - } - - $config_data = array(); - $config_data['sections'] = array(); - $config_data['vars'] = array(); - - /* reference to fill with data */ - $vars =& $config_data['vars']; - - /* parse file line by line */ - preg_match_all('!^.*\r?\n?!m', $contents, $match); - $lines = $match[0]; - for ($i=0, $count=count($lines); $i<$count; $i++) { - $line = $lines[$i]; - if (empty($line)) continue; - - if ( substr($line, 0, 1) == '[' && preg_match('!^\[(.*?)\]!', $line, $match) ) { - /* section found */ - if (substr($match[1], 0, 1) == '.') { - /* hidden section */ - if ($this->read_hidden) { - $section_name = substr($match[1], 1); - } else { - /* break reference to $vars to ignore hidden section */ - unset($vars); - $vars = array(); - continue; - } - } else { - $section_name = $match[1]; - } - if (!isset($config_data['sections'][$section_name])) - $config_data['sections'][$section_name] = array('vars' => array()); - $vars =& $config_data['sections'][$section_name]['vars']; - continue; - } - - if (preg_match('/^\s*(\.?\w+)\s*=\s*(.*)/s', $line, $match)) { - /* variable found */ - $var_name = rtrim($match[1]); - if (strpos($match[2], '"""') === 0) { - /* handle multiline-value */ - $lines[$i] = substr($match[2], 3); - $var_value = ''; - while ($i<$count) { - if (($pos = strpos($lines[$i], '"""')) === false) { - $var_value .= $lines[$i++]; - } else { - /* end of multiline-value */ - $var_value .= substr($lines[$i], 0, $pos); - break; - } - } - $booleanize = false; - - } else { - /* handle simple value */ - $var_value = preg_replace('/^([\'"])(.*)\1$/', '\2', rtrim($match[2])); - $booleanize = $this->booleanize; - - } - $this->_set_config_var($vars, $var_name, $var_value, $booleanize); - } - /* else unparsable line / means it is a comment / means ignore it */ - } - return $config_data; - } - - /**#@+ @access private */ - /** - * @param array &$container - * @param string $var_name - * @param mixed $var_value - * @param boolean $booleanize determines whether $var_value is converted to - * to true/false - */ - function _set_config_var(&$container, $var_name, $var_value, $booleanize) - { - if (substr($var_name, 0, 1) == '.') { - if (!$this->read_hidden) - return; - else - $var_name = substr($var_name, 1); - } - - if (!preg_match("/^[a-zA-Z_]\w*$/", $var_name)) { - $this->_trigger_error_msg("Bad variable name '$var_name'"); - return; - } - - if ($booleanize) { - if (preg_match("/^(on|true|yes)$/i", $var_value)) - $var_value = true; - else if (preg_match("/^(off|false|no)$/i", $var_value)) - $var_value = false; - } - - if (!isset($container[$var_name]) || $this->overwrite) - $container[$var_name] = $var_value; - else { - settype($container[$var_name], 'array'); - $container[$var_name][] = $var_value; - } - } - - /** - * @uses trigger_error() creates a PHP warning/error - * @param string $error_msg - * @param integer $error_type one of - */ - function _trigger_error_msg($error_msg, $error_type = E_USER_WARNING) - { - trigger_error("Config_File error: $error_msg", $error_type); - } - /**#@-*/ -} - -?> diff --git a/lib/Smarty/Smarty.class.php b/lib/Smarty/Smarty.class.php deleted file mode 100644 index a06e8ff..0000000 --- a/lib/Smarty/Smarty.class.php +++ /dev/null @@ -1,1968 +0,0 @@ - - * @author Andrei Zmievski - * @package Smarty - * @version 2.6.31-dev - */ - -/* $Id$ */ - -/** - * DIR_SEP isn't used anymore, but third party apps might - */ -if(!defined('DIR_SEP')) { - define('DIR_SEP', DIRECTORY_SEPARATOR); -} - -/** - * set SMARTY_DIR to absolute path to Smarty library files. - * if not defined, include_path will be used. Sets SMARTY_DIR only if user - * application has not already defined it. - */ - -if (!defined('SMARTY_DIR')) { - define('SMARTY_DIR', dirname(__FILE__) . DIRECTORY_SEPARATOR); -} - -if (!defined('SMARTY_CORE_DIR')) { - define('SMARTY_CORE_DIR', SMARTY_DIR . 'internals' . DIRECTORY_SEPARATOR); -} - -define('SMARTY_PHP_PASSTHRU', 0); -define('SMARTY_PHP_QUOTE', 1); -define('SMARTY_PHP_REMOVE', 2); -define('SMARTY_PHP_ALLOW', 3); - -/** - * @package Smarty - */ -class Smarty -{ - /**#@+ - * Smarty Configuration Section - */ - - /** - * The name of the directory where templates are located. - * - * @var string - */ - var $template_dir = 'templates'; - - /** - * The directory where compiled templates are located. - * - * @var string - */ - var $compile_dir = 'cache/smarty'; - - /** - * The directory where config files are located. - * - * @var string - */ - var $config_dir = 'configs'; - - /** - * An array of directories searched for plugins. - * - * @var array - */ - var $plugins_dir = array('plugins'); - - /** - * If debugging is enabled, a debug console window will display - * when the page loads (make sure your browser allows unrequested - * popup windows) - * - * @var boolean - */ - var $debugging = false; - - /** - * When set, smarty does uses this value as error_reporting-level. - * - * @var integer - */ - var $error_reporting = null; - - /** - * This is the path to the debug console template. If not set, - * the default one will be used. - * - * @var string - */ - var $debug_tpl = ''; - - /** - * This determines if debugging is enable-able from the browser. - *
            - *
          • NONE => no debugging control allowed
          • - *
          • URL => enable debugging when SMARTY_DEBUG is found in the URL.
          • - *
          - * @link http://www.foo.dom/index.php?SMARTY_DEBUG - * @var string - */ - var $debugging_ctrl = 'NONE'; - - /** - * This tells Smarty whether to check for recompiling or not. Recompiling - * does not need to happen unless a template or config file is changed. - * Typically you enable this during development, and disable for - * production. - * - * @var boolean - */ - var $compile_check = true; - - /** - * This forces templates to compile every time. Useful for development - * or debugging. - * - * @var boolean - */ - var $force_compile = false; - - /** - * This enables template caching. - *
            - *
          • 0 = no caching
          • - *
          • 1 = use class cache_lifetime value
          • - *
          • 2 = use cache_lifetime in cache file
          • - *
          - * @var integer - */ - var $caching = 0; - - /** - * The name of the directory for cache files. - * - * @var string - */ - var $cache_dir = 'cache'; - - /** - * This is the number of seconds cached content will persist. - *
            - *
          • 0 = always regenerate cache
          • - *
          • -1 = never expires
          • - *
          - * - * @var integer - */ - var $cache_lifetime = 3600; - - /** - * Only used when $caching is enabled. If true, then If-Modified-Since headers - * are respected with cached content, and appropriate HTTP headers are sent. - * This way repeated hits to a cached page do not send the entire page to the - * client every time. - * - * @var boolean - */ - var $cache_modified_check = false; - - /** - * This determines how Smarty handles "" tags in templates. - * possible values: - *
            - *
          • SMARTY_PHP_PASSTHRU -> print tags as plain text
          • - *
          • SMARTY_PHP_QUOTE -> escape tags as entities
          • - *
          • SMARTY_PHP_REMOVE -> remove php tags
          • - *
          • SMARTY_PHP_ALLOW -> execute php tags
          • - *
          - * - * @var integer - */ - var $php_handling = SMARTY_PHP_PASSTHRU; - - /** - * This enables template security. When enabled, many things are restricted - * in the templates that normally would go unchecked. This is useful when - * untrusted parties are editing templates and you want a reasonable level - * of security. (no direct execution of PHP in templates for example) - * - * @var boolean - */ - var $security = false; - - /** - * This is the list of template directories that are considered secure. This - * is used only if {@link $security} is enabled. One directory per array - * element. {@link $template_dir} is in this list implicitly. - * - * @var array - */ - var $secure_dir = array(); - - /** - * These are the security settings for Smarty. They are used only when - * {@link $security} is enabled. - * - * @var array - */ - var $security_settings = array( - 'PHP_HANDLING' => false, - 'IF_FUNCS' => array('array', 'list', - 'isset', 'empty', - 'count', 'sizeof', - 'in_array', 'is_array', - 'true', 'false', 'null'), - 'INCLUDE_ANY' => false, - 'PHP_TAGS' => false, - 'MODIFIER_FUNCS' => array('count'), - 'ALLOW_CONSTANTS' => false, - 'ALLOW_SUPER_GLOBALS' => true - ); - - /** - * This is an array of directories where trusted php scripts reside. - * {@link $security} is disabled during their inclusion/execution. - * - * @var array - */ - var $trusted_dir = array(); - - /** - * The left delimiter used for the template tags. - * - * @var string - */ - var $left_delimiter = '{'; - - /** - * The right delimiter used for the template tags. - * - * @var string - */ - var $right_delimiter = '}'; - - /** - * The order in which request variables are registered, similar to - * variables_order in php.ini E = Environment, G = GET, P = POST, - * C = Cookies, S = Server - * - * @var string - */ - var $request_vars_order = 'EGPCS'; - - /** - * Indicates wether $HTTP_*_VARS[] (request_use_auto_globals=false) - * are uses as request-vars or $_*[]-vars. note: if - * request_use_auto_globals is true, then $request_vars_order has - * no effect, but the php-ini-value "gpc_order" - * - * @var boolean - */ - var $request_use_auto_globals = true; - - /** - * Set this if you want different sets of compiled files for the same - * templates. This is useful for things like different languages. - * Instead of creating separate sets of templates per language, you - * set different compile_ids like 'en' and 'de'. - * - * @var string - */ - var $compile_id = null; - - /** - * This tells Smarty whether or not to use sub dirs in the cache/ and - * templates_c/ directories. sub directories better organized, but - * may not work well with PHP safe mode enabled. - * - * @var boolean - * - */ - var $use_sub_dirs = false; - - /** - * This is a list of the modifiers to apply to all template variables. - * Put each modifier in a separate array element in the order you want - * them applied. example: array('escape:"htmlall"'); - * - * @var array - */ - var $default_modifiers = array(); - - /** - * This is the resource type to be used when not specified - * at the beginning of the resource path. examples: - * $smarty->display('file:index.tpl'); - * $smarty->display('db:index.tpl'); - * $smarty->display('index.tpl'); // will use default resource type - * {include file="file:index.tpl"} - * {include file="db:index.tpl"} - * {include file="index.tpl"} {* will use default resource type *} - * - * @var array - */ - var $default_resource_type = 'file'; - - /** - * The function used for cache file handling. If not set, built-in caching is used. - * - * @var null|string function name - */ - var $cache_handler_func = null; - - /** - * This indicates which filters are automatically loaded into Smarty. - * - * @var array array of filter names - */ - var $autoload_filters = array(); - - /**#@+ - * @var boolean - */ - /** - * This tells if config file vars of the same name overwrite each other or not. - * if disabled, same name variables are accumulated in an array. - */ - var $config_overwrite = true; - - /** - * This tells whether or not to automatically booleanize config file variables. - * If enabled, then the strings "on", "true", and "yes" are treated as boolean - * true, and "off", "false" and "no" are treated as boolean false. - */ - var $config_booleanize = true; - - /** - * This tells whether hidden sections [.foobar] are readable from the - * tempalates or not. Normally you would never allow this since that is - * the point behind hidden sections: the application can access them, but - * the templates cannot. - */ - var $config_read_hidden = false; - - /** - * This tells whether or not automatically fix newlines in config files. - * It basically converts \r (mac) or \r\n (dos) to \n - */ - var $config_fix_newlines = true; - /**#@-*/ - - /** - * If a template cannot be found, this PHP function will be executed. - * Useful for creating templates on-the-fly or other special action. - * - * @var string function name - */ - var $default_template_handler_func = ''; - - /** - * The file that contains the compiler class. This can a full - * pathname, or relative to the php_include path. - * - * @var string - */ - var $compiler_file = 'Smarty_Compiler.class.php'; - - /** - * The class used for compiling templates. - * - * @var string - */ - var $compiler_class = 'Smarty_Compiler'; - - /** - * The class used to load config vars. - * - * @var string - */ - var $config_class = 'Config_File'; - -/**#@+ - * END Smarty Configuration Section - * There should be no need to touch anything below this line. - * @access private - */ - /** - * where assigned template vars are kept - * - * @var array - */ - var $_tpl_vars = array(); - - /** - * stores run-time $smarty.* vars - * - * @var null|array - */ - var $_smarty_vars = null; - - /** - * keeps track of sections - * - * @var array - */ - var $_sections = array(); - - /** - * keeps track of foreach blocks - * - * @var array - */ - var $_foreach = array(); - - /** - * keeps track of tag hierarchy - * - * @var array - */ - var $_tag_stack = array(); - - /** - * configuration object - * - * @var Config_file - */ - var $_conf_obj = null; - - /** - * loaded configuration settings - * - * @var array - */ - var $_config = array(array('vars' => array(), 'files' => array())); - - /** - * md5 checksum of the string 'Smarty' - * - * @var string - */ - var $_smarty_md5 = 'f8d698aea36fcbead2b9d5359ffca76f'; - - /** - * Smarty version number - * - * @var string - */ - var $_version = '2.6.31'; - - /** - * current template inclusion depth - * - * @var integer - */ - var $_inclusion_depth = 0; - - /** - * for different compiled templates - * - * @var string - */ - var $_compile_id = null; - - /** - * text in URL to enable debug mode - * - * @var string - */ - var $_smarty_debug_id = 'SMARTY_DEBUG'; - - /** - * debugging information for debug console - * - * @var array - */ - var $_smarty_debug_info = array(); - - /** - * info that makes up a cache file - * - * @var array - */ - var $_cache_info = array(); - - /** - * default file permissions - * - * @var integer - */ - var $_file_perms = 0644; - - /** - * default dir permissions - * - * @var integer - */ - var $_dir_perms = 0771; - - /** - * registered objects - * - * @var array - */ - var $_reg_objects = array(); - - /** - * table keeping track of plugins - * - * @var array - */ - var $_plugins = array( - 'modifier' => array(), - 'function' => array(), - 'block' => array(), - 'compiler' => array(), - 'prefilter' => array(), - 'postfilter' => array(), - 'outputfilter' => array(), - 'resource' => array(), - 'insert' => array()); - - - /** - * cache serials - * - * @var array - */ - var $_cache_serials = array(); - - /** - * name of optional cache include file - * - * @var string - */ - var $_cache_include = null; - - /** - * indicate if the current code is used in a compiled - * include - * - * @var string - */ - var $_cache_including = false; - - /** - * plugin filepath cache - * - * @var array - */ - var $_filepaths_cache = array(); - /**#@-*/ - /** - * The class constructor. - */ - public function __construct() - { - $this->assign('SCRIPT_NAME', isset($_SERVER['SCRIPT_NAME']) ? $_SERVER['SCRIPT_NAME'] - : @$GLOBALS['HTTP_SERVER_VARS']['SCRIPT_NAME']); - } - - /** - * assigns values to template variables - * - * @param array|string $tpl_var the template variable name(s) - * @param mixed $value the value to assign - */ - function assign($tpl_var, $value = null) - { - if (is_array($tpl_var)){ - foreach ($tpl_var as $key => $val) { - if ($key != '') { - $this->_tpl_vars[$key] = $val; - } - } - } else { - if ($tpl_var != '') - $this->_tpl_vars[$tpl_var] = $value; - } - } - - /** - * assigns values to template variables by reference - * - * @param string $tpl_var the template variable name - * @param mixed $value the referenced value to assign - */ - function assign_by_ref($tpl_var, &$value) - { - if ($tpl_var != '') - $this->_tpl_vars[$tpl_var] = &$value; - } - - /** - * appends values to template variables - * - * @param array|string $tpl_var the template variable name(s) - * @param mixed $value the value to append - */ - function append($tpl_var, $value=null, $merge=false) - { - if (is_array($tpl_var)) { - // $tpl_var is an array, ignore $value - foreach ($tpl_var as $_key => $_val) { - if ($_key != '') { - if(!@is_array($this->_tpl_vars[$_key])) { - settype($this->_tpl_vars[$_key],'array'); - } - if($merge && is_array($_val)) { - foreach($_val as $_mkey => $_mval) { - $this->_tpl_vars[$_key][$_mkey] = $_mval; - } - } else { - $this->_tpl_vars[$_key][] = $_val; - } - } - } - } else { - if ($tpl_var != '' && isset($value)) { - if(!@is_array($this->_tpl_vars[$tpl_var])) { - settype($this->_tpl_vars[$tpl_var],'array'); - } - if($merge && is_array($value)) { - foreach($value as $_mkey => $_mval) { - $this->_tpl_vars[$tpl_var][$_mkey] = $_mval; - } - } else { - $this->_tpl_vars[$tpl_var][] = $value; - } - } - } - } - - /** - * appends values to template variables by reference - * - * @param string $tpl_var the template variable name - * @param mixed $value the referenced value to append - */ - function append_by_ref($tpl_var, &$value, $merge=false) - { - if ($tpl_var != '' && isset($value)) { - if(!@is_array($this->_tpl_vars[$tpl_var])) { - settype($this->_tpl_vars[$tpl_var],'array'); - } - if ($merge && is_array($value)) { - foreach($value as $_key => $_val) { - $this->_tpl_vars[$tpl_var][$_key] = &$value[$_key]; - } - } else { - $this->_tpl_vars[$tpl_var][] = &$value; - } - } - } - - - /** - * clear the given assigned template variable. - * - * @param string $tpl_var the template variable to clear - */ - function clear_assign($tpl_var) - { - if (is_array($tpl_var)) - foreach ($tpl_var as $curr_var) - unset($this->_tpl_vars[$curr_var]); - else - unset($this->_tpl_vars[$tpl_var]); - } - - - /** - * Registers custom function to be used in templates - * - * @param string $function the name of the template function - * @param string $function_impl the name of the PHP function to register - */ - function register_function($function, $function_impl, $cacheable=true, $cache_attrs=null) - { - $this->_plugins['function'][$function] = - array($function_impl, null, null, false, $cacheable, $cache_attrs); - - } - - /** - * Unregisters custom function - * - * @param string $function name of template function - */ - function unregister_function($function) - { - unset($this->_plugins['function'][$function]); - } - - /** - * Registers object to be used in templates - * - * @param string $object name of template object - * @param object &$object_impl the referenced PHP object to register - * @param null|array $allowed list of allowed methods (empty = all) - * @param boolean $smarty_args smarty argument format, else traditional - * @param null|array $block_functs list of methods that are block format - */ - function register_object($object, &$object_impl, $allowed = array(), $smarty_args = true, $block_methods = array()) - { - settype($allowed, 'array'); - settype($smarty_args, 'boolean'); - $this->_reg_objects[$object] = - array(&$object_impl, $allowed, $smarty_args, $block_methods); - } - - /** - * Unregisters object - * - * @param string $object name of template object - */ - function unregister_object($object) - { - unset($this->_reg_objects[$object]); - } - - - /** - * Registers block function to be used in templates - * - * @param string $block name of template block - * @param string $block_impl PHP function to register - */ - function register_block($block, $block_impl, $cacheable=true, $cache_attrs=null) - { - $this->_plugins['block'][$block] = - array($block_impl, null, null, false, $cacheable, $cache_attrs); - } - - /** - * Unregisters block function - * - * @param string $block name of template function - */ - function unregister_block($block) - { - unset($this->_plugins['block'][$block]); - } - - /** - * Registers compiler function - * - * @param string $function name of template function - * @param string $function_impl name of PHP function to register - */ - function register_compiler_function($function, $function_impl, $cacheable=true) - { - $this->_plugins['compiler'][$function] = - array($function_impl, null, null, false, $cacheable); - } - - /** - * Unregisters compiler function - * - * @param string $function name of template function - */ - function unregister_compiler_function($function) - { - unset($this->_plugins['compiler'][$function]); - } - - /** - * Registers modifier to be used in templates - * - * @param string $modifier name of template modifier - * @param string $modifier_impl name of PHP function to register - */ - function register_modifier($modifier, $modifier_impl) - { - $this->_plugins['modifier'][$modifier] = - array($modifier_impl, null, null, false); - } - - /** - * Unregisters modifier - * - * @param string $modifier name of template modifier - */ - function unregister_modifier($modifier) - { - unset($this->_plugins['modifier'][$modifier]); - } - - /** - * Registers a resource to fetch a template - * - * @param string $type name of resource - * @param array $functions array of functions to handle resource - */ - function register_resource($type, $functions) - { - if (count($functions)==4) { - $this->_plugins['resource'][$type] = - array($functions, false); - - } elseif (count($functions)==5) { - $this->_plugins['resource'][$type] = - array(array(array(&$functions[0], $functions[1]) - ,array(&$functions[0], $functions[2]) - ,array(&$functions[0], $functions[3]) - ,array(&$functions[0], $functions[4])) - ,false); - - } else { - $this->trigger_error("malformed function-list for '$type' in register_resource"); - - } - } - - /** - * Unregisters a resource - * - * @param string $type name of resource - */ - function unregister_resource($type) - { - unset($this->_plugins['resource'][$type]); - } - - /** - * Registers a prefilter function to apply - * to a template before compiling - * - * @param callback $function - */ - function register_prefilter($function) - { - $this->_plugins['prefilter'][$this->_get_filter_name($function)] - = array($function, null, null, false); - } - - /** - * Unregisters a prefilter function - * - * @param callback $function - */ - function unregister_prefilter($function) - { - unset($this->_plugins['prefilter'][$this->_get_filter_name($function)]); - } - - /** - * Registers a postfilter function to apply - * to a compiled template after compilation - * - * @param callback $function - */ - function register_postfilter($function) - { - $this->_plugins['postfilter'][$this->_get_filter_name($function)] - = array($function, null, null, false); - } - - /** - * Unregisters a postfilter function - * - * @param callback $function - */ - function unregister_postfilter($function) - { - unset($this->_plugins['postfilter'][$this->_get_filter_name($function)]); - } - - /** - * Registers an output filter function to apply - * to a template output - * - * @param callback $function - */ - function register_outputfilter($function) - { - $this->_plugins['outputfilter'][$this->_get_filter_name($function)] - = array($function, null, null, false); - } - - /** - * Unregisters an outputfilter function - * - * @param callback $function - */ - function unregister_outputfilter($function) - { - unset($this->_plugins['outputfilter'][$this->_get_filter_name($function)]); - } - - /** - * load a filter of specified type and name - * - * @param string $type filter type - * @param string $name filter name - */ - function load_filter($type, $name) - { - switch ($type) { - case 'output': - $_params = array('plugins' => array(array($type . 'filter', $name, null, null, false))); - require_once(SMARTY_CORE_DIR . 'core.load_plugins.php'); - smarty_core_load_plugins($_params, $this); - break; - - case 'pre': - case 'post': - if (!isset($this->_plugins[$type . 'filter'][$name])) - $this->_plugins[$type . 'filter'][$name] = false; - break; - } - } - - /** - * clear cached content for the given template and cache id - * - * @param string $tpl_file name of template file - * @param string $cache_id name of cache_id - * @param string $compile_id name of compile_id - * @param string $exp_time expiration time - * @return boolean - */ - function clear_cache($tpl_file = null, $cache_id = null, $compile_id = null, $exp_time = null) - { - - if (!isset($compile_id)) - $compile_id = $this->compile_id; - - if (!isset($tpl_file)) - $compile_id = null; - - $_auto_id = $this->_get_auto_id($cache_id, $compile_id); - - if (!empty($this->cache_handler_func)) { - return call_user_func_array($this->cache_handler_func, - array('clear', &$this, &$dummy, $tpl_file, $cache_id, $compile_id, $exp_time)); - } else { - $_params = array('auto_base' => $this->cache_dir, - 'auto_source' => $tpl_file, - 'auto_id' => $_auto_id, - 'exp_time' => $exp_time); - require_once(SMARTY_CORE_DIR . 'core.rm_auto.php'); - return smarty_core_rm_auto($_params, $this); - } - - } - - - /** - * clear the entire contents of cache (all templates) - * - * @param string $exp_time expire time - * @return boolean results of {@link smarty_core_rm_auto()} - */ - function clear_all_cache($exp_time = null) - { - return $this->clear_cache(null, null, null, $exp_time); - } - - - /** - * test to see if valid cache exists for this template - * - * @param string $tpl_file name of template file - * @param string $cache_id - * @param string $compile_id - * @return string|false results of {@link _read_cache_file()} - */ - function is_cached($tpl_file, $cache_id = null, $compile_id = null) - { - if (!$this->caching) - return false; - - if (!isset($compile_id)) - $compile_id = $this->compile_id; - - $_params = array( - 'tpl_file' => $tpl_file, - 'cache_id' => $cache_id, - 'compile_id' => $compile_id - ); - require_once(SMARTY_CORE_DIR . 'core.read_cache_file.php'); - return smarty_core_read_cache_file($_params, $this); - } - - - /** - * clear all the assigned template variables. - * - */ - function clear_all_assign() - { - $this->_tpl_vars = array(); - } - - /** - * clears compiled version of specified template resource, - * or all compiled template files if one is not specified. - * This function is for advanced use only, not normally needed. - * - * @param string $tpl_file - * @param string $compile_id - * @param string $exp_time - * @return boolean results of {@link smarty_core_rm_auto()} - */ - function clear_compiled_tpl($tpl_file = null, $compile_id = null, $exp_time = null) - { - if (!isset($compile_id)) { - $compile_id = $this->compile_id; - } - $_params = array('auto_base' => $this->compile_dir, - 'auto_source' => $tpl_file, - 'auto_id' => $compile_id, - 'exp_time' => $exp_time, - 'extensions' => array('.inc', '.php')); - require_once(SMARTY_CORE_DIR . 'core.rm_auto.php'); - return smarty_core_rm_auto($_params, $this); - } - - /** - * Checks whether requested template exists. - * - * @param string $tpl_file - * @return boolean - */ - function template_exists($tpl_file) - { - $_params = array('resource_name' => $tpl_file, 'quiet'=>true, 'get_source'=>false); - return $this->_fetch_resource_info($_params); - } - - /** - * Returns an array containing template variables - * - * @param string $name - * @param string $type - * @return array - */ - function &get_template_vars($name=null) - { - if(!isset($name)) { - return $this->_tpl_vars; - } elseif(isset($this->_tpl_vars[$name])) { - return $this->_tpl_vars[$name]; - } else { - // var non-existant, return valid reference - $_tmp = null; - return $_tmp; - } - } - - /** - * Returns an array containing config variables - * - * @param string $name - * @param string $type - * @return array - */ - function &get_config_vars($name=null) - { - if(!isset($name) && is_array($this->_config[0])) { - return $this->_config[0]['vars']; - } else if(isset($this->_config[0]['vars'][$name])) { - return $this->_config[0]['vars'][$name]; - } else { - // var non-existant, return valid reference - $_tmp = null; - return $_tmp; - } - } - - /** - * trigger Smarty error - * - * @param string $error_msg - * @param integer $error_type - */ - function trigger_error($error_msg, $error_type = E_USER_WARNING) - { - $msg = htmlentities($error_msg); - trigger_error("Smarty error: $msg", $error_type); - } - - - /** - * executes & displays the template results - * - * @param string $resource_name - * @param string $cache_id - * @param string $compile_id - */ - function display($resource_name, $cache_id = null, $compile_id = null) - { - $this->fetch($resource_name, $cache_id, $compile_id, true); - } - - /** - * executes & returns or displays the template results - * - * @param string $resource_name - * @param string $cache_id - * @param string $compile_id - * @param boolean $display - */ - function fetch($resource_name, $cache_id = null, $compile_id = null, $display = false) - { - static $_cache_info = array(); - - $_smarty_old_error_level = $this->debugging ? error_reporting() : error_reporting(isset($this->error_reporting) - ? $this->error_reporting : error_reporting() & ~E_NOTICE); - - if (!$this->debugging && $this->debugging_ctrl == 'URL') { - $_query_string = $this->request_use_auto_globals ? $_SERVER['QUERY_STRING'] : $GLOBALS['HTTP_SERVER_VARS']['QUERY_STRING']; - if (@strstr($_query_string, $this->_smarty_debug_id)) { - if (@strstr($_query_string, $this->_smarty_debug_id . '=on')) { - // enable debugging for this browser session - @setcookie('SMARTY_DEBUG', true); - $this->debugging = true; - } elseif (@strstr($_query_string, $this->_smarty_debug_id . '=off')) { - // disable debugging for this browser session - @setcookie('SMARTY_DEBUG', false); - $this->debugging = false; - } else { - // enable debugging for this page - $this->debugging = true; - } - } else { - $this->debugging = (bool)($this->request_use_auto_globals ? @$_COOKIE['SMARTY_DEBUG'] : @$GLOBALS['HTTP_COOKIE_VARS']['SMARTY_DEBUG']); - } - } - - if ($this->debugging) { - // capture time for debugging info - $_params = array(); - require_once(SMARTY_CORE_DIR . 'core.get_microtime.php'); - $_debug_start_time = smarty_core_get_microtime($_params, $this); - $this->_smarty_debug_info[] = array('type' => 'template', - 'filename' => $resource_name, - 'depth' => 0); - $_included_tpls_idx = count($this->_smarty_debug_info) - 1; - } - - if (!isset($compile_id)) { - $compile_id = $this->compile_id; - } - - $this->_compile_id = $compile_id; - $this->_inclusion_depth = 0; - - if ($this->caching) { - // save old cache_info, initialize cache_info - array_push($_cache_info, $this->_cache_info); - $this->_cache_info = array(); - $_params = array( - 'tpl_file' => $resource_name, - 'cache_id' => $cache_id, - 'compile_id' => $compile_id, - 'results' => null - ); - require_once(SMARTY_CORE_DIR . 'core.read_cache_file.php'); - if (smarty_core_read_cache_file($_params, $this)) { - $_smarty_results = $_params['results']; - if (!empty($this->_cache_info['insert_tags'])) { - $_params = array('plugins' => $this->_cache_info['insert_tags']); - require_once(SMARTY_CORE_DIR . 'core.load_plugins.php'); - smarty_core_load_plugins($_params, $this); - $_params = array('results' => $_smarty_results); - require_once(SMARTY_CORE_DIR . 'core.process_cached_inserts.php'); - $_smarty_results = smarty_core_process_cached_inserts($_params, $this); - } - if (!empty($this->_cache_info['cache_serials'])) { - $_params = array('results' => $_smarty_results); - require_once(SMARTY_CORE_DIR . 'core.process_compiled_include.php'); - $_smarty_results = smarty_core_process_compiled_include($_params, $this); - } - - - if ($display) { - if ($this->debugging) - { - // capture time for debugging info - $_params = array(); - require_once(SMARTY_CORE_DIR . 'core.get_microtime.php'); - $this->_smarty_debug_info[$_included_tpls_idx]['exec_time'] = smarty_core_get_microtime($_params, $this) - $_debug_start_time; - require_once(SMARTY_CORE_DIR . 'core.display_debug_console.php'); - $_smarty_results .= smarty_core_display_debug_console($_params, $this); - } - if ($this->cache_modified_check) { - $_server_vars = ($this->request_use_auto_globals) ? $_SERVER : $GLOBALS['HTTP_SERVER_VARS']; - $_last_modified_date = @substr($_server_vars['HTTP_IF_MODIFIED_SINCE'], 0, strpos($_server_vars['HTTP_IF_MODIFIED_SINCE'], 'GMT') + 3); - $_gmt_mtime = gmdate('D, d M Y H:i:s', $this->_cache_info['timestamp']).' GMT'; - if (@count($this->_cache_info['insert_tags']) == 0 - && !$this->_cache_serials - && $_gmt_mtime == $_last_modified_date) { - if (php_sapi_name()=='cgi') - header('Status: 304 Not Modified'); - else - header('HTTP/1.1 304 Not Modified'); - - } else { - header('Last-Modified: '.$_gmt_mtime); - echo $_smarty_results; - } - } else { - echo $_smarty_results; - } - error_reporting($_smarty_old_error_level); - // restore initial cache_info - $this->_cache_info = array_pop($_cache_info); - return true; - } else { - error_reporting($_smarty_old_error_level); - // restore initial cache_info - $this->_cache_info = array_pop($_cache_info); - return $_smarty_results; - } - } else { - $this->_cache_info['template'][$resource_name] = true; - if ($this->cache_modified_check && $display) { - header('Last-Modified: '.gmdate('D, d M Y H:i:s', time()).' GMT'); - } - } - } - - // load filters that are marked as autoload - if (count($this->autoload_filters)) { - foreach ($this->autoload_filters as $_filter_type => $_filters) { - foreach ($_filters as $_filter) { - $this->load_filter($_filter_type, $_filter); - } - } - } - - $_smarty_compile_path = $this->_get_compile_path($resource_name); - - // if we just need to display the results, don't perform output - // buffering - for speed - $_cache_including = $this->_cache_including; - $this->_cache_including = false; - if ($display && !$this->caching && count($this->_plugins['outputfilter']) == 0) { - if ($this->_is_compiled($resource_name, $_smarty_compile_path) - || $this->_compile_resource($resource_name, $_smarty_compile_path)) - { - include($_smarty_compile_path); - } - } else { - ob_start(); - if ($this->_is_compiled($resource_name, $_smarty_compile_path) - || $this->_compile_resource($resource_name, $_smarty_compile_path)) - { - include($_smarty_compile_path); - } - $_smarty_results = ob_get_contents(); - ob_end_clean(); - - foreach ((array)$this->_plugins['outputfilter'] as $_output_filter) { - $_smarty_results = call_user_func_array($_output_filter[0], array($_smarty_results, &$this)); - } - } - - if ($this->caching) { - $_params = array('tpl_file' => $resource_name, - 'cache_id' => $cache_id, - 'compile_id' => $compile_id, - 'results' => $_smarty_results); - require_once(SMARTY_CORE_DIR . 'core.write_cache_file.php'); - smarty_core_write_cache_file($_params, $this); - require_once(SMARTY_CORE_DIR . 'core.process_cached_inserts.php'); - $_smarty_results = smarty_core_process_cached_inserts($_params, $this); - - if ($this->_cache_serials) { - // strip nocache-tags from output - $_smarty_results = preg_replace('!(\{/?nocache\:[0-9a-f]{32}#\d+\})!s' - ,'' - ,$_smarty_results); - } - // restore initial cache_info - $this->_cache_info = array_pop($_cache_info); - } - $this->_cache_including = $_cache_including; - - if ($display) { - if (isset($_smarty_results)) { echo $_smarty_results; } - if ($this->debugging) { - // capture time for debugging info - $_params = array(); - require_once(SMARTY_CORE_DIR . 'core.get_microtime.php'); - $this->_smarty_debug_info[$_included_tpls_idx]['exec_time'] = (smarty_core_get_microtime($_params, $this) - $_debug_start_time); - require_once(SMARTY_CORE_DIR . 'core.display_debug_console.php'); - echo smarty_core_display_debug_console($_params, $this); - } - error_reporting($_smarty_old_error_level); - return; - } else { - error_reporting($_smarty_old_error_level); - if (isset($_smarty_results)) { return $_smarty_results; } - } - } - - /** - * load configuration values - * - * @param string $file - * @param string $section - * @param string $scope - */ - function config_load($file, $section = null, $scope = 'global') - { - require_once($this->_get_plugin_filepath('function', 'config_load')); - smarty_function_config_load(array('file' => $file, 'section' => $section, 'scope' => $scope), $this); - } - - /** - * return a reference to a registered object - * - * @param string $name - * @return object - */ - function &get_registered_object($name) { - if (!isset($this->_reg_objects[$name])) - $this->_trigger_fatal_error("'$name' is not a registered object"); - - if (!is_object($this->_reg_objects[$name][0])) - $this->_trigger_fatal_error("registered '$name' is not an object"); - - return $this->_reg_objects[$name][0]; - } - - /** - * clear configuration values - * - * @param string $var - */ - function clear_config($var = null) - { - if(!isset($var)) { - // clear all values - $this->_config = array(array('vars' => array(), - 'files' => array())); - } else { - unset($this->_config[0]['vars'][$var]); - } - } - - /** - * get filepath of requested plugin - * - * @param string $type - * @param string $name - * @return string|false - */ - function _get_plugin_filepath($type, $name) - { - $_params = array('type' => $type, 'name' => $name); - require_once(SMARTY_CORE_DIR . 'core.assemble_plugin_filepath.php'); - return smarty_core_assemble_plugin_filepath($_params, $this); - } - - /** - * test if resource needs compiling - * - * @param string $resource_name - * @param string $compile_path - * @return boolean - */ - function _is_compiled($resource_name, $compile_path) - { - if (!$this->force_compile && file_exists($compile_path)) { - if (!$this->compile_check) { - // no need to check compiled file - return true; - } else { - // get file source and timestamp - $_params = array('resource_name' => $resource_name, 'get_source'=>false); - if (!$this->_fetch_resource_info($_params)) { - return false; - } - if ($_params['resource_timestamp'] <= filemtime($compile_path)) { - // template not expired, no recompile - return true; - } else { - // compile template - return false; - } - } - } else { - // compiled template does not exist, or forced compile - return false; - } - } - - /** - * compile the template - * - * @param string $resource_name - * @param string $compile_path - * @return boolean - */ - function _compile_resource($resource_name, $compile_path) - { - - $_params = array('resource_name' => $resource_name); - if (!$this->_fetch_resource_info($_params)) { - return false; - } - - $_source_content = $_params['source_content']; - $_cache_include = substr($compile_path, 0, -4).'.inc'; - - if ($this->_compile_source($resource_name, $_source_content, $_compiled_content, $_cache_include)) { - // if a _cache_serial was set, we also have to write an include-file: - if ($this->_cache_include_info) { - require_once(SMARTY_CORE_DIR . 'core.write_compiled_include.php'); - smarty_core_write_compiled_include(array_merge($this->_cache_include_info, array('compiled_content'=>$_compiled_content, 'resource_name'=>$resource_name)), $this); - } - - $_params = array('compile_path'=>$compile_path, 'compiled_content' => $_compiled_content); - require_once(SMARTY_CORE_DIR . 'core.write_compiled_resource.php'); - smarty_core_write_compiled_resource($_params, $this); - - return true; - } else { - return false; - } - - } - - /** - * compile the given source - * - * @param string $resource_name - * @param string $source_content - * @param string $compiled_content - * @return boolean - */ - function _compile_source($resource_name, &$source_content, &$compiled_content, $cache_include_path=null) - { - if (file_exists(SMARTY_DIR . $this->compiler_file)) { - require_once(SMARTY_DIR . $this->compiler_file); - } else { - // use include_path - require_once($this->compiler_file); - } - - - $smarty_compiler = new $this->compiler_class; - - $smarty_compiler->template_dir = $this->template_dir; - $smarty_compiler->compile_dir = $this->compile_dir; - $smarty_compiler->plugins_dir = $this->plugins_dir; - $smarty_compiler->config_dir = $this->config_dir; - $smarty_compiler->force_compile = $this->force_compile; - $smarty_compiler->caching = $this->caching; - $smarty_compiler->php_handling = $this->php_handling; - $smarty_compiler->left_delimiter = $this->left_delimiter; - $smarty_compiler->right_delimiter = $this->right_delimiter; - $smarty_compiler->_version = $this->_version; - $smarty_compiler->security = $this->security; - $smarty_compiler->secure_dir = $this->secure_dir; - $smarty_compiler->security_settings = $this->security_settings; - $smarty_compiler->trusted_dir = $this->trusted_dir; - $smarty_compiler->use_sub_dirs = $this->use_sub_dirs; - $smarty_compiler->_reg_objects = &$this->_reg_objects; - $smarty_compiler->_plugins = &$this->_plugins; - $smarty_compiler->_tpl_vars = &$this->_tpl_vars; - $smarty_compiler->default_modifiers = $this->default_modifiers; - $smarty_compiler->compile_id = $this->_compile_id; - $smarty_compiler->_config = $this->_config; - $smarty_compiler->request_use_auto_globals = $this->request_use_auto_globals; - - if (isset($cache_include_path) && isset($this->_cache_serials[$cache_include_path])) { - $smarty_compiler->_cache_serial = $this->_cache_serials[$cache_include_path]; - } - $smarty_compiler->_cache_include = $cache_include_path; - - - $_results = $smarty_compiler->_compile_file($resource_name, $source_content, $compiled_content); - - if ($smarty_compiler->_cache_serial) { - $this->_cache_include_info = array( - 'cache_serial'=>$smarty_compiler->_cache_serial - ,'plugins_code'=>$smarty_compiler->_plugins_code - ,'include_file_path' => $cache_include_path); - - } else { - $this->_cache_include_info = null; - - } - - return $_results; - } - - /** - * Get the compile path for this resource - * - * @param string $resource_name - * @return string results of {@link _get_auto_filename()} - */ - function _get_compile_path($resource_name) - { - return $this->_get_auto_filename($this->compile_dir, $resource_name, - $this->_compile_id) . '.php'; - } - - /** - * fetch the template info. Gets timestamp, and source - * if get_source is true - * - * sets $source_content to the source of the template, and - * $resource_timestamp to its time stamp - * @param string $resource_name - * @param string $source_content - * @param integer $resource_timestamp - * @param boolean $get_source - * @param boolean $quiet - * @return boolean - */ - - function _fetch_resource_info(&$params) - { - if(!isset($params['get_source'])) { $params['get_source'] = true; } - if(!isset($params['quiet'])) { $params['quiet'] = false; } - - $_return = false; - $_params = array('resource_name' => $params['resource_name']) ; - if (isset($params['resource_base_path'])) - $_params['resource_base_path'] = $params['resource_base_path']; - else - $_params['resource_base_path'] = $this->template_dir; - - if ($this->_parse_resource_name($_params)) { - $_resource_type = $_params['resource_type']; - $_resource_name = $_params['resource_name']; - switch ($_resource_type) { - case 'file': - if ($params['get_source']) { - $params['source_content'] = $this->_read_file($_resource_name); - } - $params['resource_timestamp'] = filemtime($_resource_name); - $_return = is_file($_resource_name) && is_readable($_resource_name); - break; - - default: - // call resource functions to fetch the template source and timestamp - if ($params['get_source']) { - $_source_return = isset($this->_plugins['resource'][$_resource_type]) && - call_user_func_array($this->_plugins['resource'][$_resource_type][0][0], - array($_resource_name, &$params['source_content'], &$this)); - } else { - $_source_return = true; - } - - $_timestamp_return = isset($this->_plugins['resource'][$_resource_type]) && - call_user_func_array($this->_plugins['resource'][$_resource_type][0][1], - array($_resource_name, &$params['resource_timestamp'], &$this)); - - $_return = $_source_return && $_timestamp_return; - break; - } - } - - if (!$_return) { - // see if we can get a template with the default template handler - if (!empty($this->default_template_handler_func)) { - if (!is_callable($this->default_template_handler_func)) { - $this->trigger_error("default template handler function \"$this->default_template_handler_func\" doesn't exist."); - } else { - $_return = call_user_func_array( - $this->default_template_handler_func, - array($_params['resource_type'], $_params['resource_name'], &$params['source_content'], &$params['resource_timestamp'], &$this)); - } - } - } - - if (!$_return) { - if (!$params['quiet']) { - $this->trigger_error('unable to read resource: "' . $params['resource_name'] . '"'); - } - } else if ($_return && $this->security) { - require_once(SMARTY_CORE_DIR . 'core.is_secure.php'); - if (!smarty_core_is_secure($_params, $this)) { - if (!$params['quiet']) - $this->trigger_error('(secure mode) accessing "' . $params['resource_name'] . '" is not allowed'); - $params['source_content'] = null; - $params['resource_timestamp'] = null; - return false; - } - } - return $_return; - } - - - /** - * parse out the type and name from the resource - * - * @param string $resource_base_path - * @param string $resource_name - * @param string $resource_type - * @param string $resource_name - * @return boolean - */ - - function _parse_resource_name(&$params) - { - - // split tpl_path by the first colon - $_resource_name_parts = explode(':', $params['resource_name'], 2); - - if (count($_resource_name_parts) == 1) { - // no resource type given - $params['resource_type'] = $this->default_resource_type; - $params['resource_name'] = $_resource_name_parts[0]; - } else { - if(strlen($_resource_name_parts[0]) == 1) { - // 1 char is not resource type, but part of filepath - $params['resource_type'] = $this->default_resource_type; - $params['resource_name'] = $params['resource_name']; - } else { - $params['resource_type'] = $_resource_name_parts[0]; - $params['resource_name'] = $_resource_name_parts[1]; - } - } - - if ($params['resource_type'] == 'file') { - if (!preg_match('/^([\/\\\\]|[a-zA-Z]:[\/\\\\])/', $params['resource_name'])) { - // relative pathname to $params['resource_base_path'] - // use the first directory where the file is found - foreach ((array)$params['resource_base_path'] as $_curr_path) { - $_fullpath = $_curr_path . DIRECTORY_SEPARATOR . $params['resource_name']; - if (file_exists($_fullpath) && is_file($_fullpath)) { - $params['resource_name'] = $_fullpath; - return true; - } - // didn't find the file, try include_path - $_params = array('file_path' => $_fullpath); - require_once(SMARTY_CORE_DIR . 'core.get_include_path.php'); - if(smarty_core_get_include_path($_params, $this)) { - $params['resource_name'] = $_params['new_file_path']; - return true; - } - } - return false; - } else { - /* absolute path */ - return file_exists($params['resource_name']); - } - } elseif (empty($this->_plugins['resource'][$params['resource_type']])) { - $_params = array('type' => $params['resource_type']); - require_once(SMARTY_CORE_DIR . 'core.load_resource_plugin.php'); - smarty_core_load_resource_plugin($_params, $this); - } - - return true; - } - - - /** - * Handle modifiers - * - * @param string|null $modifier_name - * @param array|null $map_array - * @return string result of modifiers - */ - function _run_mod_handler() - { - $_args = func_get_args(); - list($_modifier_name, $_map_array) = array_splice($_args, 0, 2); - list($_func_name, $_tpl_file, $_tpl_line) = - $this->_plugins['modifier'][$_modifier_name]; - - $_var = $_args[0]; - foreach ($_var as $_key => $_val) { - $_args[0] = $_val; - $_var[$_key] = call_user_func_array($_func_name, $_args); - } - return $_var; - } - - /** - * Remove starting and ending quotes from the string - * - * @param string $string - * @return string - */ - function _dequote($string) - { - if ((substr($string, 0, 1) == "'" || substr($string, 0, 1) == '"') && - substr($string, -1) == substr($string, 0, 1)) - return substr($string, 1, -1); - else - return $string; - } - - - /** - * read in a file - * - * @param string $filename - * @return string - */ - function _read_file($filename) - { - if ( file_exists($filename) && is_readable($filename) && ($fd = @fopen($filename, 'rb')) ) { - $contents = ''; - while (!feof($fd)) { - $contents .= fread($fd, 8192); - } - fclose($fd); - return $contents; - } else { - return false; - } - } - - /** - * get a concrete filename for automagically created content - * - * @param string $auto_base - * @param string $auto_source - * @param string $auto_id - * @return string - * @staticvar string|null - * @staticvar string|null - */ - function _get_auto_filename($auto_base, $auto_source = null, $auto_id = null) - { - $_compile_dir_sep = $this->use_sub_dirs ? DIRECTORY_SEPARATOR : '^'; - $_return = $auto_base . DIRECTORY_SEPARATOR; - - if(isset($auto_id)) { - // make auto_id safe for directory names - $auto_id = str_replace('%7C',$_compile_dir_sep,(urlencode($auto_id))); - // split into separate directories - $_return .= $auto_id . $_compile_dir_sep; - } - - if(isset($auto_source)) { - // make source name safe for filename - $_filename = urlencode(basename($auto_source)); - $_crc32 = sprintf('%08X', crc32($auto_source)); - // prepend %% to avoid name conflicts with - // with $params['auto_id'] names - $_crc32 = substr($_crc32, 0, 2) . $_compile_dir_sep . - substr($_crc32, 0, 3) . $_compile_dir_sep . $_crc32; - $_return .= '%%' . $_crc32 . '%%' . $_filename; - } - - return $_return; - } - - /** - * unlink a file, possibly using expiration time - * - * @param string $resource - * @param integer $exp_time - */ - function _unlink($resource, $exp_time = null) - { - if(isset($exp_time)) { - if(time() - @filemtime($resource) >= $exp_time) { - return @unlink($resource); - } - } else { - return @unlink($resource); - } - } - - /** - * returns an auto_id for auto-file-functions - * - * @param string $cache_id - * @param string $compile_id - * @return string|null - */ - function _get_auto_id($cache_id=null, $compile_id=null) { - if (isset($cache_id)) - return (isset($compile_id)) ? $cache_id . '|' . $compile_id : $cache_id; - elseif(isset($compile_id)) - return $compile_id; - else - return null; - } - - /** - * trigger Smarty plugin error - * - * @param string $error_msg - * @param string $tpl_file - * @param integer $tpl_line - * @param string $file - * @param integer $line - * @param integer $error_type - */ - function _trigger_fatal_error($error_msg, $tpl_file = null, $tpl_line = null, - $file = null, $line = null, $error_type = E_USER_ERROR) - { - if(isset($file) && isset($line)) { - $info = ' ('.basename($file).", line $line)"; - } else { - $info = ''; - } - if (isset($tpl_line) && isset($tpl_file)) { - $this->trigger_error('[in ' . $tpl_file . ' line ' . $tpl_line . "]: $error_msg$info", $error_type); - } else { - $this->trigger_error($error_msg . $info, $error_type); - } - } - - - /** - * callback function for preg_replace, to call a non-cacheable block - * @return string - */ - function _process_compiled_include_callback($match) { - $_func = '_smarty_tplfunc_'.$match[2].'_'.$match[3]; - ob_start(); - $_func($this); - $_ret = ob_get_contents(); - ob_end_clean(); - return $_ret; - } - - - /** - * called for included templates - * - * @param string $_smarty_include_tpl_file - * @param string $_smarty_include_vars - */ - - // $_smarty_include_tpl_file, $_smarty_include_vars - - function _smarty_include($params) - { - if ($this->debugging) { - $_params = array(); - require_once(SMARTY_CORE_DIR . 'core.get_microtime.php'); - $debug_start_time = smarty_core_get_microtime($_params, $this); - $this->_smarty_debug_info[] = array('type' => 'template', - 'filename' => $params['smarty_include_tpl_file'], - 'depth' => ++$this->_inclusion_depth); - $included_tpls_idx = count($this->_smarty_debug_info) - 1; - } - - $this->_tpl_vars = array_merge($this->_tpl_vars, $params['smarty_include_vars']); - - // config vars are treated as local, so push a copy of the - // current ones onto the front of the stack - array_unshift($this->_config, $this->_config[0]); - - $_smarty_compile_path = $this->_get_compile_path($params['smarty_include_tpl_file']); - - - if ($this->_is_compiled($params['smarty_include_tpl_file'], $_smarty_compile_path) - || $this->_compile_resource($params['smarty_include_tpl_file'], $_smarty_compile_path)) - { - include($_smarty_compile_path); - } - - // pop the local vars off the front of the stack - array_shift($this->_config); - - $this->_inclusion_depth--; - - if ($this->debugging) { - // capture time for debugging info - $_params = array(); - require_once(SMARTY_CORE_DIR . 'core.get_microtime.php'); - $this->_smarty_debug_info[$included_tpls_idx]['exec_time'] = smarty_core_get_microtime($_params, $this) - $debug_start_time; - } - - if ($this->caching) { - $this->_cache_info['template'][$params['smarty_include_tpl_file']] = true; - } - } - - - /** - * get or set an array of cached attributes for function that is - * not cacheable - * @return array - */ - function &_smarty_cache_attrs($cache_serial, $count) { - $_cache_attrs =& $this->_cache_info['cache_attrs'][$cache_serial][$count]; - - if ($this->_cache_including) { - /* return next set of cache_attrs */ - $_return = current($_cache_attrs); - next($_cache_attrs); - return $_return; - - } else { - /* add a reference to a new set of cache_attrs */ - $_cache_attrs[] = array(); - return $_cache_attrs[count($_cache_attrs)-1]; - - } - - } - - - /** - * wrapper for include() retaining $this - * @return mixed - */ - function _include($filename, $once=false, $params=null) - { - if ($once) { - return include_once($filename); - } else { - return include($filename); - } - } - - - /** - * wrapper for eval() retaining $this - * @return mixed - */ - function _eval($code, $params=null) - { - return eval($code); - } - - /** - * Extracts the filter name from the given callback - * - * @param callback $function - * @return string - */ - function _get_filter_name($function) - { - if (is_array($function)) { - $_class_name = (is_object($function[0]) ? - get_class($function[0]) : $function[0]); - return $_class_name . '_' . $function[1]; - } - else { - return $function; - } - } - - /**#@-*/ - -} - -/* vim: set expandtab: */ - -?> diff --git a/lib/Smarty/Smarty_Compiler.class.php b/lib/Smarty/Smarty_Compiler.class.php deleted file mode 100644 index 904601d..0000000 --- a/lib/Smarty/Smarty_Compiler.class.php +++ /dev/null @@ -1,2365 +0,0 @@ - - * @author Andrei Zmievski - * @version 2.6.25-dev - * @copyright 2001-2005 New Digital Group, Inc. - * @package Smarty - */ - -/* $Id$ */ - -/** - * Template compiling class - * @package Smarty - */ -class Smarty_Compiler extends Smarty { - - // internal vars - /**#@+ - * @access private - */ - var $_folded_blocks = array(); // keeps folded template blocks - var $_current_file = null; // the current template being compiled - var $_current_line_no = 1; // line number for error messages - var $_capture_stack = array(); // keeps track of nested capture buffers - var $_plugin_info = array(); // keeps track of plugins to load - var $_init_smarty_vars = false; - var $_permitted_tokens = array('true','false','yes','no','on','off','null'); - var $_db_qstr_regexp = null; // regexps are setup in the constructor - var $_si_qstr_regexp = null; - var $_qstr_regexp = null; - var $_func_regexp = null; - var $_reg_obj_regexp = null; - var $_var_bracket_regexp = null; - var $_num_const_regexp = null; - var $_dvar_guts_regexp = null; - var $_dvar_regexp = null; - var $_cvar_regexp = null; - var $_svar_regexp = null; - var $_avar_regexp = null; - var $_mod_regexp = null; - var $_var_regexp = null; - var $_parenth_param_regexp = null; - var $_func_call_regexp = null; - var $_obj_ext_regexp = null; - var $_obj_start_regexp = null; - var $_obj_params_regexp = null; - var $_obj_call_regexp = null; - var $_cacheable_state = 0; - var $_cache_attrs_count = 0; - var $_nocache_count = 0; - var $_cache_serial = null; - var $_cache_include = null; - - var $_strip_depth = 0; - var $_additional_newline = "\n"; - - /**#@-*/ - /** - * The class constructor. - */ - public function __construct() - { - // matches double quoted strings: - // "foobar" - // "foo\"bar" - $this->_db_qstr_regexp = '"[^"\\\\]*(?:\\\\.[^"\\\\]*)*"'; - - // matches single quoted strings: - // 'foobar' - // 'foo\'bar' - $this->_si_qstr_regexp = '\'[^\'\\\\]*(?:\\\\.[^\'\\\\]*)*\''; - - // matches single or double quoted strings - $this->_qstr_regexp = '(?:' . $this->_db_qstr_regexp . '|' . $this->_si_qstr_regexp . ')'; - - // matches bracket portion of vars - // [0] - // [foo] - // [$bar] - $this->_var_bracket_regexp = '\[\$?[\w\.]+\]'; - - // matches numerical constants - // 30 - // -12 - // 13.22 - $this->_num_const_regexp = '(?:\-?\d+(?:\.\d+)?)'; - - // matches $ vars (not objects): - // $foo - // $foo.bar - // $foo.bar.foobar - // $foo[0] - // $foo[$bar] - // $foo[5][blah] - // $foo[5].bar[$foobar][4] - $this->_dvar_math_regexp = '(?:[\+\*\/\%]|(?:-(?!>)))'; - $this->_dvar_math_var_regexp = '[\$\w\.\+\-\*\/\%\d\>\[\]]'; - $this->_dvar_guts_regexp = '\w+(?:' . $this->_var_bracket_regexp - . ')*(?:\.\$?\w+(?:' . $this->_var_bracket_regexp . ')*)*(?:' . $this->_dvar_math_regexp . '(?:' . $this->_num_const_regexp . '|' . $this->_dvar_math_var_regexp . ')*)?'; - $this->_dvar_regexp = '\$' . $this->_dvar_guts_regexp; - - // matches config vars: - // #foo# - // #foobar123_foo# - $this->_cvar_regexp = '\#\w+\#'; - - // matches section vars: - // %foo.bar% - $this->_svar_regexp = '\%\w+\.\w+\%'; - - // matches all valid variables (no quotes, no modifiers) - $this->_avar_regexp = '(?:' . $this->_dvar_regexp . '|' - . $this->_cvar_regexp . '|' . $this->_svar_regexp . ')'; - - // matches valid variable syntax: - // $foo - // $foo - // #foo# - // #foo# - // "text" - // "text" - $this->_var_regexp = '(?:' . $this->_avar_regexp . '|' . $this->_qstr_regexp . ')'; - - // matches valid object call (one level of object nesting allowed in parameters): - // $foo->bar - // $foo->bar() - // $foo->bar("text") - // $foo->bar($foo, $bar, "text") - // $foo->bar($foo, "foo") - // $foo->bar->foo() - // $foo->bar->foo->bar() - // $foo->bar($foo->bar) - // $foo->bar($foo->bar()) - // $foo->bar($foo->bar($blah,$foo,44,"foo",$foo[0].bar)) - $this->_obj_ext_regexp = '\->(?:\$?' . $this->_dvar_guts_regexp . ')'; - $this->_obj_restricted_param_regexp = '(?:' - . '(?:' . $this->_var_regexp . '|' . $this->_num_const_regexp . ')(?:' . $this->_obj_ext_regexp . '(?:\((?:(?:' . $this->_var_regexp . '|' . $this->_num_const_regexp . ')' - . '(?:\s*,\s*(?:' . $this->_var_regexp . '|' . $this->_num_const_regexp . '))*)?\))?)*)'; - $this->_obj_single_param_regexp = '(?:\w+|' . $this->_obj_restricted_param_regexp . '(?:\s*,\s*(?:(?:\w+|' - . $this->_var_regexp . $this->_obj_restricted_param_regexp . ')))*)'; - $this->_obj_params_regexp = '\((?:' . $this->_obj_single_param_regexp - . '(?:\s*,\s*' . $this->_obj_single_param_regexp . ')*)?\)'; - $this->_obj_start_regexp = '(?:' . $this->_dvar_regexp . '(?:' . $this->_obj_ext_regexp . ')+)'; - $this->_obj_call_regexp = '(?:' . $this->_obj_start_regexp . '(?:' . $this->_obj_params_regexp . ')?(?:' . $this->_dvar_math_regexp . '(?:' . $this->_num_const_regexp . '|' . $this->_dvar_math_var_regexp . ')*)?)'; - - // matches valid modifier syntax: - // |foo - // |@foo - // |foo:"bar" - // |foo:$bar - // |foo:"bar":$foobar - // |foo|bar - // |foo:$foo->bar - $this->_mod_regexp = '(?:\|@?\w+(?::(?:\w+|' . $this->_num_const_regexp . '|' - . $this->_obj_call_regexp . '|' . $this->_avar_regexp . '|' . $this->_qstr_regexp .'))*)'; - - // matches valid function name: - // foo123 - // _foo_bar - $this->_func_regexp = '[a-zA-Z_]\w*'; - - // matches valid registered object: - // foo->bar - $this->_reg_obj_regexp = '[a-zA-Z_]\w*->[a-zA-Z_]\w*'; - - // matches valid parameter values: - // true - // $foo - // $foo|bar - // #foo# - // #foo#|bar - // "text" - // "text"|bar - // $foo->bar - $this->_param_regexp = '(?:\s*(?:' . $this->_obj_call_regexp . '|' - . $this->_var_regexp . '|' . $this->_num_const_regexp . '|\w+)(?>' . $this->_mod_regexp . '*)\s*)'; - - // matches valid parenthesised function parameters: - // - // "text" - // $foo, $bar, "text" - // $foo|bar, "foo"|bar, $foo->bar($foo)|bar - $this->_parenth_param_regexp = '(?:\((?:\w+|' - . $this->_param_regexp . '(?:\s*,\s*(?:(?:\w+|' - . $this->_param_regexp . ')))*)?\))'; - - // matches valid function call: - // foo() - // foo_bar($foo) - // _foo_bar($foo,"bar") - // foo123($foo,$foo->bar(),"foo") - $this->_func_call_regexp = '(?:' . $this->_func_regexp . '\s*(?:' - . $this->_parenth_param_regexp . '))'; - } - - /** - * compile a resource - * - * sets $compiled_content to the compiled source - * @param string $resource_name - * @param string $source_content - * @param string $compiled_content - * @return true - */ - function _compile_file($resource_name, $source_content, &$compiled_content) - { - - if ($this->security) { - // do not allow php syntax to be executed unless specified - if ($this->php_handling == SMARTY_PHP_ALLOW && - !$this->security_settings['PHP_HANDLING']) { - $this->php_handling = SMARTY_PHP_PASSTHRU; - } - } - - $this->_load_filters(); - - $this->_current_file = $resource_name; - $this->_current_line_no = 1; - $ldq = preg_quote($this->left_delimiter, '~'); - $rdq = preg_quote($this->right_delimiter, '~'); - - // run template source through prefilter functions - if (count($this->_plugins['prefilter']) > 0) { - foreach ($this->_plugins['prefilter'] as $filter_name => $prefilter) { - if ($prefilter === false) continue; - if ($prefilter[3] || is_callable($prefilter[0])) { - $source_content = call_user_func_array($prefilter[0], - array($source_content, &$this)); - $this->_plugins['prefilter'][$filter_name][3] = true; - } else { - $this->_trigger_fatal_error("[plugin] prefilter '$filter_name' is not implemented"); - } - } - } - - /* fetch all special blocks */ - $search = "~{$ldq}\*(.*?)\*{$rdq}|{$ldq}\s*literal\s*{$rdq}(.*?){$ldq}\s*/literal\s*{$rdq}|{$ldq}\s*php\s*{$rdq}(.*?){$ldq}\s*/php\s*{$rdq}~s"; - - preg_match_all($search, $source_content, $match, PREG_SET_ORDER); - $this->_folded_blocks = $match; - - /* replace special blocks by "{php}" */ - $source_content = preg_replace_callback($search, array($this,'_preg_callback') - , $source_content); - - /* Gather all template tags. */ - preg_match_all("~{$ldq}\s*(.*?)\s*{$rdq}~s", $source_content, $_match); - $template_tags = $_match[1]; - /* Split content by template tags to obtain non-template content. */ - $text_blocks = preg_split("~{$ldq}.*?{$rdq}~s", $source_content); - - /* loop through text blocks */ - for ($curr_tb = 0, $for_max = count($text_blocks); $curr_tb < $for_max; $curr_tb++) { - /* match anything resembling php tags */ - if (preg_match_all('~(<\?(?:\w+|=)?|\?>|language\s*=\s*[\"\']?\s*php\s*[\"\']?)~is', $text_blocks[$curr_tb], $sp_match)) { - /* replace tags with placeholders to prevent recursive replacements */ - $sp_match[1] = array_unique($sp_match[1]); - usort($sp_match[1], '_smarty_sort_length'); - for ($curr_sp = 0, $for_max2 = count($sp_match[1]); $curr_sp < $for_max2; $curr_sp++) { - $text_blocks[$curr_tb] = str_replace($sp_match[1][$curr_sp],'%%%SMARTYSP'.$curr_sp.'%%%',$text_blocks[$curr_tb]); - } - /* process each one */ - for ($curr_sp = 0, $for_max2 = count($sp_match[1]); $curr_sp < $for_max2; $curr_sp++) { - if ($this->php_handling == SMARTY_PHP_PASSTHRU) { - /* echo php contents */ - $text_blocks[$curr_tb] = str_replace('%%%SMARTYSP'.$curr_sp.'%%%', ''."\n", $text_blocks[$curr_tb]); - } else if ($this->php_handling == SMARTY_PHP_QUOTE) { - /* quote php tags */ - $text_blocks[$curr_tb] = str_replace('%%%SMARTYSP'.$curr_sp.'%%%', htmlspecialchars($sp_match[1][$curr_sp]), $text_blocks[$curr_tb]); - } else if ($this->php_handling == SMARTY_PHP_REMOVE) { - /* remove php tags */ - $text_blocks[$curr_tb] = str_replace('%%%SMARTYSP'.$curr_sp.'%%%', '', $text_blocks[$curr_tb]); - } else { - /* SMARTY_PHP_ALLOW, but echo non php starting tags */ - $sp_match[1][$curr_sp] = preg_replace('~(<\?(?!php|=|$))~i', ''."\n", $sp_match[1][$curr_sp]); - $text_blocks[$curr_tb] = str_replace('%%%SMARTYSP'.$curr_sp.'%%%', $sp_match[1][$curr_sp], $text_blocks[$curr_tb]); - } - } - } - } - - /* Compile the template tags into PHP code. */ - $compiled_tags = array(); - for ($i = 0, $for_max = count($template_tags); $i < $for_max; $i++) { - $this->_current_line_no += substr_count($text_blocks[$i], "\n"); - $compiled_tags[] = $this->_compile_tag($template_tags[$i]); - $this->_current_line_no += substr_count($template_tags[$i], "\n"); - } - if (count($this->_tag_stack)>0) { - list($_open_tag, $_line_no) = end($this->_tag_stack); - $this->_syntax_error("unclosed tag \{$_open_tag} (opened line $_line_no).", E_USER_ERROR, __FILE__, __LINE__); - return; - } - - /* Reformat $text_blocks between 'strip' and '/strip' tags, - removing spaces, tabs and newlines. */ - $strip = false; - for ($i = 0, $for_max = count($compiled_tags); $i < $for_max; $i++) { - if ($compiled_tags[$i] == '{strip}') { - $compiled_tags[$i] = ''; - $strip = true; - /* remove leading whitespaces */ - $text_blocks[$i + 1] = ltrim($text_blocks[$i + 1]); - } - if ($strip) { - /* strip all $text_blocks before the next '/strip' */ - for ($j = $i + 1; $j < $for_max; $j++) { - /* remove leading and trailing whitespaces of each line */ - $text_blocks[$j] = preg_replace('![\t ]*[\r\n]+[\t ]*!', '', $text_blocks[$j]); - if ($compiled_tags[$j] == '{/strip}') { - /* remove trailing whitespaces from the last text_block */ - $text_blocks[$j] = rtrim($text_blocks[$j]); - } - $text_blocks[$j] = ""\'", "\\"=>"\\\\")) . "'; ?>"; - if ($compiled_tags[$j] == '{/strip}') { - $compiled_tags[$j] = "\n"; /* slurped by php, but necessary - if a newline is following the closing strip-tag */ - $strip = false; - $i = $j; - break; - } - } - } - } - $compiled_content = ''; - - $tag_guard = '%%%SMARTYOTG' . md5(uniqid(rand(), true)) . '%%%'; - - /* Interleave the compiled contents and text blocks to get the final result. */ - for ($i = 0, $for_max = count($compiled_tags); $i < $for_max; $i++) { - if ($compiled_tags[$i] == '') { - // tag result empty, remove first newline from following text block - $text_blocks[$i+1] = preg_replace('~^(\r\n|\r|\n)~', '', $text_blocks[$i+1]); - } - // replace legit PHP tags with placeholder - $text_blocks[$i] = str_replace('\n", $compiled_content); - $compiled_content = preg_replace("~(?\n", $compiled_content); - - // recover legit tags - $compiled_content = str_replace($tag_guard, '_cache_serial)) { - $compiled_content = "_cache_serials['".$this->_cache_include."'] = '".$this->_cache_serial."'; ?>" . $compiled_content; - } - - // run compiled template through postfilter functions - if (count($this->_plugins['postfilter']) > 0) { - foreach ($this->_plugins['postfilter'] as $filter_name => $postfilter) { - if ($postfilter === false) continue; - if ($postfilter[3] || is_callable($postfilter[0])) { - $compiled_content = call_user_func_array($postfilter[0], - array($compiled_content, &$this)); - $this->_plugins['postfilter'][$filter_name][3] = true; - } else { - $this->_trigger_fatal_error("Smarty plugin error: postfilter '$filter_name' is not implemented"); - } - } - } - - // put header at the top of the compiled template - $template_header = "_version.", created on ".strftime("%Y-%m-%d %H:%M:%S")."\n"; - $template_header .= " compiled from ".strtr(urlencode($resource_name), array('%2F'=>'/', '%3A'=>':'))." */ ?>\n"; - - /* Emit code to load needed plugins. */ - $this->_plugins_code = ''; - if (count($this->_plugin_info)) { - $_plugins_params = "array('plugins' => array("; - foreach ($this->_plugin_info as $plugin_type => $plugins) { - foreach ($plugins as $plugin_name => $plugin_info) { - $_plugins_params .= "array('$plugin_type', '$plugin_name', '" . strtr($plugin_info[0], array("'" => "\\'", "\\" => "\\\\")) . "', $plugin_info[1], "; - $_plugins_params .= $plugin_info[2] ? 'true),' : 'false),'; - } - } - $_plugins_params .= '))'; - $plugins_code = "\n"; - $template_header .= $plugins_code; - $this->_plugin_info = array(); - $this->_plugins_code = $plugins_code; - } - - if ($this->_init_smarty_vars) { - $template_header .= "\n"; - $this->_init_smarty_vars = false; - } - - $compiled_content = $template_header . $compiled_content; - return true; - } - - /** - * Compile a template tag - * - * @param string $template_tag - * @return string - */ - function _compile_tag($template_tag) - { - /* Matched comment. */ - if (substr($template_tag, 0, 1) == '*' && substr($template_tag, -1) == '*') - return ''; - - /* Split tag into two three parts: command, command modifiers and the arguments. */ - if(! preg_match('~^(?:(' . $this->_num_const_regexp . '|' . $this->_obj_call_regexp . '|' . $this->_var_regexp - . '|\/?' . $this->_reg_obj_regexp . '|\/?' . $this->_func_regexp . ')(' . $this->_mod_regexp . '*)) - (?:\s+(.*))?$ - ~xs', $template_tag, $match)) { - $this->_syntax_error("unrecognized tag: $template_tag", E_USER_ERROR, __FILE__, __LINE__); - } - - $tag_command = $match[1]; - $tag_modifier = isset($match[2]) ? $match[2] : null; - $tag_args = isset($match[3]) ? $match[3] : null; - - if (preg_match('~^' . $this->_num_const_regexp . '|' . $this->_obj_call_regexp . '|' . $this->_var_regexp . '$~', $tag_command)) { - /* tag name is a variable or object */ - $_return = $this->_parse_var_props($tag_command . $tag_modifier); - return "" . $this->_additional_newline; - } - - /* If the tag name is a registered object, we process it. */ - if (preg_match('~^\/?' . $this->_reg_obj_regexp . '$~', $tag_command)) { - return $this->_compile_registered_object_tag($tag_command, $this->_parse_attrs($tag_args), $tag_modifier); - } - - switch ($tag_command) { - case 'include': - return $this->_compile_include_tag($tag_args); - - case 'include_php': - return $this->_compile_include_php_tag($tag_args); - - case 'if': - $this->_push_tag('if'); - return $this->_compile_if_tag($tag_args); - - case 'else': - list($_open_tag) = end($this->_tag_stack); - if ($_open_tag != 'if' && $_open_tag != 'elseif') - $this->_syntax_error('unexpected {else}', E_USER_ERROR, __FILE__, __LINE__); - else - $this->_push_tag('else'); - return ''; - - case 'elseif': - list($_open_tag) = end($this->_tag_stack); - if ($_open_tag != 'if' && $_open_tag != 'elseif') - $this->_syntax_error('unexpected {elseif}', E_USER_ERROR, __FILE__, __LINE__); - if ($_open_tag == 'if') - $this->_push_tag('elseif'); - return $this->_compile_if_tag($tag_args, true); - - case '/if': - $this->_pop_tag('if'); - return ''; - - case 'capture': - return $this->_compile_capture_tag(true, $tag_args); - - case '/capture': - return $this->_compile_capture_tag(false); - - case 'ldelim': - return $this->left_delimiter; - - case 'rdelim': - return $this->right_delimiter; - - case 'section': - $this->_push_tag('section'); - return $this->_compile_section_start($tag_args); - - case 'sectionelse': - $this->_push_tag('sectionelse'); - return ""; - break; - - case '/section': - $_open_tag = $this->_pop_tag('section'); - if ($_open_tag == 'sectionelse') - return ""; - else - return ""; - - case 'foreach': - $this->_push_tag('foreach'); - return $this->_compile_foreach_start($tag_args); - break; - - case 'foreachelse': - $this->_push_tag('foreachelse'); - return ""; - - case '/foreach': - $_open_tag = $this->_pop_tag('foreach'); - if ($_open_tag == 'foreachelse') - return ""; - else - return ""; - break; - - case 'strip': - case '/strip': - if (substr($tag_command, 0, 1)=='/') { - $this->_pop_tag('strip'); - if (--$this->_strip_depth==0) { /* outermost closing {/strip} */ - $this->_additional_newline = "\n"; - return '{' . $tag_command . '}'; - } - } else { - $this->_push_tag('strip'); - if ($this->_strip_depth++==0) { /* outermost opening {strip} */ - $this->_additional_newline = ""; - return '{' . $tag_command . '}'; - } - } - return ''; - - case 'php': - /* handle folded tags replaced by {php} */ - $block = array_shift($this->_folded_blocks); - $this->_current_line_no += substr_count($block[0], "\n"); - /* the number of matched elements in the regexp in _compile_file() - determins the type of folded tag that was found */ - switch (count($block)) { - case 2: /* comment */ - return ''; - - case 3: /* literal */ - return ""\'", "\\"=>"\\\\")) . "'; ?>" . $this->_additional_newline; - - case 4: /* php */ - if ($this->security && !$this->security_settings['PHP_TAGS']) { - $this->_syntax_error("(secure mode) php tags not permitted", E_USER_WARNING, __FILE__, __LINE__); - return; - } - return ''; - } - break; - - case 'insert': - return $this->_compile_insert_tag($tag_args); - - default: - if ($this->_compile_compiler_tag($tag_command, $tag_args, $output)) { - return $output; - } else if ($this->_compile_block_tag($tag_command, $tag_args, $tag_modifier, $output)) { - return $output; - } else if ($this->_compile_custom_tag($tag_command, $tag_args, $tag_modifier, $output)) { - return $output; - } else { - $this->_syntax_error("unrecognized tag '$tag_command'", E_USER_ERROR, __FILE__, __LINE__); - } - - } - } - - - /** - * compile the custom compiler tag - * - * sets $output to the compiled custom compiler tag - * @param string $tag_command - * @param string $tag_args - * @param string $output - * @return boolean - */ - function _compile_compiler_tag($tag_command, $tag_args, &$output) - { - $found = false; - $have_function = true; - - /* - * First we check if the compiler function has already been registered - * or loaded from a plugin file. - */ - if (isset($this->_plugins['compiler'][$tag_command])) { - $found = true; - $plugin_func = $this->_plugins['compiler'][$tag_command][0]; - if (!is_callable($plugin_func)) { - $message = "compiler function '$tag_command' is not implemented"; - $have_function = false; - } - } - /* - * Otherwise we need to load plugin file and look for the function - * inside it. - */ - else if ($plugin_file = $this->_get_plugin_filepath('compiler', $tag_command)) { - $found = true; - - include_once $plugin_file; - - $plugin_func = 'smarty_compiler_' . $tag_command; - if (!is_callable($plugin_func)) { - $message = "plugin function $plugin_func() not found in $plugin_file\n"; - $have_function = false; - } else { - $this->_plugins['compiler'][$tag_command] = array($plugin_func, null, null, null, true); - } - } - - /* - * True return value means that we either found a plugin or a - * dynamically registered function. False means that we didn't and the - * compiler should now emit code to load custom function plugin for this - * tag. - */ - if ($found) { - if ($have_function) { - $output = call_user_func_array($plugin_func, array($tag_args, &$this)); - if($output != '') { - $output = '_push_cacheable_state('compiler', $tag_command) - . $output - . $this->_pop_cacheable_state('compiler', $tag_command) . ' ?>'; - } - } else { - $this->_syntax_error($message, E_USER_WARNING, __FILE__, __LINE__); - } - return true; - } else { - return false; - } - } - - - /** - * compile block function tag - * - * sets $output to compiled block function tag - * @param string $tag_command - * @param string $tag_args - * @param string $tag_modifier - * @param string $output - * @return boolean - */ - function _compile_block_tag($tag_command, $tag_args, $tag_modifier, &$output) - { - if (substr($tag_command, 0, 1) == '/') { - $start_tag = false; - $tag_command = substr($tag_command, 1); - } else - $start_tag = true; - - $found = false; - $have_function = true; - - /* - * First we check if the block function has already been registered - * or loaded from a plugin file. - */ - if (isset($this->_plugins['block'][$tag_command])) { - $found = true; - $plugin_func = $this->_plugins['block'][$tag_command][0]; - if (!is_callable($plugin_func)) { - $message = "block function '$tag_command' is not implemented"; - $have_function = false; - } - } - /* - * Otherwise we need to load plugin file and look for the function - * inside it. - */ - else if ($plugin_file = $this->_get_plugin_filepath('block', $tag_command)) { - $found = true; - - include_once $plugin_file; - - $plugin_func = 'smarty_block_' . $tag_command; - if (!function_exists($plugin_func)) { - $message = "plugin function $plugin_func() not found in $plugin_file\n"; - $have_function = false; - } else { - $this->_plugins['block'][$tag_command] = array($plugin_func, null, null, null, true); - - } - } - - if (!$found) { - return false; - } else if (!$have_function) { - $this->_syntax_error($message, E_USER_WARNING, __FILE__, __LINE__); - return true; - } - - /* - * Even though we've located the plugin function, compilation - * happens only once, so the plugin will still need to be loaded - * at runtime for future requests. - */ - $this->_add_plugin('block', $tag_command); - - if ($start_tag) - $this->_push_tag($tag_command); - else - $this->_pop_tag($tag_command); - - if ($start_tag) { - $output = '_push_cacheable_state('block', $tag_command); - $attrs = $this->_parse_attrs($tag_args); - $_cache_attrs=''; - $arg_list = $this->_compile_arg_list('block', $tag_command, $attrs, $_cache_attrs); - $output .= "$_cache_attrs\$this->_tag_stack[] = array('$tag_command', array(".implode(',', $arg_list).')); '; - $output .= '$_block_repeat=true;' . $this->_compile_plugin_call('block', $tag_command).'($this->_tag_stack[count($this->_tag_stack)-1][1], null, $this, $_block_repeat);'; - $output .= 'while ($_block_repeat) { ob_start(); ?>'; - } else { - $output = '_compile_plugin_call('block', $tag_command).'($this->_tag_stack[count($this->_tag_stack)-1][1], $_block_content, $this, $_block_repeat)'; - if ($tag_modifier != '') { - $this->_parse_modifiers($_out_tag_text, $tag_modifier); - } - $output .= '$_block_repeat=false;echo ' . $_out_tag_text . '; } '; - $output .= " array_pop(\$this->_tag_stack); " . $this->_pop_cacheable_state('block', $tag_command) . '?>'; - } - - return true; - } - - function _preg_callback ($matches) { - return $this->_quote_replace($this->left_delimiter) - . 'php' - . str_repeat("\n", substr_count($matches[1], "\n")) - . $this->_quote_replace($this->right_delimiter); - } - /** - * compile custom function tag - * - * @param string $tag_command - * @param string $tag_args - * @param string $tag_modifier - * @return string - */ - function _compile_custom_tag($tag_command, $tag_args, $tag_modifier, &$output) - { - $found = false; - $have_function = true; - - /* - * First we check if the custom function has already been registered - * or loaded from a plugin file. - */ - if (isset($this->_plugins['function'][$tag_command])) { - $found = true; - $plugin_func = $this->_plugins['function'][$tag_command][0]; - if (!is_callable($plugin_func)) { - $message = "custom function '$tag_command' is not implemented"; - $have_function = false; - } - } - /* - * Otherwise we need to load plugin file and look for the function - * inside it. - */ - else if ($plugin_file = $this->_get_plugin_filepath('function', $tag_command)) { - $found = true; - - include_once $plugin_file; - - $plugin_func = 'smarty_function_' . $tag_command; - if (!function_exists($plugin_func)) { - $message = "plugin function $plugin_func() not found in $plugin_file\n"; - $have_function = false; - } else { - $this->_plugins['function'][$tag_command] = array($plugin_func, null, null, null, true); - - } - } - - if (!$found) { - return false; - } else if (!$have_function) { - $this->_syntax_error($message, E_USER_WARNING, __FILE__, __LINE__); - return true; - } - - /* declare plugin to be loaded on display of the template that - we compile right now */ - $this->_add_plugin('function', $tag_command); - - $_cacheable_state = $this->_push_cacheable_state('function', $tag_command); - $attrs = $this->_parse_attrs($tag_args); - $_cache_attrs = ''; - $arg_list = $this->_compile_arg_list('function', $tag_command, $attrs, $_cache_attrs); - - $output = $this->_compile_plugin_call('function', $tag_command).'(array('.implode(',', $arg_list)."), \$this)"; - if($tag_modifier != '') { - $this->_parse_modifiers($output, $tag_modifier); - } - - if($output != '') { - $output = '_pop_cacheable_state('function', $tag_command) . "?>" . $this->_additional_newline; - } - - return true; - } - - /** - * compile a registered object tag - * - * @param string $tag_command - * @param array $attrs - * @param string $tag_modifier - * @return string - */ - function _compile_registered_object_tag($tag_command, $attrs, $tag_modifier) - { - if (substr($tag_command, 0, 1) == '/') { - $start_tag = false; - $tag_command = substr($tag_command, 1); - } else { - $start_tag = true; - } - - list($object, $obj_comp) = explode('->', $tag_command); - - $arg_list = array(); - if(count($attrs)) { - $_assign_var = false; - foreach ($attrs as $arg_name => $arg_value) { - if($arg_name == 'assign') { - $_assign_var = $arg_value; - unset($attrs['assign']); - continue; - } - if (is_bool($arg_value)) - $arg_value = $arg_value ? 'true' : 'false'; - $arg_list[] = "'$arg_name' => $arg_value"; - } - } - - if($this->_reg_objects[$object][2]) { - // smarty object argument format - $args = "array(".implode(',', (array)$arg_list)."), \$this"; - } else { - // traditional argument format - $args = implode(',', array_values($attrs)); - if (empty($args)) { - $args = ''; - } - } - - $prefix = ''; - $postfix = ''; - $newline = ''; - if(!is_object($this->_reg_objects[$object][0])) { - $this->_trigger_fatal_error("registered '$object' is not an object" , $this->_current_file, $this->_current_line_no, __FILE__, __LINE__); - } elseif(!empty($this->_reg_objects[$object][1]) && !in_array($obj_comp, $this->_reg_objects[$object][1])) { - $this->_trigger_fatal_error("'$obj_comp' is not a registered component of object '$object'", $this->_current_file, $this->_current_line_no, __FILE__, __LINE__); - } elseif(method_exists($this->_reg_objects[$object][0], $obj_comp)) { - // method - if(in_array($obj_comp, $this->_reg_objects[$object][3])) { - // block method - if ($start_tag) { - $prefix = "\$this->_tag_stack[] = array('$obj_comp', $args); "; - $prefix .= "\$_block_repeat=true; \$this->_reg_objects['$object'][0]->$obj_comp(\$this->_tag_stack[count(\$this->_tag_stack)-1][1], null, \$this, \$_block_repeat); "; - $prefix .= "while (\$_block_repeat) { ob_start();"; - $return = null; - $postfix = ''; - } else { - $prefix = "\$_obj_block_content = ob_get_contents(); ob_end_clean(); \$_block_repeat=false;"; - $return = "\$this->_reg_objects['$object'][0]->$obj_comp(\$this->_tag_stack[count(\$this->_tag_stack)-1][1], \$_obj_block_content, \$this, \$_block_repeat)"; - $postfix = "} array_pop(\$this->_tag_stack);"; - } - } else { - // non-block method - $return = "\$this->_reg_objects['$object'][0]->$obj_comp($args)"; - } - } else { - // property - $return = "\$this->_reg_objects['$object'][0]->$obj_comp"; - } - - if($return != null) { - if($tag_modifier != '') { - $this->_parse_modifiers($return, $tag_modifier); - } - - if(!empty($_assign_var)) { - $output = "\$this->assign('" . $this->_dequote($_assign_var) ."', $return);"; - } else { - $output = 'echo ' . $return . ';'; - $newline = $this->_additional_newline; - } - } else { - $output = ''; - } - - return '" . $newline; - } - - /** - * Compile {insert ...} tag - * - * @param string $tag_args - * @return string - */ - function _compile_insert_tag($tag_args) - { - $attrs = $this->_parse_attrs($tag_args); - $name = $this->_dequote($attrs['name']); - - if (empty($name)) { - return $this->_syntax_error("missing insert name", E_USER_ERROR, __FILE__, __LINE__); - } - - if (!preg_match('~^\w+$~', $name)) { - return $this->_syntax_error("'insert: 'name' must be an insert function name", E_USER_ERROR, __FILE__, __LINE__); - } - - if (!empty($attrs['script'])) { - $delayed_loading = true; - } else { - $delayed_loading = false; - } - - foreach ($attrs as $arg_name => $arg_value) { - if (is_bool($arg_value)) - $arg_value = $arg_value ? 'true' : 'false'; - $arg_list[] = "'$arg_name' => $arg_value"; - } - - $this->_add_plugin('insert', $name, $delayed_loading); - - $_params = "array('args' => array(".implode(', ', (array)$arg_list)."))"; - - return "" . $this->_additional_newline; - } - - /** - * Compile {include ...} tag - * - * @param string $tag_args - * @return string - */ - function _compile_include_tag($tag_args) - { - $attrs = $this->_parse_attrs($tag_args); - $arg_list = array(); - - if (empty($attrs['file'])) { - $this->_syntax_error("missing 'file' attribute in include tag", E_USER_ERROR, __FILE__, __LINE__); - } - - foreach ($attrs as $arg_name => $arg_value) { - if ($arg_name == 'file') { - $include_file = $arg_value; - continue; - } else if ($arg_name == 'assign') { - $assign_var = $arg_value; - continue; - } - if (is_bool($arg_value)) - $arg_value = $arg_value ? 'true' : 'false'; - $arg_list[] = "'$arg_name' => $arg_value"; - } - - $output = '_tpl_vars;\n"; - - - $_params = "array('smarty_include_tpl_file' => " . $include_file . ", 'smarty_include_vars' => array(".implode(',', (array)$arg_list)."))"; - $output .= "\$this->_smarty_include($_params);\n" . - "\$this->_tpl_vars = \$_smarty_tpl_vars;\n" . - "unset(\$_smarty_tpl_vars);\n"; - - if (isset($assign_var)) { - $output .= "\$this->assign(" . $assign_var . ", ob_get_contents()); ob_end_clean();\n"; - } - - $output .= ' ?>'; - - return $output; - - } - - /** - * Compile {include ...} tag - * - * @param string $tag_args - * @return string - */ - function _compile_include_php_tag($tag_args) - { - $attrs = $this->_parse_attrs($tag_args); - - if (empty($attrs['file'])) { - $this->_syntax_error("missing 'file' attribute in include_php tag", E_USER_ERROR, __FILE__, __LINE__); - } - - $assign_var = (empty($attrs['assign'])) ? '' : $this->_dequote($attrs['assign']); - $once_var = (empty($attrs['once']) || $attrs['once']=='false') ? 'false' : 'true'; - - $arg_list = array(); - foreach($attrs as $arg_name => $arg_value) { - if($arg_name != 'file' AND $arg_name != 'once' AND $arg_name != 'assign') { - if(is_bool($arg_value)) - $arg_value = $arg_value ? 'true' : 'false'; - $arg_list[] = "'$arg_name' => $arg_value"; - } - } - - $_params = "array('smarty_file' => " . $attrs['file'] . ", 'smarty_assign' => '$assign_var', 'smarty_once' => $once_var, 'smarty_include_vars' => array(".implode(',', $arg_list)."))"; - - return "" . $this->_additional_newline; - } - - - /** - * Compile {section ...} tag - * - * @param string $tag_args - * @return string - */ - function _compile_section_start($tag_args) - { - $attrs = $this->_parse_attrs($tag_args); - $arg_list = array(); - - $output = '_syntax_error("missing section name", E_USER_ERROR, __FILE__, __LINE__); - } - - $output .= "unset(\$this->_sections[$section_name]);\n"; - $section_props = "\$this->_sections[$section_name]"; - - foreach ($attrs as $attr_name => $attr_value) { - switch ($attr_name) { - case 'loop': - $output .= "{$section_props}['loop'] = is_array(\$_loop=$attr_value) ? count(\$_loop) : max(0, (int)\$_loop); unset(\$_loop);\n"; - break; - - case 'show': - if (is_bool($attr_value)) - $show_attr_value = $attr_value ? 'true' : 'false'; - else - $show_attr_value = "(bool)$attr_value"; - $output .= "{$section_props}['show'] = $show_attr_value;\n"; - break; - - case 'name': - $output .= "{$section_props}['$attr_name'] = $attr_value;\n"; - break; - - case 'max': - case 'start': - $output .= "{$section_props}['$attr_name'] = (int)$attr_value;\n"; - break; - - case 'step': - $output .= "{$section_props}['$attr_name'] = ((int)$attr_value) == 0 ? 1 : (int)$attr_value;\n"; - break; - - default: - $this->_syntax_error("unknown section attribute - '$attr_name'", E_USER_ERROR, __FILE__, __LINE__); - break; - } - } - - if (!isset($attrs['show'])) - $output .= "{$section_props}['show'] = true;\n"; - - if (!isset($attrs['loop'])) - $output .= "{$section_props}['loop'] = 1;\n"; - - if (!isset($attrs['max'])) - $output .= "{$section_props}['max'] = {$section_props}['loop'];\n"; - else - $output .= "if ({$section_props}['max'] < 0)\n" . - " {$section_props}['max'] = {$section_props}['loop'];\n"; - - if (!isset($attrs['step'])) - $output .= "{$section_props}['step'] = 1;\n"; - - if (!isset($attrs['start'])) - $output .= "{$section_props}['start'] = {$section_props}['step'] > 0 ? 0 : {$section_props}['loop']-1;\n"; - else { - $output .= "if ({$section_props}['start'] < 0)\n" . - " {$section_props}['start'] = max({$section_props}['step'] > 0 ? 0 : -1, {$section_props}['loop'] + {$section_props}['start']);\n" . - "else\n" . - " {$section_props}['start'] = min({$section_props}['start'], {$section_props}['step'] > 0 ? {$section_props}['loop'] : {$section_props}['loop']-1);\n"; - } - - $output .= "if ({$section_props}['show']) {\n"; - if (!isset($attrs['start']) && !isset($attrs['step']) && !isset($attrs['max'])) { - $output .= " {$section_props}['total'] = {$section_props}['loop'];\n"; - } else { - $output .= " {$section_props}['total'] = min(ceil(({$section_props}['step'] > 0 ? {$section_props}['loop'] - {$section_props}['start'] : {$section_props}['start']+1)/abs({$section_props}['step'])), {$section_props}['max']);\n"; - } - $output .= " if ({$section_props}['total'] == 0)\n" . - " {$section_props}['show'] = false;\n" . - "} else\n" . - " {$section_props}['total'] = 0;\n"; - - $output .= "if ({$section_props}['show']):\n"; - $output .= " - for ({$section_props}['index'] = {$section_props}['start'], {$section_props}['iteration'] = 1; - {$section_props}['iteration'] <= {$section_props}['total']; - {$section_props}['index'] += {$section_props}['step'], {$section_props}['iteration']++):\n"; - $output .= "{$section_props}['rownum'] = {$section_props}['iteration'];\n"; - $output .= "{$section_props}['index_prev'] = {$section_props}['index'] - {$section_props}['step'];\n"; - $output .= "{$section_props}['index_next'] = {$section_props}['index'] + {$section_props}['step'];\n"; - $output .= "{$section_props}['first'] = ({$section_props}['iteration'] == 1);\n"; - $output .= "{$section_props}['last'] = ({$section_props}['iteration'] == {$section_props}['total']);\n"; - - $output .= "?>"; - - return $output; - } - - - /** - * Compile {foreach ...} tag. - * - * @param string $tag_args - * @return string - */ - function _compile_foreach_start($tag_args) - { - $attrs = $this->_parse_attrs($tag_args); - $arg_list = array(); - - if (empty($attrs['from'])) { - return $this->_syntax_error("foreach: missing 'from' attribute", E_USER_ERROR, __FILE__, __LINE__); - } - $from = $attrs['from']; - - if (empty($attrs['item'])) { - return $this->_syntax_error("foreach: missing 'item' attribute", E_USER_ERROR, __FILE__, __LINE__); - } - $item = $this->_dequote($attrs['item']); - if (!preg_match('~^\w+$~', $item)) { - return $this->_syntax_error("foreach: 'item' must be a variable name (literal string)", E_USER_ERROR, __FILE__, __LINE__); - } - - if (isset($attrs['key'])) { - $key = $this->_dequote($attrs['key']); - if (!preg_match('~^\w+$~', $key)) { - return $this->_syntax_error("foreach: 'key' must to be a variable name (literal string)", E_USER_ERROR, __FILE__, __LINE__); - } - $key_part = "\$this->_tpl_vars['$key'] => "; - } else { - $key = null; - $key_part = ''; - } - - if (isset($attrs['name'])) { - $name = $attrs['name']; - } else { - $name = null; - } - - $output = '_foreach[$name]"; - $output .= "{$foreach_props} = array('total' => count(\$_from), 'iteration' => 0);\n"; - $output .= "if ({$foreach_props}['total'] > 0):\n"; - $output .= " foreach (\$_from as $key_part\$this->_tpl_vars['$item']):\n"; - $output .= " {$foreach_props}['iteration']++;\n"; - } else { - $output .= "if (count(\$_from)):\n"; - $output .= " foreach (\$_from as $key_part\$this->_tpl_vars['$item']):\n"; - } - $output .= '?>'; - - return $output; - } - - - /** - * Compile {capture} .. {/capture} tags - * - * @param boolean $start true if this is the {capture} tag - * @param string $tag_args - * @return string - */ - - function _compile_capture_tag($start, $tag_args = '') - { - $attrs = $this->_parse_attrs($tag_args); - - if ($start) { - $buffer = isset($attrs['name']) ? $attrs['name'] : "'default'"; - $assign = isset($attrs['assign']) ? $attrs['assign'] : null; - $append = isset($attrs['append']) ? $attrs['append'] : null; - - $output = ""; - $this->_capture_stack[] = array($buffer, $assign, $append); - } else { - list($buffer, $assign, $append) = array_pop($this->_capture_stack); - $output = "_smarty_vars['capture'][$buffer] = ob_get_contents(); "; - if (isset($assign)) { - $output .= " \$this->assign($assign, ob_get_contents());"; - } - if (isset($append)) { - $output .= " \$this->append($append, ob_get_contents());"; - } - $output .= "ob_end_clean(); ?>"; - } - - return $output; - } - - /** - * Compile {if ...} tag - * - * @param string $tag_args - * @param boolean $elseif if true, uses elseif instead of if - * @return string - */ - function _compile_if_tag($tag_args, $elseif = false) - { - - /* Tokenize args for 'if' tag. */ - preg_match_all('~(?> - ' . $this->_obj_call_regexp . '(?:' . $this->_mod_regexp . '*)? | # valid object call - ' . $this->_var_regexp . '(?:' . $this->_mod_regexp . '*)? | # var or quoted string - \-?0[xX][0-9a-fA-F]+|\-?\d+(?:\.\d+)?|\.\d+|!==|===|==|!=|<>|<<|>>|<=|>=|\&\&|\|\||\(|\)|,|\!|\^|=|\&|\~|<|>|\||\%|\+|\-|\/|\*|\@ | # valid non-word token - \b\w+\b | # valid word token - \S+ # anything else - )~x', $tag_args, $match); - - $tokens = $match[0]; - - if(empty($tokens)) { - $_error_msg = $elseif ? "'elseif'" : "'if'"; - $_error_msg .= ' statement requires arguments'; - $this->_syntax_error($_error_msg, E_USER_ERROR, __FILE__, __LINE__); - } - - - // make sure we have balanced parenthesis - $token_count = array_count_values($tokens); - if(isset($token_count['(']) && $token_count['('] != $token_count[')']) { - $this->_syntax_error("unbalanced parenthesis in if statement", E_USER_ERROR, __FILE__, __LINE__); - } - - $is_arg_stack = array(); - - for ($i = 0; $i < count($tokens); $i++) { - - $token = &$tokens[$i]; - - switch (strtolower($token)) { - case '!': - case '%': - case '!==': - case '==': - case '===': - case '>': - case '<': - case '!=': - case '<>': - case '<<': - case '>>': - case '<=': - case '>=': - case '&&': - case '||': - case '|': - case '^': - case '&': - case '~': - case ')': - case ',': - case '+': - case '-': - case '*': - case '/': - case '@': - break; - - case 'eq': - $token = '=='; - break; - - case 'ne': - case 'neq': - $token = '!='; - break; - - case 'lt': - $token = '<'; - break; - - case 'le': - case 'lte': - $token = '<='; - break; - - case 'gt': - $token = '>'; - break; - - case 'ge': - case 'gte': - $token = '>='; - break; - - case 'and': - $token = '&&'; - break; - - case 'or': - $token = '||'; - break; - - case 'not': - $token = '!'; - break; - - case 'mod': - $token = '%'; - break; - - case '(': - array_push($is_arg_stack, $i); - break; - - case 'is': - /* If last token was a ')', we operate on the parenthesized - expression. The start of the expression is on the stack. - Otherwise, we operate on the last encountered token. */ - if ($tokens[$i-1] == ')') { - $is_arg_start = array_pop($is_arg_stack); - if ($is_arg_start != 0) { - if (preg_match('~^' . $this->_func_regexp . '$~', $tokens[$is_arg_start-1])) { - $is_arg_start--; - } - } - } else - $is_arg_start = $i-1; - /* Construct the argument for 'is' expression, so it knows - what to operate on. */ - $is_arg = implode(' ', array_slice($tokens, $is_arg_start, $i - $is_arg_start)); - - /* Pass all tokens from next one until the end to the - 'is' expression parsing function. The function will - return modified tokens, where the first one is the result - of the 'is' expression and the rest are the tokens it - didn't touch. */ - $new_tokens = $this->_parse_is_expr($is_arg, array_slice($tokens, $i+1)); - - /* Replace the old tokens with the new ones. */ - array_splice($tokens, $is_arg_start, count($tokens), $new_tokens); - - /* Adjust argument start so that it won't change from the - current position for the next iteration. */ - $i = $is_arg_start; - break; - - default: - if(preg_match('~^' . $this->_func_regexp . '$~', $token) ) { - // function call - if($this->security && - !in_array($token, $this->security_settings['IF_FUNCS'])) { - $this->_syntax_error("(secure mode) '$token' not allowed in if statement", E_USER_ERROR, __FILE__, __LINE__); - } - } elseif(preg_match('~^' . $this->_var_regexp . '$~', $token) && (strpos('+-*/^%&|', substr($token, -1)) === false) && isset($tokens[$i+1]) && $tokens[$i+1] == '(') { - // variable function call - $this->_syntax_error("variable function call '$token' not allowed in if statement", E_USER_ERROR, __FILE__, __LINE__); - } elseif(preg_match('~^' . $this->_obj_call_regexp . '|' . $this->_var_regexp . '(?:' . $this->_mod_regexp . '*)$~', $token)) { - // object or variable - $token = $this->_parse_var_props($token); - } elseif(is_numeric($token)) { - // number, skip it - } else { - $this->_syntax_error("unidentified token '$token'", E_USER_ERROR, __FILE__, __LINE__); - } - break; - } - } - - if ($elseif) - return ''; - else - return ''; - } - - - function _compile_arg_list($type, $name, $attrs, &$cache_code) { - $arg_list = array(); - - if (isset($type) && isset($name) - && isset($this->_plugins[$type]) - && isset($this->_plugins[$type][$name]) - && empty($this->_plugins[$type][$name][4]) - && is_array($this->_plugins[$type][$name][5]) - ) { - /* we have a list of parameters that should be cached */ - $_cache_attrs = $this->_plugins[$type][$name][5]; - $_count = $this->_cache_attrs_count++; - $cache_code = "\$_cache_attrs =& \$this->_smarty_cache_attrs('$this->_cache_serial','$_count');"; - - } else { - /* no parameters are cached */ - $_cache_attrs = null; - } - - foreach ($attrs as $arg_name => $arg_value) { - if (is_bool($arg_value)) - $arg_value = $arg_value ? 'true' : 'false'; - if (is_null($arg_value)) - $arg_value = 'null'; - if ($_cache_attrs && in_array($arg_name, $_cache_attrs)) { - $arg_list[] = "'$arg_name' => (\$this->_cache_including) ? \$_cache_attrs['$arg_name'] : (\$_cache_attrs['$arg_name']=$arg_value)"; - } else { - $arg_list[] = "'$arg_name' => $arg_value"; - } - } - return $arg_list; - } - - /** - * Parse is expression - * - * @param string $is_arg - * @param array $tokens - * @return array - */ - function _parse_is_expr($is_arg, $tokens) - { - $expr_end = 0; - $negate_expr = false; - - if (($first_token = array_shift($tokens)) == 'not') { - $negate_expr = true; - $expr_type = array_shift($tokens); - } else - $expr_type = $first_token; - - switch ($expr_type) { - case 'even': - if (isset($tokens[$expr_end]) && $tokens[$expr_end] == 'by') { - $expr_end++; - $expr_arg = $tokens[$expr_end++]; - $expr = "!(1 & ($is_arg / " . $this->_parse_var_props($expr_arg) . "))"; - } else - $expr = "!(1 & $is_arg)"; - break; - - case 'odd': - if (isset($tokens[$expr_end]) && $tokens[$expr_end] == 'by') { - $expr_end++; - $expr_arg = $tokens[$expr_end++]; - $expr = "(1 & ($is_arg / " . $this->_parse_var_props($expr_arg) . "))"; - } else - $expr = "(1 & $is_arg)"; - break; - - case 'div': - if (@$tokens[$expr_end] == 'by') { - $expr_end++; - $expr_arg = $tokens[$expr_end++]; - $expr = "!($is_arg % " . $this->_parse_var_props($expr_arg) . ")"; - } else { - $this->_syntax_error("expecting 'by' after 'div'", E_USER_ERROR, __FILE__, __LINE__); - } - break; - - default: - $this->_syntax_error("unknown 'is' expression - '$expr_type'", E_USER_ERROR, __FILE__, __LINE__); - break; - } - - if ($negate_expr) { - $expr = "!($expr)"; - } - - array_splice($tokens, 0, $expr_end, $expr); - - return $tokens; - } - - - /** - * Parse attribute string - * - * @param string $tag_args - * @return array - */ - function _parse_attrs($tag_args) - { - - /* Tokenize tag attributes. */ - preg_match_all('~(?:' . $this->_obj_call_regexp . '|' . $this->_qstr_regexp . ' | (?>[^"\'=\s]+) - )+ | - [=] - ~x', $tag_args, $match); - $tokens = $match[0]; - - $attrs = array(); - /* Parse state: - 0 - expecting attribute name - 1 - expecting '=' - 2 - expecting attribute value (not '=') */ - $state = 0; - - foreach ($tokens as $token) { - switch ($state) { - case 0: - /* If the token is a valid identifier, we set attribute name - and go to state 1. */ - if (preg_match('~^\w+$~', $token)) { - $attr_name = $token; - $state = 1; - } else - $this->_syntax_error("invalid attribute name: '$token'", E_USER_ERROR, __FILE__, __LINE__); - break; - - case 1: - /* If the token is '=', then we go to state 2. */ - if ($token == '=') { - $state = 2; - } else - $this->_syntax_error("expecting '=' after attribute name '$last_token'", E_USER_ERROR, __FILE__, __LINE__); - break; - - case 2: - /* If token is not '=', we set the attribute value and go to - state 0. */ - if ($token != '=') { - /* We booleanize the token if it's a non-quoted possible - boolean value. */ - if (preg_match('~^(on|yes|true)$~', $token)) { - $token = 'true'; - } else if (preg_match('~^(off|no|false)$~', $token)) { - $token = 'false'; - } else if ($token == 'null') { - $token = 'null'; - } else if (preg_match('~^' . $this->_num_const_regexp . '|0[xX][0-9a-fA-F]+$~', $token)) { - /* treat integer literally */ - } else if (!preg_match('~^' . $this->_obj_call_regexp . '|' . $this->_var_regexp . '(?:' . $this->_mod_regexp . ')*$~', $token)) { - /* treat as a string, double-quote it escaping quotes */ - $token = '"'.addslashes($token).'"'; - } - - $attrs[$attr_name] = $token; - $state = 0; - } else - $this->_syntax_error("'=' cannot be an attribute value", E_USER_ERROR, __FILE__, __LINE__); - break; - } - $last_token = $token; - } - - if($state != 0) { - if($state == 1) { - $this->_syntax_error("expecting '=' after attribute name '$last_token'", E_USER_ERROR, __FILE__, __LINE__); - } else { - $this->_syntax_error("missing attribute value", E_USER_ERROR, __FILE__, __LINE__); - } - } - - $this->_parse_vars_props($attrs); - - return $attrs; - } - - /** - * compile multiple variables and section properties tokens into - * PHP code - * - * @param array $tokens - */ - function _parse_vars_props(&$tokens) - { - foreach($tokens as $key => $val) { - $tokens[$key] = $this->_parse_var_props($val); - } - } - - /** - * compile single variable and section properties token into - * PHP code - * - * @param string $val - * @param string $tag_attrs - * @return string - */ - function _parse_var_props($val) - { - $val = trim($val); - - if(preg_match('~^(' . $this->_obj_call_regexp . '|' . $this->_dvar_regexp . ')(' . $this->_mod_regexp . '*)$~', $val, $match)) { - // $ variable or object - $return = $this->_parse_var($match[1]); - $modifiers = $match[2]; - if (!empty($this->default_modifiers) && !preg_match('~(^|\|)smarty:nodefaults($|\|)~',$modifiers)) { - $_default_mod_string = implode('|',(array)$this->default_modifiers); - $modifiers = empty($modifiers) ? $_default_mod_string : $_default_mod_string . '|' . $modifiers; - } - $this->_parse_modifiers($return, $modifiers); - return $return; - } elseif (preg_match('~^' . $this->_db_qstr_regexp . '(?:' . $this->_mod_regexp . '*)$~', $val)) { - // double quoted text - preg_match('~^(' . $this->_db_qstr_regexp . ')('. $this->_mod_regexp . '*)$~', $val, $match); - $return = $this->_expand_quoted_text($match[1]); - if($match[2] != '') { - $this->_parse_modifiers($return, $match[2]); - } - return $return; - } - elseif(preg_match('~^' . $this->_num_const_regexp . '(?:' . $this->_mod_regexp . '*)$~', $val)) { - // numerical constant - preg_match('~^(' . $this->_num_const_regexp . ')('. $this->_mod_regexp . '*)$~', $val, $match); - if($match[2] != '') { - $this->_parse_modifiers($match[1], $match[2]); - return $match[1]; - } - } - elseif(preg_match('~^' . $this->_si_qstr_regexp . '(?:' . $this->_mod_regexp . '*)$~', $val)) { - // single quoted text - preg_match('~^(' . $this->_si_qstr_regexp . ')('. $this->_mod_regexp . '*)$~', $val, $match); - if($match[2] != '') { - $this->_parse_modifiers($match[1], $match[2]); - return $match[1]; - } - } - elseif(preg_match('~^' . $this->_cvar_regexp . '(?:' . $this->_mod_regexp . '*)$~', $val)) { - // config var - return $this->_parse_conf_var($val); - } - elseif(preg_match('~^' . $this->_svar_regexp . '(?:' . $this->_mod_regexp . '*)$~', $val)) { - // section var - return $this->_parse_section_prop($val); - } - elseif(!in_array($val, $this->_permitted_tokens) && !is_numeric($val)) { - // literal string - return $this->_expand_quoted_text('"' . strtr($val, array('\\' => '\\\\', '"' => '\\"')) .'"'); - } - return $val; - } - - /** - * expand quoted text with embedded variables - * - * @param string $var_expr - * @return string - */ - function _expand_quoted_text($var_expr) - { - // if contains unescaped $, expand it - if(preg_match_all('~(?:\`(?_dvar_guts_regexp . '(?:' . $this->_obj_ext_regexp . ')*\`)|(?:(?_parse_var(str_replace('`','',$_var)) . ')."'; - } - $var_expr = strtr($var_expr, $_replace); - $_return = preg_replace('~\.""|(?_dvar_math_regexp.'|'.$this->_qstr_regexp.')~', $var_expr, -1, PREG_SPLIT_DELIM_CAPTURE); - - if(count($_math_vars) > 1) { - $_first_var = ""; - $_complete_var = ""; - $_output = ""; - // simple check if there is any math, to stop recursion (due to modifiers with "xx % yy" as parameter) - foreach($_math_vars as $_k => $_math_var) { - $_math_var = $_math_vars[$_k]; - - if(!empty($_math_var) || is_numeric($_math_var)) { - // hit a math operator, so process the stuff which came before it - if(preg_match('~^' . $this->_dvar_math_regexp . '$~', $_math_var)) { - $_has_math = true; - if(!empty($_complete_var) || is_numeric($_complete_var)) { - $_output .= $this->_parse_var($_complete_var); - } - - // just output the math operator to php - $_output .= $_math_var; - - if(empty($_first_var)) - $_first_var = $_complete_var; - - $_complete_var = ""; - } else { - $_complete_var .= $_math_var; - } - } - } - if($_has_math) { - if(!empty($_complete_var) || is_numeric($_complete_var)) - $_output .= $this->_parse_var($_complete_var); - - // get the modifiers working (only the last var from math + modifier is left) - $var_expr = $_complete_var; - } - } - - // prevent cutting of first digit in the number (we _definitly_ got a number if the first char is a digit) - if(is_numeric(substr($var_expr, 0, 1))) - $_var_ref = $var_expr; - else - $_var_ref = substr($var_expr, 1); - - if(!$_has_math) { - - // get [foo] and .foo and ->foo and (...) pieces - preg_match_all('~(?:^\w+)|' . $this->_obj_params_regexp . '|(?:' . $this->_var_bracket_regexp . ')|->\$?\w+|\.\$?\w+|\S+~', $_var_ref, $match); - - $_indexes = $match[0]; - $_var_name = array_shift($_indexes); - - /* Handle $smarty.* variable references as a special case. */ - if ($_var_name == 'smarty') { - /* - * If the reference could be compiled, use the compiled output; - * otherwise, fall back on the $smarty variable generated at - * run-time. - */ - if (($smarty_ref = $this->_compile_smarty_ref($_indexes)) !== null) { - $_output = $smarty_ref; - } else { - $_var_name = substr(array_shift($_indexes), 1); - $_output = "\$this->_smarty_vars['$_var_name']"; - } - } elseif(is_numeric($_var_name) && is_numeric(substr($var_expr, 0, 1))) { - // because . is the operator for accessing arrays thru inidizes we need to put it together again for floating point numbers - if(count($_indexes) > 0) - { - $_var_name .= implode("", $_indexes); - $_indexes = array(); - } - $_output = $_var_name; - } else { - $_output = "\$this->_tpl_vars['$_var_name']"; - } - - foreach ($_indexes as $_index) { - if (substr($_index, 0, 1) == '[') { - $_index = substr($_index, 1, -1); - if (is_numeric($_index)) { - $_output .= "[$_index]"; - } elseif (substr($_index, 0, 1) == '$') { - if (strpos($_index, '.') !== false) { - $_output .= '[' . $this->_parse_var($_index) . ']'; - } else { - $_output .= "[\$this->_tpl_vars['" . substr($_index, 1) . "']]"; - } - } else { - $_var_parts = explode('.', $_index); - $_var_section = $_var_parts[0]; - $_var_section_prop = isset($_var_parts[1]) ? $_var_parts[1] : 'index'; - $_output .= "[\$this->_sections['$_var_section']['$_var_section_prop']]"; - } - } else if (substr($_index, 0, 1) == '.') { - if (substr($_index, 1, 1) == '$') - $_output .= "[\$this->_tpl_vars['" . substr($_index, 2) . "']]"; - else - $_output .= "['" . substr($_index, 1) . "']"; - } else if (substr($_index,0,2) == '->') { - if(substr($_index,2,2) == '__') { - $this->_syntax_error('call to internal object members is not allowed', E_USER_ERROR, __FILE__, __LINE__); - } elseif($this->security && substr($_index, 2, 1) == '_') { - $this->_syntax_error('(secure) call to private object member is not allowed', E_USER_ERROR, __FILE__, __LINE__); - } elseif (substr($_index, 2, 1) == '$') { - if ($this->security) { - $this->_syntax_error('(secure) call to dynamic object member is not allowed', E_USER_ERROR, __FILE__, __LINE__); - } else { - $_output .= '->{(($_var=$this->_tpl_vars[\''.substr($_index,3).'\']) && substr($_var,0,2)!=\'__\') ? $_var : $this->trigger_error("cannot access property \\"$_var\\"")}'; - } - } else { - $_output .= $_index; - } - } elseif (substr($_index, 0, 1) == '(') { - $_index = $this->_parse_parenth_args($_index); - $_output .= $_index; - } else { - $_output .= $_index; - } - } - } - - return $_output; - } - - /** - * parse arguments in function call parenthesis - * - * @param string $parenth_args - * @return string - */ - function _parse_parenth_args($parenth_args) - { - preg_match_all('~' . $this->_param_regexp . '~',$parenth_args, $match); - $orig_vals = $match = $match[0]; - $this->_parse_vars_props($match); - $replace = array(); - for ($i = 0, $count = count($match); $i < $count; $i++) { - $replace[$orig_vals[$i]] = $match[$i]; - } - return strtr($parenth_args, $replace); - } - - /** - * parse configuration variable expression into PHP code - * - * @param string $conf_var_expr - */ - function _parse_conf_var($conf_var_expr) - { - $parts = explode('|', $conf_var_expr, 2); - $var_ref = $parts[0]; - $modifiers = isset($parts[1]) ? $parts[1] : ''; - - $var_name = substr($var_ref, 1, -1); - - $output = "\$this->_config[0]['vars']['$var_name']"; - - $this->_parse_modifiers($output, $modifiers); - - return $output; - } - - /** - * parse section property expression into PHP code - * - * @param string $section_prop_expr - * @return string - */ - function _parse_section_prop($section_prop_expr) - { - $parts = explode('|', $section_prop_expr, 2); - $var_ref = $parts[0]; - $modifiers = isset($parts[1]) ? $parts[1] : ''; - - preg_match('!%(\w+)\.(\w+)%!', $var_ref, $match); - $section_name = $match[1]; - $prop_name = $match[2]; - - $output = "\$this->_sections['$section_name']['$prop_name']"; - - $this->_parse_modifiers($output, $modifiers); - - return $output; - } - - - /** - * parse modifier chain into PHP code - * - * sets $output to parsed modified chain - * @param string $output - * @param string $modifier_string - */ - function _parse_modifiers(&$output, $modifier_string) - { - preg_match_all('~\|(@?\w+)((?>:(?:'. $this->_qstr_regexp . '|[^|]+))*)~', '|' . $modifier_string, $_match); - list(, $_modifiers, $modifier_arg_strings) = $_match; - - for ($_i = 0, $_for_max = count($_modifiers); $_i < $_for_max; $_i++) { - $_modifier_name = $_modifiers[$_i]; - - if($_modifier_name == 'smarty') { - // skip smarty modifier - continue; - } - - preg_match_all('~:(' . $this->_qstr_regexp . '|[^:]+)~', $modifier_arg_strings[$_i], $_match); - $_modifier_args = $_match[1]; - - if (substr($_modifier_name, 0, 1) == '@') { - $_map_array = false; - $_modifier_name = substr($_modifier_name, 1); - } else { - $_map_array = true; - } - - if (empty($this->_plugins['modifier'][$_modifier_name]) - && !$this->_get_plugin_filepath('modifier', $_modifier_name) - && function_exists($_modifier_name)) { - if ($this->security && !in_array($_modifier_name, $this->security_settings['MODIFIER_FUNCS'])) { - $this->_trigger_fatal_error("[plugin] (secure mode) modifier '$_modifier_name' is not allowed" , $this->_current_file, $this->_current_line_no, __FILE__, __LINE__); - } else { - $this->_plugins['modifier'][$_modifier_name] = array($_modifier_name, null, null, false); - } - } - $this->_add_plugin('modifier', $_modifier_name); - - $this->_parse_vars_props($_modifier_args); - - if($_modifier_name == 'default') { - // supress notifications of default modifier vars and args - if(substr($output, 0, 1) == '$') { - $output = '@' . $output; - } - if(isset($_modifier_args[0]) && substr($_modifier_args[0], 0, 1) == '$') { - $_modifier_args[0] = '@' . $_modifier_args[0]; - } - } - if (count($_modifier_args) > 0) - $_modifier_args = ', '.implode(', ', $_modifier_args); - else - $_modifier_args = ''; - - if ($_map_array) { - $output = "((is_array(\$_tmp=$output)) ? \$this->_run_mod_handler('$_modifier_name', true, \$_tmp$_modifier_args) : " . $this->_compile_plugin_call('modifier', $_modifier_name) . "(\$_tmp$_modifier_args))"; - - } else { - - $output = $this->_compile_plugin_call('modifier', $_modifier_name)."($output$_modifier_args)"; - - } - } - } - - - /** - * add plugin - * - * @param string $type - * @param string $name - * @param boolean? $delayed_loading - */ - function _add_plugin($type, $name, $delayed_loading = null) - { - if (!isset($this->_plugin_info[$type])) { - $this->_plugin_info[$type] = array(); - } - if (!isset($this->_plugin_info[$type][$name])) { - $this->_plugin_info[$type][$name] = array($this->_current_file, - $this->_current_line_no, - $delayed_loading); - } - } - - - /** - * Compiles references of type $smarty.foo - * - * @param string $indexes - * @return string - */ - function _compile_smarty_ref(&$indexes) - { - /* Extract the reference name. */ - $_ref = substr($indexes[0], 1); - foreach($indexes as $_index_no=>$_index) { - if (substr($_index, 0, 1) != '.' && $_index_no<2 || !preg_match('~^(\.|\[|->)~', $_index)) { - $this->_syntax_error('$smarty' . implode('', array_slice($indexes, 0, 2)) . ' is an invalid reference', E_USER_ERROR, __FILE__, __LINE__); - } - } - - switch ($_ref) { - case 'now': - $compiled_ref = 'time()'; - $_max_index = 1; - break; - - case 'foreach': - array_shift($indexes); - $_var = $this->_parse_var_props(substr($indexes[0], 1)); - $_propname = substr($indexes[1], 1); - $_max_index = 1; - switch ($_propname) { - case 'index': - array_shift($indexes); - $compiled_ref = "(\$this->_foreach[$_var]['iteration']-1)"; - break; - - case 'first': - array_shift($indexes); - $compiled_ref = "(\$this->_foreach[$_var]['iteration'] <= 1)"; - break; - - case 'last': - array_shift($indexes); - $compiled_ref = "(\$this->_foreach[$_var]['iteration'] == \$this->_foreach[$_var]['total'])"; - break; - - case 'show': - array_shift($indexes); - $compiled_ref = "(\$this->_foreach[$_var]['total'] > 0)"; - break; - - default: - unset($_max_index); - $compiled_ref = "\$this->_foreach[$_var]"; - } - break; - - case 'section': - array_shift($indexes); - $_var = $this->_parse_var_props(substr($indexes[0], 1)); - $compiled_ref = "\$this->_sections[$_var]"; - break; - - case 'get': - if ($this->security && !$this->security_settings['ALLOW_SUPER_GLOBALS']) { - $this->_syntax_error("(secure mode) super global access not permitted", - E_USER_WARNING, __FILE__, __LINE__); - return; - } - $compiled_ref = "\$_GET"; - break; - - case 'post': - if ($this->security && !$this->security_settings['ALLOW_SUPER_GLOBALS']) { - $this->_syntax_error("(secure mode) super global access not permitted", - E_USER_WARNING, __FILE__, __LINE__); - return; - } - $compiled_ref = "\$_POST"; - break; - - case 'cookies': - if ($this->security && !$this->security_settings['ALLOW_SUPER_GLOBALS']) { - $this->_syntax_error("(secure mode) super global access not permitted", - E_USER_WARNING, __FILE__, __LINE__); - return; - } - $compiled_ref = "\$_COOKIE"; - break; - - case 'env': - if ($this->security && !$this->security_settings['ALLOW_SUPER_GLOBALS']) { - $this->_syntax_error("(secure mode) super global access not permitted", - E_USER_WARNING, __FILE__, __LINE__); - return; - } - $compiled_ref = "\$_ENV"; - break; - - case 'server': - if ($this->security && !$this->security_settings['ALLOW_SUPER_GLOBALS']) { - $this->_syntax_error("(secure mode) super global access not permitted", - E_USER_WARNING, __FILE__, __LINE__); - return; - } - $compiled_ref = "\$_SERVER"; - break; - - case 'session': - if ($this->security && !$this->security_settings['ALLOW_SUPER_GLOBALS']) { - $this->_syntax_error("(secure mode) super global access not permitted", - E_USER_WARNING, __FILE__, __LINE__); - return; - } - $compiled_ref = "\$_SESSION"; - break; - - /* - * These cases are handled either at run-time or elsewhere in the - * compiler. - */ - case 'request': - if ($this->security && !$this->security_settings['ALLOW_SUPER_GLOBALS']) { - $this->_syntax_error("(secure mode) super global access not permitted", - E_USER_WARNING, __FILE__, __LINE__); - return; - } - if ($this->request_use_auto_globals) { - $compiled_ref = "\$_REQUEST"; - break; - } else { - $this->_init_smarty_vars = true; - } - return null; - - case 'capture': - return null; - - case 'template': - $compiled_ref = "'" . addslashes($this->_current_file) . "'"; - $_max_index = 1; - break; - - case 'version': - $compiled_ref = "'$this->_version'"; - $_max_index = 1; - break; - - case 'const': - if ($this->security && !$this->security_settings['ALLOW_CONSTANTS']) { - $this->_syntax_error("(secure mode) constants not permitted", - E_USER_WARNING, __FILE__, __LINE__); - return; - } - array_shift($indexes); - if (preg_match('!^\.\w+$!', $indexes[0])) { - $compiled_ref = '@' . substr($indexes[0], 1); - } else { - $_val = $this->_parse_var_props(substr($indexes[0], 1)); - $compiled_ref = '@constant(' . $_val . ')'; - } - $_max_index = 1; - break; - - case 'config': - $compiled_ref = "\$this->_config[0]['vars']"; - $_max_index = 3; - break; - - case 'ldelim': - $compiled_ref = "'$this->left_delimiter'"; - break; - - case 'rdelim': - $compiled_ref = "'$this->right_delimiter'"; - break; - - default: - $this->_syntax_error('$smarty.' . $_ref . ' is an unknown reference', E_USER_ERROR, __FILE__, __LINE__); - break; - } - - if (isset($_max_index) && count($indexes) > $_max_index) { - $this->_syntax_error('$smarty' . implode('', $indexes) .' is an invalid reference', E_USER_ERROR, __FILE__, __LINE__); - } - - array_shift($indexes); - return $compiled_ref; - } - - /** - * compiles call to plugin of type $type with name $name - * returns a string containing the function-name or method call - * without the paramter-list that would have follow to make the - * call valid php-syntax - * - * @param string $type - * @param string $name - * @return string - */ - function _compile_plugin_call($type, $name) { - if (isset($this->_plugins[$type][$name])) { - /* plugin loaded */ - if (is_array($this->_plugins[$type][$name][0])) { - return ((is_object($this->_plugins[$type][$name][0][0])) ? - "\$this->_plugins['$type']['$name'][0][0]->" /* method callback */ - : (string)($this->_plugins[$type][$name][0][0]).'::' /* class callback */ - ). $this->_plugins[$type][$name][0][1]; - - } else { - /* function callback */ - return $this->_plugins[$type][$name][0]; - - } - } else { - /* plugin not loaded -> auto-loadable-plugin */ - return 'smarty_'.$type.'_'.$name; - - } - } - - /** - * load pre- and post-filters - */ - function _load_filters() - { - if (count($this->_plugins['prefilter']) > 0) { - foreach ($this->_plugins['prefilter'] as $filter_name => $prefilter) { - if ($prefilter === false) { - unset($this->_plugins['prefilter'][$filter_name]); - $_params = array('plugins' => array(array('prefilter', $filter_name, null, null, false))); - require_once(SMARTY_CORE_DIR . 'core.load_plugins.php'); - smarty_core_load_plugins($_params, $this); - } - } - } - if (count($this->_plugins['postfilter']) > 0) { - foreach ($this->_plugins['postfilter'] as $filter_name => $postfilter) { - if ($postfilter === false) { - unset($this->_plugins['postfilter'][$filter_name]); - $_params = array('plugins' => array(array('postfilter', $filter_name, null, null, false))); - require_once(SMARTY_CORE_DIR . 'core.load_plugins.php'); - smarty_core_load_plugins($_params, $this); - } - } - } - } - - - /** - * Quote subpattern references - * - * @param string $string - * @return string - */ - function _quote_replace($string) - { - return strtr($string, array('\\' => '\\\\', '$' => '\\$')); - } - - /** - * display Smarty syntax error - * - * @param string $error_msg - * @param integer $error_type - * @param string $file - * @param integer $line - */ - function _syntax_error($error_msg, $error_type = E_USER_ERROR, $file=null, $line=null) - { - $this->_trigger_fatal_error("syntax error: $error_msg", $this->_current_file, $this->_current_line_no, $file, $line, $error_type); - } - - - /** - * check if the compilation changes from cacheable to - * non-cacheable state with the beginning of the current - * plugin. return php-code to reflect the transition. - * @return string - */ - function _push_cacheable_state($type, $name) { - $_cacheable = !isset($this->_plugins[$type][$name]) || $this->_plugins[$type][$name][4]; - if ($_cacheable - || 0<$this->_cacheable_state++) return ''; - if (!isset($this->_cache_serial)) $this->_cache_serial = md5(uniqid('Smarty')); - $_ret = 'if ($this->caching && !$this->_cache_including): echo \'{nocache:' - . $this->_cache_serial . '#' . $this->_nocache_count - . '}\'; endif;'; - return $_ret; - } - - - /** - * check if the compilation changes from non-cacheable to - * cacheable state with the end of the current plugin return - * php-code to reflect the transition. - * @return string - */ - function _pop_cacheable_state($type, $name) { - $_cacheable = !isset($this->_plugins[$type][$name]) || $this->_plugins[$type][$name][4]; - if ($_cacheable - || --$this->_cacheable_state>0) return ''; - return 'if ($this->caching && !$this->_cache_including): echo \'{/nocache:' - . $this->_cache_serial . '#' . ($this->_nocache_count++) - . '}\'; endif;'; - } - - - /** - * push opening tag-name, file-name and line-number on the tag-stack - * @param string the opening tag's name - */ - function _push_tag($open_tag) - { - array_push($this->_tag_stack, array($open_tag, $this->_current_line_no)); - } - - /** - * pop closing tag-name - * raise an error if this stack-top doesn't match with the closing tag - * @param string the closing tag's name - * @return string the opening tag's name - */ - function _pop_tag($close_tag) - { - $message = ''; - if (count($this->_tag_stack)>0) { - list($_open_tag, $_line_no) = array_pop($this->_tag_stack); - if ($close_tag == $_open_tag) { - return $_open_tag; - } - if ($close_tag == 'if' && ($_open_tag == 'else' || $_open_tag == 'elseif' )) { - return $this->_pop_tag($close_tag); - } - if ($close_tag == 'section' && $_open_tag == 'sectionelse') { - $this->_pop_tag($close_tag); - return $_open_tag; - } - if ($close_tag == 'foreach' && $_open_tag == 'foreachelse') { - $this->_pop_tag($close_tag); - return $_open_tag; - } - if ($_open_tag == 'else' || $_open_tag == 'elseif') { - $_open_tag = 'if'; - } elseif ($_open_tag == 'sectionelse') { - $_open_tag = 'section'; - } elseif ($_open_tag == 'foreachelse') { - $_open_tag = 'foreach'; - } - $message = " expected {/$_open_tag} (opened line $_line_no)."; - } - $this->_syntax_error("mismatched tag {/$close_tag}.$message", - E_USER_ERROR, __FILE__, __LINE__); - } - -} - -/** - * compare to values by their string length - * - * @access private - * @param string $a - * @param string $b - * @return 0|-1|1 - */ -function _smarty_sort_length($a, $b) -{ - if($a == $b) - return 0; - - if(strlen($a) == strlen($b)) - return ($a > $b) ? -1 : 1; - - return (strlen($a) > strlen($b)) ? -1 : 1; -} - - -/* vim: set et: */ - -?> diff --git a/lib/Smarty/debug.tpl b/lib/Smarty/debug.tpl deleted file mode 100644 index c05ef5d..0000000 --- a/lib/Smarty/debug.tpl +++ /dev/null @@ -1,157 +0,0 @@ -{* Smarty *} -{* debug.tpl, last updated version 2.1.0 *} -{assign_debug_info} -{capture assign=debug_output} - - - - Smarty Debug Console -{literal} - -{/literal} - - - -

          Smarty Debug Console

          - -

          included templates & config files (load time in seconds)

          - -
          -{section name=templates loop=$_debug_tpls} - {section name=indent loop=$_debug_tpls[templates].depth}   {/section} - - {$_debug_tpls[templates].filename|escape:html} - {if isset($_debug_tpls[templates].exec_time)} - - ({$_debug_tpls[templates].exec_time|string_format:"%.5f"}) - {if %templates.index% eq 0}(total){/if} - - {/if} -
          -{sectionelse} -

          no templates included

          -{/section} -
          - -

          assigned template variables

          - - - {section name=vars loop=$_debug_keys} - - - - {sectionelse} - - {/section} -
          {ldelim}${$_debug_keys[vars]|escape:'html'}{rdelim}{$_debug_vals[vars]|@debug_print_var}

          no template variables assigned

          - -

          assigned config file variables (outer template scope)

          - - - {section name=config_vars loop=$_debug_config_keys} - - - - {sectionelse} - - {/section} -
          {ldelim}#{$_debug_config_keys[config_vars]|escape:'html'}#{rdelim}{$_debug_config_vals[config_vars]|@debug_print_var}

          no config vars assigned

          - - -{/capture} -{if isset($_smarty_debug_output) and $_smarty_debug_output eq "html"} - {$debug_output} -{else} - -{/if} \ No newline at end of file diff --git a/lib/Smarty/internals/core.assemble_plugin_filepath.php b/lib/Smarty/internals/core.assemble_plugin_filepath.php deleted file mode 100644 index 22c0248..0000000 --- a/lib/Smarty/internals/core.assemble_plugin_filepath.php +++ /dev/null @@ -1,65 +0,0 @@ -_filepaths_cache[$_plugin_filename])) { - return $smarty->_filepaths_cache[$_plugin_filename]; - } - $_return = false; - - foreach ((array)$smarty->plugins_dir as $_plugin_dir) { - - $_plugin_filepath = $_plugin_dir . DIRECTORY_SEPARATOR . $_plugin_filename; - - // see if path is relative - if (!preg_match("/^([\/\\\\]|[a-zA-Z]:[\/\\\\])/", $_plugin_dir)) { - $_relative_paths[] = $_plugin_dir; - // relative path, see if it is in the SMARTY_DIR - if (@is_readable(SMARTY_DIR . $_plugin_filepath)) { - $_return = SMARTY_DIR . $_plugin_filepath; - break; - } - } - // try relative to cwd (or absolute) - if (@is_readable($_plugin_filepath)) { - $_return = $_plugin_filepath; - break; - } - } - - if($_return === false) { - // still not found, try PHP include_path - if(isset($_relative_paths)) { - foreach ((array)$_relative_paths as $_plugin_dir) { - - $_plugin_filepath = $_plugin_dir . DIRECTORY_SEPARATOR . $_plugin_filename; - - $_params = array('file_path' => $_plugin_filepath); - require_once(SMARTY_CORE_DIR . 'core.get_include_path.php'); - if(smarty_core_get_include_path($_params, $smarty)) { - $_return = $_params['new_file_path']; - break; - } - } - } - } - $smarty->_filepaths_cache[$_plugin_filename] = $_return; - return $_return; -} - -/* vim: set expandtab: */ - -?> diff --git a/lib/Smarty/internals/core.assign_smarty_interface.php b/lib/Smarty/internals/core.assign_smarty_interface.php deleted file mode 100644 index 7e65a73..0000000 --- a/lib/Smarty/internals/core.assign_smarty_interface.php +++ /dev/null @@ -1,43 +0,0 @@ - - * Name: assign_smarty_interface
          - * Purpose: assign the $smarty interface variable - * @param array Format: null - * @param Smarty - */ -function smarty_core_assign_smarty_interface($params, &$smarty) -{ - if (isset($smarty->_smarty_vars) && isset($smarty->_smarty_vars['request'])) { - return; - } - - $_globals_map = array('g' => 'HTTP_GET_VARS', - 'p' => 'HTTP_POST_VARS', - 'c' => 'HTTP_COOKIE_VARS', - 's' => 'HTTP_SERVER_VARS', - 'e' => 'HTTP_ENV_VARS'); - - $_smarty_vars_request = array(); - - foreach (preg_split('!!', strtolower($smarty->request_vars_order)) as $_c) { - if (isset($_globals_map[$_c])) { - $_smarty_vars_request = array_merge($_smarty_vars_request, $GLOBALS[$_globals_map[$_c]]); - } - } - $_smarty_vars_request = @array_merge($_smarty_vars_request, $GLOBALS['HTTP_SESSION_VARS']); - - $smarty->_smarty_vars['request'] = $_smarty_vars_request; -} - -/* vim: set expandtab: */ - -?> diff --git a/lib/Smarty/internals/core.create_dir_structure.php b/lib/Smarty/internals/core.create_dir_structure.php deleted file mode 100644 index 3eecc49..0000000 --- a/lib/Smarty/internals/core.create_dir_structure.php +++ /dev/null @@ -1,79 +0,0 @@ -_dir_perms) && !is_dir($_new_dir)) { - $smarty->trigger_error("problem creating directory '" . $_new_dir . "'"); - return false; - } - $_new_dir .= '/'; - } - } -} - -/* vim: set expandtab: */ - -?> diff --git a/lib/Smarty/internals/core.display_debug_console.php b/lib/Smarty/internals/core.display_debug_console.php deleted file mode 100644 index 1a80f39..0000000 --- a/lib/Smarty/internals/core.display_debug_console.php +++ /dev/null @@ -1,61 +0,0 @@ - - * Name: display_debug_console
          - * Purpose: display the javascript debug console window - * @param array Format: null - * @param Smarty - */ -function smarty_core_display_debug_console($params, &$smarty) -{ - // we must force compile the debug template in case the environment - // changed between separate applications. - - if(empty($smarty->debug_tpl)) { - // set path to debug template from SMARTY_DIR - $smarty->debug_tpl = SMARTY_DIR . 'debug.tpl'; - if($smarty->security && is_file($smarty->debug_tpl)) { - $smarty->secure_dir[] = realpath($smarty->debug_tpl); - } - $smarty->debug_tpl = 'file:' . SMARTY_DIR . 'debug.tpl'; - } - - $_ldelim_orig = $smarty->left_delimiter; - $_rdelim_orig = $smarty->right_delimiter; - - $smarty->left_delimiter = '{'; - $smarty->right_delimiter = '}'; - - $_compile_id_orig = $smarty->_compile_id; - $smarty->_compile_id = null; - - $_compile_path = $smarty->_get_compile_path($smarty->debug_tpl); - if ($smarty->_compile_resource($smarty->debug_tpl, $_compile_path)) - { - ob_start(); - $smarty->_include($_compile_path); - $_results = ob_get_contents(); - ob_end_clean(); - } else { - $_results = ''; - } - - $smarty->_compile_id = $_compile_id_orig; - - $smarty->left_delimiter = $_ldelim_orig; - $smarty->right_delimiter = $_rdelim_orig; - - return $_results; -} - -/* vim: set expandtab: */ - -?> diff --git a/lib/Smarty/internals/core.get_include_path.php b/lib/Smarty/internals/core.get_include_path.php deleted file mode 100644 index 4343241..0000000 --- a/lib/Smarty/internals/core.get_include_path.php +++ /dev/null @@ -1,44 +0,0 @@ - diff --git a/lib/Smarty/internals/core.get_microtime.php b/lib/Smarty/internals/core.get_microtime.php deleted file mode 100644 index f1a28e0..0000000 --- a/lib/Smarty/internals/core.get_microtime.php +++ /dev/null @@ -1,23 +0,0 @@ - diff --git a/lib/Smarty/internals/core.get_php_resource.php b/lib/Smarty/internals/core.get_php_resource.php deleted file mode 100644 index 786d4e7..0000000 --- a/lib/Smarty/internals/core.get_php_resource.php +++ /dev/null @@ -1,80 +0,0 @@ -trusted_dir; - $smarty->_parse_resource_name($params, $smarty); - - /* - * Find out if the resource exists. - */ - - if ($params['resource_type'] == 'file') { - $_readable = false; - if(file_exists($params['resource_name']) && is_readable($params['resource_name'])) { - $_readable = true; - } else { - // test for file in include_path - $_params = array('file_path' => $params['resource_name']); - require_once(SMARTY_CORE_DIR . 'core.get_include_path.php'); - if(smarty_core_get_include_path($_params, $smarty)) { - $_include_path = $_params['new_file_path']; - $_readable = true; - } - } - } else if ($params['resource_type'] != 'file') { - $_template_source = null; - $_readable = is_callable($smarty->_plugins['resource'][$params['resource_type']][0][0]) - && call_user_func_array($smarty->_plugins['resource'][$params['resource_type']][0][0], - array($params['resource_name'], &$_template_source, &$smarty)); - } - - /* - * Set the error function, depending on which class calls us. - */ - if (method_exists($smarty, '_syntax_error')) { - $_error_funcc = '_syntax_error'; - } else { - $_error_funcc = 'trigger_error'; - } - - if ($_readable) { - if ($smarty->security) { - require_once(SMARTY_CORE_DIR . 'core.is_trusted.php'); - if (!smarty_core_is_trusted($params, $smarty)) { - $smarty->$_error_funcc('(secure mode) ' . $params['resource_type'] . ':' . $params['resource_name'] . ' is not trusted'); - return false; - } - } - } else { - $smarty->$_error_funcc($params['resource_type'] . ':' . $params['resource_name'] . ' is not readable'); - return false; - } - - if ($params['resource_type'] == 'file') { - $params['php_resource'] = $params['resource_name']; - } else { - $params['php_resource'] = $_template_source; - } - return true; -} - -/* vim: set expandtab: */ - -?> diff --git a/lib/Smarty/internals/core.is_secure.php b/lib/Smarty/internals/core.is_secure.php deleted file mode 100644 index d54abd4..0000000 --- a/lib/Smarty/internals/core.is_secure.php +++ /dev/null @@ -1,59 +0,0 @@ -security || $smarty->security_settings['INCLUDE_ANY']) { - return true; - } - - if ($params['resource_type'] == 'file') { - $_rp = realpath($params['resource_name']); - if (isset($params['resource_base_path'])) { - foreach ((array)$params['resource_base_path'] as $curr_dir) { - if ( ($_cd = realpath($curr_dir)) !== false && - strncmp($_rp, $_cd, strlen($_cd)) == 0 && - substr($_rp, strlen($_cd), 1) == DIRECTORY_SEPARATOR ) { - return true; - } - } - } - if (!empty($smarty->secure_dir)) { - foreach ((array)$smarty->secure_dir as $curr_dir) { - if ( ($_cd = realpath($curr_dir)) !== false) { - if($_cd == $_rp) { - return true; - } elseif (strncmp($_rp, $_cd, strlen($_cd)) == 0 && - substr($_rp, strlen($_cd), 1) == DIRECTORY_SEPARATOR) { - return true; - } - } - } - } - } else { - // resource is not on local file system - return call_user_func_array( - $smarty->_plugins['resource'][$params['resource_type']][0][2], - array($params['resource_name'], &$smarty)); - } - - return false; -} - -/* vim: set expandtab: */ - -?> diff --git a/lib/Smarty/internals/core.is_trusted.php b/lib/Smarty/internals/core.is_trusted.php deleted file mode 100644 index 4299731..0000000 --- a/lib/Smarty/internals/core.is_trusted.php +++ /dev/null @@ -1,47 +0,0 @@ -trusted_dir)) { - $_rp = realpath($params['resource_name']); - foreach ((array)$smarty->trusted_dir as $curr_dir) { - if (!empty($curr_dir) && is_readable ($curr_dir)) { - $_cd = realpath($curr_dir); - if (strncmp($_rp, $_cd, strlen($_cd)) == 0 - && substr($_rp, strlen($_cd), 1) == DIRECTORY_SEPARATOR ) { - $_smarty_trusted = true; - break; - } - } - } - } - - } else { - // resource is not on local file system - $_smarty_trusted = call_user_func_array($smarty->_plugins['resource'][$params['resource_type']][0][3], - array($params['resource_name'], $smarty)); - } - - return $_smarty_trusted; -} - -/* vim: set expandtab: */ - -?> diff --git a/lib/Smarty/internals/core.load_plugins.php b/lib/Smarty/internals/core.load_plugins.php deleted file mode 100644 index 6db1dc5..0000000 --- a/lib/Smarty/internals/core.load_plugins.php +++ /dev/null @@ -1,125 +0,0 @@ -_plugins[$_type][$_name]; - - /* - * We do not load plugin more than once for each instance of Smarty. - * The following code checks for that. The plugin can also be - * registered dynamically at runtime, in which case template file - * and line number will be unknown, so we fill them in. - * - * The final element of the info array is a flag that indicates - * whether the dynamically registered plugin function has been - * checked for existence yet or not. - */ - if (isset($_plugin)) { - if (empty($_plugin[3])) { - if (!is_callable($_plugin[0])) { - $smarty->_trigger_fatal_error("[plugin] $_type '$_name' is not implemented", $_tpl_file, $_tpl_line, __FILE__, __LINE__); - } else { - $_plugin[1] = $_tpl_file; - $_plugin[2] = $_tpl_line; - $_plugin[3] = true; - if (!isset($_plugin[4])) $_plugin[4] = true; /* cacheable */ - } - } - continue; - } else if ($_type == 'insert') { - /* - * For backwards compatibility, we check for insert functions in - * the symbol table before trying to load them as a plugin. - */ - $_plugin_func = 'insert_' . $_name; - if (function_exists($_plugin_func)) { - $_plugin = array($_plugin_func, $_tpl_file, $_tpl_line, true, false); - continue; - } - } - - $_plugin_file = $smarty->_get_plugin_filepath($_type, $_name); - - if (! $_found = ($_plugin_file != false)) { - $_message = "could not load plugin file '$_type.$_name.php'\n"; - } - - /* - * If plugin file is found, it -must- provide the properly named - * plugin function. In case it doesn't, simply output the error and - * do not fall back on any other method. - */ - if ($_found) { - include_once $_plugin_file; - - $_plugin_func = 'smarty_' . $_type . '_' . $_name; - if (!function_exists($_plugin_func)) { - $smarty->_trigger_fatal_error("[plugin] function $_plugin_func() not found in $_plugin_file", $_tpl_file, $_tpl_line, __FILE__, __LINE__); - continue; - } - } - /* - * In case of insert plugins, their code may be loaded later via - * 'script' attribute. - */ - else if ($_type == 'insert' && $_delayed_loading) { - $_plugin_func = 'smarty_' . $_type . '_' . $_name; - $_found = true; - } - - /* - * Plugin specific processing and error checking. - */ - if (!$_found) { - if ($_type == 'modifier') { - /* - * In case modifier falls back on using PHP functions - * directly, we only allow those specified in the security - * context. - */ - if ($smarty->security && !in_array($_name, $smarty->security_settings['MODIFIER_FUNCS'])) { - $_message = "(secure mode) modifier '$_name' is not allowed"; - } else { - if (!function_exists($_name)) { - $_message = "modifier '$_name' is not implemented"; - } else { - $_plugin_func = $_name; - $_found = true; - } - } - } else if ($_type == 'function') { - /* - * This is a catch-all situation. - */ - $_message = "unknown tag - '$_name'"; - } - } - - if ($_found) { - $smarty->_plugins[$_type][$_name] = array($_plugin_func, $_tpl_file, $_tpl_line, true, true); - } else { - // output error - $smarty->_trigger_fatal_error('[plugin] ' . $_message, $_tpl_file, $_tpl_line, __FILE__, __LINE__); - } - } -} - -/* vim: set expandtab: */ - -?> diff --git a/lib/Smarty/internals/core.load_resource_plugin.php b/lib/Smarty/internals/core.load_resource_plugin.php deleted file mode 100644 index a7d37d1..0000000 --- a/lib/Smarty/internals/core.load_resource_plugin.php +++ /dev/null @@ -1,74 +0,0 @@ -_plugins['resource'][$params['type']]; - if (isset($_plugin)) { - if (!$_plugin[1] && count($_plugin[0])) { - $_plugin[1] = true; - foreach ($_plugin[0] as $_plugin_func) { - if (!is_callable($_plugin_func)) { - $_plugin[1] = false; - break; - } - } - } - - if (!$_plugin[1]) { - $smarty->_trigger_fatal_error("[plugin] resource '" . $params['type'] . "' is not implemented", null, null, __FILE__, __LINE__); - } - - return; - } - - $_plugin_file = $smarty->_get_plugin_filepath('resource', $params['type']); - $_found = ($_plugin_file != false); - - if ($_found) { /* - * If the plugin file is found, it -must- provide the properly named - * plugin functions. - */ - include_once($_plugin_file); - - /* - * Locate functions that we require the plugin to provide. - */ - $_resource_ops = array('source', 'timestamp', 'secure', 'trusted'); - $_resource_funcs = array(); - foreach ($_resource_ops as $_op) { - $_plugin_func = 'smarty_resource_' . $params['type'] . '_' . $_op; - if (!function_exists($_plugin_func)) { - $smarty->_trigger_fatal_error("[plugin] function $_plugin_func() not found in $_plugin_file", null, null, __FILE__, __LINE__); - return; - } else { - $_resource_funcs[] = $_plugin_func; - } - } - - $smarty->_plugins['resource'][$params['type']] = array($_resource_funcs, true); - } -} - -/* vim: set expandtab: */ - -?> diff --git a/lib/Smarty/internals/core.process_cached_inserts.php b/lib/Smarty/internals/core.process_cached_inserts.php deleted file mode 100644 index 1d78edd..0000000 --- a/lib/Smarty/internals/core.process_cached_inserts.php +++ /dev/null @@ -1,71 +0,0 @@ -_smarty_md5.'{insert_cache (.*)}'.$smarty->_smarty_md5.'!Uis', - $params['results'], $match); - list($cached_inserts, $insert_args) = $match; - - for ($i = 0, $for_max = count($cached_inserts); $i < $for_max; $i++) { - if ($smarty->debugging) { - $_params = array(); - require_once(SMARTY_CORE_DIR . 'core.get_microtime.php'); - $debug_start_time = smarty_core_get_microtime($_params, $smarty); - } - - $args = unserialize($insert_args[$i]); - $name = $args['name']; - - if (isset($args['script'])) { - $_params = array('resource_name' => $smarty->_dequote($args['script'])); - require_once(SMARTY_CORE_DIR . 'core.get_php_resource.php'); - if(!smarty_core_get_php_resource($_params, $smarty)) { - return false; - } - $resource_type = $_params['resource_type']; - $php_resource = $_params['php_resource']; - - - if ($resource_type == 'file') { - $smarty->_include($php_resource, true); - } else { - $smarty->_eval($php_resource); - } - } - - $function_name = $smarty->_plugins['insert'][$name][0]; - if (empty($args['assign'])) { - $replace = $function_name($args, $smarty); - } else { - $smarty->assign($args['assign'], $function_name($args, $smarty)); - $replace = ''; - } - - $params['results'] = substr_replace($params['results'], $replace, strpos($params['results'], $cached_inserts[$i]), strlen($cached_inserts[$i])); - if ($smarty->debugging) { - $_params = array(); - require_once(SMARTY_CORE_DIR . 'core.get_microtime.php'); - $smarty->_smarty_debug_info[] = array('type' => 'insert', - 'filename' => 'insert_'.$name, - 'depth' => $smarty->_inclusion_depth, - 'exec_time' => smarty_core_get_microtime($_params, $smarty) - $debug_start_time); - } - } - - return $params['results']; -} - -/* vim: set expandtab: */ - -?> diff --git a/lib/Smarty/internals/core.process_compiled_include.php b/lib/Smarty/internals/core.process_compiled_include.php deleted file mode 100644 index 904d597..0000000 --- a/lib/Smarty/internals/core.process_compiled_include.php +++ /dev/null @@ -1,37 +0,0 @@ -_cache_including; - $smarty->_cache_including = true; - - $_return = $params['results']; - - foreach ($smarty->_cache_info['cache_serials'] as $_include_file_path=>$_cache_serial) { - $smarty->_include($_include_file_path, true); - } - - foreach ($smarty->_cache_info['cache_serials'] as $_include_file_path=>$_cache_serial) { - $_return = preg_replace_callback('!(\{nocache\:('.$_cache_serial.')#(\d+)\})!s', - array(&$smarty, '_process_compiled_include_callback'), - $_return); - } - $smarty->_cache_including = $_cache_including; - return $_return; -} - -?> diff --git a/lib/Smarty/internals/core.read_cache_file.php b/lib/Smarty/internals/core.read_cache_file.php deleted file mode 100644 index c60e113..0000000 --- a/lib/Smarty/internals/core.read_cache_file.php +++ /dev/null @@ -1,101 +0,0 @@ -force_compile) { - // force compile enabled, always regenerate - return false; - } - - if (isset($content_cache[$params['tpl_file'].','.$params['cache_id'].','.$params['compile_id']])) { - list($params['results'], $smarty->_cache_info) = $content_cache[$params['tpl_file'].','.$params['cache_id'].','.$params['compile_id']]; - return true; - } - - if (!empty($smarty->cache_handler_func)) { - // use cache_handler function - call_user_func_array($smarty->cache_handler_func, - array('read', &$smarty, &$params['results'], $params['tpl_file'], $params['cache_id'], $params['compile_id'], null)); - } else { - // use local cache file - $_auto_id = $smarty->_get_auto_id($params['cache_id'], $params['compile_id']); - $_cache_file = $smarty->_get_auto_filename($smarty->cache_dir, $params['tpl_file'], $_auto_id); - $params['results'] = $smarty->_read_file($_cache_file); - } - - if (empty($params['results'])) { - // nothing to parse (error?), regenerate cache - return false; - } - - $_contents = $params['results']; - $_info_start = strpos($_contents, "\n") + 1; - $_info_len = (int)substr($_contents, 0, $_info_start - 1); - $_cache_info = unserialize(substr($_contents, $_info_start, $_info_len)); - $params['results'] = substr($_contents, $_info_start + $_info_len); - - if ($smarty->caching == 2 && isset ($_cache_info['expires'])){ - // caching by expiration time - if ($_cache_info['expires'] > -1 && (time() > $_cache_info['expires'])) { - // cache expired, regenerate - return false; - } - } else { - // caching by lifetime - if ($smarty->cache_lifetime > -1 && (time() - $_cache_info['timestamp'] > $smarty->cache_lifetime)) { - // cache expired, regenerate - return false; - } - } - - if ($smarty->compile_check) { - $_params = array('get_source' => false, 'quiet'=>true); - foreach (array_keys($_cache_info['template']) as $_template_dep) { - $_params['resource_name'] = $_template_dep; - if (!$smarty->_fetch_resource_info($_params) || $_cache_info['timestamp'] < $_params['resource_timestamp']) { - // template file has changed, regenerate cache - return false; - } - } - - if (isset($_cache_info['config'])) { - $_params = array('resource_base_path' => $smarty->config_dir, 'get_source' => false, 'quiet'=>true); - foreach (array_keys($_cache_info['config']) as $_config_dep) { - $_params['resource_name'] = $_config_dep; - if (!$smarty->_fetch_resource_info($_params) || $_cache_info['timestamp'] < $_params['resource_timestamp']) { - // config file has changed, regenerate cache - return false; - } - } - } - } - - $content_cache[$params['tpl_file'].','.$params['cache_id'].','.$params['compile_id']] = array($params['results'], $_cache_info); - - $smarty->_cache_info = $_cache_info; - return true; -} - -/* vim: set expandtab: */ - -?> diff --git a/lib/Smarty/internals/core.rm_auto.php b/lib/Smarty/internals/core.rm_auto.php deleted file mode 100644 index b251f64..0000000 --- a/lib/Smarty/internals/core.rm_auto.php +++ /dev/null @@ -1,71 +0,0 @@ - $params['auto_base'], - 'level' => 0, - 'exp_time' => $params['exp_time'] - ); - require_once(SMARTY_CORE_DIR . 'core.rmdir.php'); - $_res = smarty_core_rmdir($_params, $smarty); - } else { - $_tname = $smarty->_get_auto_filename($params['auto_base'], $params['auto_source'], $params['auto_id']); - - if(isset($params['auto_source'])) { - if (isset($params['extensions'])) { - $_res = false; - foreach ((array)$params['extensions'] as $_extension) - $_res |= $smarty->_unlink($_tname.$_extension, $params['exp_time']); - } else { - $_res = $smarty->_unlink($_tname, $params['exp_time']); - } - } elseif ($smarty->use_sub_dirs) { - $_params = array( - 'dirname' => $_tname, - 'level' => 1, - 'exp_time' => $params['exp_time'] - ); - require_once(SMARTY_CORE_DIR . 'core.rmdir.php'); - $_res = smarty_core_rmdir($_params, $smarty); - } else { - // remove matching file names - $_handle = opendir($params['auto_base']); - $_res = true; - while (false !== ($_filename = readdir($_handle))) { - if($_filename == '.' || $_filename == '..') { - continue; - } elseif (substr($params['auto_base'] . DIRECTORY_SEPARATOR . $_filename, 0, strlen($_tname)) == $_tname) { - $_res &= (bool)$smarty->_unlink($params['auto_base'] . DIRECTORY_SEPARATOR . $_filename, $params['exp_time']); - } - } - } - } - - return $_res; -} - -/* vim: set expandtab: */ - -?> diff --git a/lib/Smarty/internals/core.rmdir.php b/lib/Smarty/internals/core.rmdir.php deleted file mode 100644 index 2166c44..0000000 --- a/lib/Smarty/internals/core.rmdir.php +++ /dev/null @@ -1,54 +0,0 @@ - keep root) - * WARNING: no tests, it will try to remove what you tell it! - * - * @param string $dirname - * @param integer $level - * @param integer $exp_time - * @return boolean - */ - -// $dirname, $level = 1, $exp_time = null - -function smarty_core_rmdir($params, &$smarty) -{ - if(!isset($params['level'])) { $params['level'] = 1; } - if(!isset($params['exp_time'])) { $params['exp_time'] = null; } - - if($_handle = @opendir($params['dirname'])) { - - while (false !== ($_entry = readdir($_handle))) { - if ($_entry != '.' && $_entry != '..') { - if (@is_dir($params['dirname'] . DIRECTORY_SEPARATOR . $_entry)) { - $_params = array( - 'dirname' => $params['dirname'] . DIRECTORY_SEPARATOR . $_entry, - 'level' => $params['level'] + 1, - 'exp_time' => $params['exp_time'] - ); - smarty_core_rmdir($_params, $smarty); - } - else { - $smarty->_unlink($params['dirname'] . DIRECTORY_SEPARATOR . $_entry, $params['exp_time']); - } - } - } - closedir($_handle); - } - - if ($params['level']) { - return @rmdir($params['dirname']); - } - return (bool)$_handle; - -} - -/* vim: set expandtab: */ - -?> diff --git a/lib/Smarty/internals/core.run_insert_handler.php b/lib/Smarty/internals/core.run_insert_handler.php deleted file mode 100644 index 71c3845..0000000 --- a/lib/Smarty/internals/core.run_insert_handler.php +++ /dev/null @@ -1,71 +0,0 @@ -debugging) { - $_params = array(); - $_debug_start_time = smarty_core_get_microtime($_params, $smarty); - } - - if ($smarty->caching) { - $_arg_string = serialize($params['args']); - $_name = $params['args']['name']; - if (!isset($smarty->_cache_info['insert_tags'][$_name])) { - $smarty->_cache_info['insert_tags'][$_name] = array('insert', - $_name, - $smarty->_plugins['insert'][$_name][1], - $smarty->_plugins['insert'][$_name][2], - !empty($params['args']['script']) ? true : false); - } - return $smarty->_smarty_md5."{insert_cache $_arg_string}".$smarty->_smarty_md5; - } else { - if (isset($params['args']['script'])) { - $_params = array('resource_name' => $smarty->_dequote($params['args']['script'])); - require_once(SMARTY_CORE_DIR . 'core.get_php_resource.php'); - if(!smarty_core_get_php_resource($_params, $smarty)) { - return false; - } - - if ($_params['resource_type'] == 'file') { - $smarty->_include($_params['php_resource'], true); - } else { - $smarty->_eval($_params['php_resource']); - } - unset($params['args']['script']); - } - - $_funcname = $smarty->_plugins['insert'][$params['args']['name']][0]; - $_content = $_funcname($params['args'], $smarty); - if ($smarty->debugging) { - $_params = array(); - require_once(SMARTY_CORE_DIR . 'core.get_microtime.php'); - $smarty->_smarty_debug_info[] = array('type' => 'insert', - 'filename' => 'insert_'.$params['args']['name'], - 'depth' => $smarty->_inclusion_depth, - 'exec_time' => smarty_core_get_microtime($_params, $smarty) - $_debug_start_time); - } - - if (!empty($params['args']["assign"])) { - $smarty->assign($params['args']["assign"], $_content); - } else { - return $_content; - } - } -} - -/* vim: set expandtab: */ - -?> diff --git a/lib/Smarty/internals/core.smarty_include_php.php b/lib/Smarty/internals/core.smarty_include_php.php deleted file mode 100644 index 30c6e76..0000000 --- a/lib/Smarty/internals/core.smarty_include_php.php +++ /dev/null @@ -1,50 +0,0 @@ - $params['smarty_file']); - require_once(SMARTY_CORE_DIR . 'core.get_php_resource.php'); - smarty_core_get_php_resource($_params, $smarty); - $_smarty_resource_type = $_params['resource_type']; - $_smarty_php_resource = $_params['php_resource']; - - if (!empty($params['smarty_assign'])) { - ob_start(); - if ($_smarty_resource_type == 'file') { - $smarty->_include($_smarty_php_resource, $params['smarty_once'], $params['smarty_include_vars']); - } else { - $smarty->_eval($_smarty_php_resource, $params['smarty_include_vars']); - } - $smarty->assign($params['smarty_assign'], ob_get_contents()); - ob_end_clean(); - } else { - if ($_smarty_resource_type == 'file') { - $smarty->_include($_smarty_php_resource, $params['smarty_once'], $params['smarty_include_vars']); - } else { - $smarty->_eval($_smarty_php_resource, $params['smarty_include_vars']); - } - } -} - - -/* vim: set expandtab: */ - -?> diff --git a/lib/Smarty/internals/core.write_cache_file.php b/lib/Smarty/internals/core.write_cache_file.php deleted file mode 100644 index fa3cdd7..0000000 --- a/lib/Smarty/internals/core.write_cache_file.php +++ /dev/null @@ -1,96 +0,0 @@ -_cache_info['timestamp'] = time(); - if ($smarty->cache_lifetime > -1){ - // expiration set - $smarty->_cache_info['expires'] = $smarty->_cache_info['timestamp'] + $smarty->cache_lifetime; - } else { - // cache will never expire - $smarty->_cache_info['expires'] = -1; - } - - // collapse nocache.../nocache-tags - if (preg_match_all('!\{(/?)nocache\:[0-9a-f]{32}#\d+\}!', $params['results'], $match, PREG_PATTERN_ORDER)) { - // remove everything between every pair of outermost noache.../nocache-tags - // and replace it by a single nocache-tag - // this new nocache-tag will be replaced by dynamic contents in - // smarty_core_process_compiled_includes() on a cache-read - - $match_count = count($match[0]); - $results = preg_split('!(\{/?nocache\:[0-9a-f]{32}#\d+\})!', $params['results'], -1, PREG_SPLIT_DELIM_CAPTURE); - - $level = 0; - $j = 0; - for ($i=0, $results_count = count($results); $i < $results_count && $j < $match_count; $i++) { - if ($results[$i] == $match[0][$j]) { - // nocache tag - if ($match[1][$j]) { // closing tag - $level--; - unset($results[$i]); - } else { // opening tag - if ($level++ > 0) unset($results[$i]); - } - $j++; - } elseif ($level > 0) { - unset($results[$i]); - } - } - $params['results'] = implode('', $results); - } - $smarty->_cache_info['cache_serials'] = $smarty->_cache_serials; - - // prepend the cache header info into cache file - $_cache_info = serialize($smarty->_cache_info); - $params['results'] = strlen($_cache_info) . "\n" . $_cache_info . $params['results']; - - if (!empty($smarty->cache_handler_func)) { - // use cache_handler function - call_user_func_array($smarty->cache_handler_func, - array('write', &$smarty, &$params['results'], $params['tpl_file'], $params['cache_id'], $params['compile_id'], $smarty->_cache_info['expires'])); - } else { - // use local cache file - - if(!@is_writable($smarty->cache_dir)) { - // cache_dir not writable, see if it exists - if(!@is_dir($smarty->cache_dir)) { - $smarty->trigger_error('the $cache_dir \'' . $smarty->cache_dir . '\' does not exist, or is not a directory.', E_USER_ERROR); - return false; - } - $smarty->trigger_error('unable to write to $cache_dir \'' . realpath($smarty->cache_dir) . '\'. Be sure $cache_dir is writable by the web server user.', E_USER_ERROR); - return false; - } - - $_auto_id = $smarty->_get_auto_id($params['cache_id'], $params['compile_id']); - $_cache_file = $smarty->_get_auto_filename($smarty->cache_dir, $params['tpl_file'], $_auto_id); - $_params = array('filename' => $_cache_file, 'contents' => $params['results'], 'create_dirs' => true); - require_once(SMARTY_CORE_DIR . 'core.write_file.php'); - smarty_core_write_file($_params, $smarty); - return true; - } -} - -/* vim: set expandtab: */ - -?> diff --git a/lib/Smarty/internals/core.write_compiled_include.php b/lib/Smarty/internals/core.write_compiled_include.php deleted file mode 100644 index c14adb5..0000000 --- a/lib/Smarty/internals/core.write_compiled_include.php +++ /dev/null @@ -1,91 +0,0 @@ -caching && \!\$this->_cache_including\)\: echo \'\{nocache\:('.$params['cache_serial'].')#(\d+)\}\'; endif;'; - $_tag_end = 'if \(\$this->caching && \!\$this->_cache_including\)\: echo \'\{/nocache\:(\\2)#(\\3)\}\'; endif;'; - - preg_match_all('!('.$_tag_start.'(.*)'.$_tag_end.')!Us', - $params['compiled_content'], $_match_source, PREG_SET_ORDER); - - // no nocache-parts found: done - if (count($_match_source)==0) return; - - // convert the matched php-code to functions - $_include_compiled = "_version.", created on ".strftime("%Y-%m-%d %H:%M:%S")."\n"; - $_include_compiled .= " compiled from " . strtr(urlencode($params['resource_name']), array('%2F'=>'/', '%3A'=>':')) . " */\n\n"; - - $_compile_path = $params['include_file_path']; - - $smarty->_cache_serials[$_compile_path] = $params['cache_serial']; - $_include_compiled .= "\$this->_cache_serials['".$_compile_path."'] = '".$params['cache_serial']."';\n\n?>"; - - $_include_compiled .= $params['plugins_code']; - $_include_compiled .= "= 5.0) ? '_smarty' : 'this'; - for ($_i = 0, $_for_max = count($_match_source); $_i < $_for_max; $_i++) { - $_match =& $_match_source[$_i]; - $source = $_match[4]; - if ($this_varname == '_smarty') { - /* rename $this to $_smarty in the sourcecode */ - $tokens = token_get_all('\n"; - - $_params = array('filename' => $_compile_path, - 'contents' => $_include_compiled, 'create_dirs' => true); - - require_once(SMARTY_CORE_DIR . 'core.write_file.php'); - smarty_core_write_file($_params, $smarty); - return true; -} - - -?> diff --git a/lib/Smarty/internals/core.write_compiled_resource.php b/lib/Smarty/internals/core.write_compiled_resource.php deleted file mode 100644 index b902eff..0000000 --- a/lib/Smarty/internals/core.write_compiled_resource.php +++ /dev/null @@ -1,35 +0,0 @@ -compile_dir)) { - // compile_dir not writable, see if it exists - if(!@is_dir($smarty->compile_dir)) { - $smarty->trigger_error('the $compile_dir \'' . $smarty->compile_dir . '\' does not exist, or is not a directory.', E_USER_ERROR); - return false; - } - $smarty->trigger_error('unable to write to $compile_dir \'' . realpath($smarty->compile_dir) . '\'. Be sure $compile_dir is writable by the web server user.', E_USER_ERROR); - return false; - } - - $_params = array('filename' => $params['compile_path'], 'contents' => $params['compiled_content'], 'create_dirs' => true); - require_once(SMARTY_CORE_DIR . 'core.write_file.php'); - smarty_core_write_file($_params, $smarty); - return true; -} - -/* vim: set expandtab: */ - -?> diff --git a/lib/Smarty/internals/core.write_file.php b/lib/Smarty/internals/core.write_file.php deleted file mode 100644 index 8a3a3b3..0000000 --- a/lib/Smarty/internals/core.write_file.php +++ /dev/null @@ -1,54 +0,0 @@ - $_dirname); - require_once(SMARTY_CORE_DIR . 'core.create_dir_structure.php'); - smarty_core_create_dir_structure($_params, $smarty); - } - - // write to tmp file, then rename it to avoid file locking race condition - $_tmp_file = tempnam($_dirname, 'wrt'); - - if (!($fd = @fopen($_tmp_file, 'wb'))) { - $_tmp_file = $_dirname . DIRECTORY_SEPARATOR . uniqid('wrt'); - if (!($fd = @fopen($_tmp_file, 'wb'))) { - $smarty->trigger_error("problem writing temporary file '$_tmp_file'"); - return false; - } - } - - fwrite($fd, $params['contents']); - fclose($fd); - - if (DIRECTORY_SEPARATOR == '\\' || !@rename($_tmp_file, $params['filename'])) { - // On platforms and filesystems that cannot overwrite with rename() - // delete the file before renaming it -- because windows always suffers - // this, it is short-circuited to avoid the initial rename() attempt - @unlink($params['filename']); - @rename($_tmp_file, $params['filename']); - } - @chmod($params['filename'], $smarty->_file_perms); - - return true; -} - -/* vim: set expandtab: */ - -?> \ No newline at end of file diff --git a/lib/Smarty/libs/Smarty.class.php b/lib/Smarty/libs/Smarty.class.php new file mode 100644 index 0000000..6d79fd9 --- /dev/null +++ b/lib/Smarty/libs/Smarty.class.php @@ -0,0 +1,45 @@ +testInstall(); // +///////////////////////////////////////////////////////////////////// + + error_reporting(E_ALL); + +define('__SMARTY_DIR', BASE_DIR . '/lib/Smarty/src/'); + +// Global function declarations +//require_once(__SMARTY_DIR . "/functions.php"); +require(BASE_DIR . '/lib/Smarty/src/functions.php'); + +spl_autoload_register(function ($class) { + // Class prefix + $prefix = 'Smarty\\'; + + // Does the class use the namespace prefix? + $len = strlen($prefix); + if (strncmp($prefix, $class, $len) !== 0) { + // If not, move to the next registered autoloader + return; + } + + // Hack off the prefix part + $relative_class = substr($class, $len); + + // Build a path to the include file + $file = __SMARTY_DIR . str_replace('\\', '/', $relative_class) . '.php'; + + // If the file exists, require it + if (file_exists($file)) { + require_once($file); + } +}); diff --git a/lib/Smarty/plugins/block.textformat.php b/lib/Smarty/plugins/block.textformat.php deleted file mode 100644 index 8cd010a..0000000 --- a/lib/Smarty/plugins/block.textformat.php +++ /dev/null @@ -1,103 +0,0 @@ - - * Name: textformat
          - * Purpose: format text a certain way with preset styles - * or custom wrap/indent settings
          - * @link http://smarty.php.net/manual/en/language.function.textformat.php {textformat} - * (Smarty online manual) - * @param array - *
          - * Params:   style: string (email)
          - *           indent: integer (0)
          - *           wrap: integer (80)
          - *           wrap_char string ("\n")
          - *           indent_char: string (" ")
          - *           wrap_boundary: boolean (true)
          - * 
          - * @author Monte Ohrt - * @param string contents of the block - * @param Smarty clever simulation of a method - * @return string string $content re-formatted - */ -function smarty_block_textformat($params, $content, &$smarty) -{ - if (is_null($content)) { - return; - } - - $style = null; - $indent = 0; - $indent_first = 0; - $indent_char = ' '; - $wrap = 80; - $wrap_char = "\n"; - $wrap_cut = false; - $assign = null; - - foreach ($params as $_key => $_val) { - switch ($_key) { - case 'style': - case 'indent_char': - case 'wrap_char': - case 'assign': - $$_key = (string)$_val; - break; - - case 'indent': - case 'indent_first': - case 'wrap': - $$_key = (int)$_val; - break; - - case 'wrap_cut': - $$_key = (bool)$_val; - break; - - default: - $smarty->trigger_error("textformat: unknown attribute '$_key'"); - } - } - - if ($style == 'email') { - $wrap = 72; - } - - // split into paragraphs - $_paragraphs = preg_split('![\r\n][\r\n]!',$content); - $_output = ''; - - for($_x = 0, $_y = count($_paragraphs); $_x < $_y; $_x++) { - if ($_paragraphs[$_x] == '') { - continue; - } - // convert mult. spaces & special chars to single space - $_paragraphs[$_x] = preg_replace(array('!\s+!','!(^\s+)|(\s+$)!'), array(' ',''), $_paragraphs[$_x]); - // indent first line - if($indent_first > 0) { - $_paragraphs[$_x] = str_repeat($indent_char, $indent_first) . $_paragraphs[$_x]; - } - // wordwrap sentences - $_paragraphs[$_x] = wordwrap($_paragraphs[$_x], $wrap - $indent, $wrap_char, $wrap_cut); - // indent lines - if($indent > 0) { - $_paragraphs[$_x] = preg_replace('!^!m', str_repeat($indent_char, $indent), $_paragraphs[$_x]); - } - } - $_output = implode($wrap_char . $wrap_char, $_paragraphs); - - return $assign ? $smarty->assign($assign, $_output) : $_output; - -} - -/* vim: set expandtab: */ - -?> diff --git a/lib/Smarty/plugins/compiler.assign.php b/lib/Smarty/plugins/compiler.assign.php deleted file mode 100644 index abef377..0000000 --- a/lib/Smarty/plugins/compiler.assign.php +++ /dev/null @@ -1,40 +0,0 @@ - - * Name: assign
          - * Purpose: assign a value to a template variable - * @link http://smarty.php.net/manual/en/language.custom.functions.php#LANGUAGE.FUNCTION.ASSIGN {assign} - * (Smarty online manual) - * @author Monte Ohrt (initial author) - * @author messju mohr (conversion to compiler function) - * @param string containing var-attribute and value-attribute - * @param Smarty_Compiler - */ -function smarty_compiler_assign($tag_attrs, &$compiler) -{ - $_params = $compiler->_parse_attrs($tag_attrs); - - if (!isset($_params['var'])) { - $compiler->_syntax_error("assign: missing 'var' parameter", E_USER_WARNING); - return; - } - - if (!isset($_params['value'])) { - $compiler->_syntax_error("assign: missing 'value' parameter", E_USER_WARNING); - return; - } - - return "\$this->assign({$_params['var']}, {$_params['value']});"; -} - -/* vim: set expandtab: */ - -?> diff --git a/lib/Smarty/plugins/function.assign_debug_info.php b/lib/Smarty/plugins/function.assign_debug_info.php deleted file mode 100644 index 6540498..0000000 --- a/lib/Smarty/plugins/function.assign_debug_info.php +++ /dev/null @@ -1,40 +0,0 @@ - - * Name: assign_debug_info
          - * Purpose: assign debug info to the template
          - * @author Monte Ohrt - * @param array unused in this plugin, this plugin uses {@link Smarty::$_config}, - * {@link Smarty::$_tpl_vars} and {@link Smarty::$_smarty_debug_info} - * @param Smarty - */ -function smarty_function_assign_debug_info($params, &$smarty) -{ - $assigned_vars = $smarty->_tpl_vars; - ksort($assigned_vars); - if (@is_array($smarty->_config[0])) { - $config_vars = $smarty->_config[0]; - ksort($config_vars); - $smarty->assign("_debug_config_keys", array_keys($config_vars)); - $smarty->assign("_debug_config_vals", array_values($config_vars)); - } - - $included_templates = $smarty->_smarty_debug_info; - - $smarty->assign("_debug_keys", array_keys($assigned_vars)); - $smarty->assign("_debug_vals", array_values($assigned_vars)); - - $smarty->assign("_debug_tpls", $included_templates); -} - -/* vim: set expandtab: */ - -?> diff --git a/lib/Smarty/plugins/function.config_load.php b/lib/Smarty/plugins/function.config_load.php deleted file mode 100644 index db89f63..0000000 --- a/lib/Smarty/plugins/function.config_load.php +++ /dev/null @@ -1,142 +0,0 @@ - - * Name: config_load
          - * Purpose: load config file vars - * @link http://smarty.php.net/manual/en/language.function.config.load.php {config_load} - * (Smarty online manual) - * @author Monte Ohrt - * @author messju mohr (added use of resources) - * @param array Format: - *
          - * array('file' => required config file name,
          - *       'section' => optional config file section to load
          - *       'scope' => local/parent/global
          - *       'global' => overrides scope, setting to parent if true)
          - * 
          - * @param Smarty - */ -function smarty_function_config_load($params, &$smarty) -{ - if ($smarty->debugging) { - $_params = array(); - require_once(SMARTY_CORE_DIR . 'core.get_microtime.php'); - $_debug_start_time = smarty_core_get_microtime($_params, $smarty); - } - - $_file = isset($params['file']) ? $smarty->_dequote($params['file']) : null; - $_section = isset($params['section']) ? $smarty->_dequote($params['section']) : null; - $_scope = isset($params['scope']) ? $smarty->_dequote($params['scope']) : 'global'; - $_global = isset($params['global']) ? $smarty->_dequote($params['global']) : false; - - if (!isset($_file) || strlen($_file) == 0) { - $smarty->trigger_error("missing 'file' attribute in config_load tag", E_USER_ERROR, __FILE__, __LINE__); - } - - if (isset($_scope)) { - if ($_scope != 'local' && - $_scope != 'parent' && - $_scope != 'global') { - $smarty->trigger_error("invalid 'scope' attribute value", E_USER_ERROR, __FILE__, __LINE__); - } - } else { - if ($_global) { - $_scope = 'parent'; - } else { - $_scope = 'local'; - } - } - - $_params = array('resource_name' => $_file, - 'resource_base_path' => $smarty->config_dir, - 'get_source' => false); - $smarty->_parse_resource_name($_params); - $_file_path = $_params['resource_type'] . ':' . $_params['resource_name']; - if (isset($_section)) - $_compile_file = $smarty->_get_compile_path($_file_path.'|'.$_section); - else - $_compile_file = $smarty->_get_compile_path($_file_path); - - if($smarty->force_compile || !file_exists($_compile_file)) { - $_compile = true; - } elseif ($smarty->compile_check) { - $_params = array('resource_name' => $_file, - 'resource_base_path' => $smarty->config_dir, - 'get_source' => false); - $_compile = $smarty->_fetch_resource_info($_params) && - $_params['resource_timestamp'] > filemtime($_compile_file); - } else { - $_compile = false; - } - - if($_compile) { - // compile config file - if(!is_object($smarty->_conf_obj)) { - require_once SMARTY_DIR . $smarty->config_class . '.class.php'; - $smarty->_conf_obj = new $smarty->config_class(); - $smarty->_conf_obj->overwrite = $smarty->config_overwrite; - $smarty->_conf_obj->booleanize = $smarty->config_booleanize; - $smarty->_conf_obj->read_hidden = $smarty->config_read_hidden; - $smarty->_conf_obj->fix_newlines = $smarty->config_fix_newlines; - } - - $_params = array('resource_name' => $_file, - 'resource_base_path' => $smarty->config_dir, - $_params['get_source'] = true); - if (!$smarty->_fetch_resource_info($_params)) { - return; - } - $smarty->_conf_obj->set_file_contents($_file, $_params['source_content']); - $_config_vars = array_merge($smarty->_conf_obj->get($_file), - $smarty->_conf_obj->get($_file, $_section)); - if(function_exists('var_export')) { - $_output = ''; - } else { - $_output = ''\\\'', '\\'=>'\\\\')) . '\'); ?>'; - } - $_params = (array('compile_path' => $_compile_file, 'compiled_content' => $_output, 'resource_timestamp' => $_params['resource_timestamp'])); - require_once(SMARTY_CORE_DIR . 'core.write_compiled_resource.php'); - smarty_core_write_compiled_resource($_params, $smarty); - } else { - include($_compile_file); - } - - if ($smarty->caching) { - $smarty->_cache_info['config'][$_file] = true; - } - - $smarty->_config[0]['vars'] = @array_merge($smarty->_config[0]['vars'], $_config_vars); - $smarty->_config[0]['files'][$_file] = true; - - if ($_scope == 'parent') { - $smarty->_config[1]['vars'] = @array_merge($smarty->_config[1]['vars'], $_config_vars); - $smarty->_config[1]['files'][$_file] = true; - } else if ($_scope == 'global') { - for ($i = 1, $for_max = count($smarty->_config); $i < $for_max; $i++) { - $smarty->_config[$i]['vars'] = @array_merge($smarty->_config[$i]['vars'], $_config_vars); - $smarty->_config[$i]['files'][$_file] = true; - } - } - - if ($smarty->debugging) { - $_params = array(); - require_once(SMARTY_CORE_DIR . 'core.get_microtime.php'); - $smarty->_smarty_debug_info[] = array('type' => 'config', - 'filename' => $_file.' ['.$_section.'] '.$_scope, - 'depth' => $smarty->_inclusion_depth, - 'exec_time' => smarty_core_get_microtime($_params, $smarty) - $_debug_start_time); - } - -} - -/* vim: set expandtab: */ - -?> diff --git a/lib/Smarty/plugins/function.counter.php b/lib/Smarty/plugins/function.counter.php deleted file mode 100644 index 1f26db5..0000000 --- a/lib/Smarty/plugins/function.counter.php +++ /dev/null @@ -1,80 +0,0 @@ - - * Name: counter
          - * Purpose: print out a counter value - * @author Monte Ohrt - * @link http://smarty.php.net/manual/en/language.function.counter.php {counter} - * (Smarty online manual) - * @param array parameters - * @param Smarty - * @return string|null - */ -function smarty_function_counter($params, &$smarty) -{ - static $counters = array(); - - $name = (isset($params['name'])) ? $params['name'] : 'default'; - if (!isset($counters[$name])) { - $counters[$name] = array( - 'start'=>1, - 'skip'=>1, - 'direction'=>'up', - 'count'=>1 - ); - } - $counter =& $counters[$name]; - - if (isset($params['start'])) { - $counter['start'] = $counter['count'] = (int)$params['start']; - } - - if (!empty($params['assign'])) { - $counter['assign'] = $params['assign']; - } - - if (isset($counter['assign'])) { - $smarty->assign($counter['assign'], $counter['count']); - } - - if (isset($params['print'])) { - $print = (bool)$params['print']; - } else { - $print = empty($counter['assign']); - } - - if ($print) { - $retval = $counter['count']; - } else { - $retval = null; - } - - if (isset($params['skip'])) { - $counter['skip'] = $params['skip']; - } - - if (isset($params['direction'])) { - $counter['direction'] = $params['direction']; - } - - if ($counter['direction'] == "down") - $counter['count'] -= $counter['skip']; - else - $counter['count'] += $counter['skip']; - - return $retval; - -} - -/* vim: set expandtab: */ - -?> diff --git a/lib/Smarty/plugins/function.cycle.php b/lib/Smarty/plugins/function.cycle.php deleted file mode 100644 index 80378b7..0000000 --- a/lib/Smarty/plugins/function.cycle.php +++ /dev/null @@ -1,106 +0,0 @@ - - * Name: cycle
          - * Date: May 3, 2002
          - * Purpose: cycle through given values
          - * Input: - * - name = name of cycle (optional) - * - values = comma separated list of values to cycle, - * or an array of values to cycle - * (this can be left out for subsequent calls) - * - reset = boolean - resets given var to true - * - print = boolean - print var or not. default is true - * - advance = boolean - whether or not to advance the cycle - * - delimiter = the value delimiter, default is "," - * - assign = boolean, assigns to template var instead of - * printed. - * - * Examples:
          - *
          - * {cycle values="#eeeeee,#d0d0d0d"}
          - * {cycle name=row values="one,two,three" reset=true}
          - * {cycle name=row}
          - * 
          - * @link http://smarty.php.net/manual/en/language.function.cycle.php {cycle} - * (Smarty online manual) - * @author Monte Ohrt - * @author credit to Mark Priatel - * @author credit to Gerard - * @author credit to Jason Sweat - * @version 1.3 - * @param array - * @param Smarty - * @return string|null - */ -function smarty_function_cycle($params, &$smarty) -{ - static $cycle_vars; - - $name = (empty($params['name'])) ? 'default' : $params['name']; - $print = (isset($params['print'])) ? (bool)$params['print'] : true; - $advance = (isset($params['advance'])) ? (bool)$params['advance'] : true; - $reset = (isset($params['reset'])) ? (bool)$params['reset'] : false; - - if (!in_array('values', array_keys($params))) { - if(!isset($cycle_vars[$name]['values'])) { - $smarty->trigger_error("cycle: missing 'values' parameter"); - return; - } - } else { - if(isset($cycle_vars[$name]['values']) - && $cycle_vars[$name]['values'] != $params['values'] ) { - $cycle_vars[$name]['index'] = 0; - } - $cycle_vars[$name]['values'] = $params['values']; - } - - if (isset($params['delimiter'])) { - $cycle_vars[$name]['delimiter'] = $params['delimiter']; - } elseif (!isset($cycle_vars[$name]['delimiter'])) { - $cycle_vars[$name]['delimiter'] = ','; - } - - if(is_array($cycle_vars[$name]['values'])) { - $cycle_array = $cycle_vars[$name]['values']; - } else { - $cycle_array = explode($cycle_vars[$name]['delimiter'],$cycle_vars[$name]['values']); - } - - if(!isset($cycle_vars[$name]['index']) || $reset ) { - $cycle_vars[$name]['index'] = 0; - } - - if (isset($params['assign'])) { - $print = false; - $smarty->assign($params['assign'], $cycle_array[$cycle_vars[$name]['index']]); - } - - if($print) { - $retval = $cycle_array[$cycle_vars[$name]['index']]; - } else { - $retval = null; - } - - if($advance) { - if ( $cycle_vars[$name]['index'] >= count($cycle_array) -1 ) { - $cycle_vars[$name]['index'] = 0; - } else { - $cycle_vars[$name]['index']++; - } - } - - return $retval; -} - -/* vim: set expandtab: */ - -?> diff --git a/lib/Smarty/plugins/function.debug.php b/lib/Smarty/plugins/function.debug.php deleted file mode 100644 index 4345230..0000000 --- a/lib/Smarty/plugins/function.debug.php +++ /dev/null @@ -1,35 +0,0 @@ - - * Name: debug
          - * Date: July 1, 2002
          - * Purpose: popup debug window - * @link http://smarty.php.net/manual/en/language.function.debug.php {debug} - * (Smarty online manual) - * @author Monte Ohrt - * @version 1.0 - * @param array - * @param Smarty - * @return string output from {@link Smarty::_generate_debug_output()} - */ -function smarty_function_debug($params, &$smarty) -{ - if (isset($params['output'])) { - $smarty->assign('_smarty_debug_output', $params['output']); - } - require_once(SMARTY_CORE_DIR . 'core.display_debug_console.php'); - return smarty_core_display_debug_console(null, $smarty); -} - -/* vim: set expandtab: */ - -?> diff --git a/lib/Smarty/plugins/function.eval.php b/lib/Smarty/plugins/function.eval.php deleted file mode 100644 index ff0472d..0000000 --- a/lib/Smarty/plugins/function.eval.php +++ /dev/null @@ -1,49 +0,0 @@ - - * Name: eval
          - * Purpose: evaluate a template variable as a template
          - * @link http://smarty.php.net/manual/en/language.function.eval.php {eval} - * (Smarty online manual) - * @author Monte Ohrt - * @param array - * @param Smarty - */ -function smarty_function_eval($params, &$smarty) -{ - - if (!isset($params['var'])) { - $smarty->trigger_error("eval: missing 'var' parameter"); - return; - } - - if($params['var'] == '') { - return; - } - - $smarty->_compile_source('evaluated template', $params['var'], $_var_compiled); - - ob_start(); - $smarty->_eval('?>' . $_var_compiled); - $_contents = ob_get_contents(); - ob_end_clean(); - - if (!empty($params['assign'])) { - $smarty->assign($params['assign'], $_contents); - } else { - return $_contents; - } -} - -/* vim: set expandtab: */ - -?> diff --git a/lib/Smarty/plugins/function.fetch.php b/lib/Smarty/plugins/function.fetch.php deleted file mode 100644 index d72c7b1..0000000 --- a/lib/Smarty/plugins/function.fetch.php +++ /dev/null @@ -1,221 +0,0 @@ - - * Name: fetch
          - * Purpose: fetch file, web or ftp data and display results - * @link http://smarty.php.net/manual/en/language.function.fetch.php {fetch} - * (Smarty online manual) - * @author Monte Ohrt - * @param array - * @param Smarty - * @return string|null if the assign parameter is passed, Smarty assigns the - * result to a template variable - */ -function smarty_function_fetch($params, &$smarty) -{ - if (empty($params['file'])) { - $smarty->_trigger_fatal_error("[plugin] parameter 'file' cannot be empty"); - return; - } - - $content = ''; - if ($smarty->security && !preg_match('!^(http|ftp)://!i', $params['file'])) { - $_params = array('resource_type' => 'file', 'resource_name' => $params['file']); - require_once(SMARTY_CORE_DIR . 'core.is_secure.php'); - if(!smarty_core_is_secure($_params, $smarty)) { - $smarty->_trigger_fatal_error('[plugin] (secure mode) fetch \'' . $params['file'] . '\' is not allowed'); - return; - } - - // fetch the file - if($fp = @fopen($params['file'],'r')) { - while(!feof($fp)) { - $content .= fgets ($fp,4096); - } - fclose($fp); - } else { - $smarty->_trigger_fatal_error('[plugin] fetch cannot read file \'' . $params['file'] . '\''); - return; - } - } else { - // not a local file - if(preg_match('!^http://!i',$params['file'])) { - // http fetch - if($uri_parts = parse_url($params['file'])) { - // set defaults - $host = $server_name = $uri_parts['host']; - $timeout = 30; - $accept = "image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, */*"; - $agent = "Smarty Template Engine ".$smarty->_version; - $referer = ""; - $uri = !empty($uri_parts['path']) ? $uri_parts['path'] : '/'; - $uri .= !empty($uri_parts['query']) ? '?' . $uri_parts['query'] : ''; - $_is_proxy = false; - if(empty($uri_parts['port'])) { - $port = 80; - } else { - $port = $uri_parts['port']; - } - if(!empty($uri_parts['user'])) { - $user = $uri_parts['user']; - } - if(!empty($uri_parts['pass'])) { - $pass = $uri_parts['pass']; - } - // loop through parameters, setup headers - foreach($params as $param_key => $param_value) { - switch($param_key) { - case "file": - case "assign": - case "assign_headers": - break; - case "user": - if(!empty($param_value)) { - $user = $param_value; - } - break; - case "pass": - if(!empty($param_value)) { - $pass = $param_value; - } - break; - case "accept": - if(!empty($param_value)) { - $accept = $param_value; - } - break; - case "header": - if(!empty($param_value)) { - if(!preg_match('![\w\d-]+: .+!',$param_value)) { - $smarty->_trigger_fatal_error("[plugin] invalid header format '".$param_value."'"); - return; - } else { - $extra_headers[] = $param_value; - } - } - break; - case "proxy_host": - if(!empty($param_value)) { - $proxy_host = $param_value; - } - break; - case "proxy_port": - if(!preg_match('!\D!', $param_value)) { - $proxy_port = (int) $param_value; - } else { - $smarty->_trigger_fatal_error("[plugin] invalid value for attribute '".$param_key."'"); - return; - } - break; - case "agent": - if(!empty($param_value)) { - $agent = $param_value; - } - break; - case "referer": - if(!empty($param_value)) { - $referer = $param_value; - } - break; - case "timeout": - if(!preg_match('!\D!', $param_value)) { - $timeout = (int) $param_value; - } else { - $smarty->_trigger_fatal_error("[plugin] invalid value for attribute '".$param_key."'"); - return; - } - break; - default: - $smarty->_trigger_fatal_error("[plugin] unrecognized attribute '".$param_key."'"); - return; - } - } - if(!empty($proxy_host) && !empty($proxy_port)) { - $_is_proxy = true; - $fp = fsockopen($proxy_host,$proxy_port,$errno,$errstr,$timeout); - } else { - $fp = fsockopen($server_name,$port,$errno,$errstr,$timeout); - } - - if(!$fp) { - $smarty->_trigger_fatal_error("[plugin] unable to fetch: $errstr ($errno)"); - return; - } else { - if($_is_proxy) { - fputs($fp, 'GET ' . $params['file'] . " HTTP/1.0\r\n"); - } else { - fputs($fp, "GET $uri HTTP/1.0\r\n"); - } - if(!empty($host)) { - fputs($fp, "Host: $host\r\n"); - } - if(!empty($accept)) { - fputs($fp, "Accept: $accept\r\n"); - } - if(!empty($agent)) { - fputs($fp, "User-Agent: $agent\r\n"); - } - if(!empty($referer)) { - fputs($fp, "Referer: $referer\r\n"); - } - if(isset($extra_headers) && is_array($extra_headers)) { - foreach($extra_headers as $curr_header) { - fputs($fp, $curr_header."\r\n"); - } - } - if(!empty($user) && !empty($pass)) { - fputs($fp, "Authorization: BASIC ".base64_encode("$user:$pass")."\r\n"); - } - - fputs($fp, "\r\n"); - while(!feof($fp)) { - $content .= fgets($fp,4096); - } - fclose($fp); - $csplit = preg_split("!\r\n\r\n!",$content,2); - - $content = $csplit[1]; - - if(!empty($params['assign_headers'])) { - $smarty->assign($params['assign_headers'],preg_split("!\r\n!",$csplit[0])); - } - } - } else { - $smarty->_trigger_fatal_error("[plugin] unable to parse URL, check syntax"); - return; - } - } else { - // ftp fetch - if($fp = @fopen($params['file'],'r')) { - while(!feof($fp)) { - $content .= fgets ($fp,4096); - } - fclose($fp); - } else { - $smarty->_trigger_fatal_error('[plugin] fetch cannot read file \'' . $params['file'] .'\''); - return; - } - } - - } - - - if (!empty($params['assign'])) { - $smarty->assign($params['assign'],$content); - } else { - return $content; - } -} - -/* vim: set expandtab: */ - -?> diff --git a/lib/Smarty/plugins/function.html_checkboxes.php b/lib/Smarty/plugins/function.html_checkboxes.php deleted file mode 100644 index ed8ad7f..0000000 --- a/lib/Smarty/plugins/function.html_checkboxes.php +++ /dev/null @@ -1,143 +0,0 @@ - - * Type: function
          - * Name: html_checkboxes
          - * Date: 24.Feb.2003
          - * Purpose: Prints out a list of checkbox input types
          - * Input:
          - * - name (optional) - string default "checkbox" - * - values (required) - array - * - options (optional) - associative array - * - checked (optional) - array default not set - * - separator (optional) - ie
          or   - * - output (optional) - the output next to each checkbox - * - assign (optional) - assign the output as an array to this variable - * Examples: - *
          - * {html_checkboxes values=$ids output=$names}
          - * {html_checkboxes values=$ids name='box' separator='
          ' output=$names} - * {html_checkboxes values=$ids checked=$checked separator='
          ' output=$names} - *
          - * @link http://smarty.php.net/manual/en/language.function.html.checkboxes.php {html_checkboxes} - * (Smarty online manual) - * @author Christopher Kvarme - * @author credits to Monte Ohrt - * @version 1.0 - * @param array - * @param Smarty - * @return string - * @uses smarty_function_escape_special_chars() - */ -function smarty_function_html_checkboxes($params, &$smarty) -{ - require_once $smarty->_get_plugin_filepath('shared','escape_special_chars'); - - $name = 'checkbox'; - $values = null; - $options = null; - $selected = null; - $separator = ''; - $labels = true; - $output = null; - - $extra = ''; - - foreach($params as $_key => $_val) { - switch($_key) { - case 'name': - case 'separator': - $$_key = $_val; - break; - - case 'labels': - $$_key = (bool)$_val; - break; - - case 'options': - $$_key = (array)$_val; - break; - - case 'values': - case 'output': - $$_key = array_values((array)$_val); - break; - - case 'checked': - case 'selected': - $selected = array_map('strval', array_values((array)$_val)); - break; - - case 'checkboxes': - $smarty->trigger_error('html_checkboxes: the use of the "checkboxes" attribute is deprecated, use "options" instead', E_USER_WARNING); - $options = (array)$_val; - break; - - case 'assign': - break; - - default: - if(!is_array($_val)) { - $extra .= ' '.$_key.'="'.smarty_function_escape_special_chars($_val).'"'; - } else { - $smarty->trigger_error("html_checkboxes: extra attribute '$_key' cannot be an array", E_USER_NOTICE); - } - break; - } - } - - if (!isset($options) && !isset($values)) - return ''; /* raise error here? */ - - settype($selected, 'array'); - $_html_result = array(); - - if (isset($options)) { - - foreach ($options as $_key=>$_val) - $_html_result[] = smarty_function_html_checkboxes_output($name, $_key, $_val, $selected, $extra, $separator, $labels); - - - } else { - foreach ($values as $_i=>$_key) { - $_val = isset($output[$_i]) ? $output[$_i] : ''; - $_html_result[] = smarty_function_html_checkboxes_output($name, $_key, $_val, $selected, $extra, $separator, $labels); - } - - } - - if(!empty($params['assign'])) { - $smarty->assign($params['assign'], $_html_result); - } else { - return implode("\n",$_html_result); - } - -} - -function smarty_function_html_checkboxes_output($name, $value, $output, $selected, $extra, $separator, $labels) { - $_output = ''; - if ($labels) $_output .= ''; - $_output .= $separator; - - return $_output; -} - -?> diff --git a/lib/Smarty/plugins/function.html_image.php b/lib/Smarty/plugins/function.html_image.php deleted file mode 100644 index 9abae72..0000000 --- a/lib/Smarty/plugins/function.html_image.php +++ /dev/null @@ -1,142 +0,0 @@ - - * Name: html_image
          - * Date: Feb 24, 2003
          - * Purpose: format HTML tags for the image
          - * Input:
          - * - file = file (and path) of image (required) - * - height = image height (optional, default actual height) - * - width = image width (optional, default actual width) - * - basedir = base directory for absolute paths, default - * is environment variable DOCUMENT_ROOT - * - path_prefix = prefix for path output (optional, default empty) - * - * Examples: {html_image file="/images/masthead.gif"} - * Output: - * @link http://smarty.php.net/manual/en/language.function.html.image.php {html_image} - * (Smarty online manual) - * @author Monte Ohrt - * @author credits to Duda - wrote first image function - * in repository, helped with lots of functionality - * @version 1.0 - * @param array - * @param Smarty - * @return string - * @uses smarty_function_escape_special_chars() - */ -function smarty_function_html_image($params, &$smarty) -{ - require_once $smarty->_get_plugin_filepath('shared','escape_special_chars'); - - $alt = ''; - $file = ''; - $height = ''; - $width = ''; - $extra = ''; - $prefix = ''; - $suffix = ''; - $path_prefix = ''; - $server_vars = ($smarty->request_use_auto_globals) ? $_SERVER : $GLOBALS['HTTP_SERVER_VARS']; - $basedir = isset($server_vars['DOCUMENT_ROOT']) ? $server_vars['DOCUMENT_ROOT'] : ''; - foreach($params as $_key => $_val) { - switch($_key) { - case 'file': - case 'height': - case 'width': - case 'dpi': - case 'path_prefix': - case 'basedir': - $$_key = $_val; - break; - - case 'alt': - if(!is_array($_val)) { - $$_key = smarty_function_escape_special_chars($_val); - } else { - $smarty->trigger_error("html_image: extra attribute '$_key' cannot be an array", E_USER_NOTICE); - } - break; - - case 'link': - case 'href': - $prefix = ''; - $suffix = ''; - break; - - default: - if(!is_array($_val)) { - $extra .= ' '.$_key.'="'.smarty_function_escape_special_chars($_val).'"'; - } else { - $smarty->trigger_error("html_image: extra attribute '$_key' cannot be an array", E_USER_NOTICE); - } - break; - } - } - - if (empty($file)) { - $smarty->trigger_error("html_image: missing 'file' parameter", E_USER_NOTICE); - return; - } - - if (substr($file,0,1) == '/') { - $_image_path = $basedir . $file; - } else { - $_image_path = $file; - } - - if(!isset($params['width']) || !isset($params['height'])) { - if(!$_image_data = @getimagesize($_image_path)) { - if(!file_exists($_image_path)) { - $smarty->trigger_error("html_image: unable to find '$_image_path'", E_USER_NOTICE); - return; - } else if(!is_readable($_image_path)) { - $smarty->trigger_error("html_image: unable to read '$_image_path'", E_USER_NOTICE); - return; - } else { - $smarty->trigger_error("html_image: '$_image_path' is not a valid image file", E_USER_NOTICE); - return; - } - } - if ($smarty->security && - ($_params = array('resource_type' => 'file', 'resource_name' => $_image_path)) && - (require_once(SMARTY_CORE_DIR . 'core.is_secure.php')) && - (!smarty_core_is_secure($_params, $smarty)) ) { - $smarty->trigger_error("html_image: (secure) '$_image_path' not in secure directory", E_USER_NOTICE); - } - - if(!isset($params['width'])) { - $width = $_image_data[0]; - } - if(!isset($params['height'])) { - $height = $_image_data[1]; - } - - } - - if(isset($params['dpi'])) { - if(strstr($server_vars['HTTP_USER_AGENT'], 'Mac')) { - $dpi_default = 72; - } else { - $dpi_default = 96; - } - $_resize = $dpi_default/$params['dpi']; - $width = round($width * $_resize); - $height = round($height * $_resize); - } - - return $prefix . ''.$alt.'' . $suffix; -} - -/* vim: set expandtab: */ - -?> diff --git a/lib/Smarty/plugins/function.html_options.php b/lib/Smarty/plugins/function.html_options.php deleted file mode 100644 index cebadde..0000000 --- a/lib/Smarty/plugins/function.html_options.php +++ /dev/null @@ -1,122 +0,0 @@ - - * Name: html_options
          - * Input:
          - * - name (optional) - string default "select" - * - values (required if no options supplied) - array - * - options (required if no values supplied) - associative array - * - selected (optional) - string default not set - * - output (required if not options supplied) - array - * Purpose: Prints the list of