Jump to content

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


Go to solution Solved by mishanya,

Recommended Posts

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

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

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

Link to post
Share on other sites

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

Link to post
Share on other sites
  • Solution

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

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

вроде бы все.

Edited by mishanya
Link to post
Share on other sites

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

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

вроде бы все.

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

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

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

 

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

 

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

Link to post
Share on other sites

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

 

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

 

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

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

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

Link to post
Share on other sites

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

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

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

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

Link to post
Share on other sites

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

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

Link to post
Share on other sites

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

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

 

 

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

 

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

 

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

Link to post
Share on other sites

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

ORDER BY b.name 

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

ORDER BY b.position

 

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

Link to post
Share on other sites

 

меняем сортировку по имени (примерно 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
Edited by Dmitry86
Link to post
Share on other sites

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

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

Link to post
Share on other sites

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

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

 

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

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

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

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

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

 

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

 

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

Link to post
Share on other sites

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

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

 

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

 

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

 

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

 

UPDATE `s_brands` SET `position`=`id`;
Link to post
Share on other sites

 

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

 

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

 

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

Link to post
Share on other sites

Этот запрос исправляет 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;
Link to post
Share on other sites

 

а

 

замените в 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...

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...