Если вдруг кому интересно, то смотрим сюда:
Как сделать заглушку сайта на ReadyScript

2,227

(12 ответов, оставленных в Вопросы по разработке модулей и API системы)

Во первых.
Мы не приемлим прямых обращений в базу. У нас в системе на прямую обращаться нет надобности. Т.к. для этого уже всё предусмотрено. ЗАБУДЬТЕ о прямых обращениях в БД, это метод "лохматых" годов и"олдскул".
Со всем записями в БД можно работать через ORM объект. Каждому ORM объекту соответствует своя БД и своя одна запись в этой БД.
При удалении через ORM объект срабатывает метод delete() в котором, подтягиваются все необходимые данные и удаляются. Поэтому Вам надо сделать примерно так:

$product = new \Catalog\Model\Orm\Product(id записи в БД); //Получаем одну запись товара из БД и помещаем в ORM объект значения
$product->delete(); //Удалит товар и всё что с ним связано само 

Поэтому Вам вообще не надо думать о том какие таблицы задействованы.
Как делать выборки? Вот пара материалов из форума:
http://forum.readyscript.ru/topic/16/zaprosy-k-bd/
http://forum.readyscript.ru/topic/297/g … apis-v-bd/
http://forum.readyscript.ru/topic/321/f … -usloviem/
Ну и собственно документация:
Подсистема ORM и запросы

Если у Вас возникнут вопросы или надо подсказать запрос, то пишите мы Вам всё подскажем с примерами.

Хорошо. Обсудим.

Вообщем так надо сделать:

{addjs file="order.js"}

{assign var=errors value=$order->getNonFormErrors()}
{if $errors}
    <div class="pageError">
        {foreach from=$errors item=item}
            <p>{$item}</p>
        {/foreach}
    </div>
{/if}

