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

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


Рекомендуемые сообщения

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


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, одного только свойства "хит" явно было недостаточно. Используйте на своё усмотрение.

Ссылка на сообщение
Поделиться на другие сайты
  • 5 недель спустя...

сделал вывод новинок для версии 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.

Ссылка на сообщение
Поделиться на другие сайты
  • 1 месяц спустя...

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

Выкладываю для версии симплы 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}  

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

 

Ссылка на сообщение
Поделиться на другие сайты
  • 2 месяца спустя...

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

Ссылка на сообщение
Поделиться на другие сайты

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

Ссылка на сообщение
Поделиться на другие сайты

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

Ссылка на сообщение
Поделиться на другие сайты

С последним разобрался. В версии 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. Может чего лишнего поправил, но заработало.
Ссылка на сообщение
Поделиться на другие сайты

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

Ссылка на сообщение
Поделиться на другие сайты

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

Ссылка на сообщение
Поделиться на другие сайты

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

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

Затем изменил размер самих иконок с 16х16 на 13х13. Чуть мельче стали, но в одну строку. Еще раз огромное спасибо.
Ссылка на сообщение
Поделиться на другие сайты

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

Ссылка на сообщение
Поделиться на другие сайты
  • 10 месяцев спустя...

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

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

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

Ссылка на сообщение
Поделиться на другие сайты
  • 1 год спустя...
  • 1 год спустя...

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

Ссылка на сообщение
Поделиться на другие сайты
  • 1 месяц спустя...

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

 

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

$params['new'] = 1;

добавил

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

 

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

Ссылка на сообщение
Поделиться на другие сайты

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

 

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

 

$params['new'] = 1;

добавил

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

 

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

 

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

Ссылка на сообщение
Поделиться на другие сайты

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

 

в файле api/Products.php

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

 

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

Ссылка на сообщение
Поделиться на другие сайты

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

 

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

 

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

Ссылка на сообщение
Поделиться на другие сайты

в файле 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>

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

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

 

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

Изменено пользователем Skynet
Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
×
×
  • Создать...