101

(14 ответов, оставленных в Вопросы по работе с системой)

Если позволите, выскажу свое мнение.
Люблю иногда почитать оригинальное описание того, для чего разрабатывался тег rel="canonical" в RFC 6596.

https://tools.ietf.org/html/rfc6596

to specify the single-page version as preferred over the same content separated on multiple component pages.

--------------

Тег rel="canonical" нужен исключительно для того, чтобы делать ссылки от дублирующего частного к общему.
Например, у вас есть одна страница со всеми товарами и есть страницы с этими же товарами с пагинацией, соответственно rel="canonical"  должен указывать на страницах с пагинацией на страницу со всеми товарами.

--------------

Различные страницы пагинации - это не дублирующийся контент, если у вас нет общей страницы (на каждой странице - разные товары). Указывая ссылку на первую страницу - вы просто отрезаете  от индексирования все остальные страницы каталога, кроме первой и все. SEOшники обычно ставят галочку - rel=canonical применили, задача закрыта, но это ведь не так!

В RFC прямо сказано про пагинацию, то о чем я пишу выше:

*  As an example, each component page (e.g., page-1.html, page-
         2.html) of a multi-page article MAY specify the "view-all"
         version (e.g., page-all.html), the superset of their content,
         as the target IRI.  This is because the content from each
         component page is contained within the view-all version.  Given
         this implementation, applications can mark page-1.html and
         page-2.html as duplicates of page-all.html, process content
         only from page-all.html, and disregard the component pages.
         All references can then be made to the view-all version (page-
         all.html, the target IRI), and no content will have been lost
         in this process.

      *  Using the same example above, page-2.html SHOULD NOT designate
         page-1.html as the target (canonical) IRI because this may
         cause a loss of data.  When page-2.html designates page-1.html
         as the canonical, only content from the target IRI, page-
         1.html, will be processed. page-2.html may be marked as a
         duplicate of page-1.html and its content disregarded.

Просто жалко ваши сайты, когда что-то делается на них без понимания того, для чего в деталях это делается.

Уважаемые пользователи!

В пятницу 28.08.2020 c 21:00 до 03:00 мы планируем провести плановое обслуживание наших серверов.
Во время проведения работ, возможны перебои в работе наших сервисов. Мы постараемся сделать все, чтобы перебои в работе были минимальны.

Установите флажок напротив "Публичность" в настройке "Поля категории, которые не следует обновлять"
на вкладке "Каталог товаров - что следует обновлять" в настройках модуля Обмен данными с 1С (exchange)

Daniel пишет:

Нет,сайт не в облаке,на хостинге.Обновления остановил на 5-й версии

В таком случае, если ваш хостинг, например, не восстанавливал бекапы, не менял версию PHP, вы не устанавливали обновления - ничего не может самостоятельно изменяться на сайте. Программа одинаково работает всегда, кода для самоизменения настроек не существует в ReadyScript.

Облако не для программистов, облако - готовый сервис. Клиенты облака в основном не знакомы с html, css, ftp  и не желают в это погружаться.

Daniel, в облаке происходят автоматические обновления, когда мы их выпускаем.

Автоматические обновления - не могут снимать галки в настройках, так как данные БД - не трогаются, только структура БД обновляется.

Если вы модифицировали системные шаблоны не по инструкции: https://readyscript.ru/dev-manual/dev_t … tends.html
То абсолютно все изменения будут возвращены в исходное состояние при обновлении.

Теперь можно быстро найти заказ по:
1. Точному совпадению номера
2. ФИО клиента, на которого активирована лицензия по заказу
3. По номеру лицензии
4. По наименованию клиента, если вы его указали при оформлении заказа
5. По доменному имени, на которое активирована лицензия

В подробном просмотре заказа у активированных лицензий теперь отображен домен, на который они активированы.
В списке заказов выводится Клиент, который указан при оформлении заказа.

В общем, партнерам теперь будет проще ориентироваться в своих заказах, когда их переваливает за несколько десятков.

Ярослав, добрый день!

Насколько мы понимаем, какой-то из компонентов Битрикс24 некорректно работает, если видит переменную global (была такая информация от одного клиента). Данная переменная необходима для работы ReadyScript, она обеспечивает трансфер в JS некоторых переменных из PHP. Это имя никем не зарезервировано и ее использование не запрещено.

--------