<form method="POST" id="order-form">
    
    <input type="hidden" name="user_type" value="{$order.user_type}">
    <div class="userProfile activeTabs" data-input-name="user_type">
        {if !$is_auth}
        <div class="formSection">
            <span class="sectionListBlock">
                <ul class="lineList tabList">
                    <li><a class="item {if $order.user_type=='person'} act{/if}" data-tab="#user-tab1" data-input-val="person" href="JavaScript:;">Частное лицо</a></li>
                    <li><a class="item{if $order.user_type=='company'} act{/if}" data-tab="#user-tab1" data-class="thiscompany" data-input-val="company" href="JavaScript:;">Компания</a></li>
                    <li><a class="item{if $order.user_type=='user'} act{/if}" data-tab="#user-tab2" data-input-val="user" href="JavaScript:;">Я регистрировался раннее</a></li>
                </ul>
            </span>
        </div>
        {/if}
    
        <div class="tabFrame {if $order.user_type =='user'} hidden{/if}{if $order.user_type =='company'} thiscompany{/if}" id="user-tab1">
            {if $is_auth}
                <div class="formSection">
                    <span class="formSectionTitle">Покупатель</span>
                    <a href="{urlmake logout=true}" class="ml10">сменить пользователя (Выход)</a>
                </div>    
                
                <table class="formTable">
                    {if $user.is_company}
                    <tbody>
                        <tr>
                            <td class="key">Название организации:</td>
                            <td class="value">
                                {$user.company}
                            </td>
                        </tr>
                        <tr>
                            <td class="key">ИНН:</td>
                            <td class="value">
                                {$user.company_inn}
                            </td>
                        </tr>                
                    </tbody>
                    {/if}
                    <tbody>
                        <tr>
                            <td class="key">Имя:</td>
                            <td class="value">
                                {$user.name}
                            </td>
                        </tr>
                        <tr>
                            <td class="key">Фамилия:</td>
                            <td class="value">
                                {$user.surname}
                            </td>
                        </tr>
                        <tr>
                            <td class="key">Отчество:</td>
                            <td class="value">
                                {$user.midname}
                            </td>
                        </tr>                    
                        <tr>
                            <td class="key">Телефон:</td>
                            <td class="value">
                                {$user.phone}
                            </td>
                        </tr>                    
                        <tr>
                            <td class="key">E-mail:</td>
                            <td class="value">
                                {$user.e_mail}
                            </td>
                        </tr>
                    </tbody>
                </table>
            {else}
                <table class="formTable">
                    <tbody class="organization">
                    <tr>
                        <td class="key">Название организации:</td>
                        <td class="value">
                            {$order->getPropertyView('reg_company')}
                            <div class="help">Например: ООО Аудиторская фирма "Аудитор"</div>
                        </td>
                    </tr>
                    <tr>
                        <td class="key">ИНН:</td>
                        <td class="value">
                            {$order->getPropertyView('reg_company_inn')}
                            <div class="help">10 или 12 цифр</div>
                        </td>
                    </tr>                
                    </tbody>            
                    <tbody>
                    <tr>
                        <td class="key">Имя:</td>
                        <td class="value">
                            {$order->getPropertyView('reg_name')}
                            <div class="help">Имя покупателя, владельца аккаунта</div>
                        </td>
                    </tr>
                    <tr>
                        <td class="key">Фамилия:</td>
                        <td class="value">
                            {$order->getPropertyView('reg_surname')}
                            <div class="help">Фамилия покупателя, владельца аккаунта</div>
                        </td>
                    </tr>                    
                    <tr>
                        <td class="key">Отчество:</td>
                        <td class="value">
                            {$order->getPropertyView('reg_midname')}
                        </td>
                    </tr>                    
                    <tr>
                        <td class="key">Телефон:</td>
                        <td class="value">
                            {$order->getPropertyView('reg_phone')}
                            <div class="help">В формате: +7(123)9876543</div>
                        </td>
                    </tr>                    
                    <tr>
                        <td class="key">E-mail:</td>
                        <td class="value">
                            {$order->getPropertyView('reg_e_mail')}
                        </td>
                    </tr>
                    <tr>
                        <td class="key">Пароль:</td>
                        <td class="value">
                            <input type="checkbox" name="reg_autologin" {if $order.reg_autologin}checked{/if} value="1" id="reg-autologin">
                            <label for="reg-autologin">Получить автоматически на e-mail</label>
                            <div class="help">Нужен для проверки статуса заказа, обращения в поддержку, входа в кабинет</div>
                            <div id="manual-login" {if $order.reg_autologin}style="display:none"{/if}>
                                <div class="inline f">
                                    {$order.__reg_openpass->formView(['form'])}
                                    <div class="help">Пароль</div>
                                </div>
                                <div class="inline">
                                    {$order.__reg_pass2->formView()}
                                    <div class="help">Повтор пароля</div>
                                </div>
                                <div class="inline">
                                    <div class="form-error">{$order->getErrorsByForm('reg_openpass', ', ')}</div>
                                </div>
                            </div>
                        </td>
                    </tr>
                    
                    {foreach from=$reg_userfields->getStructure() item=fld}
                    <tr>
                        <td class="key">{$fld.title}</td>
                        <td class="value">
                            {$reg_userfields->getForm($fld.alias)}
                            {assign var=errname value=$reg_userfields->getErrorForm($fld.alias)}
                            {assign var=error value=$order->getErrorsByForm($errname, ', ')}
                            {if !empty($error)}
                                <span class="form-error">{$error}</span>
                            {/if}                        
                        </td>
                    </tr>
                    {/foreach}                
                    
                    </tbody>
                </table>
                {/if}
               <div class="formSection">
                    <span class="formSectionTitle">адрес</span>
               </div>
               
               {if count($address_list)>0}
                    <div class="existsAddress">
                        Использовать следующий адрес:
                        <table id="address-list">
                            {foreach from=$address_list item=address}
                            <tr>
                                <td><input type="radio" name="use_addr" value="{$address.id}" id="adr_{$address.id}" {if $order.use_addr == $address.id}checked{/if}></td>
                                <td>
                                    <label for="adr_{$address.id}">{$address->getLineView()}</label>
                                    <a href="{$router->getUrl('shop-front-checkout', ['Act' =>'deleteAddress', 'id' => $address.id])}" class="deleteAddress"/></a>
                                </td>
                            </tr>
                            {/foreach}
                            <tr>
                                <td><input type="radio" name="use_addr" value="0" id="use_addr_new" {if $order.use_addr == 0}checked{/if}></td>
                                <td><label for="use_addr_new">Другой адрес</label></td>
                            </tr>                
                        </table>
                    </div>
                {else}
                    <input type="hidden" name="use_addr" value="0">
                {/if}
                <table class="formTable">
                    <tbody class="new-address">
                        <tr>
                            <td class="key">Страна:</td>
                            <td class="value">
                                {assign var=region_tools_url value=$router->getUrl('shop-front-regiontools', ["Act" => 'listByParent'])}
                                {$order->getPropertyView('addr_country_id', ['data-region-url' => $region_tools_url])}
                                <div class="help">Например: Россия</div>
                            </td>
                        </tr>
                        <tr>
                            <td class="key">Область, Город:</td>
                            <td class="value">
                                <div class="inline f">
                                    {assign var=regcount value=$order->regionList()}
                                    <span {if count($regcount) == 0}style="display:none"{/if} id="region-select">
                                        {$order.__addr_region_id->formView()}
                                    </span>
                                    
                                    <span {if count($regcount) > 0}style="display:none"{/if} id="region-input">
                                        {$order.__addr_region->formView()}
                                    </span>
                                    <div class="help">Область/Край</div>
                                </div>
                                <div class="inline">
                                    {$order->getPropertyView('addr_city')}
                                    <div class="help">Город</div>
                                </div>
                            </td>
                        </tr>                    
                        <tr>
                            <td class="key">Индекс, Адрес:</td>
                            <td class="value">
                                <div class="inline f">
                                    {$order.__addr_zipcode->formView()}
                                    <div class="help">Индекс</div>
                                </div>
                                <div class="inline">
                                    {$order->getPropertyView('addr_address')}
                                    <div class="help">Адрес. Например: ул. Красная, 100, офис 71</div>
                                </div>
                            </td>
                        </tr>
                    </tbody>
                    <tbody>
                        <tr>
                            <td class="key">Контактное лицо:</td>
                            <td class="value">
                                {$order->getPropertyView('contact_person')}
                                <div class="help">Лицо, которое встретит доставку. Например: Иван Иванович Пуговкин</div>
                            </td>
                        </tr>
                        {if $order.__code->isEnabled()}
                            <tr>
                                <td class="key">Защитный код:</td>
                                <td class="value">
                                    {$order->getPropertyView('code')}
                                    <div class="help">Необходим для защиты от спам роботов</div>
                                </td>
                            </tr>
                        {/if}
                    </tbody>
                </table>
                
                {if $conf_userfields->notEmpty()}
                    <br>
                    <div class="formSection">
                        <span class="formSectionTitle">дополнительные сведения</span>
                    </div>
                    <table class="formTable">
                        <tbody>
                        {foreach from=$conf_userfields->getStructure() item=fld}
                        <tr>
                            <td class="key">{$fld.title}</td>
                            <td class="value">
                                {$conf_userfields->getForm($fld.alias)}
                                {assign var=errname value=$conf_userfields->getErrorForm($fld.alias)}
                                {assign var=error value=$order->getErrorsByForm($errname, ', ')}
                                {if !empty($error)}
                                    <span class="form-error">{$error}</span>
                                {/if}                        
                            </td>
                        </tr>
                        {/foreach}
                        </tbody>
                    </table>        
                {/if}
            </div>
            
            {if !$is_auth}
            <div class="tabFrame{if $order.user_type !='user'} hidden{/if}" id="user-tab2">
                    <table class="formTable">
                        <tbody>
                        <tr>
                            <td class="key">Логин:</td>
                            <td class="value">
                                {$order->getPropertyView('login')}
                            </td>
                        </tr>    
                        <tr>
                            <td class="key">Пароль:</td>
                            <td class="value">
                                {$order->getPropertyView('password')}
                                <a href="?ologin=1" id="order_login">Вход</a>
                            </td>
                        </tr>                    
                    </table>
            </div>
            {/if}
            
       </div>
       
       
       
    
    
         
    <button type="submit" class="formSave">Далее</button>
