avatar

Выборочная выгрузка в Яндекс.Маркет

Опубликовал в блог Дополнения и модули для Simpla CMS
0


Достаточно часто поднимается вопрос на форуме Simpla CMS о том, как выгружать не весь товар в Яндекс.Маркет, а только его часть. Данный «допил» позволит выбирать какой товар выгружать в Яндекс Маркет.

Как обычно в таких ситуациях нам надо добавить поле для отметки нужных товаров. Для этого в таблице товаров s_products создаем поле to_yandex и вторым запросом выставим его значение на «1», чтобы все стояли в активном состоянии (через phpmyadmin или аналогичный).
ALTER TABLE `s_products` ADD `to_yandex` TINYINT( 1 ) NOT NULL AFTER `featured`;
UPDATE `s_products` SET `to_yandex` = 1;

Теперь обработаем это значение в файле выгрузки в корне сайта yandex.php — найдем код (~55 строка)
WHERE p.visible

и заменим на
WHERE p.visible AND p.to_yandex

Все! Теперь товар у которого стоит «1» будет выгружаться, а с «0» — нет.
Сделаем админскую часть для этого функционала. Будем расширять карточку товара — в simpla/ProductAdmin.php сразу после кода (24 строка)
$product->visible = $this->request->post('visible', 'boolean');

вставляем код
$product->to_yandex = $this->request->post('to_yandex', 'boolean');

И теперь добавим в шаблоне товара «галочку». Для этого в файле simpla/design/html/product.tpl после строк (485)
<div class="checkbox">
    <input name=featured value="1" type="checkbox" id="featured_checkbox" {if $product->featured}checked{/if}/> <label for="featured_checkbox">Рекомендуемый</label>
</div>

добавим код
<div class="checkbox">
    <input name=to_yandex value="1" type="checkbox" id="yandex_checkbox" {if $product->to_yandex}checked{/if}/> <label for="yandex_checkbox">Yandex</label>
</div>

Чтобы Ваше поле to_yandex выводилось в списке товаров надо модифицировать класс товара api/Products.php — после строки (141)
p.visible,

добавим поле
p.to_yandex,

И аналогично в методе get_product в этом же файле (для карточки товара).
Теперь наша «галочка» сохраняется в базе. Только для полноты картинки — я бы переименовал «Рекомендуемый» в «Хит», а-то слово уж больно длинное.
Сейчас можно работать, но было бы неплохо создать массовое изменение — поэтому идем в список товаров simpla/ProductsAdmin.php и там после строк (строка 100)
case 'unset_featured':
{
    $this->products->update_product($ids, array('featured'=>0));
    break;
}

добавим код
case 'set_yandex':
{
    $this->products->update_product($ids, array('to_yandex'=>1));
    break;
}
case 'unset_yandex':
{
    $this->products->update_product($ids, array('to_yandex'=>0));
    break;
}

И добавим «обертку» в шаблоне simpla/design/html/products.tpl после строки (120)
<option value="unset_featured">Отменить рекомендуемый</option>

добавим код
<option value="set_yandex">Отправлять в Я.Маркет</option>
<option value="unset_yandex">Не отправлять в Я.Маркет</option>

Есть еще 1 приятная мелочь — аяксовые кнопочки напротив каждого товара и мы сделаем свои для Yandex.Market. Выше в этом же файле найдем (62 строка)
{if $product->featured}featured{/if}

и добавим после него
{if $product->to_yandex}yandex{/if}

Далее по коду найдем (102 строка)
<a class="featured"  title="Рекомендуемый"           href="#"></a>

и добавим
<a class="yandex"  title="Yandex.Market"           href="#"></a>

И допишем javascript-обработчик для всего этого — по сути это копия «сделать хитом» только со своим полем. Перед строкой (459)
// Подтверждение удаления

добавим код
// Yandex.market
$("a.yandex").click(function() {
    var icon        = $(this);
    var line        = icon.closest("div.row");
    var id          = line.find('input[type="checkbox"][name*="check"]').val();
    var state       = line.hasClass('yandex')?0:1;
    icon.addClass('loading_icon');
    $.ajax({
        type: 'POST',
        url: 'ajax/update_object.php',
        data: {'object': 'product', 'id': id, 'values': {'to_yandex': state}, 'session_id': '{/literal}{$smarty.session.id}{literal}'},
        success: function(data){
            icon.removeClass('loading_icon');
            if(state)
                line.addClass('yandex');               
            else
                line.removeClass('yandex');
        },
        dataType: 'json'
    });
    return false;  
});

Никаких ajax-обработчиков не надо переделывать и писать, т.к. стандартный считывает статус конкретного параметра — в нашем случае это to_yandex.
Теперь поправим стили и наведем небольшую «красоту». Открываем файл simpla/design/css/style.css и после кода (851 строка)
.icons a.restore                { background-image: url(../images/clock_history_frame.png); }

добавим код
.icons a.yandex                 { background-image: url(../images/yandex_off.png); }
.yandex .icons a.yandex        { background-image: url(../images/yandex_on.png); }

И поскольку мы добавили иконку в строку товара — расширим место под нее. В строке 670 поменяем длину поля имени с 505px на 485px. Ну и естественно надо залить картинки, которые мы вызываем — иконки Yandex. Скачиваем их и заливаем в папку simpla/design/images.

Касательно фильтрации в админке.
api/Products.php
$is_featured_filter = '';

добавляем после
$yandex_filter = '';

simpla/ProductsAdmin.php
if($f = $this->request->get('filter', 'string'))

добавляем
elseif($f == 'yandex')
$filter['yandex'] = 1;

simpla/design/html/products.tpl


Добавляем
<li {if $filter=='yandex'}class="selected"{/if}><a href="{url keyword=null brand_id=null category_id=null page=null filter='yandex'}">Yandex</a></li>
3 комментария RSS
avatar
simpla/ProductsAdmin.php
if($f = $this->request->get('filter', 'string'))
надо добавить; (точку с запятой) тогда работает
avatar
Здравствуйте!
У меня на версии 2.15 почему-то вышибает все товары с отображения после того как делаю это:
Чтобы Ваше поле to_yandex выводилось в списке товаров надо модифицировать класс товара api/Products.php — после строки (141)…
при этом вышибает и в админке и на сайте, т.е товар перестаёт отображаться…
всё проверил по многу раз, всё сделано 1 в 1 с написанным… ???
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.