Друзья, только недавно начал работать с битрикс, прям совсем недавно. Очень интересно, нравится, несмотря не на что))
Но вот возникла задача, добавить возможность вывода товаров плиткой(сейчас списком).
Шаблон вывода не стандартный и у него нету вывода плиткой. Как я понял надо писать свой шаблон плиткой.
Но... посмотрев на текущий код шаблона каталога я очумел.... там 885 строк хорошего вдумчивого :) php кода и сделать такой же будет не реальной задачей для меня сейчас.
Но вот при включении стандартного шаблона для компонента каталога получается плитка то что надо, если немного допилить её будет вообще пушка.
Можно ли сделать кнопку для смены шаблона для компонента и вывести её для пользователя(как обычно и бывает в любом ИМ - иконка списком , иконка плиткой) ? Как это сделать ?
toha_man дорогой пользователь, настоятельно рекомендуем еще раз обратить самое пристальное внимание на п. 3.1 регламента работы сервиса (и, в особенности, на его последний абзац). В противном случае, ваши вопросы будут удаляться по причине тег-спама, а систематические нарушения приведут к блокировке учетной записи.
в ряду того, что только начал изучать, хочу дать совет:
не зацикливайся на стандартных шаблонах, научись писать свои включая комплексные
причины: многие стандартные шаблоны и компоненты просто показывают возможности, но каждый проект по своему индивидуальный и в своем компоненте можно написать оптимизированный код с минимальной нагрузкой за счет минимума обращений к бд и минимального построения массивов. Многие делают ошибки за счет накидывания на стандартные шаблоны кучи костылей, что приводит к большим нагрузкам.
Переключать шаблон на лету приведет к задержке на каждый запрос, поэтому лучше будет загрузить оба шаблона, и один скрыть, поставить переключатель с js обработчиком, т.е. один блок видимый, второй скрытый.
еще вариант можно продублировать оба вида в одном шаблоне сразу с переключателем.
Решений множества, но не забывай про оптимизацию, которая влияет на сео.
Да возможно.
1. Делаете ссылку переключатель плитка, список.
2. В ссылку вписываете параметр ?listType=list и ?listType=card
3. На странице с вызовом компонента или внутри комплексного компонента пишите обработку передаваемого параметра
4. Если совпадает присваиваете переменной с именем шаблона значение
5. Если не совпадает, то значение по умолчанию
6. Записываете полученное значение в сессию или куку
7. Перед подключением шаблона проверяет значение в куки или сессии
8. Вставляете переменную с именем шаблона.
Если нужно сделать на Ajax то всё тоже самое просто ссылку заменяете на Ajax запрос на эту же страницу и добавляете перед компонентом
$APPLICATION->RestartBuffer();
И после компонента die();
Естественно с проверкой по наличию передаваемого параметра.
Далее в результате ajax просто вставляете html в блок с списком
Вроде разобрался и даже работает всё) Для меня как слабо знающего и php и bitrix это сработало как магия. Хотя вообщем-то сильно сложного в этом ничего нет, но все равно очень приятно делать.
Но проблема небольшая есть. Куки я устанавливаю через php только(может через js сработает так как надо). Проверка GET-параметра и установка соответствующей переменной шаблона идёт прямо перед загрузкой(IncludeComponent) компонента.
И отсюда видимо такая штука, что обновление шаблона компонента просходит на 2ом хите только(((
обработку get параметра вставлял в файл /magazin/index.php (magazin - имя компонента основного для каталога)
в этом файле изменение название шаблона меняет отображение.
в этом файле только 3 блока - 1) require(header) 2) includeComponent 3) require(footer)
в другой файл вставлять надо ?
после клика по ссылке перезагрузка страницы происходит но со старым шаблоном каталога, куки при этом новые ставятся, при повторной перезагрузке уже загружается новый шаблон
Проблема была в том , что установка и сразу считывание cookie в одном файле php за один хит сервера не работает.
Решил установкой cookies через JS, в таком случае все работает корректно и шаблон компонента обновляется на 1ом хите сервера.
Но как же это сделать с php )))
если коротко: нельзя установить и получить одну и туже cookies в одном php скрипте, т.к. cookies установится только после отправки в заголовках страницы
решений несколько:
1) установить самому cookie через $_COOKIES['cookie_name'] = $value; и после можно получить её от туда же.
2) использовать headers_list() для получения заголовков и оттуда распарсить свеже-установленные печеньки
Вывод: в моём случае установка cookies через JS на стороне клиента, чтобы после сервер мог отдать установленный шаблон выглядит разумно при всём вышеописанном.
Спасибо за внимание :)