// === Редизайн 2026 (Шаг 5): условие привязки шаблона cp2026 === // b_site_template.CONDITION — varchar(255), длинное выражение обрезается молча. // Вся логика — здесь, в условии записи вызывается только cp2026TemplateCondition(). // Исключения — легаси-страницы без аналога в новом дизайне (остаются на старом шаблоне). if (!function_exists('cp2026TemplateCondition')) { function cp2026TemplateCondition() { if (CSite::InDir('/about/howto/') || CSite::InDir('/about/vyberi-kupon-na-skidku-sam/')) return false; if ($_SERVER['SCRIPT_NAME'] === '/index.php' && CSite::InDir('/')) return true; // главная if ($_SERVER['SCRIPT_NAME'] === '/cookies.php') // статичная страница «Cookies» — на новом шаблоне return true; $cpDirs = array('/catalog/', '/about/', '/service/', '/actions/', '/articles/', '/portfolio/', '/personal/', '/privacy/', '/news/', '/reviews/', '/auth/', '/search/'); foreach ($cpDirs as $cpDir) { if (CSite::InDir($cpDir)) return true; } return false; } } // === Редизайн 2026: поздняя подстановка og:image (шаблон cp2026) === // header.php шаблона выводит meta og:image с маркером CP_OGIMAGE_PLACEHOLDER, // т.к. к моменту рендера компоненты ещё не выполнились. Здесь, в конце // буфера, подставляем финальное значение свойства og:image (fallback — логотип). if (!function_exists('cp2026OgImageBuffer')) { function cp2026OgImageBuffer(&$content) { if (strpos($content, 'CP_OGIMAGE_PLACEHOLDER') === false) return; global $APPLICATION; $img = is_object($APPLICATION) ? trim((string)$APPLICATION->GetPageProperty('og:image')) : ''; if ($img === '') $img = SITE_TEMPLATE_PATH . '/assets/img/cp-logo.png'; if (strpos($img, 'http') !== 0) $img = 'https://' . $_SERVER['HTTP_HOST'] . $img; $content = str_replace('CP_OGIMAGE_PLACEHOLDER', htmlspecialcharsbx($img), $content); } } AddEventHandler('main', 'OnEndBufferContent', 'cp2026OgImageBuffer'); // === Фикс: массовое редактирование цен в гриде каталога (iblock_list_admin) === // Причина: security-правка в main 26.x (CAdminUiList::EditAction, interface/admin_ui_list.php) // отбрасывает custom-поля грида, чьи имена НЕ начинаются с FIELDS[...]. Редактор цен // (AddMoneyField) шлёт пары name/value с именами вида CATALOG_PRICE[ID][TYPE], поэтому // цены молча теряются, а iblock_list_admin.php ждёт их в $_POST['CATALOG_*'] верхнего // уровня — элемент при этом сохраняется, цена нет. // Решение: до обработки гридом восстанавливаем $_POST['CATALOG_*'] из *_custom пар. // Vendor-код не трогаем. Права на правку цен по-прежнему проверяет ядро // ($boolCatalogPrice + element_edit_price на каждый элемент). if (!function_exists('cpFixGridCatalogPrices')) { function cpFixGridCatalogPrices() { @file_put_contents('/cp_probe.log', date('H:i:s') . ' ' . ($_SERVER['SCRIPT_NAME'] ?? '-') . ' method=' . ($_SERVER['REQUEST_METHOD'] ?? '-') . ' fields=' . (isset($_POST['FIELDS']) ? 'Y' : 'N') . ' cats=' . (isset($_POST['CATALOG_PRICE']) ? 'Y' : 'N') . " ", FILE_APPEND); if (($_SERVER['REQUEST_METHOD'] ?? '') !== 'POST') return; if (strpos($_SERVER['SCRIPT_NAME'] ?? '', '/bitrix/admin/') === false) return; if (empty($_POST['FIELDS']) || !is_array($_POST['FIELDS'])) return; foreach ($_POST['FIELDS'] as $rowId => $fields) { if (!is_array($fields)) continue; foreach ($fields as $colKey => $pairs) { if (!is_array($pairs) || stripos((string)$colKey, '_custom') === false) continue; foreach ($pairs as $pair) { if (!is_array($pair) || !isset($pair['name'], $pair['value'])) continue; $name = (string)$pair['name']; // только CATALOG_*[число] или CATALOG_*[число][число] — никаких произвольных ключей if (!preg_match('/^(CATALOG_[A-Z_]+)((?:\[\d+\]){1,2})$/', $name, $m)) continue; preg_match_all('/\[(\d+)\]/', $m[2], $km); $keys = $km[1]; $ref = &$_POST[$m[1]]; foreach ($keys as $i => $k) { $k = (int)$k; if ($i === count($keys) - 1) { $ref[$k] = $pair['value']; } else { if (!isset($ref[$k]) || !is_array($ref[$k])) $ref[$k] = []; $ref = &$ref[$k]; } } unset($ref); } } } } } AddEventHandler('main', 'OnPageStart', 'cpFixGridCatalogPrices'); @file_put_contents('/cp_probe.log', date('H:i:s') . ' INIT_LOADED ' . ($_SERVER['SCRIPT_NAME'] ?? '-') . " ", FILE_APPEND);
[RuntimeException] 
Could not start session because headers have already been sent. "/var/www/centrparketa/data/www/xn----8sbarc3asrhdrh5b.xn--p1ai/local/php_interface/init.php":79. (0)
/var/www/centrparketa/data/www/xn----8sbarc3asrhdrh5b.xn--p1ai/bitrix/modules/main/lib/Session/Session.php:143
#0: Bitrix\Main\Session\Session->start()
	/var/www/centrparketa/data/www/xn----8sbarc3asrhdrh5b.xn--p1ai/bitrix/modules/main/lib/Session/KernelSessionProxy.php:47
#1: Bitrix\Main\Session\KernelSessionProxy->start()
	/var/www/centrparketa/data/www/xn----8sbarc3asrhdrh5b.xn--p1ai/bitrix/modules/main/include.php:151
#2: require_once(string)
	/var/www/centrparketa/data/www/xn----8sbarc3asrhdrh5b.xn--p1ai/bitrix/modules/main/include/prolog_before.php:19
#3: require_once(string)
	/var/www/centrparketa/data/www/xn----8sbarc3asrhdrh5b.xn--p1ai/bitrix/modules/main/include/prolog.php:10
#4: require_once(string)
	/var/www/centrparketa/data/www/xn----8sbarc3asrhdrh5b.xn--p1ai/bitrix/header.php:2
#5: require(string)
	/var/www/centrparketa/data/www/xn----8sbarc3asrhdrh5b.xn--p1ai/catalog/podbor/index.php:2
#6: include_once(string)
	/var/www/centrparketa/data/www/xn----8sbarc3asrhdrh5b.xn--p1ai/bitrix/modules/main/include/urlrewrite.php:128
#7: include_once(string)
	/var/www/centrparketa/data/www/xn----8sbarc3asrhdrh5b.xn--p1ai/bitrix/urlrewrite.php:2
----------