</form>
<br><br><br>

Вы нашли tabFrame правильно. И теперь посмотрите где находится закрывающий </div>. Так вот это надо передвинуть таким образом, чтобы он закрыл ещё и див в выдачей адресов. Т.е. Вам надо просто перенести часть кода которая отвечает за адреса в перед закрывающим дивом tabFrame.

2,231

(16 ответов, оставленных в Предложения по улучшению системы)

Отлично. Ждём модуль в маркетплэйс.

2,232

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

Спасибо, вот второй вариант меня как раз и интересует.

    Папочки с поддоменами соответственно на хостинге.

А в папочке что?

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

2,233

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

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

Хорошо.

2,235

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

Тут есть 2 пути. 1 через мильтисайтовость, другой через партнёрский модуль.

1. Мультисайтовость.
При покупке полной лицензии вы получаете дополнительно лицензию на 2 домена, под управлением одной системы. Но в данном случае, Всё будет разное в системе, кроме пользователей. Пользователи будут одинаковые для всех. Переключатся можно через админку.
Это будет как будто 2 разных сайта.

Соответственно, если у Вас сайтов больше 2-х, то Вам надо будет докупить лицензии на доп домены, до скольки Вам необходимо. Дополнительный сайт на Вашей лицензии будет стоить  3 750 на данный момент.
http://readyscript.ru/internet-magazin/shop-full/

