Jump to content

Новинки по типу рекомендуемых


Recommended Posts

У меня он пока "новый".


DB:

ALTER TABLE `s_products` ADD `new` TINYINT( 1 ) NOT NULL DEFAULT '0' AFTER `hit`

ProductAdmin.php:
$product->new = $this->request->post('new', 'boolean');

Products.php
$query = "SELECT
p.id,
p.url,
p.brand_id,
p.name,
p.annotation,
p.body,
p.position,
p.created as created,
p.visible,
p.featured,
p.new,
p.meta_title,
p.meta_keywords,
p.meta_description,
b.name as brand,
b.url as brand_url
FROM __products p
$category_id_filter
LEFT JOIN __brands b ON p.brand_id = b.id
WHERE
1
$product_id_filter
$brand_id_filter
$features_filter
$keyword_filter
$is_featured_filter
$discounted_filter
$in_stock_filter
$visible_filter
GROUP BY p.id
ORDER BY $order
$sql_limit";

$query = $this->db->placehold($query);

(это в 103 строке, аналогично в 216 строке идёт запрос, в нём добавить p.new)
Product.tpl в админке:
<div class="checkbox"> <input name=new value="1" type="checkbox" id="new_checkbox" {if $product->new}checked{/if}/> <label for="new_checkbox">NEW</label> </div>  

Вот и всё. Теперь у товара есть свойство $product->new, одного только свойства "хит" явно было недостаточно. Используйте на своё усмотрение.

Link to post
Share on other sites
  • 5 weeks later...

сделал вывод новинок для версии 2.0.2, но есть вопрос.

проделанные действия:

в файле simpla/view/View.php примерно строка 90 после:

$this->design->smarty->registerPlugin("function", "get_browsed_products", array($this, 'get_browsed_products'));


добавляем

$this->design->smarty->registerPlugin("function", "get_new_products", array($this, 'get_new_products_plugin'));


после функции

public function get_browsed_products($params, &$smarty)
{
if(!empty($_COOKIE['browsed_products']))
{
....
}
}


добавляем

public function get_new_products_plugin($params, &$smarty)
{
if(!isset($params['visible']))
$params['visible'] = 1;
if(!isset($params['sort']))
$params['sort'] = 'created';
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);

}
}


в файле design/тема/html/hits.tpl добавляем
{* Новинки *} {get_new_products var=new_products limit=3} {if $new_products} <h1></h1> <!-- Список товаров--> <ul id="catalog"> {foreach $new_products as $product} <!-- Товар--> <li class="product"> <!-- Фото товара --> <div class="image"> <a href="products/{$product->url}"> {if $product->image} <img src="{$product->image->filename|resize:200:200}" alt="{$product->name|escape}"/> {/if} </a> </div> <!-- Фото товара (The End) --> <!-- Название товара --> <h3><center><a product_id="{$product->id}" href="products/{$product->url}">{$product->name|escape}</a></center></h3></br> <!-- Название товара (The End) --> {if $product->variants|count > 0} <!-- Цена товара --> <form class="cart" method="get" action="cart"> {if $product->variant->price|convert > 0} <div class="price"> <center>{$product->variant->price|convert} <i>{$currency->sign|escape}</i></center> </div> {/if} </form> <!-- Цена товара (The End)--> {/if} </li> <!-- Товар (The End)--> {/foreach} </ul> <!-- Список товаров (The End)--> {/if}


Теперь вопрос!

При выводе товара в hits.tpl выводит первые указанные 3 товара, которые в админке в каталоге товаров находятся первыми, т.е. вверху каталога.

Помогите пожалуйста сделать, чтобы можно было новинку выбрать вручную, в карточке товара установить галочку "Новинка" и данный товар выводился в файле hits.tpl.

Link to post
Share on other sites
  • 1 month later...

Я сделал новинки по типу рекомендуемых, только в место рекомендуемых у меня хиты.

Выкладываю для версии симплы 2.0.2

Инструкция:

1. в базу в таблице s_products добавляем поле:

ALTER TABLE `s_products` ADD `new` TINYINT( 1 ) NOT NULL DEFAULT '0' AFTER `hit` 

2. в файле simpla/ProductAdmin.php добавляем:

$product->new = $this->request->post('new');

3. в файле api/Products.php в данной функции добавляем p.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.hit,
p.new,
p.meta_title,
p.meta_keywords,
p.meta_description,
b.name as brand,
b.url as brand_url
FROM __products p
LEFT JOIN __variants pv ON (stock IS NULL OR stock>0) AND p.id = pv.product_id AND pv.position=(SELECT MIN(position) FROM __variants WHERE (stock>0 OR stock IS NULL) AND product_id=p.id LIMIT 1)
$category_id_filter
LEFT JOIN __brands b ON p.brand_id = b.id
WHERE
1
$product_id_filter
$brand_id_filter
$features_filter
$keyword_filter
$hit_filter
$discounted_filter
$in_stock_filter
$visible_filter
GROUP BY p.id
ORDER BY $order
$sql_limit";
 

так же внизу в данной функции тоже добавим p.new,