И на наш взгляд встраиваемые скрипты не должны зависеть ни от каких глобальных переменных.
Нужно писать в Битрикс24 по данному поводу. Ведь любой другой скрипт чата работает без проблем.

Это понятно,т.е в функционале версии Гипермаркет невозможно отключить возможность заказа товара из разных магазинов?

Я даже не представляю как это с точки зрения пользователя может быть. Допустим есть товар:

1. Кружка - 3 шт. на складе А, 2 шт. на складе Б
2. Тарелка - 10 шт. на складе Б

Клиент же не обозначает где будет покупать, когда заходит на сайт в Гипермаркете и накидывает в корзину 4 кружки, 10 тарелок, потом идет в корзину нажимает кнопку оформить заказ, выбирает самовывоз со склада А и что дальше?

Система должна говорить, что корзину, которую собрал клиент невозможно забрать на складе А (всех товаров нет на этом складе)?
Ок, допустим, клиент переключает на склад Б и тоже видит, что корзину нельзя забрать на складе Б (всех товаров нет на этом складе тоже). Полный тупик.

Система же не может сама подменить корзину, изменить там количество - клиент будет повергнут в шок, если за него такое сделают, он же сам выбирал количество.

-------------------------------------------

Другое дело - в Мегамаркете. Клиент зашел на сайт и сразу выбрал, что он будет закупаться в Магазине А. И в корзину в этом случае он сможет положить только то, что есть в магазине А. Никаких логических коллизий.

Добрый день!

{$product->getUnit()->stitle} - выведет единицу измерения, например кв.м.

Внесу ясность в правки шаблонов. Дело в том, что различные методы расширения функциональности шаблонов появлялись со временем, а старые при этом продолжали работать. По этому есть множество вариантов на выбор:

1. Полное клонирование темы и изменение файлов уже внутри нее. Делается прямо через админ.панель
Управление -> Шаблоны -> Клонировать тему. (есть особенности с темой default, в клона нужно сперва копировать tpl файлы из модулей, а затем изменять.)

2. Для простого добавления своих скриптов мы придумали scripts.tpl, которого нет в дистрибутиве, но он подключается, если в корне лежит этот файл. Этот метод подходит только для добавления скриптов и стилей на все страницы шаблонов.

3. Частичная модификация темы с помощью .my.tpl, .my.css  .my.js. Отлично подходит если хочется, чтобы все в теме обновлялось, кроме измененных частей. Очень простой способ модификации с относительно небольшими потерями обновляемости.

https://readyscript.ru/dev-manual/dev_t … tends.html

4. Модификация шаблонов с помощью кастомного модуля и обработки хуков в шаблонах. Способ сложный для обычного пользователя, но позволяет изменять даже часть одного tpl шаблона, при этом сохраняя обновление других частей этого же tpl.
Это самый ювелирный способ модификации.
https://readyscript.ru/dev-manual/dev_t … hooks.html

Почти все торговые сети в этом случае налаживают внутреннюю логистику и если товар хоть где-то есть, его можно переместить в другую точку выдачи и продать.

Альтернативный вариант - это только использовать Мегамаркет и представлять магазины как филиалы.

Насколько я понимаю, вы находитесь на странице просмотра статьи, т.е. article-front-view, за данную страницу отвечает контроллер \Article\Controller\Front\View, видим что в данном шаблоне статья передается в переменной article

        $this->view->assign(array(
            'article' => $article
        ));

Ваш ход мыслей верный, думаю вы просто ошиблись в том, что getCategory() нужно вызывать у $article в шаблоне
%article%/view_article.tpl

{$categoria = $article->getCategory()} {* Здесь будет Article\Model\Orm\Category *}
{$parent = $categoria->getParent()} {* Здесь будет Article\Model\Orm\Category *}
{$parent.title} {* У объекта Article\Model\Orm\Category название в поле title находится *}

Это настройка атрибута rel, туда можно добавить элемент в список, так как у TinyeMCE есть такой параметр rel_list
Но дописывать data-fancybox="gallery", оно не будет ) Возможно для этого нужно будет подключить какой-то плагин к tinyMCE.
-------------
Возможно fancybox можно инициализировать и на rel="lightbox", просто это должно быть явно прописано в JS, где fancybox инициализируется.

Думаю все дело в том, что вы вносите изменения в шаблон, который находится в модуле, а на сайте у вас используется тема не default.

