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

Вот структура по документации к шаблону. wrapper оборачивает только часть данных.:

<!DOCTYPE html>
<html lang="en-us">
  
    <head>
        [HEAD_META]
    </head>
 
    <body class="smoothscroll enable-animation">
 
        <div id="slidetop">
            [SLIDE_TOP]
        </div>
 
        <div id="wrapper">
         
            <div id="topBar">
                [TO_BAR]
            </div>
 
            <div id="header">
                [BUTTONS]
                [LOGO]
                [NAV_MAIN]
            </div>
 
            <section>
                [SECTION_1]
            </section>
 
            ....
 
            <section>
                [SECTION_N]
            </section>
 
        </div>
  
 
        <!-- FOOTER -->
        <footer id="footer">
            [FOOTER_CONTENT]
        </footer>
        <!-- /FOOTER -->
 
        [PAGE_JAVASCRIPTS]
 
    </body>
</html>

Вопрос остается  с row, так как они не везде нужны (на примере в первом посте - меню и слайдер). Возможно ли переопределить tpl в системном шаблоне system?

Здравствуйте!
Верстаю тему с одного шаблона на BS 3.
Необходимо оборачивать несколько контейнеров.
Вкладывать контейнеры в конструкторе можно, но было бы неплохо для некоторых контейнеров и строк иметь возможность указывать генерировать ли конструкцию"<div class="container"> " <div class="row"> или нет.

Поясню на примере, где иногда не надо оборачивать container и когда не нужен row:

                 <!-- Несколько container оборачиваются div -->
<div id="wrapper">
         
            <div id="topBar">
                 
            </div>
 
            <div id="header">
            <div class="container">
                 <!-- ТУТ НЕ нУЖЕН ROW-->
                    <ul class="top-links list-inline pull-right">
                        <li class="text-welcome hidden-xs">Welcome, <strong>John Doe</strong></li>
    
                    </ul>
              </div>
            </div>
 
            <section>
           <div class="container">

            <h2 class="owl-featured noborder"><strong>FEATURED</strong> PRODUCTS</h2>
                 <!-- ТУТ НЕ нУЖЕН ROW-->
             </div>
                [SECTION_1]
            </section>
 
            ....
 
            <section>
                [SECTION_N]
            </section>
 
        </div>

Т.е. не получается в конструкторе сделать несколько повторяющихся контейнеров, обернутых одним div.

Как вариант, можно не генерировать div с классом container или row при указанном внешнем шаблоне, так как в нем и так можно добавить нужную конструкцию.

Ура, функционал сделан в Мегамаркете!

Благодарю, Александр!

id - в списке статей в колонке "№"


Прошу прощения, в файле feedback.inc.php в самом начале в строке

namespace evAddons\Model\CommentType;

надо заменить на

namespace Article\Model\CommentType;

Отлично! А то костыли использую

532

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

Спасибо, помогло!

Спасибо, тоже полезно будет, как без модуля реализуется.

Уважаемые разработчики, подскажите, пожалуйста, какие средствами отладки, логирования, разработки советуете пользоваться при работе с RS?

535

(2 ответов, оставленных в Сайт ReadyScript)

А https://docs.google.com/spreadsheets/d/ … li=1#gid=0 посчитали по баллам. ReadyScript - 2 место

536

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

Здравствуйте! Возникла проблемка при переходе с 5.6 на 7
Посыпались ошибки:
[Tue Mar 29 00:32:43.999460 2016] [cgi:error] [pid 18347] [client 2.94.189.63:38941] AH01215: PHP Fatal error:  Cannot use 'String' as class name as it is reserved in /var/www/-----/data/www/-----/core/rs/orm/type/string.inc.php on line 14

537

(2 ответов, оставленных в Сайт ReadyScript)

http://research.cmsmagazine.ru/obzor-sa … magazinov/
А RS очень даже неплохо смотрится на фоне многих

Замените префикс таблиц wlzd на свой и вставьте идентификаторы (номера) характеристик.

 SELECT id,wp.title,barcode,wpl.prop_id,wpl.val_str,wpl.val_int FROM wlzd_product wp,  wlzd_product_prop_link  wpl WHERE
  wp.id=wpl.product_id AND 
  wpl.prop_id IN ( 342) AND -- список идентификаторов характеристик (Номера) через запятую
  (wpl.val_int IS NULL OR wpl.val_int=0) -- если строковая переменная, то вместо val_int  будет  val_str

Вот запрос для вывода списка товаров с незаполненным весом:

 SELECT id,wp.title,barcode FROM wlzd_product wp WHERE wp.weight IN ('',0, ' ') OR wp.weight IS null

