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

Активные бренды


Перейти к решению Решено mishanya,

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

Суть такая, как можно сделать активные бренды?

Например: Категория - активные меню,  там можно свободно менять местами категории, тем самым меняя их расположение.

Как сделать такую активную штуку к брендам?

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

В таблицу брендов нужно добавлять поле position и дальше, по аналогии, как в категориях везде прописать.

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

Делаем запрос к БД:

ALTER TABLE `s_brands` ADD `position` INT(11) NOT NULL DEFAULT '0' ;

В /simpla/design/brands.tpl меняем:

		<div id="list" class="brands">	
			{foreach $brands as $brand}
			<div class="row">
		 		<div class="checkbox cell">
					<input type="checkbox" name="check[]" value="{$brand->id}" />				
				</div>
				<div class="cell">
					<a href="{url module=BrandAdmin id=$brand->id return=$smarty.server.REQUEST_URI}">{$brand->name|escape}</a> 	 			
				</div>
				<div class="icons cell">
					<a class="preview" title="Предпросмотр в новом окне" href="../brands/{$brand->url}" target="_blank"></a>				
					<a class="delete"  title="Удалить" href="#"></a>
				</div>
				<div class="clear"></div>
			</div>
			{/foreach}
		</div>

на это:

		<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>			
		 		<div class="checkbox cell">
					<input type="checkbox" name="check[]" value="{$brand->id}" />				
				</div>
				<div class="cell">
					<a href="{url module=BrandAdmin id=$brand->id return=$smarty.server.REQUEST_URI}">{$brand->name|escape}</a> 	 			
				</div>
				<div class="icons cell">
					<a class="preview" title="Предпросмотр в новом окне" href="../brands/{$brand->url}" target="_blank"></a>				
					<a class="delete"  title="Удалить" href="#"></a>
				</div>
				<div class="clear"></div>
			</div>
			{/foreach}
		</div>

в этом же файле, ниже, после:

{literal}
<script>
$(function() {

добавляем функцию сортировки (остальные функции не удалять, просто добавить эту):

	// Сортировка списка
	$("#list").sortable({
		items:             ".row",
		tolerance:         "pointer",
		handle:            ".move_zone",
		scrollSensitivity: 40,
		opacity:           0.7, 
		
		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();
			});
		}
	});

в файле /simpla/BrandsAdmin.php после:

		// Обработка действий 	
		if($this->request->method('post'))
		{

вставляем прием позиций брендов:

			// Сортировка
			$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));	

дальше в файле api/Brands.php

добавляем в запрос выборки (примерно 34я строка) брендов поле b.position

 

меняем сортировку по имени (примерно 35я строка) 

ORDER BY b.name 

на сортировку по позиции:

ORDER BY b.position

вроде бы все.

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

Делаем запрос к БД:

ALTER TABLE `s_brands` ADD `position` INT(11) NOT NULL DEFAULT '0' ;

В /simpla/design/brands.tpl меняем:

		<div id="list" class="brands">	
			{foreach $brands as $brand}
			<div class="row">
		 		<div class="checkbox cell">
					<input type="checkbox" name="check[]" value="{$brand->id}" />				
				</div>
				<div class="cell">
					<a href="{url module=BrandAdmin id=$brand->id return=$smarty.server.REQUEST_URI}">{$brand->name|escape}</a> 	 			
				</div>
				<div class="icons cell">
					<a class="preview" title="Предпросмотр в новом окне" href="../brands/{$brand->url}" target="_blank"></a>				
					<a class="delete"  title="Удалить" href="#"></a>
				</div>
				<div class="clear"></div>
			</div>
			{/foreach}
		</div>

на это:

		<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>			
		 		<div class="checkbox cell">
					<input type="checkbox" name="check[]" value="{$brand->id}" />				
				</div>
				<div class="cell">
					<a href="{url module=BrandAdmin id=$brand->id return=$smarty.server.REQUEST_URI}">{$brand->name|escape}</a> 	 			
				</div>
				<div class="icons cell">
					<a class="preview" title="Предпросмотр в новом окне" href="../brands/{$brand->url}" target="_blank"></a>				
					<a class="delete"  title="Удалить" href="#"></a>
				</div>
				<div class="clear"></div>
			</div>
			{/foreach}
		</div>

в этом же файле, ниже, после:

{literal}
<script>
$(function() {

добавляем функцию сортировки (остальные функции не удалять, просто добавить эту):

	// Сортировка списка
	$("#list").sortable({
		items:             ".row",
		tolerance:         "pointer",
		handle:            ".move_zone",
		scrollSensitivity: 40,
		opacity:           0.7, 
		
		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();
			});
		}
	});

