Перейти к содержанию
Официальный форум поддержки Simpla

Enhill

Пользователь
  • Публикаций

    169
  • Зарегистрирован

  • Посещение

Сообщения, опубликованные Enhill

  1. Мне подсказали вот такое решение:

     

    ProductsView

     

    $discounted = new stdClass();
    if ($this->request->get('discounted', 'integer'))
    {
        $discounted->disabled = false;
        $discounted->count = 0;
    }
    else
    {
        $temp_filter = $filter;
        $temp_filter['discounted'] = 1;
        $discounted->count = $this->products->count_products($temp_filter);
        if((int)$discounted->count > 0)
        {
            $discounted->disabled = false;
        }
        else
        {
            $discounted->disabled = true;
            $discounted->count = 0;
        }
        unset($temp_filter);
    }
    $this->design->assign('discounted', $discounted);
    

     

    В шаблоне products.tpl

    {if !$discounted->disabled} Показываем, когда в категории есть товары со скидкой {/if}
    

     

    Работает отлично. Но есть вопрос к профессионалам: не избыточно ли?

     

  2. Добрый день. Очень нужна ваша помощь.

    Вывожу акционные товары в шаблоне products.tpl с помощью GET параметра:

     

    if (!empty($type) && !$brand) {
                $query = $this->db->placehold("
    				SELECT c.name, count(pc.product_id) as products_count, c.parent_id, c.id, c.url
    				FROM __products_categories pc
    				LEFT JOIN __categories c ON c.id=pc.category_id
    				INNER JOIN __products p ON p.id=pc.product_id AND pc.position=(SELECT MIN(pc2.position) FROM __products_categories pc2 WHERE pc.product_id=pc2.product_id)
    				WHERE 1
    				AND p.visible=1 
    				AND (SELECT 1 FROM __variants pv WHERE pv.product_id=p.id AND pv.compare_price>0 LIMIT 1) = 1
    				AND (SELECT count(*)>0 FROM __variants pv WHERE pv.product_id=p.id AND pv.price>0 AND (pv.stock IS NULL OR pv.stock>0) LIMIT 1) = 1
    				GROUP BY pc.category_id
    				ORDER BY products_count DESC");
    
                $this->db->query($query);
                $results_categories = $this->db->results();
    	        foreach($results_categories as &$u) {
    		        $u->url .= '?type=actions';
    	        }
    

     

    https://site.ru/category_name?type=actions
    

     

    Как сделать условие в шаблоне products.tpl на присутствие\отсутствие акционных товаров?

    Цель: показывать ссылку на акционные товары, только в тех категориях, где они есть.

  3.  

     

    Большое спасибо за помощь.

     

    1. $p->quantity  - неизвестно что, всегда будет пустым.

    2. Никаких сведений о ценах и стоимости не пеедается вообще. Вряд ли это правильно...

     

    1. Это пример яндекса. Под этим параметром они хотят видеть количество товара в заказе. То есть $p->quantity это $purchase->amount

  4. Здравствуйте. Как мы знаем, наступила эра нового Федерального закона. Яндекс для отбития чеков в обязательном порядке запрашивает список товаров в таком формате:

     

    <input name="ym_merchant_receipt" value='{"customerContact": "+79001231212","taxSystem": 1, "items":[{"quantity": 1.154, "price": {"amount": 300.23},  "tax": 3,"text": "Зеленый чай \"Юн Ву\", кг","paymentMethodType": "full_prepayment ","paymentSubjectType": "commodity"},{"quantity": 2, "price": {"amount": 200.00},  "tax": 3,"text": "Кружка для чая, шт., скидка 10%","paymentMethodType": "full_prepayment ","paymentSubjectType": "commodity"}]}'
            type="hidden"/>
    

    Как такое реализовать?

  5. Через файл обмена. Обязательно завтра напишу, спасибо за помощь. Попробую сначала уменьшить выборку, ведь такая проблема существует только с группированными товарами у которых есть гроуп ид.

  6. дык я же говорю сделайте уникальным экстернал айди, тем самым вы не сможете добавить товар с дублирующим экс айди. я с таким развлекался когда делал парсер мультипоставщика, только там добавлял еще поле поставщика, но если у вас товар только из 1с и весь с внешним ключем (экс айди) тогда это решение для вас.

    Вы говорите о индексе UNIQUE? Если сделать это поле уникальным, тогда после исправления ошибки в 1с, не будет создан правильный вариант, так как на сайте висит старый, с неправильным ид группы, но с таким же эксернал ид.

     

    Ошибки в 1с находим не сразу, к этому времени уже создаются варианты с неправильными данными. Часто бывает так, что вариант создается не в своем товаре и вычислить его потом очень трудно. В итоге второй созданный вариант является правильным, так как создается уже после исправления в 1с. Я вижу вариант с удалением, если найден дубль экстернал ид.  АмМожет я вас неправильно понял...

  7. Как доберусь до компьютера обязательно попробую все предложенные варианты.

     

    более извращенный вариант если предыдущие не сработали - сделать экспорт таблицы, указать уникальным экстернал айди в структуре, сделать импорт, убрать уникальность - гарантировано сработает :)

    тут загвоздка в том, что external_id это уникальный код из 1с, который присваивается вариантам при первой выгрузке. А еще у нас работает группировка товаров по другому id. Иногда наш закупщик путается и заводит в 1с неправильный id группы. После исправления ошибки, если товар успел выгрузиться на сайт с неправильным id группы, создается дублирующий вариант с тем же уникальным кодом external_id, по которому происходит обновление цен и наличия. Получается что созданный до этого первый вариант перестает обновлять наличие и цену и вообще может висеть не в своем товаре (в следствие ошибки заведения в 1с). Этот запрос и был призван такое исправлять. то есть при каждой выгрузке проверять задвоенные варианты и оставлять только последний из созданных.

    Была мысль запихнуть его прямо в обработчик выгрузки из 1с, но теперь понимаю, что решение очень нерациональное. Может подскажете куда копнуть?

  8. Добрый вечер. Возникла необходимость удалить все варианты у которых задублировано поле "external_id", кроме последнего.

     

    Получился запрос:
     

    DELETE n1 FROM s_variants n1, s_variants n2 WHERE n1.id < n2.id AND n1.external_id = n2.external_id
    

    Удаляет задублированное поле с меньшим id

     

    На тестовом магазине с маленьким количеством товара все ок. На магазине в 10000 товаров захлебывается. Помогите пожалуйста упростить запрос. Может есть альтернатива?

  9. Добрый день. Возникла необходимость вывести сумму остатков товара на складе. То есть посчитать все остатки у вариантов товара и вывести их сумму.

     

    Рабочий вариант (сомнительный):

    {assign var="sumstock" value="0"}
    	{foreach $product->variants as $v}
    		{$sumstock = $sumstock +$product->variant->stock}
    	{/foreach}
    {if $sumstock >0}На складе: {$sumstock|convert}{/if}
    

    Есть сомнения на счет быстроты выполнения в шаблоне products.tpl Насколько это рациональный способ? У нас могут быть товары с 40+ вариантами.

     

    Может кто-то реализовывал другим способом?


     

  10. Осталось придумать, как скрыть категорию бренда, если мы туда уже зашли.

    - Фотоаппараты
    --- Ручные (присвоен бренд canon)
    --- Автозаводные (присвоен бренд canon)

    Если зайти в "Автозаводные" , все равно показывает ее в списке.

     

  11.  

     

    Я не очень понятно задачу изложил. Имелся ввиду вывод категорий бренда из доработки: http://forum.simplacms.ru/topic/7909-%D0%BA%D0%B0%D1%82%D0%B5%D0%B3%D0%BE%D1%80%D0%B8%D0%B8-%D0%B2-%D0%BA%D0%BE%D0%BC%D0%BF%D0%B0%D0%BD%D0%B8%D0%B8-%D0%B8%D0%BB%D0%B8-%D0%BB%D0%BE%D0%B3%D0%B8%D0%BA%D0%B0-%D0%B7%D0%B0%D0%B4%D0%BE%D0%BC-%D0%BD%D0%B0%D0%BF%D0%B5%D1%80%D0%B5%D0%B4/

     

    Дайте код, который у вас есть сейчас (который выводит все категории Бренда)

    А условие будет примерно такое:

    {if in_array($c->id,$category->children)}
    ...
    {/if}
    

    В цикле вывода категорий бренда - выводим только те категории, которые есть в $category->children

     

    Спасибо, то что нужно! Вот такой вывод почти идеален:

     

    {foreach $brand_cat as $bc}
        {if in_array($bc->id, $category->children)}
            <a href="catalog/{$bc->url}/{$brand->url}"> {$bc->name}</a>
        {/if}
    {/foreach}
    
  12. Зря я создал новую тему. Надо было поднять старую, тогда бы и контекст был понятен.

     

    Вывод категорий бренда:

    {if $brand}
        {foreach $brand_cat as $bc}
            <a href="catalog/{$bc->url}/{$brand->url}">{$bc->name}</a>
        {/foreach}
    {/if}
    
    
  13.  

    {if $category->subcategories}
    ...
    {/if}

    Это условие "если есть детки у категории".

     

    Не сработает с таким вариантом событий:

     

    - Фотоаппараты

    --- Ручные (присвоен бренд canon)

    --- Автозаводные (присвоен бренд canon)

    - Пылесосы CANON (присвоен бренд canon)

     

    Если мы зайдем в бренд в фотоаппаратах: фотоаппараты/ручные/canon

    то получим вот такой список категорий:

    - Ручные

    - Автозаводные

    - Пылесосы CANON

  14. Добрый день. в симпле есть 2 места, где мы можем посмотреть товары привязанные к бренду:

     

    1) http://demo.simplacms.ru/brands/canon

     

    2) http://demo.simplacms.ru/catalog/fotoapparaty/canon

     

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

     

    Есть замечательная доработка от ExtraBash и Noxter'a:

    http://forum.simplacms.ru/topic/7909-%D0%BA%D0%B0%D1%82%D0%B5%D0%B3%D0%BE%D1%80%D0%B8%D0%B8-%D0%B2-%D0%BA%D0%BE%D0%BC%D0%BF%D0%B0%D0%BD%D0%B8%D0%B8-%D0%B8%D0%BB%D0%B8-%D0%BB%D0%BE%D0%B3%D0%B8%D0%BA%D0%B0-%D0%B7%D0%B0%D0%B4%D0%BE%D0%BC-%D0%BD%D0%B0%D0%BF%D0%B5%D1%80%D0%B5%D0%B4/

     

    Но как оказалось, с ее помощью выводятся ВСЕ категории, в которых лежат товары бренда. Это отлично подходит для 1 варианта.

     

    В случае 2 не логично показывать категорию бренда "Пылесосы", так как мы выбрали бренд в категории "сотовые телефоны".

     

    Как можно вывести в бренде только категории деток?

  15. Maksclub, вот это оперативность =)

     

    Файл фида, отдающий максимальную информацию в поиск, включая все свойства.

     

    Его также можно использовать для выгрузки на яндекс маркет.

    <name>Наименование товара</name>
    
    <vendor>Бренд</vendor>
    
    <vendorCode>Артикул</vendorCode>
    
    <description>Описание $p->description : $p->annotation<description/>
    
    <param name="Свойство">значение свойства</param>
    
    <price>цена</price>
    
    <oldprice>старая цена</oldprice>
    

    yandex-search.php

  16. Согласен. Открываются невиданные возможности фильтрации результатов поиска.

    По поводу бренда. Наверное хорошо и артикул туда закинуть.

     

    // Товары
    $simpla->db->query("SET SQL_BIG_SELECTS=1");
    // Товары
    $simpla->db->query("SELECT v.price, v.id as variant_id, p.name as product_name, v.name as variant_name, p.url, p.annotation, pc.category_id, i.filename as image, b.name as brand, b.url as brand_url
    FROM __variants v LEFT JOIN __products p ON v.product_id=p.id
    
    LEFT JOIN __products_categories pc ON p.id = pc.product_id AND pc.position=(SELECT MIN(position) FROM __products_categories WHERE product_id=p.id LIMIT 1)
    LEFT JOIN __images i ON p.id = i.product_id AND i.position=(SELECT MIN(position) FROM __images WHERE product_id=p.id LIMIT 1)
    LEFT JOIN __brands b ON p.brand_id = b.id
    WHERE p.visible AND (v.stock >0 OR v.stock is NULL) GROUP BY v.id");
    print "<offers>
    ";
    

     

    <vendor>".htmlspecialchars($p->brand)."</vendor>
    ".($p->sku ? '<vendorCode>'.$p->sku.'</vendorCode>' : '')."
    
  17. Maksclub, ого! Даже не знаю как выразить свой восторг.

     

    По поводу фида. Стандартный фид в принципе имеет в себе все необходимое, кроме характеристик. Опять же все подряд характеристики туда пихать не очень рационально (их может быть очень много).

     

    Как думаете на счет такого варианта:

     

    Cразу после описания в <description> или в тег <param>  выводим те характеристики, которые отмечены в фильтре (значит самые важные).

     

    Например вот так:

        if (!empty($features[$p->product_id])) {
            foreach($features[$p->product_id] as $feature) {
                print "
                <param name='".htmlspecialchars($feature->name)."'>".htmlspecialchars($feature->value)."</param>
                ";
            }
        }

     

    Еще наверное бренд хорошо выводить

     

    <vendor>Adidas</vendor> 
    

     


     

  18. Мы все знаем, что одно из самых узких мест в Simpla является ужасный поиск товаров. Но есть решение, которое может все изменить.

     

    Недавно команда Яндекса выпустила в бетатестирование новый полноценный поиск для интернет магазинов. https://tech.yandex.ru/sitesearch/shopsearch/

     

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

     

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

     

     

    Самое интересное: с помощью Яндекс API можно получать сырые JSON данные, которые можно как угодно стилизовать в своем магазине.

     

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

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

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

  20. Пытаюсь добавить картинки в Excel-прайс с помощью библиотеки PHPExcel.

    Для добавления картинки нужно указывать адрес типа:

    /home/web/site.com/www/files/products/kartinka.250x250.jpg

     

    dirname (dirname ( __FILE__ ) ) . '/files/products/'.preg_replace('@\.([^\.]+)$@', '.250x250.\1', $p->image);
    

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

    http://site.com/files/products/kartinka.250x250.jpg



     

    $simpla->design->resize_modifier($p->image, 250, 250)
    

    Вот такая конструкция то же не генерирует файл, пока к нему не обратятся (если я все правильно понял)

     

    Как автоматически сгенерировать картинки определенных размеров?

  21. Добрый вечер, форумчане.
    Движок оброс множеством доработок, приличным трафиком и ~10000 товарами. Приключилось все еще на хостинге, что привело меня к переезду на VDS.

     

    Характеристики машины:
    CPU: 4 Core RAM: 4096 Mb Диск: 20 Gb,SSD
     

    А приключилось следующее:

    При неизвестных мне обстоятельтвах, mysql не хватает памяти выполнить некоторые запросы. Он сбрасывает кеш на диск и сбрасывает его до тех пор, пока не займет все пространство на диске, что приводит к блокировке всех сервисов, как mysql, так и php.

     

    В логе ошибок PHP - все кристально чисто.

     

    mysqltuner - говорит, что конфиги правильно настроенны.

     

    а вот в логах mysql-slow есть много интересного:

    Запросы с большим временем выполнения и неиспользующим индексы:

    # Time: 160318 14:02:09
    # User@Host: o[o] @ localhost []
    # Thread_id: 18308  Schema: o  QC_hit: No
    # Query_time: 240.045449  Lock_time: 0.000199  Rows_sent: 1  Rows_examined: 8227
    SET timestamp=1458291729;
    SELECT  
    					p.id,
    					p.url,
    					p.brand_id,
    					p.name,
    					p.annotation,
    					p.body,
    					p.bodytwo,
    					p.video,
              pc.category_id,
    					p.position,
    					p.created as created,
    					p.visible,
    					p.proizvodstvo,
    					p.featured, 
    					p.meta_title,
    					p.meta_keywords, 
    					p.meta_description, 
    					b.name as brand,
    					b.url as brand_url
    				FROM s_products p
    				INNER JOIN s_products_categories pc ON pc.product_id = p.id 
    				LEFT JOIN s_brands b ON p.brand_id = b.id
    				, s_variants v 
    				WHERE 
    					1
    					
    					
    					
    					 AND p.id=v.product_id AND (v.sku LIKE "%Самокат%" OR p.name LIKE "%Самокат%" OR p.meta_keywords LIKE "%Самокат%")  AND p.id=v.product_id AND (v.sku LIKE "%3-х%" OR p.name LIKE "%3-х%" OR p.meta_keywords LIKE "%3-х%")  AND p.id=v.product_id AND (v.sku LIKE "%колесный%" OR p.name LIKE "%колесный%" OR p.meta_keywords LIKE "%колесный%")  AND p.id=v.product_id AND (v.sku LIKE "%Marvel%" OR p.name LIKE "%Marvel%" OR p.meta_keywords LIKE "%Marvel%")  AND p.id=v.product_id AND (v.sku LIKE "%Spider%" OR p.name LIKE "%Spider%" OR p.meta_keywords LIKE "%Spider%")  AND p.id=v.product_id AND (v.sku LIKE "%Man%" OR p.name LIKE "%Man%" OR p.meta_keywords LIKE "%Man%") 
    					
    					
    					
    					
    					
    					AND p.visible=1
    					
    				
    				ORDER BY (SELECT p.position FROM s_variants pv WHERE p.id = pv.product_id AND pv.position=(SELECT MIN(position) FROM s_variants WHERE (stock>0 OR stock IS NULL) AND product_id=p.id LIMIT 1) LIMIT 1)DESC
    					 LIMIT 0, 150;
    

    Или вот этот, с пугающим значением Rows_examined

     

    # Time: 160318 13:26:07
    # User@Host: r[r] @ localhost []
    # Thread_id: 17388  Schema: r  QC_hit: No
    # Query_time: 0.049616  Lock_time: 0.000179  Rows_sent: 24  Rows_examined: 19005
    SET timestamp=1458289567;
    SELECT  
    					p.id,
    					p.url,
    					p.brand_id,
    					p.name,
    					p.yandex_name,					
    					p.annotation,
    					p.body,
    					p.bodyniz,
    					p.bodyunderbutton,
    					p.video,
    					p.no_active_product,
    					p.position,
    					p.created as created,
    					p.visible,
    					p.yandex,
    					p.tiu,
    					p.freelance_status,
    					p.featured, 
    					p.meta_title, 
    					p.meta_keywords, 
    					p.meta_description, 
    					b.name as brand,
    					b.url as brand_url
    				FROM s_products p   
    				 
    				LEFT JOIN s_brands b ON p.brand_id = b.id
    				, s_variants v 
    				WHERE 
    					1
    					
    					
    					
    					 AND p.id=v.product_id AND (v.sku LIKE "%%" OR p.name LIKE "%%" OR p.meta_keywords LIKE "%%")  AND p.id=v.product_id AND (v.sku LIKE "%Карапуз-5А%" OR p.name LIKE "%Карапуз-5А%" OR p.meta_keywords LIKE "%Карапуз-5А%")  AND p.id=v.product_id AND (v.sku LIKE "%%" OR p.name LIKE "%%" OR p.meta_keywords LIKE "%%") 
    					
    					
    					
    					
    					
    					
    					
    					AND p.visible=1
    					
    				
    				ORDER BY (SELECT p.position FROM s_variants pv WHERE p.id = pv.product_id AND pv.position=(SELECT MIN(position) FROM s_variants WHERE (stock>0 OR stock IS NULL) AND product_id=p.id LIMIT 1) LIMIT 1)DESC
    					 LIMIT 0, 200;
    

    Какие то запросы висят, блокируют таблицу и пишут кеш в гигабайты! Что за запросы, понять я не могу.

     

    Прошу вашей помощи! Предоставлю любые листинги чего угодно. Если хотите денег за помощь - говорите, за мной не заржавеет.

  22. Вся загвоздка в том, что бы вывести поля находящиеся в таблице юзера(зарегистрированного),который сделал заказ, а не самого заказа. В order.tpl спокойно выводятся такие вещи как:

    {$user->company|escape}
    

    Как такое можно вывести в админке в orders.tpl ? Спасибо.

×
×
  • Создать...