Теперь создайте пункт меню на статью "Отзывы".
В папке modules/article/model/commenttype создайте файл feedback.inc.php
В СТРОКЕ с текстом 

return 20;//страница отзывов

замените 20 на id статьи "Отзывы".

<?php
/**
* ReadyScript (http://readyscript.ru)
*
* @copyright Copyright (c) ReadyScript lab. (http://readyscript.ru)
* @license http://readyscript.ru/licenseAgreement/
*/
namespace evAddons\Model\CommentType;
//to do
//1.Вынести настройки в модуль
/**
* Тип комментария - коментарий к статье
* @ingroup Article
*/
class Feedback extends \Comments\Model\Abstracttype
{
    /**
    * Возвращает тип комментария
    */
    function getTitle()
    {
        return t('Отзывы');
    }
    
    /**
    * Возвращает ссылку на объект в административной части
    * 
    * @return string
    */
    function getAdminUrl(\Comments\Model\Orm\Comment $comment)
    {
        return \RS\Router\Manager::obj()->getAdminUrl('edit', array('id' => $comment['aid']), 'article-ctrl');
    }    
    
    /**
    * Возвращает id товара, к которому необходимо привязать комментарий
    * 
    * @return integer
    */
    function getLinkId()
    {
        $route = \RS\Router\Manager::obj()->getCurrentRoute();
       //убираем проверку на маршрут    
       
          if (isset($route->article_id)) {
                return $route->article_id;
            }
        
        return 20;//страница отзывов
  //return 9999;
    }
    
    /**
    * Обновляет поле "рейтинг" у статьи
    * Вызывается при добавлении комментария
    */
    function onAdd(\Comments\Model\Orm\Comment $comment)
    {
        if ($comment['rate']) {
            $api    = new \Comments\Model\Api(); 
            $api->recountItemRatingByComment(new \Article\Model\Orm\Article(), $comment);
        }
        return true;
    }
    
    /**
    * Действие при удалении комментария
    */
    function onDelete(\Comments\Model\Orm\Comment $comment)
    {
        $api = new \Comments\Model\Api(); 
        $api->recountItemRatingByComment(new \Article\Model\Orm\Article(), $comment);
    }
}

В папке moduleview/article  с вашей темой создайте файл view_article_feedback.tpl

<div class="newsView">
    <article>
        <h1>{$article.title}</h1>
        
        {if !empty($article.image)}
        <img class="mainImage" src="{$article.__image->getUrl(700, 304, 'xy')}" alt="{$article.title}"/>
        {/if}
        {$article.content}
    </article>
    {moduleinsert name="\Photo\Controller\Block\PhotoList" type="article" route_id_param="article_id"}
    
</div>
{moduleinsert name="\Comments\Controller\Block\Comments" type="Article\Model\CommentType\Feedback"}

В конструкторе сайта создайте страницу "Меню-ОТзывы", поместите туда блок "Статья" со статьей "Отзывы", а шаблон в настройка замените на "theme:<Ваша тема>/moduleview/article/view_article_feedback.tpl"

Теперь у нас в админке есть комментарии с типом "Отзывы" на странице "Отзывы")))

Это слишком узконаправленный функционал.  Чтобы всех удовлетворить, тогда надо делать конструктор фильтров, как сделано, например у Oracle Forms.
В понедельник запрос напишу и выложу.

Облако или на Вашем хостинге?
Если на хостинге, то простейшими sql запросами можно вывести список.
А можно и модуль фильтра каталога товаров сделать. В платной техподдержке за день-два сделают.

542

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

Как вариант, сначала разрабатывать на поддомене с активированной  на него лицензией (dev.site.ru). После переноса на site.ru попросить разработчиков активировать на основной домен.

Я реализовавыл данный функционал Оказывается блок комментариев предназначен только для новостей)
http://forum.readyscript.ru/topic/483/v … mentariev/ вот обсуждение.
Пришлось добавить новый тип комментариев- отзывы.
http://forum.readyscript.ru/post/2010/#p2010
В понедельник выложу свой вариант.

Как раз идея для модуля

На текущий момент жалоб нет. Правда я перестраховался и добавил 1 процессор в VDS.

546

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

1. Начало оформления заказа    url: содержит «/checkout/address»
2. Страница оплаты    url: содержит «/checkout/payment/»
3. Подтверждение заказа    url: содержит «/checkout/confirmpage/»
4. Заказ совершен    url: содержит «/checkout/finish/»

