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

Сортировка брендов


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

Возникла необходимость вывести перечень брендов с сопровождающей картинкой в определенной последовательности на главной странице.

1. Добавляем в таблицу s_brands столбец position с типом поля int(11)

2. Добавляем параметр сортировки для получения списка брендов в шаблоне в нужной последовательности.
В файле api/Brands.php в функцию get_brands после строк

if(!empty($filter['category_id']))
$category_id_filter = $this->db->placehold('LEFT JOIN __products p ON p.brand_id=b.id LEFT JOIN __products_categories pc ON p.id = pc.product_id WHERE pc.category_id in(?@)', (array)$filter['category_id']);

добавляем

$order = 'b.name';
if(!empty($filter['sort']))
switch ($filter['sort'])
{
case 'position':
$order = 'b.position';
break;
case 'name':
$order = 'b.name';
break;
case 'image':
$order = 'b.image';
break;
}

сразу же ниже, меняем:

// Выбираем все бренды
$query = $this->db->placehold("SELECT DISTINCT b.id, b.name, b.url, b.meta_title, b.meta_keywords, b.meta_description, b.description, b.image
FROM __brands b $category_id_filter ORDER BY b.name");

на следующее:

// Выбираем все бренды
$query = $this->db->placehold("SELECT DISTINCT b.id, b.name, b.url, b.meta_title, b.meta_keywords, b.meta_description, b.description, b.image, b.position
FROM __brands b $category_id_filter ORDER BY $order");

Теперь в шаблонах перечень брендов можно получать отсортированными по нужному полю:
{get_brands var=all_brands sort=position}


P.S.: Аналогичным образом можно добавить параметр limit

3. В этом же файле, правим функцию add_brand, заменяем строки:

$this->db->query("INSERT INTO __brands SET ?%", $brand);
return $this->db->insert_id();

на нижеследующие:

$query = $this->db->placehold("INSERT INTO __brands SET ?%", $brand);
$this->db->query($query);
$id = $this->db->insert_id();
$query = $this->db->placehold("UPDATE __brands SET position=id WHERE id=? LIMIT 1", $id);
$this->db->query($query);
return $id;

Это позволит в новое поле position записывать новое значение при добавление бренда, располагая его в конец списка.
Чуть ниже, в функции update_brand заменяем строку:

$query = $this->db->placehold("UPDATE __brands SET ?% WHERE id=? LIMIT 1", $brand, intval($id));

на другую строку:

$query = $this->db->placehold("UPDATE __brands SET ?% WHERE id in(?@) LIMIT ?", (array)$brand, (array)$id, count((array)$id));


4. Добавляем в файл simpla/design/html/brands.tpl после:

<div id="list" class="brands">
{foreach $brands as $brand}
<div class="row">

следующий код:

<input type="hidden" name="positions[{$brand->id}]" value="{$brand->position}">
<div class="move cell"><div class="move_zone"></div></div>

и в этом же файле, чуть ниже, сразу после:

// Раскрасить строки сразу
colorize();

добавляем:

// Сортировка списка, добавляем по аналогии из шаблона features.tpl
$("#list").sortable({
items: ".row",
tolerance: "pointer",
handle: ".move_zone",
axis: 'y',
scrollSensitivity: 40,
opacity: 0.7,
forcePlaceholderSize: true,
helper: function(event, ui){
if($('input[type="checkbox"][name*="check"]:checked').size()<1) return ui;
var helper = $('<div/>');
$('input[type="checkbox"][name*="check"]:checked').each(function(){
var item = $(this).closest('.row');
helper.height(helper.height()+item.innerHeight());
if(item[0]!=ui[0]) {
helper.append(item.clone());
$(this).closest('.row').remove();
}
else {
helper.append(ui.clone());
item.find('input[type="checkbox"][name*="check"]').attr('checked', false);
}
});
return helper;
},
start: function(event, ui) {
if(ui.helper.children('.row').size()>0)
$('.ui-sortable-placeholder').height(ui.helper.height());
},
beforeStop:function(event, ui){
if(ui.helper.children('.row').size()>0){
ui.helper.children('.row').each(function(){
$(this).insertBefore(ui.item);
});
ui.item.remove();
}
},
update:function(event, ui)
{
$("#list_form input[name*='check']").attr('checked', false);
$("#list_form").ajaxSubmit(function() {
colorize();
});
}
});

Это нам позволит в админке, простым перетаскиванием, менять сортировку по полю position. Точнее пока не позволит, это просто визуальная часть, нужно сделать update в базу, что бы смена позиции сохранялось, для этого...

5. Добавляем в файл simpla\BrandsAdmin.php сразу после:

if(is_array($ids))
switch($this->request->post('action'))
{
case 'delete':
{
foreach($ids as $id)
$this->brands->delete_brand($id);
break;
}
}

следующее:

// Сортировка
$positions = $this->request->post('positions');
$ids = array_keys($positions);
sort($positions);
foreach($positions as $i=>$position)
$this->brands->update_brand($ids[$i], array('position'=>$position));

А чуть ниже, мы меняем:

$brands = $this->brands->get_brands();

на:

$brands = $this->brands->get_brands(array('sort'=>'position'));

это нужно для того, что бы в админке бренды сортировались не по названию (по умолчанию), а по полю position

Вроде все, ничего не забыл.

 

Отредактировал в связи с переездом форума на новый движок, привел в божеский читаемый вид!

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

Спасибо за реализвацию.

Можешь помочь с сортировкой товара в заказе, выскакивает ошибка?!
http://forum.simplacms.ru/discussion/3430/sortirovka-tovarov-v-zakaze#Item_3

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

 

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

 

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

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

Давно не заходил и не смотрел темы :) если еще не поправил, пиши в ЛС, посмотрим

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

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

Тоесть вы ресайзите фотку бренда в момент загрузки ее?

Что-то я об этом не подумал сразу :) а можно кусочек кода и куда лепить, а то лень сейчас капаться?

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

