Намного проще сделать 301 редиректы со старых урлов товаров на новые. Возможно вам данный вариант подойдет?

Простого способа это сделать - нет.  Так как вы хотите убрать якорь из маршрута, который придает ему уникальность по сравнению с другими урлами на сайте. Будет необходимо влазить в глубины маршрутизации. Ну и конечно все URL_имена категорий перечислять в маршруте к категории и товару.

Если с категориями все не так сложно, можно видоизменить маршрут

        //Просмотр категории продукции
        $routes[] = new \RS\Router\Route('catalog-front-listproducts', array(
            '/catalog/{category}/',
            '/catalog/'
        ), null, t('Просмотр категории продукции'));

Примерно таким образом (перечислив все идентификаторы категорий, чтобы обойти конфликты с другими маршрутами):

        //Просмотр категории продукции
        $routes[] = new \RS\Router\Route('catalog-front-listproducts', array(
            '/{category:(demo-produkty|elektronika)}/',
            '/catalog/'
        ), null, t('Просмотр категории продукции'));

То с формированием Урлов для товара придется переделать его стандартный маршрут, примерно на такой:

        
        //Карточка товара
        $routes[] = new \RS\Router\Route('catalog-front-product', 
            '/{category:(demo-produkty|elektronika)}/{id}/', null, t('Карточка товара'));

И переделать метод getUrl у объекта \Catalog\Model\Orm\Product, необходимо дописать передачу
параметра category в маршрут, так как стандартно там передается только id

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

На практике мы делали однажды подобную работу для одного клиента, выгоды никакой не получили абсолютно для поисковой выдачи.

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

Наоборот, можете удалить все миниатюры /storage/photo/resized, они будут создаваться постепенно, пока пользователи будут обходить ваш сайт. Это даст небольшой запас времени.

Единственное что можно удалить - это папку storage/tmp - если она у вас есть.

Для системного решения, конечно нужно место срочно увеличивать. Благо сейчас место на диске почти ничего не стоит.

Тот же DigitalOcean 20GB, SSD, 512MB,  - 5$/мес.