Как сделать мультисайтовость можно почитать здесь:
Мультисайтовость
Причём править robots.txt, .htaccess не надо, т.к. у нас предусмотрено это действие на автомате при создании нового сайт.

2. Партнёрский модуль.
Он присутствует в версии Гипермаркет и позволяет добавлять сколько угодно сайтов на данную систему, но дело в том, что в данном случае, товары будут те же самые и Вы назначаете в каждый филиал нужные для показа товары, админ у них тоже будет свой. "Мордочки" сайтам можно тоже менять. Вам останется просто на хостинге настроить алиас поддомена на основную папку со скриптом. Добавить в админке сайты можно через Разное->Партнёрский модуль. Папочки с поддоменами соответственно на хостинге.

PS. Какую нагрузку на БД потянет скрипт? 10 000? 50 000? 200 000?

Скрипт потянет все, но надо понимать, что сайт это одна сторона, а хостинг другая. У нас есть сайты 35 000 и 60 000 товаров, которые себя спокойно чувствуют на обычном shared хостинге. Но надо смотреть по нагрузке, если посещаемость высокая, то соотвественно надо и хостинг по лучше. Но у нас скрипт не очень требовательный к ресурсом. Просто здесь всё индивидуально и зависит от хостинга.

2,236

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

При вызове поля через getPropertyView есть несколько параметров первым из которых является имя поля соответствующего объекта. А второй парамер принимает массив атрибутов для этого поля. Поэтому для Вашего случая конструкция будет выглядеть примерно так:

{$order->getPropertyView('reg_surname', ['placeholder'=>'Мой плэйсхолдер'])} 

Другое дело, что у нас действует ещё плагин data-deftext, который выполняет туже функцию, что и placeholder, только чуточку лучше и под все браузеры.
Поэтому можно и так:

{$order->getPropertyView('reg_surname', ['data-deftext'=>'Мой плэйсхолдер'])} 

В этой теме так как и в остальных используется activeTabs плагин для js. Находится он в jquery.activetabs.js. Там скрываются нужные контейнеры с классом tabFrame Скорее всего надо будет дообернуть нужный кусочек данным контейнером. Т.к. повидимому он не обёрнут.
Соответственно, нужно учесть, что данные контейнеры обладают своими идентификаторами, например первый это id="user-tab1", в него надо и обернуть.

Ну если у Вас присутствует домен xxxxx.ru, то поддомен, это просто папка как вы и указали. Т.е. по идее достаточно просто в браузере открыть поддомен, чтобы началась установка.

У нас такое реализовано было здесь
http://nefertiti-gsfr.ru/product/plat-e-00410-61061/
Кнопка в корзину представляет собой такой вид:

<div class="addToCartContainer" data-cart-url="{$router->getUrl('shop-front-cartpage')}">
     <a href="{$router->getUrl('shop-front-cartpage', ["add" => $product.id])}" class="buyButton addToCart noShowCart" data-product-page="1">В корзину <i></i></a>
</div>

А на класс addToCartContainer навешено событие, которое дописывает внутрь нужный нам код. В данном случае это выглядит так(theme.js):

var qCartAdd; //Таймер показа подсказки при покупке
    
/**
* Скрывать подсказку показывающую, что товар добавлен в корзину
* 
*/
function hideCartHint(){
    clearTimeout(qCartAdd); //Очищаем таймер, если он установлен
    $("#cartHint").stop(true,true).fadeOut('slow',function(){ //Делаем затухание
        $("#cartHint").remove(); //Удаляем добавлнный нами HTML
    }); 
} 

