Simpla 2.1+: дополнительные чекбоксы в товаре

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 для великолепных Интернет магазинов! 

Буду благодарен за отзывы, рекомендации и пожертвования  . Успехов!

Отзывы

Оставьте отзыв
На него будут приходить уведомление при ответе. На сайте не публикуется