ну там не кусочек кода, но не сложно...

 

 в .htaccess (который в корне), добавляем перед # Статические страницы строку

RewriteRule ^image/([^/]+)_([^/]+)/(.+)? /image.php?width=$1&height=$2&image=/$3 [NC,L]

в корень сайта ложем https://www.dropbox....lbmll/image.php

теперь в шаблоне достаточно писать к брендам

<img src="image/42_42/files/brands/{$brand->image}" border="0">

, на выходе имеем 42х42 максимальные размеры

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

О, спасибо :)

Я прадва думал у вас ресайз идет в момент загрузки картинки для бренда :) На лету это лучше, можно всегда иметь нужного размера картинку, но вот не будет ли это сильно жратъ ресурсы?

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

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

Ссылка на сообщение
Поделиться на другие сайты
  • 1 месяц спустя...
  • 2 недели спустя...
Сортировка не работает в админке, в базе в поле position бренда "0", нужно редактировать каждый бренд и прописывать числа позиций.

 


 

Возможно ли массово прописать числа позиций?

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

 

UPDATE s_brands SET position = id

Да, вот что я забыл написать :) После добавления поля в базу, его нужно проапдейтить на значение ID той же строки!

Спасибо mart за помощь в мое отсутствие :)

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

Юрий быстро и недорого установил данный модуль, теперь работает сортировка брендов в категориях. Рекомендую данного исполнителя!

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

Подскажите пожалуйста, реализацию вывода брендов по параметру 

limit=12

совместно с параметром

position

в первом посту

 

 

 

{get_brands var=all_brands sort=position limit=12}

Ссылка на сообщение
Поделиться на другие сайты
        $sql_limit = '';
        if(isset($filter['limit']) || isset($filter['page']))
        {
        	$limit = 100;
        	$page = 1;

        	if(isset($filter['limit']))
        		$limit = max(1, intval($filter['limit']));

        	if(isset($filter['page']))
        		$page = max(1, intval($filter['page']));

        	$sql_limit = $this->db->placehold(' LIMIT ?, ? ', ($page-1)*$limit, $limit);
        }

изменить 

// Выбираем все бренды
$query = $this->db->placehold("SELECT DISTINCT b.id, b.name, b.url, b.meta_title, b.meta_keywords, b.meta_description, b.description, b.image, b.position
FROM __brands b $category_id_filter ORDER BY $order");

на

// Выбираем все бренды
$query = $this->db->placehold("SELECT DISTINCT b.id, b.name, b.url, b.meta_title, b.meta_keywords, b.meta_description, b.description, b.image, b.position
FROM __brands b $category_id_filter ORDER BY $order $sql_limit");
Ссылка на сообщение
Поделиться на другие сайты

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

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

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

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

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

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

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

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

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