Напишите нам в support@readyscript.ru мы добавим.

Вы хотите, чтобы у вас просто не переходил текст на следующую строку в шаблоне? я так понял речь идёт о   вместо пробелов?

2,478

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

1. Наверное да. Но это только лишь догадки. Правду знает лишь поисковик.
2. " это кавычки в кодировке после htmlspecialchars, просто в html & перевёлся в &. Соответственно Ваш надо просто раскодировать строку.
Например так:

{$item|htmlspecialchars_decode}

Вопрос:
Как сделать Ajax запрос блок контроллеру в Readyscript?

Ответ:
Дело в том, что каждый блок контроллер в системе обладает своим уникальным идентификатором. Заботится о нём не надо, т.к. как только вы его вставляете на страницу, то тут же у него генерируется уникальный номер. Это нужно для того, чтобы можно было вставить несколько таких же блок контроллеров или же разных, но чтобы именно тот который Вам нужно отработал.
Соответственно когда вы посылаете запрос, то надо передавать уникальный идентификатор блока в параметре с именем "_block_id".
Т.е. например

 
?_block_id=-345345431

Как его получить?
В шаблоне доступна переменная $this_controller у которой есть метод getBlockId, его то и можно использовать, например так

/путь к блок контроллеру/?_block_id={$this_controller->getBlockId()}

Если вы реализуете форму, то есть метод, который вернёт скрытый input с прописанным id блока, который будет учитываться при отправке формы.

<form>
{$this_controller->myBlockIdInput()}
....
</form>

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

{$router->getUrl('catalog-block-sidefilters', ['_block_id'=>$this_controller->getBlockId(), 'p'=>2])}

Т.е. используя объект $router. В данном примере это страница со списком товаров, и где-то там наш блок контроллер.

И тогда получится адрес примерно такой:

/catalog-block-sidefilters/?_block_id=-342342345&p=2

Ну хорошо, вот мы отправили запрос.
Как понять на стороне контроллера, какому контроллеру пришёл запрос и сделать обработку этого запроса?

Всё просто. В нашем блок контроллере пишем...
Для POST запроса:

if ($this->isMyPost()){
   //Мой POST запрос
}

Для GET запроса:

if ($this->myGet()){
   //Мой GET запрос
}

Если есть вопросы, задавайте.

Вопрос:
Как понять в шаблоне Ajax запрос произошел или нет?
Ответ:
Система сама понимает, когда произошёл AJAX запрос и выдает шаблон обрезанный без обёртки в случает если используется Front контроллер. Однако всё же бывают случаи когда надо узнать это аякс или нет прямо в шаблоне...

В шаблоне доступна переменная $url (объект класса \RS\Http\Request, путь к файлу /core/rs/request.inc.php) у которой есть метод isAjax().
Поэтому проверка будет такая:

{if $url->isAjax()}
  //Это аякс запрос
{/if}
Amigo пишет:

Нашел проблему. Для полноценной работы bootstrap помимо CSS необходимо подключить следующие JS скрипты:

<script src="http://code.jquery.com/jquery-1.11.3.js"></script>
<script src="//netdna.bootstrapcdn.com/bootstrap/3.3.2/js/bootstrap.min.js"></script>

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

{addjs file="jquery.min.js" name="jquery" basepath="common" unshift=true}

