Simpla 2.1+: дополнительные чекбоксы в товаре
Как обычно начинаем с добавления поля в базу данных. Будем делать дополнительную, альтернативную стандартному пониятию в SimplaCMS "Новинку".
В таблицу s_products добавляем поле is_new следующим запросом
ALTER TABLE `s_products` ADD `is_new` TINYINT( 1 ) NOT NULL AFTER `visible`
Теперь открываем файла админки simpla/design/html/product.tpl и перед чекбоксом "Рекомендуемый" (~457 строка)
<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="is_new" value="1" type="checkbox" id="new_checkbox" {if $product->is_new}checked{/if}/> <label for="new_checkbox">Новинка</label> </div>
Далее открываем файл редактирования товара simpla/productAdmin.php и перед строкой получения значения поля "Рекомендуемый" (features - ~25 строка) добавим код получения значения "Новинка"
$product->is_new = $this->request->post('is_new', 'boolean');
По сути мы уже пишем наши "Новинки" в базу. Теперь организуем их вывод.
Открываем файл api/Products.php и в методе get_products добавляем фильтр по данному критерию. Инициализируем переменную в начале метода (~39 строка)
$is_new_filter = '';
Далее в этом же файле сделаем обработчик фильтра - все опять же по аналогии с features (~68 строка)
if(!empty($filter['is_new'])) $is_new_filter = $this->db->placehold('AND p.is_new=?', intval($filter['is_new']));
И теперь непосредственно сам запрос получит вид
$query = "SELECT p.id, p.url, p.brand_id, p.name, p.annotation, p.body, p.position, p.created as created, p.visible, p.is_new, p.featured, p.meta_title, p.meta_keywords, p.meta_description, b.name as brand, b.url as brand_url FROM s_products p $category_id_filter LEFT JOIN s_brands b ON p.brand_id = b.id WHERE 1 $product_id_filter $brand_id_filter $features_filter $keyword_filter $is_new_filter $is_featured_filter $discounted_filter $in_stock_filter $visible_filter $group_by ORDER BY $order $sql_limit";
Здесь мы добавили в выборку наше поле is_new и далее по коду подключили сформированный нами запрос по фильтру.
Аналогично правим метод count_products - инициализируем переменную $is_new_filter (как мы делали для списка товаров), добавляем обработчик фильтра и изменяем код запроса на
$query = "SELECT count(distinct p.id) as count FROM s_products AS p $category_id_filter WHERE 1 $brand_id_filter $keyword_filter $is_new_filter $is_featured_filter $in_stock_filter $discounted_filter $visible_filter $features_filter ";
Ну и конечно выведем наше новое поле в карточку товара. В методе get_product меняем запрос на
$query = "SELECT DISTINCT p.id, p.url, p.brand_id, p.name, p.annotation, p.body, p.position, p.created as created, p.visible, p.is_new, p.featured, p.meta_title, p.meta_keywords, p.meta_description FROM s_products AS p LEFT JOIN s_brands b ON p.brand_id = b.id WHERE $filter GROUP BY p.id LIMIT 1";
По сути все, теперь мы можем в каталоге и в карточке по значению переменной $product->is_new определять "Новинку".
Но для чего мы все это затеяли? Конечно же нам надо сделать виждет для вывода наших новых "Новинок" :) Открываем файл view/View.php и после инициализации плагина get_featured_products (~103 строка) вставляем инициализацию плагина get_is_new_products
$this->design->smarty->registerPlugin("function", "get_is_new_products", array($this, 'get_is_new_products_plugin'));
В этом же файле перед методом get_featured_products_plugin (~181 строка) вставляем метод
public function get_is_new_products_plugin($params, &$smarty) { if(!isset($params['visible'])) $params['visible'] = 1; $params['is_new'] = 1; if(!empty($params['var'])) { foreach($this->products->get_products($params) as $p) $products[$p->id] = $p; if(!empty($products)) { // id выбраных товаров $products_ids = array_keys($products); // Выбираем варианты товаров $variants = $this->variants->get_variants(array('product_id'=>$products_ids, 'in_stock'=>true)); // Для каждого варианта foreach($variants as &$variant) { // добавляем вариант в соответствующий товар $products[$variant->product_id]->variants[] = $variant; } // Выбираем изображения товаров $images = $this->products->get_images(array('product_id'=>$products_ids)); foreach($images as $image) $products[$image->product_id]->images[] = $image; foreach($products as &$product) { if(isset($product->variants[0])) $product->variant = $product->variants[0]; if(isset($product->images[0])) $product->image = $product->images[0]; } } $smarty->assign($params['var'], $products); } }
Если Вы сравните методы get_featured_products_plugin и get_is_new_products_plugin Вы увидите, что отличается только 1 строка
$params['is_new'] = 1;
Теперь осталось получить и обработать данные в шаблоне. Открываем файл design/[ваш_шаблон]/html/main.tpl и вместо виджета get_new_products вызываем виджет
{get_is_new_products var=new_products limit=3}
Теперь мы получаем в "Новинки" не последние по дате добавления, а те товары, где мы поставили галочку "Новинка".
Как уже писало выше - вывести метку или поставить картинку в товаре, и в списке, и в карточке, Вы можете используя аналог следующего кода
{if $product->is_new}Новинка{/if}
Вот и все. По аналогии можно сделать и "Товар дня", и другой чекбокс для товара. Именно так и работает этот функционал на данном сайте :) можете проверить на главной.
Удачи в освоении SimplaCMS для великолепных Интернет магазинов!
Буду благодарен за отзывы, рекомендации и пожертвования . Успехов!
Добрый день
Извините за ответ с задержкой)))
Скорее всего Вы либо не добавили запрос в базу или не обработали галочку в API
Если не сможете справиться своими силами то предаставьте доступы и мы поможем Вам решить данную проблему!
simpla/design/html/products.tpl
Нужно делать по аналогии с чекбоксом "featured" и дописывать аякс-обработчики для ваших чекбоксов по аналогии с "featured" и формировать соответствующие стили(для удобства пользования)
Хотел добавить в админке в списке товаров добавить значок "новинка" по аналогии с "Рекомендуемые" (такую же звездочку)
<a class="featured" title="Рекомендуемый" href="#"></a>
<a class="is_new" title="Новинка" href="#"></a>
<a class="duplicate" title="Дублировать" href="#"></a>
стили по аналогии с class="featured" поправил, новый значок отображается, но не переключает состояния.
Куда еще можно обратить внимание, чтобы такая конструкция работала?
И по прошлому комментарию:
<li {if $filter=='is_new'}class="selected"{/if}><a href="{url keyword=null brand_id=null category_id=null page=null filter='is_new'}">Новинки</a></li>
такой код, у меня по крайней мере, не выводит только новинки, а выводит весь список товаров.
В файле simpla/ProductsAdmin.php нужно добавить
elseif($f == 'is_new')
$filter['is_new'] = 1;
после
if($f == 'featured')
$filter['featured'] = 1;
Без нее сложно понять, какой товар отмечен, как Новинка.
Спасибо!
Доброе время суток! Вам необходимо по аналогии с
<li {if $filter=='featured'}class="selected"{/if}><a href="{url keyword=null brand_id=null category_id=null page=null filter='featured'}">Рекомендуемые</a></li>
вывести
<li {if $filter=='is_new'}class="selected"{/if}><a href="{url keyword=null brand_id=null category_id=null page=null filter='is_new'}">Рекомендуемые</a></li>