Отдельная обработка событий метрики удобна тем, что можно сделать свой модуль, который будет подключаться к существующей теме без переделки.
На самом деле, подглядел у одного известного движка) Но там модуль еще и сам создавал цели в Метрике через API.

Александр, версия не последняя. Модуль магазина 2.0.0.86 .  Вопрос о необходимости обновления я поднял перед заказчиком. Но когда все работает, кроме данного момента, трогать как то не хочется)))
==========
Комплектации не используют, скидок нет (привязываются типы цен к пользователям), сопутствующих нет.
В зависимости от количества товара в корзине, или долгий ответ или превышается лимит выполнения скрипта(я поднял выше стандартного).
Все три пункта))

Раз не доходит и до адреса, значит где то в actionIndex() контроллера заказа рубится.
Пока закомментировал сопутствующие и склеивание одинаковых.

 function actionIndex()
    {
        $this->order->clear();
                 
        //Замораживаем объект "корзина" и привязываем его к заказу
        $frozen_cart = \Shop\Model\Cart::preOrderCart(null);
        //eventus нет сопутcтвующих
        //$frozen_cart->splitSubProducts();
        //$frozen_cart->mergeEqual();
        
        $this->order->linkSessionCart($frozen_cart);
        $this->order->setCurrency( \Catalog\Model\CurrencyApi::getCurrentCurrency() );
        $this->order['ip'] = $_SERVER['REMOTE_ADDR'];
        $this->order['expired'] = false;
        $this->redirect($this->router->getUrl('shop-front-checkout', array('Act' => 'address')));
    }

p.s.
Возможны ли дополнительные проблемы с нагрузкой из-за постоянного вызова deleteExpiredCartItems при добавлении в корзину? Оптовики как из пулемета "нащелкивают" товар в корзину)

Здравствуйте! Тут столкнулся с проблемной. Оптовый магазин канцелярки.
Имеются клиенты, которые кладут в корзину от 200 до 500 наименований товаров.
И при оформлении заказа сажают сервер (хотя выводит сообщение о необходимости дробить заказы)
Прямо после нажатия на "Оформить заказ" в корзине.
Сейчас конфигурация 4 ядра, 1 гб ОЗУ. На сервере только 1 сайт.
Количество товаров около 5000,  заказов в день около 25.

Что можно оптимизировать?

Как вариант, можно  запретить класть в корзину более 60 наименований.

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

{* Вставляет в шаблон блок Меню, в котором будут отображаться дочерние элементы от элемента с символьным идентификатором footmenu*}
{moduleinsert name="\Menu\Controller\Block\Menu" root="footmenu"}

2.В шаблон меню список категорий:

{* Вставляет в шаблон блок Список категорий *}
{moduleinsert name="\Catalog\Controller\Block\Category"}

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

<ul class="topMenu" id="topMenu">
    {foreach $dirlist as $dir}
    <li class="item_{$dir@iteration}{if !empty($dir.child)} node{/if}" {$dir.fields->getDebugAttributes()}><a href="{$dir.fields->getUrl()}">{$dir.fields.name}</a>
        {if !empty($dir.child)}
            {$cnt=count($dir.child)}
            {$columns=1}
            {if $cnt>3}{$columns=2}{/if}
            {if $cnt>6}{$columns=3}{/if}
            {if $cnt>12}{$columns=4}{/if}
            {* Второй уровень *}
            <ul class="columns{$columns}">
                {foreach $dir.child as $subdir}
                <li><a href="{$subdir.fields->getUrl()}">{$subdir.fields.name}</a>
                    {if !empty($subdir.child)}
                    {* Третий уровень *}
                    <ul>
                        {foreach $subdir.child as $subdir2}
                        <li><a href="{$subdir2.fields->getUrl()}">{$subdir2.fields.name}</a></li>
                        {/foreach}
                    </ul>
                    {/if}
                </li>
                {/foreach}
            </ul>
        {/if}
    </li>
    {/foreach}
       <li class="second_item"><a href="/catalog/new/">Новинки <i class="fa fa-truck"></i></a>
       </li>
       <li class="second_item"><a href="/catalog/akcii/">Акции <i class="fa fa-gift"></i></a>
       </li>
       <li class="second_item"><a href="/catalog/last/">Последние поступления <i class="fa fa-clock-o "></i></a>
       </li>
       <li class="second_item"><a href="/feedback/">Отзывы <i class="fa fa-thumbs-o-up"></i></a>
       </li>
       
   </ul>

Возможно ли модулем переопределить данную функцию?
Просьба к администраторам перенести эту раздел "Вопросы по разработке модулей и API системы"