$(function() {

  /**
  * Событие которое вешается добавление в корзину, чтобы расширить функционал при добавлении в корзину. 
  * product.add это событие которое вызывается при добавлении в корзину
  * @param object e - объект события
  * @param object params - параметры из функции добавления в корзину
  */
  $('body').on('product.add',function(e, params){
        clearTimeout(qCartAdd); //Очищаем таймер, если он установлен
        var _this = e.target; //Сама кнопка
        var url   = $(_this).closest('[data-cart-url]').data('cart-url'); //Откуда берём url корзины
        $('#cartHint').stop(true,true).remove(); //Погасим прошлое всплывание, если несколько раз сразу нажали
        $(_this).closest('.addToCartContainer').append('<div id="cartHint" class="cartHint"><div><i></i>Товар добавлен в корзину<br/><a href="'+url+'">Перейти в корзину</a></div></div>'); //Добавляем код внутрь
        $("#cartHint").fadeIn(200,function(){ //Делаем плавный показ
            qCartAdd = setTimeout('hideCartHint()', 3000); //Делаем затухание через 3 секунды
        });
    });
});

Ну соответственно, надо будет настроить css под себя и разобраться javascript, по другому никак.
Если я Вас правильно понял, то это то что Вам нужно.

setFieldPrefix - это метод от родителя данного класса AbstructFilter

А нельзя чуть более подробнее описать процесс вывода кол-ва товаров в категории?

1. Вам нужно, это иметь шаблон блока, который выводит категории.
Он лежит по пути /templates/ВАША ТЕМА/moduleview/catalog/blocks/category/category.tpl
В нём идёт перебор циклом категорий и подкатегорий. Вывод категорий выглядит примерно так:

{$dir.fields.name}

Эту конструкцию надо дополнить так:

{$dir.fields.name} <sup>({$dir.fields.itemcount})</sup>

Т.е. {$dir.fields.itemcount} выводит нужное нам количество.
2. Если у Вас нет там шаблона, то просто скопируйте его из
/modules/catalog/view/blocks/category/category.tpl в
/templates/ВАША ТЕМА/moduleview/catalog/blocks/category/category.tpl
А дальше как в пункте 1.
3. Сохраняем шаблон и сбрасываем кэш.

И плюсом бы еще хотелось добавить кол-во товаров в фильтры (пример на картинке).

Пока такого функционала нет, для реализации задачи можно написать свой модуль.

В одном из ближайших обновлений этого можно будет избежать. В настройках модуля каталог появится флажок "Показывать фильтр по цене в виде слайдера". Если его установить, то всё будет работать сразу.

Да, дело именно в префиксе, т.к. передаётся массив параметрами для поиска и соответственно значение для поиска. Для объекта фильтра используйте функцию setFieldPrefix('f')

Обратитесь к нам в поддержку разберёмся. Вроде всё верно. Но нужно посмотреть.

Какая вкладка в конструкторе сайта у Вас выбрана?

Вроде всё верно. Кэш сбросили? И какая вкладка в конструкторе сайта у Вас выбрана?

А вы в настройках блока "Форма отправки на E-mail" указали форму для вывода?

Ну во первых посмотрите какие значения в списке регионов со значениями. Вероятно просто неверные значения в фильтр подставляются.
По сортировке... Сортировка запоминается в куках. Т.е. Вам надо выставить сортировку сначала нажав на нужную колонку и она запомнится.

У нас в системе действует система маршрутов(масок адресов), в данном случае /feedback-(номер формы)/ Поэтому url именно такой. По нему отслеживается, какую форму необходимо показать и обработать.
Как можно выкрутится?
Можно создать пункт меню в разделе Веб-сайт->Меню, у которого указать тип страница. В поле "Симв. идентификатор" укажем feedback. Далее идём в Веб-сайт->Конструктор сайта и добавляем нашу созданную страницу.
Если адаптивный дизайн, то нужно скопировать в центральной части контейнер из страницы "по-умолчанию" и в центральной части вставить блок с обратной связью.
А если не адаптивный(тема молодёжная), то указываем при создании страницы шаблон и вручную нужно прописать блок с вставкой обратной связи. Например, вот такая запись для вашего случая:

{moduleinsert name="\Feedback\Controller\Block\Feedback" form_id=1}

Всё равно мало сведений. Мне не совсем понятно. Вы хотите вывести информацию с одинаковой длинной символов, или вы хотите, чтобы у Вас были анонсы новостей разбиты по колонкам и эти колонки были одинаковыми по ширине?