Jump to content

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


Recommended Posts

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

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

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

 

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

Edited by Gloobus
Link to post
Share on other sites
  • 3 months later...
  • 3 weeks later...

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

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

Link to post
Share on other sites

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

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

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

Link to post
Share on other sites

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

 

 в .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 максимальные размеры

Link to post
Share on other sites
neo-2000

О, спасибо :)

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

Link to post
Share on other sites
  • 1 month later...
  • 2 weeks later...
Сортировка не работает в админке, в базе в поле position бренда "0", нужно редактировать каждый бренд и прописывать числа позиций.

 


 

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

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

 

UPDATE s_brands SET position = id

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

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

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

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

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

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

limit=12

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

position

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

 

 

 

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

Link to post
Share on other sites
        $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");
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...