Простор - вопросы и обсуждение шаблона

Поддержка шаблонов, продающихся на нашем сайте
ClayRabbit
Сообщения: 28
Зарегистрирован: 17.05.2022
Откуда: Тюмень
Спасибо: 12 раз
Контактная информация:

Простор - вопросы и обсуждение шаблона

Непрочитанное сообщение ClayRabbit »

По итогам запуска магазина на шаблоне простор, публикую небольшой модификатор с багфиксами и доработками для версии 1.2.0:
 

Код: Выделить всё

<?xml version="1.0" encoding="utf-8"?>
<modification>
  <name>z Prostore v1.2.0 fixes</name>
  <code>cr_prostore_fixes_1.2.0</code>
  <version>1.0</version>
  <author>Andrey Chesnakov</author>
  <email>clayrabbit2@gmail.com</email>
  <link>https://clayrabbit.ru</link>
  
  <!-- prostore_blog_mod: если выбрана категория блога ссылка "показать все" наверное должна вести в категорию -->
  <file path="catalog/controller/extension/module/prostore_blog_mod.php">
    <operation>
      <search><![CDATA[if($settings['main_category_id']){]]></search>
      <add position="after"><![CDATA[
$data['blog_href'] = $this->url->link('extension/module/prostorecat_blog/getcat&lbpath=' . $settings['main_category_id']);
      ]]></add>
    </operation>
  </file>

  <!-- [bugfix] Проверка наличия товара в корзине не учитывает опции. Пока просто игнорируем наличие таких товаров в корзине. -->
  <file path="system/library/themes899/helper.php">
    <operation>
      <search><![CDATA[if (array_key_exists($product_info['product_id'],$productsInCart)) {]]></search>
      <add position="after"><![CDATA[
if (!empty($productsInCart[$product_info['product_id']]['option'])) {
	$outData['isincart'] = false;
	return $outData;
}
      ]]></add>
    </operation>
  </file>

  <!-- [bugfix] Если в настройках выключен "Адрес доставки" (Выбор адреса доставки, отличного от платежного адреса), 
  то shipping_address не сохраняется и расчет доставки работает некорректно. (По крайней мере так происходило,
  если до этого адрес доставки заполнялся на странице товара для расчета стоимости доставки.) -->
  <file path="catalog/controller/checkout/payment_address.php">
    <operation>
      <search><![CDATA[$this->session->data['payment_address'] = $this->model_account_address->getAddress($this->request->post['address_id']);]]></search>
      <add position="after"><![CDATA[
if ($this->config->get('theme_prostore_checkout_st3_sa')) {
    $this->session->data['shipping_address'] = $this->session->data['payment_address'];
	unset($this->session->data['shipping_method']);
    unset($this->session->data['shipping_methods']);
}
      ]]></add>
    </operation>
    <operation>
      <search><![CDATA[$this->session->data['payment_address'] = $this->model_account_address->getAddress($address_id);]]></search>
      <add position="after"><![CDATA[
if ($this->config->get('theme_prostore_checkout_st3_sa')) {
    $this->session->data['shipping_address'] = $this->session->data['payment_address'];
	unset($this->session->data['shipping_method']);
    unset($this->session->data['shipping_methods']);
}
      ]]></add>
    </operation>
  </file>
<!-- [bugfix] Если в настройках выключен "Адрес доставки" то на странице информации о заказе не нужно его выводить -->  
  <file path="catalog/controller/account/order.php">
    <operation>
      <search><![CDATA[$data['shipping_method'] = $order_info['shipping_method'];]]></search>
      <add position="after"><![CDATA[
if ($this->config->get('theme_prostore_checkout_st3_sa')) {
	$data['payment_address'] = '';
}
      ]]></add>
    </operation>
  </file>
  
  <!-- Модуль prostore_brands предлагает вручную заполнять список брендов с картинками и ссылками, вместо того чтобы использовать данные производителей?
 	   Добавим автоматическую генерацию, если список в настройках оставлен пустым. -->
  <file path="catalog/controller/extension/module/prostore_brands.php">
    <operation>
      <search><![CDATA[if(isset($setting['brands_image'])){]]></search>
      <add position="before"><![CDATA[
if(empty($setting['brands_image'])){
	$this->load->model('catalog/manufacturer');
	foreach ($this->model_catalog_manufacturer->getManufacturers(array('sort' => 'sort_order')) as $_key => $_manufacturer) {
		if (!$_manufacturer['image']) continue;
		$data['banners'][$_key][] = array(
           'title' 			=> $_manufacturer['name'],
           'link'  			=> $this->url->link('product/manufacturer/info', 'manufacturer_id=' . $_manufacturer['manufacturer_id']),
           'image' 			=> $this->model_tool_image->resize($_manufacturer['image'], $setting['width'], $setting['height']),
		);
	}
}
      ]]></add>
    </operation>
  </file>

  <!-- [bugfix] Модуль prostore_faq не сохраняет customer_id -->
  <file path="catalog/model/extension/module/prostore_faq.php">
    <operation>
      <search index="0"><![CDATA[$sql .= " text = '" . $this->db->escape(strip_tags($data['faq_text'])) . "', email = '" . $this->db->escape($data['faq_email']) . "',";]]></search>
      <add position="before"><![CDATA[
if ($this->customer->isLogged()) {
	$sql .= " customer_id = " . $this->customer->getId() . ",";
	if (empty($data['faq_email'])) {
		$data['faq_email'] = $this->customer->getEmail();
	}
}
      ]]></add>
    </operation>
  </file>
  
  <!-- Для модуля вопросов нужна возможность включения необходимости авторизации также как для отзывов -->
  <file path="catalog/controller/extension/module/prostore/prostore_theme.php">
    <operation>
      <search><![CDATA[$data['faqs'] = array();]]></search>
      <add position="before"><![CDATA[
if ($this->config->get('config_review_guest') || $this->customer->isLogged()) {
    $data['review_guest'] = true;
} else {
    $data['review_guest'] = false;
	$data['text_login'] = sprintf($this->language->get('text_login'), $this->url->link('account/login', '', true), $this->url->link('account/register', '', true));
}
      ]]></add>
    </operation>
    <operation>
      <search><![CDATA[if ($this->config->get('captcha_' . $this->config->get('theme_prostore_product_faq')['captcha'] . '_status')) {]]></search>
      <add position="before"><![CDATA[
if (!$this->config->get('config_review_guest') AND !$this->customer->isLogged()) {
    $json['error'] = sprintf($this->language->get('text_login'), $this->url->link('account/login', '', true), $this->url->link('account/register', '', true));
}
      ]]></add>
    </operation>	
  </file>
  
</modification>
(Некоторые из этих доработок потребуют также правок twig-шаблона.)

Еще немного фиксов для app.js:
 

Код: Выделить всё

--- catalog/view/javascript/prostore/app.js~orig	2023-10-16 10:26:11.452309900 +0500
+++ catalog/view/javascript/prostore/app.js	2023-10-16 10:53:41.402291900 +0500
@@ -2498,7 +2498,8 @@
 
 function alertClose(alert) {
 	$(alert).closest('.alert').addClass('is-hide').on('animationend',function(){
-		$(alert).remove();
+        // Вероятно должен удаляться весь блок, а не только кнопка.
+		$(this).remove();
 	});	
 }
 
@@ -3618,7 +3619,8 @@
 				if (getURLVar('route') == 'checkout/cart' || getURLVar('route') == 'checkout/checkout' || $('.cart__content').length) {  
 					location = 'index.php?route=checkout/cart';
 				} else {
-					$('#cart .header__cart-load').load('index.php?route=common/cart/info .header__cart-offcanvas',function(){
+                    // Чтобы не терялась позиция скролла в корзине при обновлении количества
+                    $('#cart .header__cart-load .js-cart-scrollbar').load('index.php?route=common/cart/info .header__cart-offcanvas .js-cart-scrollbar > *',function(){
 						hasScrollBar();
 						$('[data-fancybox]').fancybox(fancyboxOptions);
 					});				
@@ -3754,7 +3756,8 @@
 					location = json['redirect'];
 				}
 
-				var elem = $('.products__item, #product').find("button[data-for='"+product_id+"']").filter("[data-action='wishlist']");
+                // Чтобы обновление иконок избранного работало и на странице сравнения
+				var elem = $('.products__item, .compare__item, #product').find("button[data-for='"+product_id+"']").filter("[data-action='wishlist']");
 
 				if(json['error'] != 1){
 					elem.addClass('is-active');
@@ -3785,7 +3788,8 @@
 			success: function(json) {
 				$('.alerts-wrapper').remove();
 
-				var elem = $('.products__item, #product').find("button[data-for='"+product_id+"']").filter("[data-action='wishlist']");
+                // Чтобы обновление иконок избранного работало и на странице сравнения
+				var elem = $('.products__item, .compare__item, #product').find("button[data-for='"+product_id+"']").filter("[data-action='wishlist']");
 
 				if(json['error'] != 1){
 					elem.removeClass('is-active');


Лично для меня основным минусом шаблона была слабая поддержка опций (впрочем, наверное мало какой шаблон может похвастаться полноценной их поддержкой).

И еще несколько вопросов/пожеланий:
  • После отправки вопроса (на странице товара) не надо очищать поле с именем. Если у покупателя второй вопрос родится - зачем снова заполнять имя? Достаточно очистки поля с текстом.
  • При оформлении заказа зарегистрированным пользователем телефон присутствует в форме нового адреса но нигде не сохраняется.
  • На странице контактов на карте было бы хорошо для меток добавить балуны с информацией о магазине и кластеризацию меток включить (иначе в масштабе страны сливаются метки 2+ магазинов в одном городе).
ClayRabbit
Сообщения: 28
Зарегистрирован: 17.05.2022
Откуда: Тюмень
Спасибо: 12 раз
Контактная информация:

Re: Простор (prostore)

Непрочитанное сообщение ClayRabbit »

Еще один багфикс

Код: Выделить всё

    <!-- prostorecat_blog: забыли подключить обработку кастомных макетов -->
  	<file path="catalog/controller/common/{column_*,content_bottom,content_top}.php">
		<operation>
			<search><![CDATA['information/information']]></search>
			<add position="before"><![CDATA[
if ($route == 'extension/module/prostorecat_blog/getcat' && isset($this->request->get['lbpath'])) {
	$this->load->model('extension/module/prostorecatblog');

	$lbpath = explode('_', (string)$this->request->get['lbpath']);

	$layout_id = $this->model_extension_module_prostorecatblog->getBlogCategoryLayoutId(end($lbpath));
}
			]]></add>
		</operation>
	</file>
Waskadagama
Сообщения: 7
Зарегистрирован: 20.11.2023
Поблагодарил: 1 раз
Спасибо: 1 раз

Шаблон Простор + Rutube

Непрочитанное сообщение Waskadagama »

В связи с замедлением Youtube, возникла необходимость добавить в шаблон поддержку Rutube.
К сожалению, только модификатором, сделать не получится, необходимо внести несколько правок в файл скрипта jquery.fancybox.js. Файл и его минифицированную версию сделал вложением.
Добавление ролика осуществляется с помощью стандартной вкладки шаблона Дополнительные вкладки товаров → Видео-вкладка. После модификации можно добавлять один или несколько роликов как с Youtube так и с Rutube, НО в случае нескольких роликов для одного товара ВСЕ ролики должны быть с одной платформы.
 

Код: Выделить всё

  <!-- Rutube -->  
  <file path="catalog/view/theme/prostore/template/product/product.twig">
    <operation>
        <search><![CDATA[{% if count_videos == 1 and video.0.description %}]]></search>
        <add position="replace"><![CDATA[{% if count_videos == 1 and video.0.description and video.0.description|length == 11 %}]]></add>
    </operation>
    <operation>
        <search><![CDATA[{% elseif count_videos > 1 %}]]></search>
        <add position="before"><![CDATA[
                                            {% elseif count_videos == 1 and video.0.description and video.0.description|length == 32 %}
                                            <!-- одно видео Rutube -->
                                            <div class="sku__video">
                                                <a class="ui-link ui-link--blue" href="https://rutube.ru/video/{{video.0.description}}/" data-fancybox>
                                                    <svg class="icon-video"><use xlink:href="catalog/view/theme/prostore/sprites/sprite.svg#icon-video"></use>
                                                    </svg>{{ text_show_video }}
                                                </a>
                                            </div>]]></add>
    </operation>
    <operation>
        <search><![CDATA[{% elseif count_videos > 1 %}]]></search>
        <add position="replace"><![CDATA[
                                            {% elseif count_videos > 1 and video.0.description|length == 32 %}
                                            <!--  несколько видео Rutube-->
                                            <div class="sku__video">
                                                <a class="ui-link ui-link--blue" href="#rutube" data-fancybox>
                                                    <svg class="icon-video"><use xlink:href="catalog/view/theme/prostore/sprites/sprite.svg#icon-video"></use>
                                                    </svg>{{ text_show_video }}
                                                </a>
                                            </div>
                                            {% elseif count_videos > 1 and video.0.description|length == 11 %}]]></add>
    </operation>
    <operation>
        <search><![CDATA[{% if count_videos > 1 %}]]></search>
        <add position="replace"><![CDATA[
                    {% if count_videos > 1 and video.0.description|length == 32 %}
                    <div class="fancybox-is-hidden popup popup--custom" id="rutube">
                        <span class="popup__title">{{ text_show_video }}</span>
                        <div class="popup__form">
                            {% for item_video in video %}
                            <a class="rutube-video-place" href="https://rutube.ru/play/embed/{{item_video.description}}/">
                                <figure class="ui-video__figure">
                                    <img src="https://rutube.ru/api/video/{{item_video.description}}/thumbnail/?redirect=1" alt="" loading="lazy">
                                    <svg class="icon-video hide"><use xlink:href="catalog/view/theme/prostore/sprites/sprite.svg#icon-video"></use></svg>
                                </figure>
                            </a>
                            {% endfor %}
                            </div>
                    </div>
                    {% elseif count_videos > 1 and video.0.description|length == 11 %}]]></add>
    </operation>
    <operation>
        <search><![CDATA[$(document).on('click','.youtube-video-place', function(e) {]]></search>
        <add position="before"><![CDATA[
$(document).on('click','.rutube-video-place', function(e) {
    e.preventDefault();
    $(this).html('<div class="ratio ratio-16x9 rtb-iframe"><iframe allow="clipboard-write; autoplay" width="820" height="461" src="' + $(this).attr('href') + '" frameBorder="0" class="embed-responsive-item" webkitAllowFullScreen mozallowfullscreen allowFullScreen></iframe></div>');
});]]></add>
    </operation>
  </file>
  <file path="admin/language/ru-ru/extension/module/prostore/prostore_tab.php">
    <operation>
        <search><![CDATA[$_['text_video']                         = 'Youtube id';]]></search>
        <add position="replace"><![CDATA[$_['text_video']                         = 'Youtube или Rutube id';]]></add>
    </operation>
  </file>

Также нужно добавить одно правило CSS в раздел Для разработчиков

Код: Выделить всё

.rtb-iframe { margin: 0 0 2rem; }

Рабочий магазин на последней версии шаблона. Сейчас осуществляется перенос роликов с Youtube на Rutube. Большинство товаров имеют по 2 ролика.
Вложения
jquery.fancybox.min.js.gz
(20.61 КБ) 2524 скачивания
jquery.fancybox.js.gz
(36.59 КБ) 2519 скачиваний
Аватара пользователя
BuslikDrev
Разработчик дополнений
Сообщения: 190
Зарегистрирован: 22.04.2022
Откуда: Кіеўская Русь
Поблагодарил: 4 раз
Спасибо: 10 раз
Контактная информация:

Re: Шаблон Простор + Rutube

Непрочитанное сообщение BuslikDrev »

Лучше использовать plvideo.ru т.к. он не требует куков, а у многих могут быть заблокированы куки для сторонних сайтов.
Dmit
Сообщения: 14
Зарегистрирован: 25.04.2025

ПРОСТОР. Ошибка при активации

Непрочитанное сообщение Dmit »

Добрый день! При попытке ввести лицензионный ключ к шаблону Простор появилась такая странная ошибка (ОООООЧЕНЬ БОЛЬШАЯ): Много-много безсвязного текста и в конце:

Fatal error: Uncaught Error: Class 'Controllerextensionthemeprostore' not found in /home/c105799/himeko-ekb.ru/www/system/engine/action.php:71 Stack trace: #0 /home/c105799/himeko-ekb.ru/www/admin/controller/startup/router.php(26): Action->execute(Object(Registry), Array) #1 /home/c105799/himeko-ekb.ru/www/system/engine/action.php(79): ControllerStartupRouter->index() #2 /home/c105799/himeko-ekb.ru/www/system/engine/router.php(67): Action->execute(Object(Registry)) #3 /home/c105799/himeko-ekb.ru/www/system/engine/router.php(56): Router->execute(Object(Action)) #4 /home/c105799/himeko-ekb.ru/www/system/framework.php(169): Router->dispatch(Object(Action), Object(Action)) #5 /home/c105799/himeko-ekb.ru/www/system/startup.php(104): require_once('/home/c105799/h...') #6 /home/c105799/himeko-ekb.ru/www/admin/index.php(19): start('admin') #7 {main} thrown in /home/c105799/himeko-ekb.ru/www/system/engine/action.php on line 71 
Аватара пользователя
liveopencart
liveopencart.ru
Сообщения: 314
Зарегистрирован: 10.03.2022
Мои дополнения: 19th19th
Поблагодарил: 88 раз
Спасибо: 161 раз
Контактная информация:

Re: ПРОСТОР. Ошибка при активации

Непрочитанное сообщение liveopencart »

В первую очередь - написать автору.
Выразить благодарность деньгами - liveopencart.ru/pay
Asa-dn
Сообщения: 2
Зарегистрирован: 14.12.2023

Простор - вопросы и обсуждение шаблона

Непрочитанное сообщение Asa-dn »

Добрый день, странно что нет общей темы по обсуждению популярного шаблона Простор. Предлагаю тут отвечать на возникшие вопросы по шаблону.
В частности, хотел спросить.
Планируется ли доработка чекбоксов в формах шаблона в соответствии с новыми требованиями Роскомнадзора. В отзывах о шаблоне уже спрашивали следующее:
Прекрасный шаблон. Пожалуй, самый лучший и функциональный из всех, что встречал в рунете. Автору огромное спасибо!

Для автора: надо бы ДЛЯ ВСЕХ форм на сайте сделать чекбокс согласия с политикой конфиденциальности. Новые требования РКН. Причем, по-умолчанию, они должны быть не активны.
На днях на хабре статья вышла крупная по этому поводу. 
3. Правильные чекбоксы под всеми формами
Раньше все ставили «Отправляя заявку, вы соглашаетесь...». Теперь так нельзя.
Как должно быть:
Отдельная галочка под каждой формой
Галочка НЕ проставлена по умолчанию
Без галочки форму отправить невозможно
В тексте ссылки на политику и согласие
Вся статья доступна по ссылке. https://habr.com/ru/articles/954602/
Как бы там ни было В 152-ФЗ «О персональных данных» - мне кажется что лишним не будет. 
899themes
Разработчик дополнений
Сообщения: 2
Зарегистрирован: 20.10.2025
Мои дополнения: 899themes

Re: Простор - вопросы и обсуждение шаблона

Непрочитанное сообщение 899themes »

Здравствуйте!
Asa-dn писал(а): 16 окт 2025, 19:43 Как бы там ни было В 152-ФЗ «О персональных данных» - мне кажется что лишним не будет. 
Да, планируется в ближайшем обновлении шаблона. Если вам нужны галочки сейчас, отправьте запрос в тех. поддержку по почте support@899themes.ru
Waskadagama
Сообщения: 7
Зарегистрирован: 20.11.2023
Поблагодарил: 1 раз
Спасибо: 1 раз

Re: Простор - вопросы и обсуждение шаблона

Непрочитанное сообщение Waskadagama »

Добрый день.
Если Вы планируете доработку форм обратной связи, может быть Вы сделаете их загрузку через ajax, а не в HTML коде страницы?
Форма Обратный звонок, которая располагается в header и в footer, загружается на всех страницах сайта и, если мы добавим в эту форму современную капчу, например от Yandex, получается, что скрипты для этой капчи будут загружаться на каждой странице сайта, даже если посетитель не воспользуется формой обратной связи. Загрузка этих лишних скриптов негативно влияет на скорость загрузки страниц сайта.
899themes
Разработчик дополнений
Сообщения: 2
Зарегистрирован: 20.10.2025
Мои дополнения: 899themes

Re: Простор - вопросы и обсуждение шаблона

Непрочитанное сообщение 899themes »

Waskadagama писал(а): 22 окт 2025, 18:02 Если Вы планируете доработку форм обратной связи, может быть Вы сделаете их загрузку через ajax, а не в HTML коде страницы?
Спасибо за обратную связь, мы рассмотрим ваше предложение и внесем необходимые изменения в новую версию шаблона.
Ответить