$query = $this->db->placehold("SELECT DISTINCT
p.id,
p.url,
p.brand_id,
p.name,
p.annotation,
p.body,
p.position,
p.created as created,
p.visible,
p.hit,
p.new,
p.meta_title,
p.meta_keywords,
p.meta_description
FROM __products AS p
LEFT JOIN __brands b ON p.brand_id = b.id
WHERE $filter
GROUP BY p.id
LIMIT 1", intval($id));

4. в файле simpla/design/html/product.tpl добавим включение и выключение:

<div class="checkbox">
<input name=new value="1" type="checkbox" id="new_checkbox" {if $product->new}checked{/if}/> <label for="new_checkbox">NEW</label>
</div>

5. в файле view/View.php добавляем:

$this->design->smarty->registerPlugin("function", "get_new", array($this, 'get_new_plugin'));

и ниже

public function get_new_plugin($params, &$smarty)
{
if(!isset($params['visible']))
$params['visible'] = 1;
$params['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);

}
}

6. в файле hits.tpl делаем вывод:

{get_new var=new limit=3} {if $new} <h1>Новые товары в магазине</h1> <ul id="catalog"> {foreach $new as $product} ......... {/foreach} </ul> {/if}  

Пользуйтесь с удовольствием!

 

Link to post
Share on other sites
  • 2 months later...

Спасибо. Хорошее решение. А можно такое же, но для версии 2.1. В ней уже нет ни hits.tpl, ни колонки hit в таблице БД. А что нужно поправить, не знаю.

Link to post
Share on other sites

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

Link to post
Share on other sites

Только что заметил, что товар выводится не тот, у которого стоит флажок, а тот, который попадал в новинки (последний добавленный). В каком файле копать?

Link to post
Share on other sites

С последним разобрался. В версии 2.1 и думаю выше нужно было править еще и все фильтры в файле api/Products.php. В общем я поиском находил в этом файле слово featured и дублировал, но уже подставлял new.
Напрмер

if(!empty($filter['featured']))
		$is_featured_filter = $this->db->placehold('AND p.featured=?', intval($filter['featured']));

               if(!empty($filter['new']))
		$new_filter = $this->db->placehold('AND p.new=?', intval($filter['new']));



или

$is_featured_filter $new_filter

В общем везде, где было featured. Может чего лишнего поправил, но заработало.
Link to post
Share on other sites

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

Link to post
Share on other sites

Вы уж простите, что напрягаю, но есть проблемка. Все сделал, как было описано, на всякий случай перепроверил. Все иконки в списке товаров перескочили на строку ниже.
Что поправить? Спасибо.

Link to post
Share on other sites

Всё бы ничего, но при изменении ширины этого блока даже на 5 пикс. пропадает правый блок с сортировкой по брендам и т.д.
Пошел немного другим путем:
В стилях изменил значения 2 и 8 на 1 и 7 кода

.icons a{	padding: 7px;	margin: 1px;

Затем изменил размер самих иконок с 16х16 на 13х13. Чуть мельче стали, но в одну строку. Еще раз огромное спасибо.
Link to post
Share on other sites

Хотя нашел и другой выход: в main_list ширину увеличить на 20 пикс, а в right_menu уменьшить отступ на 20 пикс. Но всё равно спасибо, а то перерыл методом тыка весь CSS, а нужного места так и не нашел.

Link to post
Share on other sites
  • 10 months later...

Хотя нашел и другой выход: в main_list ширину увеличить на 20 пикс, а в right_menu уменьшить отступ на 20 пикс. Но всё равно спасибо, а то перерыл методом тыка весь CSS, а нужного места так и не нашел.

 если ещё актуально, то в файле simpla/design/css/style. css   найти строку #list .product_name и менять значение width

меняется ширина строки с наименованием товара.

Link to post
Share on other sites
  • 1 year later...
  • 1 year later...

сделал вывод новых товаров под версию 2.0, подскажите пожалуйста, как можно сделать так, чтобы новинки отображались, когда добавляешь новый товар, он автоматически выводился на сайте - что это новинка? А то пока не включишь галочку в админке в карточке товара, что это новинка, то он не отображается на сайте как новинка.

Link to post
Share on other sites
  • 1 month later...

подскажите пожалуйста, как можно выводить новинки по дате добавления и если включен чекбокс на странице товара?

 

в файле view/View.php в функции get_new_plugin
 

$params['new'] = 1;

добавил

if(!isset($params['sort']))
	$params['sort'] = 'created';

 

Как можно объеденить два эти парамметра, чтобы выводило по дате и если включен чекбокс (принудительно новинка) ?

Link to post
Share on other sites

подскажите пожалуйста, как можно выводить новинки по дате добавления и если включен чекбокс на странице товара?

 

в файле view/View.php в функции get_new_plugin

 

$params['new'] = 1;

добавил

if(!isset($params['sort']))
	$params['sort'] = 'created';

 

Как можно объеденить два эти парамметра, чтобы выводило по дате и если включен чекбокс (принудительно новинка) ?

 

вам нужно еще в api/Products.php создать фильтр по этому полю. смотрите как сделано для рекомендуемых. в ф-ях get_products и get_count_products

Link to post
Share on other sites

да да, спасибо!

 

в файле api/Products.php

	case 'created':
	$order = 'p.created DESC';
	break;

 

Подскажите пожалуйста по $params в файле view/View.php в функции get_new_plugin, как можно объеденить?

Link to post
Share on other sites

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

 

например при фильтре на странице товаров по новым товарам выводились сначала товары, которые отмечены чекбоксом и следом были товары по дате

 

и на главной так же выводились в таком порядке

Link to post
Share on other sites

в файле view/View.php в функции get_new_plugin после

$params['visible'] = 1;

прописал

if(!isset($params['sort']))
    $params['sort'] = 'new';

в файле api/Products.php после

case 'name':
$order = 'p.name';
break;

прописал

case 'new':
$order = 'p.created DESC, p.new DESC';
break;

в файле design/default/html/products.tpl прописал фильтр

<a {if $sort=='new'} class="selected"{/if} href="{url sort=new}">новые товары</a>

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

А на главной отображаются новые товары только по дате.

 

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

Edited by Skynet
Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
×
×
  • Create New...