В интернете - не существует однозначного ответа каким должен быть урл, со слешем в конце или без (http://imperacms.ru/articles/seo/url-so … avilno.htm),
а соответственно можно выбрать как один вариант, так и второй. Мы выбрали вариант со слешем в конце.

URL без слеша в конце - это неизвестный для системы URL, поэтому система возвращает 404. Система однообразно ведет себя для всех неизвестных адресов, а именно отдает 404.

По правильному должен быть редирект на страницу со слешем.

Если он вам нужен, вы можете создать правило в .htaccess.
Не думаю, что он нужен всем, так как адреса внутренних страниц вручную никто не набирает вслепую,
а поисковики берут те адреса, что представлены на сайте. Соответственно никакой проблемы - нет.

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

Вероятно, что данное правило может сломать урлы с параметрами (надо проверить):

/catalog/категория/?page=2
/catalog/категория/?f[id_характеристики]=значение_харктеристики

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

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

Это можно сделать:
1. просто в базе, тогда это будет до первого обновления модуля "Блок фотографий",
2. можно сделать с помощью дополнительного модуля (рекомендуемое решение), и обработки в нем события инициализации ORM объекта Photo\Model\Orm\Image

Примерно таким обработчиком (handlers.inc.php):

<?php
namespace ВАШ_МОДУЛЬ\Config;

class Handlers extends \RS\Event\HandlerAbstract
{
    function init()
    {
        $this
            ->bind('orm.init.photo-image');
    }

    /**
    * Модифицируем ORM объект - "изображение"
    * 
    * @param \Photo\Model\Orm\Image $image - объект "изображение"
    */
    public static function ormInitPhotoImage(\Photo\Model\Orm\Image $image)
    {
        $image->__servername->setMaxLength(255);
    }
}

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

3. Можно сделать с помощью создания image.my.inc.php, у которого изменена длина поля в стандартном описании полей. (не рекомендуемый способ)

Вот так можно:

{if $product->isOffersUse()}
    {foreach $product.offers.items as $key=>$offer}
        {if $offer.num>0} {* offer.num - общий остаток комплектации на всех складах *}
            {if !$offer@first}, {/if}{$offer.title} {* название комплектации *}
        {/if}
    {/foreach}
{/if}

При импорте из CSV данные попадают в базу в том виде, в котором они есть. В данный момент CSV реализован, как низкоуровневый инструмент чтения/записи данных в базу.

Просто замените двойные кавычки на &quot; перед импортом с помощью автозамены.

Если у вас в системе только одна валюта, то вы можете оставить в колонке цена только число.
Например, сделать автозамену "(RUB)" на "", тем самым оставить только цифры в ячейках, увеличить вашу цену по формуле и загрузить обратно в систему.

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

835

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

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

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

Покупка в 1 клик - это аналог "Заказать звонок менеджера". Поэтому этот инструмент носит информационный характер для администраторов. И предусматривает, что менеджер перезвонит клиенту и создаст полноценный заказ в админ. панели. В шаблоне есть переменная - $is_auth, которая принимает значение true, если пользователь авторизован, можете её использовать.

837

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

Нет, все не совсем так.
В 1С выгружаются все заказы, которые удовлетворяют заданным в настройках модуля обмена условиям, а именно статусам.

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

838

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

Да, так можно.
Только убедитесь, что в настройках модуля обмена на вкладке "Каталог товаров", опция "Что делать с товарами, отсутствующими в файле импорта" имеет значение - "Ничего".

На эти адреса ссылаются заказы, поэтому их удаления в настоящее время - нет.
Напишите пожелание в наш сервис пожеланий.

Там выполняется eval() того, что написано в колонке Формула,
т.е. по сути вы можете использовать все математические функции PHP (использовать любые выражения PHP).

Из доступных переменных - 
$S - Сумма заказа
$W - Общий вес заказа

Например: round($S*0.3) - это означает 30% от стоимости заказа, сумма окрулена.

Да, это хорошее предложение, в новых версиях добавим флажок "публичности" для оплат и доставок.

Только с помощью удаления, или в крайнем случае прописать в шаблоне shop/checkout/delivery.tpl условие исключения.

Очень объемный вопрос, но постараюсь вкратце объяснить.

Так как при выборе  комплектации в селекторе, не происходит перезагрузок страницы, вам необходимо это делать с помощью JavaScript.  Посмотрите, как меняются цены при выборе селектора комплектаций. Что-то аналогичное нужно судя по всему вам.

Информация по комплектации сначала выводятся в атрибутах элемента формы:

<select name="offer">
    {foreach from=$product.offers.items key=key item=offer name=offers}
    <option value="{$key}" {if $smarty.foreach.offers.first}checked{/if} {if $check_quantity}data-num="{$offer.num}"{/if} data-change-cost='{ ".offerBarcode": "{$offer.barcode|default:$product.barcode}", ".myCost": "{$product->getCost(null, $key)}", ".lastPrice": "{$product->getCost('Зачеркнутая цена', $key)}"}' data-sticks='{$offer->getStickJson()}'>{$offer.title}</option>
    {/foreach}
</select>

А затем уже в JavaScript вы можете получить текущую выбранную комплектацию, считать у неё атрибут и сделать с ним что угодно(например вывести куда-нибудь).

{foreach $product.offers.items as $offer_sortn=>$offer}
    {* $offer - здесь объект \Catalog\Model\Orm\Offer *}
    {$offer.num} 
    {$offer.id}
{/foreach}

Да, если в аргументе 2,3 метода bind - не задан callback на другой обработчик.

Исправили данную ошибку, будет опубликовано в ближайшем обновлении.

Ошибка в следующем:

Вы подвешиваетесь на событие orm.init.catalog-offer. 2,3 аргумент у bind - не задан, соответственно это означает, что система будет искать в данном классе функцию для обработки события с названием события, за вычетом точек и минусов.

т.е. Вам необходимо назвать функцию вместо ormInitCatalogProduct так:

public static function ormInitCatalogOffer(\Catalog\Model\Orm\Offer $offer)

В сентябре 2014 вышла новая версия модуля обмена. Для импорта многомерных комплектаций теперь достаточно установить один флажок в настройках модуля обмена данными с 1С.
Эта информация есть в новости http://readyscript.ru/text-blog/novye-v … adyscript/

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

Торговое предложение - это обычный ORM объект класса \Catalog\Model\Orm\Offer.
В нашей статье подробно расписано, как расширять ORM объект из дополнительного модуля. (см. обработку события orm.init.КОРОТКОЕ_ИМЯ_ORM_ОБЪЕКТА)
http://readyscript.ru/text-blog/Kak-pra … adyScript/

Следует учитывать, что Торговое предложение имеет не автоматически генерируемую форму отображения в админ. панели. Т.е. если необходимо выводить данное поле визуально в админ. панели, то необходимо будет править шаблон \modules\catalog\view\form\product\offers.tpl

Нет, к складу привязывается только остаток.