1,651

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

Надо ещё в select получать A.entity_id.
Тогда:

new TableType\Text('title', t('Товар'), array('href' => $this->router->getAdminPattern('edit', array(':id' => '@entity_id'), 'catalog-ctrl' ), 'LinkAttr' => array('class' => 'crud-edit') )),

Тогда всё ещё проще. У ссылок на добавление в корзину, или у самой корзины нужно поставить класс noShowCart.

1,653

(10 ответов, оставленных в Вопросы по созданию тем оформления)

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

Там очень много завязок, т.к. там же ещё CSS JS конструктора. Мы обсудим на днях, может добавим в общее. Но пока ещё не решили.  Подождите немного.

1,654

(10 ответов, оставленных в Вопросы по созданию тем оформления)

Официально Bootstrap 3 поддерживает только 12 колонок. Хотя впринципе это возможно, поэтому пишите пожелание.

1,655

(10 ответов, оставленных в Вопросы по созданию тем оформления)

Сейчас мы работаем только с 12 колоночным вариантом. Вы можете оставить пожелание у нас helpdesk.readyscript.ru, если Вам нужна поддержка 16 и 24 колоночной системы.
Почему кстати Вы выбрали 16 колоночный вариант?

Т.е. Вам всегда нужен физический переход в корзину?
Если да, то просто нужно сделать за место этой строки return true;, тогда всегда будет переход в корзину.

1,657

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

Дмитрий пишет:
Антон пишет:

весь код шаблона между if содержится.

Ну я ж написал что с if мне все ясно )) я про другое спрашивал. Ну да ладно, подключил уже через инклюид

Всё правильно

{if $dir.alias=='Мой алиас'}
   {include file="%THEME%/my.tpl"}
{else}
   {include file="%catalog%/my2.tpl"} 
{/if}

где %THEME% - короткий путь в папку с Вашей темой оформления. Например: /templates/ВАША ТЕМА/.
а %catalog% - это короткий путь к папке модуля каталога товаров в Вашей теме оформления. Например: /templates/ВАША ТЕМА/moduleview/catalog/.

Если в шаблон нужно передать переменную, то пишем:

   {include file="%catalog%/my2.tpl" list=$list} 

Тогда в шаблоне тоже появится переменная с именем $list.

Дело всё в том, что открывающееся окно может не поместиться в экран на мобильной версии, поэтому существует код функции $.detectMedia

if ($.detectMedia && ($.detectMedia('mobile') || $.detectMedia('portrait')) ) return true; //Не открываем окна в мобильной версии

Эта функция, которая физически находится в theme.js проверяет ширину экрана и переходит по ссылке если ширина меньше заданной.

Как вариант...
У оборачивающего контейнера нужно назначить position:relative;
У внутреннего блока, который будет расти position:absolute;left:0px;top:0px;
И соответственно большую нужную ширину.
Например можно подвеситна :focus в CSS.
http://htmlbook.ru/css/focus

А чтобы было с анимацей, нужно прочитать и поупражняться с transition http://html5book.ru/css3-transition/

1,660

(2 ответов, оставленных в Вопросы по созданию тем оформления)

Спасибо!

1,661

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