в файле /simpla/BrandsAdmin.php после:

		// Обработка действий 	
		if($this->request->method('post'))
		{

вставляем прием позиций брендов:

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

дальше в файле api/Brands.php

добавляем в запрос выборки (примерно 34я строка) брендов поле b.position

 

меняем сортировку по имени (примерно 35я строка) 

ORDER BY b.name 

на сортировку по позиции:

ORDER BY b.position

вроде бы все.

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

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

вы добавили в выборку поле b.position?

 

День добрый. Такая же проблема как и у AlexanderKi, бренды сортируются по дате создания, а то что передвигаю в админке, не закрепляется. В базе поле position у всех брендов равно 0.

 

в выборку поле b.position добавлено.

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

День добрый. Такая же проблема как и у AlexanderKi, бренды сортируются по дате создания, а то что передвигаю в админке, не закрепляется. В базе поле position у всех брендов равно 0.

 

в выборку поле b.position добавлено.

 

сделайте запрос к базе

UPDATE `s_brands` SET `position`=`id`;

а затем пробуйте сортировать

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

сделайте запрос к базе

UPDATE `s_brands` SET `position`=`id`;

а затем пробуйте сортировать

Сделал запрос, в базе position заполнилось двузначными числами. После попытки сортировки - поле снова стало нулями.

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

Сделал запрос, в базе position заполнилось двузначными числами. После попытки сортировки - поле снова стало нулями.

можете фтп в личку кинуть, посмотрю.

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

можете фтп в личку кинуть, посмотрю.

Разобрался, извиняюсь.

 

 

вы добавили в выборку поле b.position?

 

Оказалось, что не добавил, подумал, что нужно только order by b.name заменить на order by b.position!

 

Спасибо за подсказки и способ!

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

меняем сортировку по имени (примерно 35я строка) 

ORDER BY b.name 

на сортировку по позиции:

ORDER BY b.position

 

Я что-то не понял наверное я просто заменил ORDER BY b.name на ORDER BY b.position, правильно?

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

 

меняем сортировку по имени (примерно 35я строка) 

ORDER BY b.name 

на сортировку по позиции:

ORDER BY b.position

 

Я что-то не понял наверное я просто заменил ORDER BY b.name на ORDER BY b.position, правильно?

 

Да, всё правильно сделали, только пропустили предыдущий пункт:

 

 

дальше в файле api/Brands.php

добавляем в запрос выборки (примерно 34я строка) брендов поле b.position

 

Это вот здесь нужно добавить в конец b.position:

// Выбираем все бренды
$query = $this->db->placehold("SELECT DISTINCT b.id, b.name, b.url, b.meta_title, b.meta_keywords, b.meta_description, b.description, b.top_description, b.image, b.supplier_id, b.position
Изменено пользователем Dmitry86
Ссылка на сообщение
Поделиться на другие сайты

 b.supplier_id,   - что-то нестандартное, сейчас он его добавит и будет кричать - все пропало :)

Да, это собственные доработки, я просто указал, где нужно добавить b.position )

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

Исправил но все равно порядок сбрасывается

$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 b.position");
 

 

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

сделайте запрос к базе

UPDATE `s_brands` SET `position`=`id`;

а затем пробуйте сортировать

помог вот этот пост. Спасибо за доработку и помощь.

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

Народ, помогите, пожалуйста, с брендами всё Ок, выводим в юзерской части как нам нужно по сортировке, но в админке в "товарах" бренды хотелось бы выводить по имени, для удобства просмотра (их стало очень много, приходится постоянно пользоваться теперь поиском по странице), как это можно реализовать?

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

При создании нового бренда есть проблема, что position заполняется нулём. При добавлении нескольких новых брендов постепенно появляются нули в свойстве position и от этого сортировка "едет" и бренды потом не меняются местами. Вероятно так происходит потому, что новое поле было создано с нулём по умолчанию, то есть:

ALTER TABLE `s_brands` ADD `position` INT(11) NOT NULL DEFAULT '0' ;

 

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

 

Возможно я что-то путаю, т.к. не гуру программирования. Сможет кто-нибудь помочь? Заранее благодарю.

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

При создании нового бренда есть проблема, что position заполняется нулём. При добавлении нескольких новых брендов постепенно появляются нули в свойстве position и от этого сортировка "едет" и бренды потом не меняются местами. Вероятно так происходит потому, что новое поле было создано с нулём по умолчанию, то есть:

ALTER TABLE `s_brands` ADD `position` INT(11) NOT NULL DEFAULT '0' ;

 

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

 

Возможно я что-то путаю, т.к. не гуру программирования. Сможет кто-нибудь помочь? Заранее благодарю.

 

выше же есть запрос чтобы это сделать.

 

UPDATE `s_brands` SET `position`=`id`;
Ссылка на сообщение
Поделиться на другие сайты

 

выше же есть запрос чтобы это сделать.

 

UPDATE `s_brands` SET `position`=`id`;

 

Этот запрос исправляет position только у уже созданных брендов. А при создании новых брендов у них position снова с нулём.

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

Этот запрос исправляет position только у уже созданных брендов. А при создании новых брендов у них position снова с нулём.

а

 

замените в add_brand

 

return $this->db->insert_id();

на

$id = $this->db->insert_id();
$this->db->query("UPDATE __brands SET position=id WHERE id=?", $id);		
return $id;
Ссылка на сообщение
Поделиться на другие сайты

 

а

 

замените в add_brand

 

return $this->db->insert_id();

на

$id = $this->db->insert_id();
$this->db->query("UPDATE __brands SET position=id WHERE id=?", $id);		
return $id;

 

Огромное Спасибо Mishanya! Сделал в api/Brands.php, и теперь всё как надо. Почему сам не додумался сначала заглянуть в Features.php, ведь там всё точно так же в add_feature...

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

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

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

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

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

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

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

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

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

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