Вам нужно вносить изменения в шаблон /ВАША ТЕМА/moduleview/catalog/product.tpl
А еще правильнее, создавать на его основе  /ВАША ТЕМА/moduleview/catalog/product.my.tpl

В этом случае при любом обновлении ваши изменения не будут исчезать.

в Catalog\Controller\Front\ListProducts в методе init есть событие init.api.catalog-front-listproducts

В обработчике у вас есть переменная, ссылающаяся на этот контроллер ListProducts

Вы можете перехватить объект запроса на выборку товаров:

в handlers.inc.php вашего кастомного модуля:

public static function initApiCatalogFrontListProducts($controller) {
    $request = $controller->api->queryObj();
    //Тут можно делать что угодно с запросом, например добавить JOIN и уточнить секцию SELECT
}
Ярослав пишет:

Как раз пришлось реализовывать индивидуальные цены для товаров.
40 колонок цен со скидками  на товары уже существовали на базе стандартного справочника цен (причем есть товары, где скидка не должна превышать определенный процент).
Но захотели создавать цены в разрезе брендов, категорий и отдельных товаров. При этом настройку делают на стороне 1с.
Уговорить  реализовать скидками в корзине не получилось.
В итоге сделал модуль с отдельной таблицей индивидуальных цен (товар-пользователь-цена). При расчете цены товара сначала выборка делается из этой таблицы. В таблицу заливаю данный из csv файла с помощью LOAD INFILE, поэтому проблем с синхронизацией нет. Файл формируется на стороне 1с сразу с рассчитанными ценами для клиента. Попадают только товары, затронутые скидкой. Обычно из около 300-500 для клиента.
Все это касается только отображения цены.

Очень здорово, что вы не побоялись ввязаться в эту крайне непростую задачу.
Насколько я понимаю, вы добавляете join вашей таблицы во время выборки товаров, чтобы перекрыть цены из xcost?

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

Мы еще думали сделать дополнительный уникализатор, чтобы можно было вообще сделать самые невероятные вещи с помощью сторонних модулей, например, каждый нечетный день для какой-то группы клиентов давать скидки на какие-то группы товаров. В данном случае флаг нечетного дня был бы доп. унификатором.

Одна из проблем - это был объем такой таблицы, если на сайте 10 000 товаров, 1000 пользователей и 2 типа цен, то это уже 20 млн. записей. JOIN такой таблицы даже с индексами будет довольно дорогой по ресурсам. И это я привел очень скромные параметры - 10k товаров и все с одной комплектацией и без доп.унификаторов.

Второй из важнейших проблем такой схемы - обновление данных. Допустим, пользователь перешел какой-то порог и ему вдруг нужно все цены пересчитать (он достиг нового уровня скидок), а если в магазине много товаров - не совсем понятно в какой момент это делать, так как это занимает длительное время? Если в момент наступления события (достижения нового уровня скидок), то клиент может не дождаться, когда у него оформится заказ, например. Если по крону, то какое-то время цены на сайте будут неактуальны.

Вариант как у вас - что источник новых цен - всегда 1С частично снимает эту проблему, но делает цены какое-то время неактуальными на сайте для пользователя, хотя возможно это очень небольшое время.

Вот я кстати хотел бы немного рассказать о незрелости технологий пока еще для динамического ценообразования.

Когда речь идет о ценах, всегда нужно помнить, что у цен бывает:

1. отображение
2. сортировка по цене по возрастанию (в списках)
3. фильтрация по цене (в списках)

Как вы понимаете сортировка и фильтрация должна оперировать полным набором данных, то есть если мы заходим в категорию, где 5000 товаров, то программа должна посмотреть на все 5000 товаров и выстроить их по возрастанию цены и вернуть в итоге только,например, первые 20 - что соответствует одной странице данных.

На случай, если кто-то из читателей не знает, то пагинация нужна исключительно с технической точки зрения, чтобы не нагружать память backend'а, браузера клиента объемом HTML, сеть гигантским объемом передаваемых данных. Пагинация - это необходимость.

Сейчас п.2, п.3. делает на своей стороне БД, так как RS только оперирует колонками цен. У юзера может быть установлена заранее подготовленная скидочная колонка цен. Это обеспечивает работоспособность всех функций и скорость работы.