Ну естественно, Вы в файле API несколько раз переназначили с чем оно работает при вызове  parent::__construct(.
Правильный API должен содержать только один экземпляр объекта того с чем он работает.

<?php
namespace Newpage\Model;
/**
* Класс API
*/
class MyApi extends \RS\Module\AbstractModel\EntityList
{
    
    function __construct()
    {
        parent::__construct(new \Shop\Model\Orm\OrderItem, //С какой таблицей через ORM объект работать
        array(
            'multisite' => false, //Объект является не мультисайтовым (без поля site_id)
            //'defaultOrder' => 'id DESC' //Сортировка по умолчанию при выборке
        ));
    }

}

Этим самым мы объявили, что мы будем работать через API только с объектом \Shop\Model\Orm\OrderItem. А именно с таблицей order_items.

Теперь, что касается контроллера... Там в самом начале Вы уже объявили API с которым работает контроллер через присвоение АПИ контроллеру в конструкторе класса.

function __construct()
    {
         parent::__construct(new \Newpage\Model\MyApi()); //API с которым будет работать контроллер
    }

Но я думаю при переносе у Вас ничего не получилось, т.к. Вы написали запрос в ручную и скорее всего у Вас на удалёнке свой префикс к таблицам БД совсем другой. Я иногда проверяю сам запрос просто выполнив его, например на удалённом PHPMyAdmin, если он доступен. Чтобы не запоминать префиксы, правильно будет строить запросы ORM запросом, тогда всё будет учтено.
Я думаю, что правильный код контроллера должен быть такой:

namespace Newpage\Controller\Admin;
use \RS\Html\Table\Type as TableType,
    \RS\Html\Toolbar\Button as ToolbarButton,
    \RS\Html\Toolbar,
    \RS\Html\Tree,
    \RS\Html\Table,
    \RS\Html\Filter;


class MyCtrl extends \RS\Controller\Admin\Crud
{
        function __construct()
    {
         parent::__construct(new \Newpage\Model\MyApi());
    }
    
    function helperIndex()
    {
           
        
        $helper = parent::helperIndex();
        $q = $this->api->queryObj(); //Получаем объект запроса
        //Изменяем запрос под наши нужды
        $q->join(new \Newpage\Model\Orm\Mydiscount(), 'A.order_id=B.order_id', 'B') //JOIN к таблице с нужными сведениями
             ->join(new \Shop\Model\Orm\Discount(), 'B.discount_id=C.id', 'C'); //JOIN к таблице с скидками

        //Теперь, что выбирать
        $q->select = "A.order_id, A.title, B.discount_id, C.descr ";
            
        $helper = parent::helperIndex();
        $helper->setTopTitle(t('Товары со скидками'));
        $edit_pattern = $this->router->getAdminPattern('edit', array(':id' => '@id'));
        $helper->setTable(new Table\Element(array(
            'Columns' => array(         
                new TableType\String('order_id', '1'),
                new TableType\String('title', t('2')), 
                new TableType\String('discount_id', t('3')),
                new TableType\String('descr', t('14')),             
        ))));

        return $helper;
    }
    
}

1,662

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

Ну всё дело в том я так думаю, про то что я говорил, что нужно проверять на флажок приходящий из поста о том, что нужно генерировать пароль.
Вы можете свой код закомментировать и попробовать туже схему. Я думаю всё будет как надо. Т.е. Вам не хватает проверок на то, что именно сейчас делается с пользователем. Попробуйте завардампить объекты в Вашем коде и приходящий POST или GET запрос, чтобы проанализировать.

Убрал.

1,664

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

Он вызывает из этого же класса функцию checkOpenPassword, посмотрите что в ней.

{$mystr=str_replace("/watch?v=","/embed/", $product->getPropertyValueById(3))}

Практически также как и в PHP

1,666

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

Да точно! здесь же у нас идёт на прямую запись. Я думаю Вот так поможет.
изменить

$user['pass'] = $user::cryptPass(\RS\Helper\Tools::generatePassword(6));

на

$user['openpass'] = \RS\Helper\Tools::generatePassword(6);
$user['pass'] = $user::cryptPass();

Ато у нас получается [b]openpass[/b] поэтому и пустой, что нигде не присваивается.

Я думаю надо код JS Ваш обернуть {literal}

1,668

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

Да. Подумаем над этим.

1,669

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

Чтобы видеть ошибки, а не 500-ю включите отображение ошибок:
http://readyscript.ru/faq/#faq-errors

 $user = $data['orm'];
 $flag  = $data['flag']; //Флаг insert или update
 if ($flag == self::INSERT_FLAG && \Setup::$INSTALLED && !$this['no_send_notice']) {
            
 // Уведомление пользователю
 $user = new \Users\Model\Notice\UserRegisterUser;
 $user->init($this, $this['openpass']);
 \Alerts\Model\Manager::send($user); 

Что касается уведомления, то Вы переприсвоили переменной $user, объект самого уведомления и передали объект самого себя, а не пользователя. Зачем?
Вам в Уведомдение нужно передать объект пользователя который вы получаете из объекта $data выше.

Нужно же так:)

 $user = $data['orm'];
 $flag  = $data['flag']; //Флаг insert или update
 if ($flag == $user::INSERT_FLAG && \Setup::$INSTALLED && !$user['no_send_notice']) {
            
 // Уведомление пользователю
 $user_notice = new \Users\Model\Notice\UserRegisterUser;
 $user_notice->init($user, $user['openpass']);
 \Alerts\Model\Manager::send($user_notice); 

1,670

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

Ну чтож теоретически можно сделать следующим образом.
Сам блок контроллер для пагинации принимает параметр p из GET запроса.

Для отображения пагинации нужен сам объект пагинации. А именно:
\RS\Helper\Pagination
Можно воспользоваться функцией static_call (http://readyscript.ru/dev-manual/dev_sm … tatic_call) и помощью неё заполнить объект пагинации из своего модуля, передав нужные переменные в публичную статическую функцию своего апи. Например вызовом в шаблоне:

{static_call var=paginator callback=['\Custom\Model\Api','myPagination'] params=[$this_controller->article_api, $this_controller->getParam('pageSize')]}

В самой функции, надо сделать примерно следующее:

/**
* 
* @param \Article\Model\Api $article_api - объект АПИ статей
* @param integer $limit - по сколько резульататов выводить.
*/
public static function myPagination($article_api, $limit)
{
      $page        = \RS\Http\Request::commonInstance()->get('p', TYPE_INTEGER, 1); //Получаем из GET текущую страницу
      $total         = $article_api->getListCount(); //Получим общее количество статей
      $paginator = new \RS\Helper\Paginator($page, $total, $limit); 
      retrun $paginator;
}

В самом шаблоне чуть ниже static_call можно вызвать теперь шаблон пагинатора:

{include file="%THEME%/paginator.tpl"}

А может есть в CMS какая то готовая функция которая выводит значение характеристики по ее id? Или только способ описанный выше?

Конечно есть:
Если у нас есть объект товара то можно так:

{$product->getPropertyValueById(идентификатор нужной характеристики)} {* Получить значение по id *}
{$product->getPropertyValueByTitle('имя нужной характеристики')} {* Получить значение по названию характеристики *}

Единственное, нужно предварительно наполнить товар характеристиками. Если у Вас используется в коде только один экземпляр товара, например в карточке товара (правда в карточке уже характеристики подгружены) перед вызовом метода, нужно вызвать метод:

{$product->fillProperty()} {* Наполняет характеристиками товар *}

Если у Вас есть несколько или множество товаров, то есть установка массовая характеристик товарам. Например так:

{$list=$this_constroller->api->addProductsProperty($list)}

где $list - массив с товарами,
а в api содержится экземпляр класса \Catalog\Model\Api

1,672

(4 ответов, оставленных в Вопросы по созданию тем оформления)

Михаил пишет:
Закусило Александр пишет:

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

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

А если через редактирование блока. У Вас какой код в итоге получался?

1,673

(10 ответов, оставленных в Вопросы по созданию тем оформления)

Ярослав пишет:

Попробуйте просто

{moduleinsert name="\Comments\Controller\Block\Comments" type="\catalog\model\commenttype\product" }

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

1,674

(12 ответов, оставленных в Вопросы по созданию тем оформления)

toFixed - приводит к числу с плавающей точкой. Первый аргумент это количество чисел после запятой
https://developer.mozilla.org/ru/docs/W … er/toFixed

.toFixed().replace(/(\d)(?=(\d{3})+\.)/g, '$1 ');

Тада! smile

1,675

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

Попробуйте в Вашем хуке beforeWrite выполнить сразу после установки openpass

/**
* Действия перед записью объекта пользователя
* 
* @param array $data - Массив  с данными
*/
public static function ormBeforeWriteUsersUser($data){
     /**
     * @var \User\Model\Orm\User
     */
     $user = $data['orm'];
     $flag  = $data['flag']; //Флаг insert или update
     if ($flag==$user::INSERT_FLAG){ //Делаем только на создание (insert)
          $my_autologin = \RS\Http\Request::commonInstance()->request('my_autologin', TYPE_INTEGER, false); //Получаем флаг из запроса
          if ($my_autologin){ //Если флаг стоит

              $user['pass'] = $user::cryptPass(\RS\Helper\Tools::generatePassword(6));
          }

     }
}

Я думаю, тогда 100% всё будет как надо.