Дело в том что используемая версия 1.8.2 уже устарела и bootstrap ее не поддерживает. При попытке подключить версию 1.11.2 или 1.11.3 перестают работать слайдер для фото, очистка кеша и т.д.  Печаль (((

Да, мы позднее обновим эту версию. Но есть возможность как не использовать старую версию, которая конфликтует. В Управление->Настройки системы есть галочка которая отвечает за, то что показывать панель администратора или нет. Если отключить, то конфликта не будет.

Скрипты и css вы правильно подключили. Главное проверить, а подключилась ли у Вас JS бутсрапа. Т.е. тот ли вы путь указали.
Проверьте в FireBug консоли есть ли ошибки.

{literal} для css можно не использовать.
для JS в вашем случае тоже.

Большое спасибо!

Не за что smile

В обычном экспорте выгружается всё. Но если переключится на категорию в Каталоге товаров и выбрать "Расширенный экспорт товаров". То товары будут выгружены только из той категории которую вы выбрали.

Ну отлично! Киньте пожалуйста текст с примерами файлов. Может кому пригодится, если не жалко.

Напишите нам в пожелания в helpdesk.readyscript.ru. Мы рассмотрим.

Разобрались?

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

Например Вы можете посмотреть на класс:
/modules/article/model/commenttype/article.inc.php - отвечает за тип комментария к статье.
Соответственно такой класс должен быть и в Вашем модуле, только переделанный под вас.

//Классе который обрабатывает бренды id бренда записывается в следующий роут
$this->router->getCurrentRoute()->brand_id
(Посмотреть можно в файле класса /modules/catalog/front/brand.inc.php)

Соответственно маршрут должен быть catalog-front-brand для вашего класса.

Для собственного модуля почитайте вот эту статью Создаём собственный модуль.
Но по большому счёту Вам надо скопировать и переделать под себя класс типа комментария.

Попробуйте разобраться, если что-то не получится пишите.

Вам для какой темы оформления?

Подобная проблема, не могу установить систему на хостинг ru-centr
Не могу найти модуль filer в панели управления хостингом, может они обновление сделали...

А вы им прозвоните, пусть включат.

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

Во первых надо включить отображение ошибок на период разработки:
Включение отображения ошибок


Все файлы и классы в системе обладают своим namespace в самом начале файла. Если вы укажите свой namespace то они не пересекутся. Т.е. для своей папки используется свой уникальный namespace.

В формате:
Папка модуля\путь к файлу

Также там прописаны маршруты обрабатываемых страниц для брендов. Они находятся в файле handlers.inc.php в методе getRoute. Их надо либо убрать, либо заменить на свои.
Документацию по маршрутам можно взять здесь:
Маршруты в ReadyScript

Следующий шаг. Нужно классы, которые отвечают за ORM объекты(записи в БД) изменить таким образом, чтобы они использовали другие таблицы, чтобы они не пересекались. Они находятся в папках /modules/НУЖНЫЙ МОДУЛЬ/model/orm/.
Например в объекте брендов это будет строка:

protected static
        $table = 'brand'; //Имя таблицы в БД

Вот описание ORM объектов в системе.
А вот, то что я приводил на форуме по полям ORM объектов.
Описание по полям

Если останутся вопросы, то говорите.

Ну вообще сортировка становится в таком порядке в котором её отдала 1Ска. Можно например у этого товара переставить комплектации в админке и всё будет нормально. Но для одного товара это понятно.
Если у вас пачка товаров, то лучше выгрузить в CSV. Задать им порядок(индекс сортировки) и загрузить обратно.
Обратите внимание, что у каждого товара есть и должна быть 0(нулевая) комплектация. Она отвечает за сам товар.
Остальные комплектации идут на увеличение.
Т.е. для одного товара должно быть
0 комплектация
1 комплектация

и т.д.

Не за что. smile Надеюсь, Вам это пригодится.

2,496

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

Sergey T. пишет:

Попробовал, работает, класс добавляется. Вопрос в следующем, а как сделать условие, если не больше нуля, а равно нулю? Если я добавляю вот так, то не работает.

{if $product.num=0}
    мой класс
{/if}


Всё правильно. В php =(равно) является равно. Т.е. вы присвоили 0. Если Вам надо проверить на ноль, то нужно писать двойное равно(==):

{if $product.num==0}
    мой класс
{/if}

2,497

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

Всё просто.
Если вы посмотрите в файл /modules/catalog/model/orm/product.inc.php
То там есть описание полей класса \Catalog\Model\Orm\Product, который является объектом товара.
Общее количество товара хранится в поле num. Т.е. нам нужно просто проверить положительное значение этого поля.

{if $product.num>0}
    //Ваш класс
{/if}

Пробуйте.

Подскажите, пожалуйста, а как быть с многомерными комплектациями?
Пробовал по аналогии с кодом из файла product.tpl, вывод по var_dump показал, что у $product нет multioffers.
Многомерные комплектации используются, в корзине выбор есть, в карточке товара аналогично.

p.s. Подсмотрел в контроллере: $product->fillMultiOffers()

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

{$product->fillMultiOffers()}

После этого к товару будут дописаны многомерки если они есть и проверить это можно так:

{if $product->isMultiOffersUse()}
   //Многомерки используются
{else}
   //Иначе
{/if}

После того как добавятся многомерки, то они будут ключе массива объекта \Catalog\Model\Orm\Product. А именно в

   <pre>
   {var_dump($product.multioffers)}
   </pre>

Т.е. перебрать многомерки можно как в карточке товара

{foreach $product.multioffers.levels as $level}
    
{/foreach}

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

{if $product->isOffersUse()}
                {foreach from=$product.offers.items key=key item=offer name=offers}
                    <input value="{$key}" type="hidden" name="hidden_offers" class="hidden_offers" {if $smarty.foreach.offers.first}checked{/if} id="offer_{$key}" data-info='{$offer->getPropertiesJson()}' {if $check_quantity}data-num="{$offer.num}"{/if} {if $catalog_config.use_offer_unit}data-unit="{$offer->getUnit()->stitle}"{/if} data-change-cost='{ ".offerBarcode": "{$offer.barcode|default:$product.barcode}", ".myCost": "{$product->getCost(null, $key)}", ".lastPrice": "{$product->getCost('Зачеркнутая цена', $key)}"}' data-images='{$offer->getPhotosJson()}' data-sticks='{$offer->getStickJson()}'/>
                {/foreach}
                
      <input type="hidden" name="offer" value="0"/>
{/if}

Соответственно нужно обеспечить выбор нужной комплектации которая соответствует выбраной многомерной комплектации. Если посмотреть на input'ы, то там видно, что подгружаются сведения о многомерках в data-info.
Т.е. нужно javascript.
Посмотреть как взять нужную комплектацию можно в /templates/ВАША ТЕМА/resourse/js/jquery.changeoffer.js, в методе changeMultiOffer.

Для javascript просмотра используйте firebug и console.log(переменная);

В этом методе смотрится, что выбрана многомерка, смотрится соотвествие комплектациям, и если такая есть, то в input с name="offer" ставится нужная комплектация.

При нажатии на кнопку купить. Скрипт смотрит что у нас находится в этом input в рамках контейнера который обёрнут с data-id="id товара", как приведено выше.

По идее, Вам надо просто добавить скрипт jquery.changeoffer.js на эту страницу и он сам поймёт всю структуру. И при смене многомерки будет выбиратся нужная комплектация. Главное чтобы была обёртка с data-id (как было описано в предыдущем посте).

Есть ещё другой момент. Вы работаете со списком товаров, а каждый раз подгружать многомерки накладно. Поэтому вместо:

{$product->fillMultiOffers()}

Вам нужно использовать конструкцию

{$list=$this_controller->api->addProductsMultiOffers($list)}

Подробнее данный метод можно посмотреть в файле /modules/catalog/model/api.inc.php. Данный метод позволит подгрузить многомерки сразу многим товарам.

Пробуйте.

2,499

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

Так же не совсем понятно как именно работает подсчет остатков в таблицах - при просмотре категории в админке.

Поясните пожалуйста, что конкретнее Вам пояснить? Ато не совсем понятен вопрос.

2,500

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

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

{$product->getCost()}

и

{$product->getCost('Зачеркнутая цена')}

Т.е.

{$product->getCost('Название нужной цены')}