Есть сайт на битриксе версии 20.0 ("1С-Битрикс: Управление сайтом"). Выгрузил товары в этот сайт из 1с Предприятие 8.3. Товары присутствуют в админке (они у меня все одного уровня, без категорий/разделов). Ставлю задачу вывести в публичной части сайта список товаров (в мой-сайт.рф/catalog), но он не выводится (страница существует, но товары не отображаются). Если создать раздел в этом каталоге, и в этом разделе создать какой-нибудь товар, то внутри мой-сайт.рф/catalog появится этот раздел, внутри него отображается этот самый товар. То есть проблема именно с отображением товаров верхнего уровня. Каким образом можно вывести товары верхнего уровня? Читал здесь - https://dev.1c-bitrix.ru/user_help/components/content/catalog/catalog.php, в частности, написано:
"Внимание! Компонент не работает с инфоблоками, не имеющими структуры разделов. Если по логике проекта информация не должна иметь структурного деления, то необходимо создать один раздел верхнего уровня и уже в нём размещать элементы инфоблока"
Так и не понял, что именно предлагается сделать для решения данной проблемы. Сейчас у меня один инфоблок - "основной каталог товаров" (каталог /catalog), и мне на данный момент не нужны разделы внутри /catalog.
Как решить подобную проблему? Код моего компонента "каталог" такой:
в шаблоне комплексного компонента каталог есть файл sections.php(который вызывается в корне раздела каталога) в нем по умолчанию вызываются catalog.section.list/catalog.compare.list/catalog.top
а для вывода элементов нужен компонент catalog.section
Посмотрел что внутри bitrix/components/bitrix/catalog/templates/bootstrap_v4/section.php, взял оттуда (а точнее из подключаемых внутри section.php файлов section_horizontal.php и section_vertical.php - в моей версии битрикса именно так) код вызова компонента bitrix:catalog.section, вставил его в нужное место в sections.php, теперь в мой.сайт-рф/catalog выводятся товары верхнего уровня (но не только верхнего, но и с вложенных разделов! Буду кумекать дальше). Это, безуcловно, хорошо
Теперь осталось побороть две проблемы - собственно, убрать в мой.сайт-рф/catalog вывод товаров, которые не принадлежат верхнему уровню (вроде бы в коде вызова компонента есть параметр, который вложенность регулирует) и проблему отображения страницы с товаром верхнего уровня - при клике по мой-сайт.рф/catalog/tovar пишет что "раздел не существует". При этом с товаром из вложенного раздела мой-сайт.рф/catalog/razdel/tovar2 все в порядке.
Как решу эти проблемы, отпишусь, может кому в будущем поможет эта тема
Убрал в мой.сайт-рф/catalog вывод товаров, которые не принадлежат верхнему уровню в админке - параметры компонента Каталог:
Показывать элементы подразделов раздела: не показывать
Ну или, разумеется, это можно сделать ручками, прописав в вызове компонента INCLUDE_SUBSECTIONS => N
С "раздел не найден" (товары верхнего уровня, расположенные по адресу мой.сайт-рф/catalog/tovar,не открываются) пока не разобрался. Мои настройки инфоблока Каталога (те, что отвечают за чпу) в прикрепленном изображении, также прикрепляю настройки чпу компонента bitrix:catalog.
Все ли в порядке настройками?
p.s. Кстати, заметил, по адресу вида мой.сайт-рф/catalog/abrakadabra/tovar этот самый товар открывается (abrakadabra - любое слово), при этом внизу характеристик товара написано "Раздел не найден". Это так, просто забавное наблюдение
Придумал временный (черт возьми, не бывает ничего более постоянного, чем временное!) способ-костыль с .htaccess для решения проблемы отображения страницы товара из каталога верхнего уровня.
1) Создал в /catalog/ файл .htaccess (пустой) 2) Создал razdel_generator.php в корне сайта 3) Подключил этот razdel_generator в начале файла /catalog/index.php с помощью include();
Файл razdel_generator.php имеет следующее содержимое:
Код
<?php
// здесь информация о подключении к БД, разумеется я ее не публикую
$sql = "SEL ECT CODE FR OM b_iblock_section";
$res = mysql_query($sql);
$spisok = "RewriteCond %{REQUEST_URI} !^/catalog/all/(.*)$ [NC]";
while ( $row = mysql_fetch_assoc($res) )
{
$spisok .= "
RewriteCond %{REQUEST_URI} !^/catalog/".$row['CODE']."/(.*)$ [NC]
";
}
$towrite = "# redirects /catalog/element to /catalog/all/element except /catalog/razdel
Options +FollowSymLinks
RewriteEngine on
".$spisok.
"RewriteRule ^(.*)/$ /catalog/all/$1/ [R=301,L]";
$current_lenght = filesize($_SERVER["DOCUMENT_ROOT"].'/catalog/.htaccess');
$fp = fopen($_SERVER["DOCUMENT_ROOT"].'/catalog/.htaccess', 'r');
$contents = fread($fp, $current_lenght);
fclose($fp);
if ($contents !== $towrite)
{
$fp2 = fopen($_SERVER["DOCUMENT_ROOT"].'/catalog/.htaccess', 'w');
fwrite($fp2, $towrite);
fclose($fp2);
}
else
{
}
?>
Вкратце, этот скрипт проверяет какие разделы товаров сейчас есть на сайте, и, если обнаружены изменения в списке этих разделов, пишет об этом в файл .htaccess, расположенный в /catalog/. Это сделано для того, чтобы все урл вида мой-сайт.рф/catalog/товар приводились к виду мой-сайт.рф/catalog/all/товар (тогда товар открывается), и при этом чтобы урлы вида мой-сайт.рф/catalog/раздел не затрагивались этим .htaccess.
К примеру, сейчас мой .htaccess внутри /catalog/ имеет такой вид: