Здравствуйте!
Используем многомерные комплектации.
Если у товара имеется 1 размер , то при выгрузке в 1с не проставляется xml_id товарного предложения ("Ид" в выгрузке)
и в документе в 1с выводится Носки m0e0107-0055 BNM без указания размера (не подтягивается товарное предложение)
Файл выгрузки:

 - <Товар>
  <Ид>ca20582e-d532-11e4-996d-dc85deaed994</Ид> 
  <Наименование>Носки m0e0107-0055 BNM, Носки m0e0107-0055 BNM (42-45)</Наименование> 
  <БазоваяЕдиница Код="796" НаименованиеПолное="" МеждународноеСокращение="PCE">шт.</БазоваяЕдиница> 
  <ЦенаЗаЕдиницу>80</ЦенаЗаЕдиницу> 
  <Количество>12</Количество> 
  <Сумма>960</Сумма> 
- <ЗначенияРеквизитов>
- <ЗначениеРеквизита>
  <Наименование>ВидНоменклатуры</Наименование> 
  <Значение>Товар</Значение> 
  </ЗначениеРеквизита>
- <ЗначениеРеквизита>
  <Наименование>ТипНоменклатуры</Наименование> 
  <Значение>Товар</Значение> 
  </ЗначениеРеквизита>
  </ЗначенияРеквизитов>
  </Товар>

Пришлось закомментировать часть кода в modules\exchange\model\api.inc.php:

 /**
    * Получает xml_id товарного предложения по товару
    * 
    * @param \Shop\Model\Orm\OrderItem $offer_product - объект товара в заказе
    * @param \Catalog\Model\Orm\Product $product      - объект связанного товара
    * @return string
    */
    private function getOfferXmlIdByOfferProduct(\Shop\Model\Orm\OrderItem $offer_product, $product){
        $xml_id = $product->xml_id; //Получаем xml_id 
        
       // if ($offer_product['offer'] && $product){ //Если комплектация отличная от оригинала !ТУТ!
            $product->fillOffers();
            
            if ($product->isOffersUse()){ //Если такое предложение есть
                $offer = $product['offers']['items'][$offer_product['offer']];
                return $offer['xml_id'];
            }
        //}       !И ТУТ!
        return $xml_id;
    }

Стало выводится верно

 <Товар>
  <Ид>ca20582e-d532-11e4-996d-dc85deaed994#ca205832-d532-11e4-996d-dc85deaed994</Ид> 
  <Наименование>Носки m0e0107-0055 BNM, Носки m0e0107-0055 BNM (42-45)</Наименование> 
  <БазоваяЕдиница Код="796" НаименованиеПолное="" МеждународноеСокращение="PCE">шт.</БазоваяЕдиница> 
  <ЦенаЗаЕдиницу>80</ЦенаЗаЕдиницу> 
  <Количество>132</Количество> 
  <Сумма>10560</Сумма> 
- <ЗначенияРеквизитов>
- <ЗначениеРеквизита>
  <Наименование>ВидНоменклатуры</Наименование> 
  <Значение>Товар</Значение> 
  </ЗначениеРеквизита>
- <ЗначениеРеквизита>
  <Наименование>ТипНоменклатуры</Наименование> 
  <Значение>Товар</Значение> 
  </ЗначениеРеквизита>
  </ЗначенияРеквизитов>
  </Товар>

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

function getLinkId()
    {
        //$route = \RS\Router\Manager::obj()->getCurrentRoute();
         //отсюда убираем проверку идентификатора маршрута
         //if (isset($route->article_id)) {
         //    return $route->article_id;
        // }
        return 20; //здесь идетификатор Вашей статьи "Отзывы"
    }

553

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

С наступающим Новым годом!
Спасибо огромное вашей команде за проделанную работу!
Счастья, здоровья вам и вашим семьям! Отлично встретить Новый и проводить старый год!
И, конечно, дальнейшего развития ReadyScript!

554

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

Можно еще вставить ссылку вместо просто текста "цену по запросу" на вывод формы обратной связи.

555

(12 ответов, оставленных в Вопросы по Маркетплейсу)

Как вариант, просто отдельная категория в каталоге "Портфолио" и вместо товаров выполненные работы.

556

(12 ответов, оставленных в Вопросы по Маркетплейсу)

Или можно решить задачу в лоб, сверстав html страницу с фото и добавив ее в статью.

557

(8 ответов, оставленных в Вопросы по Маркетплейсу)

Как то была подобная задача.
Решил следующим путем.
Настроил несколько типов цен для соответствующей скидки.


Создал (спасибо разработчикам за советы) простой модуль.
Тип цены переключается в зависимости от суммы товаров в корзине:

<?php

namespace Opt\Config;

class Handlers extends \RS\Event\HandlerAbstract
{
    function init()
    {
        $this->bind('cart.update.after')
               ->bind('cart.getcartdata')
              ->bind('cart.addproduct.after'); 
    }    
    
   public static function checkprice($info)
    {
         //\Catalog\Model\CostApi::setSessionDefaultCost(2); 
          if (!$_SESSION['user_cost_id']) {
                $_SESSION['user_default_cost_id']=\Catalog\Model\CostApi::getDefaultCostId();
                $cost_id=\Catalog\Model\CostApi::getDefaultCostId() ;
         }  
           else   $cost_id=$_SESSION['user_cost_id'];
                                                    
         $cart=$info['cart'];      
         $cartinfo = $cart->getCartData(false,false);
         flog($cost_id);                                
         flog( $cartinfo['total']);   
  //здест условие для переключения типа цены        
         if ((  $cartinfo['total']<50000) &&( $cost_id!=1)) 
         {       

             $_SESSION['user_cost_id']=1;    
               
             //здесь необходимо обновить корзину  
             //Заменим закешированный _current_cost_id у объекта товара 
            
            foreach($cart->getProductItems() as $cartdata) {  
             
                $cartdata['product']['_current_cost_id'] =1;
            }

            //Очистим сведения для блока корзины
            $cart->cleanInfoCache();
 
             $info['cart']=$cart;           
             
        }
///здесь условие для переключения типа цены
         elseif ((  $cartinfo['total']>=50000)&&( $cost_id!=2)) 
         {       
             
              $_SESSION['user_cost_id']=2;  
              
              //здесь необходимо обновить корзину 
              //Заменим закешированный _current_cost_id у объекта товара
            foreach($cart->getProductItems() as $cartdata) {
            
                $cartdata['product']['_current_cost_id'] =2; 
                
            }

            //Очистим сведения для блока корзины
            $cart->cleanInfoCache();
 
             $info['cart']=$cart;   
            
         };
      
         $info['cost_id']= $_SESSION['user_cost_id'];        
       return $info;    
    }
  public static function cartUpdateAfter ($info)
    {  
    
       $result=self::checkprice($info);           
       return $result;     
           
    }
   public static function cartGetcartdata ($info)
   {     
     
     $k=$info['cart_result'];     
     $k['cost_id']= $_SESSION['user_cost_id'];  

     return $info ;
   }   
                           
   public static function cartAddproductAfter ($info)
    {  
           $result=self::checkprice($info);           
          return $result;
    }
    
}

Я подключил выделенные IP. Иначе никак. По опыту, в основном и взламывали то сайты из-за утекших или полученных перебором паролей к фтп.
Для безопасности 100-150 рублей не деньги, зато эффект на тысячи.
Так же можно настроить фтп-сервер,чтобы блокировал перебор паролей

1. В основном запрещаю ftpaccess доступ по фтп (кроме наших айпи)
2. Резервное копирование базы несколько раз в день средствами панели ISPManager (можно использовать sypex backup)
Раз в неделю копирование всего сайта на удаленный фтп-сервер.

Спасибо! Сам не знал)))

В общем случае это и не нужно. У нашего клиента оптовый магазин с 10 000 товаров и 1500 клиентами оптовиками и за год никому данный функционал не пригодился, правят непосредственно в итоговом счете в 1с.
В AliExpress, ComputerUniverse, ebay аналогично надо пересоздавать или писать в поддержку для изменения в заказе.

Пользуемся крупным сервисом SAAS онлайн-фотоуслуг и там тоже не позволено менять заказ пользователя.
Все таки у покупателя тоже должна быть доля ответственности за заказ, а не "сделаю я а бы как, потом 20 раз переделаю"

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

Конструктор сайта, страница "по-умолчанию". Находите нужную секцию  и добавляете блок "Произвольный HTML"
http://joxi.ru/4AkpWl5Fv9Wprq
В него вставляете код виджета вконтакте.

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

564

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

Поделюсь с общественностью небольшим кодом:

function metrikaReach(goal_name) {
        for (var i in window) {
        if (/^yaCounter\d+/.test(i)) {
            window[i].reachGoal(goal_name);
        }
    }
   /* или напрямую вызвать свой счетчик. К примеру 1111*/
            /*yaCounter1111.reachGoal(goal_name);*/

}

$( document ).ready(function() {
$('body').on('click', '.metrika', function() {
    var goal_name = this.className.match(/metrika_([^\s]+)/);
    if (goal_name[1]) {
        metrikaReach(goal_name);
    }
    return true; 
});


$('body').on('submit', 'form.register', function() {
    var goal_name = 'rs_register';
    metrikaReach(goal_name);
    return true; 
});

$('body').on('click', '.addToCart', function() {
    var goal_name = 'rs_addtocart';
    metrikaReach(goal_name);
    return true; 
});

$('body').on('click', '.formSave', function() {
    var goal_name = 'rs_formsave';
    metrikaReach(goal_name);
    return true; 
});


});

В метрике добавлены цели - события JS:
rs_formsave - отправка сообщений обратной связи.
rs_addtocart - в корзину.
rs_register - регистрация пользователя.
Так же можно на любые элементы с классами по шаблону "metrika_{название события}".
Пример для события bannerclick: metrika_bannerclick.

Код для темы "Детская"

Здравствуйте! Подскажите, пожалуйста, можно ли как то без модификации стандартных js файлов шаблона поймать следующие цели:
1. Регистрация пользователя
2. Покупка в 1 клик
3. Отправка сообщения обратной связи (или иные формы из конструктора форм)
4. Добавление товара в корзину
т.е. те действия, которые осуществляются ajax запросом.

566

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

Еще раз уточню) Т.е. перезагрузкой шаблонов можно сетку и по bootstrap сделать?
Изменения сохранять в templates/mysystem/*? Просто в документации разработчикам этот момент не нашел...

Спасибо за советы!

Воспользуйтесь инструментами разработчика в браузерах.
FireFox- правой кнопкой по странице - "Иследовать элемент"
Chrome - "просмотр кода элемента"
Они помогут "подсветить" нужные элементы и покажут в правом нижнем окне в какой файле css необходимо изменить стиль.
http://joxi.ru/KAxz1Jxs7lxQm8

1. Разношу товары по спецкатегориям "Новинки","Последние поступления", "Акции" в зависимости от количество дней от даты создания товара, от количества дней в характеристике "Дата последнего поступления", от наличия характеристике "Акция" соответственно.

2. Выключаю товары, которые добавлены в мусорную категорию. У клиента так принято.

Спасибо! Все работает!

570

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

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

 {foreach $images as $key => $image}
                            <li data-id="{$image.id}" class="{if $offer_images && !in_array($image.id, $offer_images)}hidden{elseif !$first++} first{/if}">
                                <a href="{$image->getUrl(800,600,'xy')}" class="preview" data-n="{$key}" target="_blank"><img src="{$image->getUrl(100, 100)}"  alt="{$image.title|default:"{$product.title} фото {$key+1}"}" title="{$product.title}"/></a></li>
                            {/foreach}

 title="{$product.title}"

Спасибо, Александр! Внесите, пожалуйста, этот хук в документацию

Здравствуйте! Не могу настроить отправку почты через smtp Yandex. Нет настроек SSL
В отдельном скрипте для теста адрес указал так:

 $mhSmtpMail_Server = "ssl://smtp.yandex.ru"; // smtp-сервер

и все работает.
А с магазина проверка отправки не срабатывает.

просто

{$product.title}
{static_call var=product callback=['\Catalog\Model\Orm\Product', 'loadByWhere'] params=[['id'=>$aid]]}{$product.title}

Здравствуйте! Возможно ли как то перехватывать окончание импорта товаров из 1с?
После обмена необходимо совершать определенные операции. Сейчас делаю это аналогично очистке логов, т.е. рандомно на событии Start.

Здравствуйте!
Кто нибудь сталкивался с версткой шаблона на bootstrap 3 под ReasyScript с сохранением функционала конструктора сайта? Какие подводные камни имеются?