Мы считаем, что в любом магазине должно быть ограниченное число колонок цен и оно НЕ должно быть равно числу пользователей. Магазины не понимают, что когда у них станет 2000 или 5000 или 10 000 клиентов вести индивидуальный порядок расчетов - невозможно. Крупные магазины всегда стандартизируют понятия Колонка цен 1 .... Колонка цен 10, вспомните Юлмарт. И все клиенты работают именно по какой-то колонке цен, а не имеют все разные пляшущие цены.

Для более гибкой политики - существует бонусная система и (внимание!) - бонусная система - это то, что в корзине или в карточке товара (как подсказка), а не в списках товаров в категории цены сразу с учетом ваших бонусов. Это очень важно!
Слой расчета бонусных скидок он чисто косметический и выполняется поверх уже отобранных из БД товаров. Соответственно скидки не могут учитываться во время фильтрации и сортировки.

-----------------------------------

Теперь о незрелости технической. К сожалению, реализовать динамическое ценообразование возможно (в наше время), только если вешать обработчики цен на стороне PHP, а соответственно сортировку и фильтрацию нужно будет также обеспечивать силами PHP, ну и самое главное, из БД в этом случае нужно получать не одну страницу товаров, а ПОЛНЫЙ набор данных.

Все это приведет к тому, что сайт будет катастрофически сильно тормозить.

Динамическое ценообразование предполагает, что колонка цен в БД - динамическая и она зависит от текущего юзера, от его прежних заказов, от категории продукции и возможно еще очень много от чего. В итоге нужно дождаться таких технологий, чтобы в БД в качестве колонки можно было объявить целую программу (callback), которая должна выполняться максимально быстро, чтобы не пострадало время выборки.

Пока удобной технологии для этого мы еще не нашли, поэтому мы разделяем понятия:

1. Типы цен - это то, что работает быстро, поддерживает сортировку и фильтрацию.
2. Скидки, бонусные программы - это то, что клиент увидит в корзине. Скидки могут быть сколь угодно сложные.

---------

Решил написать этот пост, так как мы стали получать много заявок, на тему "хотим, чтобы клиенты сразу везде и повсюду видели все цены с учетом своих скидок", но так, к сожалению, пока невозможно с обычным Mysql.

Daniel пишет:

К примеру описание товара в МойСклад заливается в RS в Краткое описание

Это в ближайшем обновлении будет починено добавлением опции в настройках модуля Обмен данными.
Почему-то Мой склад описание передает в реквизите "Полное наименование", что весьма и весьма необычно.

Андрей, принял информацию, спасибо!

Уважаемые пользователи, разработчики!

Давно мы не получали обратную связь!
Расскажите как у вас дела? Как поменялись ваши продажи после COVID?
Что на ваш взгляд в ближайшее время будет наиболее востребовано в online продажах?

Все ошибки, которые мы наблюдали на текущий момент, которые связаны с sameSite были связаны с внешними скриптами, то есть ошибки на их стороне. (Например яндекс метрика)

Если у вас есть подробное техническое описание именно на нашей ошибки, напишите.

123

(4 ответов, оставленных в Вопросы по работе с системой)

Такая ошибка может возникать только из-за старых js в кэше браузера. Что-то недоочистили 100%. Возможно не выбрали За весь период.

Просто при добавлении в шаблоне третьего пункта оно магическим образом работать не будет,
необходимо запрограммировать всю логику в контроллере, как должны обрабатываться новые значения.

А это по сути означает включение перенаправления стандартного маршрута checkout на контроллер вашего кастомного модуля, который уже будет отвечать за оформление заказа.

Думаю, без профессионального программиста переделать логику оформления заказа не получится.

Правило построения пути к шаблону такие:

Абсолютный URL:

%ИМЯ МОДУЛЯ%/ПУТЬ К ШАБЛОНУ ОТНОСИТЕЛЬНО ПАПКИ VIEW.tpl

Пример:
%users%/register.tpl = /templates/ТЕМА/moduleview/users/register.tpl или /modules/users/view/register.tpl
%users%/notice/touser_register.tpl = /templates/ТЕМА/moduleview/users/notice/touser_register.tpl или /modules/users/view/notice/touser_register.tpl


------------

В {moduleinsert} можно также указывать путь к шаблону относительно папки /view модуля, например

{moduleinsert name="\Menu\Controller\Block\Menu" indexItemplate="blocks/menu/catalog_menu.tpl"}

В этом случае путь к шаблону будет равен /templates/ТЕМА/moduleview/menu/blocks/menu/catalog_menu.tpl или /modules/menu/view/blocks/menu/catalog_menu.tpl