Каталоги по производителю)

Смотрю я на эти "6 соток" и вид ссылок на категории, подкатегории и брэнды...
И понимаю (возможно, я и неправа), что у них на брэнды там отдельная таблица, а каталог по брендам организован как альтернативное category_tree, только с более сложной организацией.
Смотрите:
При выборе чего-нибудь из каталога брэндов получаем вот такую ссылку

Для просмотра ссылки Войди или Зарегистрируйся

А при выборе ПОДКАТЕГОРИИ видится вот это:

Для просмотра ссылки Войди или Зарегистрируйся

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

ЗЫ. Караул! Попробовала сделать "по-быстрому", использовала для хранения названия бренда ненужное мне для других целей поле "product_code". Всё бы хорошо, но теперь не знаю, за что хвататься, чтобы оставить возможность поиска по брэнду, если он будет не в дополнительных параметрах, а в основной таблице. Пока брэнд сидел как доп.параметр, я могла для каждой категории выбрать список отображаемых брэндов и поиск реализовывать в виде выпадающего списка, чтобы посетитель не вбивал руками, а выбирал из готовых. Если я его переведу в основную таблицу, даже не представляю, как вообще его в поиск втулить, не говоря уже об ограничениях по выбираемым брэндам для каждого типа товара.
Да уж... наверно, если нужно "красиво" - нужно под брэнды отдельную таблицу и потом код дописывать. Звучит жутковато.
 
А что твой для premium версии не подойдет?
Я не ещё не видел структуру БД у премиум версии. Скорей всего без "тщательной обработки напильником" не подойдет.

OFF: Поставил галочку уведомлять о новых сообщениях в теме, но что-то не уведомляет... Такчто звиняйте, если долго не отвечаю
 
А, кстати, вот еще вопрос: как сделать возможным добавление дополнительных родительских категорий для СУБкатегорий?

Поясняю, зачем надо: если будем делать "каталог по брэндам", то фактически мы должны продублировать тот каталог, который у нас есть (обычно слева под шапкой), но отдельно для каждого брэнда. Да еще в зависимости от того, что туда попадает или не попадает.
То есть брэнд будет "старшим" уровнем по сравнению с главной категорией. и одна категория может выводиться в разных брэндах.

Для собственно ТОВАРОВ есть такой пунктик "дополнительные родиельские категории". Вот что-то такое же нужно, чтобы прикрепить категорию к каждому брэнду, где она встречается.
 
А как реализовал можешь написать?

Фуух, не думал, что так сложно будет все описать. Но раз пообещал, пришлось напрячься. Итак...

Идеология, как впринципе видно по скринам, такая: каждый товар относится к одному какому-либо бренду, хотя указание бренда для товара не обязательно.
Реализуется это дополнительным полем в табличке товаров.
Для хранения информации о брендах создается отдельная таблица.

1 Модифицируем БД
1.1 Создаем табличку с информацией о брендах ss_brands

Код:
CREATE TABLE IF NOT EXISTS `ss_brands` (
  `id` int NOT NULL auto_increment,
  `name` varchar(30) default NULL,
  `description` text default NULL,
  `img_logo` varchar(100) default NULL,
  `site` varchar(60) default NULL,
  `sort_order` int default '9999',
  `enabled` int default '1',
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

1.2 Создаем поле "индентификатор бренда" в таблице продуктов

Код:
ALTER TABLE `ss_products` ADD `brandid` int default NULL

2 Добавляем новый модуль в админку

2.1 Дописываем в "includes/admin/catalog.php"
Было:
Код:
	//define admin department
	$admin_dpt = array(
		"id" => "catalog", //department ID
		"sort_order" => 10, //sort order (less `sort_order`s appear first)
		"name" => ADMIN_CATALOG, //department name
		"sub_departments" => array
		(
			array("id"=>"products_categories", "name"=>ADMIN_CATEGORIES_PRODUCTS),
			array("id"=>"special", "name"=>ADMIN_SPECIAL_OFFERS)
		)
	);
	add_department($admin_dpt);
	...
Стало:
Код:
	//define admin department
	$admin_dpt = array(
		"id" => "catalog", //department ID
		"sort_order" => 10, //sort order (less `sort_order`s appear first)
		"name" => ADMIN_CATALOG, //department name
		"sub_departments" => array
		(
			array("id"=>"products_categories", "name"=>ADMIN_CATEGORIES_PRODUCTS),
			[B]array("id"=>"brands", "name"=>"Бренды"),[/B]
			array("id"=>"special", "name"=>ADMIN_SPECIAL_OFFERS)
		)
	);
	add_department($admin_dpt);
	...

2.2 Создаем скрипт "includes/admin/sub/catalog_brands.php"

Код:
<?php
	include("./core/admin_db_access.php");
	
	if (!strcmp($sub, "brands"))
	{
		$brands = admin_get_brands();
	
		$smarty->assign("brands", $brands);
		$smarty->assign("admin_sub_dpt", "catalog_brands.tpl.html");
	}
?>

2.3 Создаем шаблон для странички списка брендов "templates/tmpl1/admin/catalog_brands.tpl.html"
Мой пример во вложении


3 Создаем скрипт редактирования/добавления бренда "editbrand.php"
Мой пример во вложении (загрузку логотипа ещё не реализовал)

4 Добавляем комбо-бокс для выбора бренда в страничку редактирования товара "products.php"
Тут свою форму показывать смысла нет, т.к. она мною значительно переделана и
работать на стандартном SS-Free не будет.

4.1 Чтоб при редактировании продукта получить идентификатор бренда нужно добавить одно поле в селект

Код:
	else //get product from db
	{
		if ($_GET["productID"])
		{

			$q = db_query("SELECT categoryID, name, ..., [B]brandid[/B] FROM ".PRODUCTS_TABLE." WHERE productID='".$_GET["productID"]."'") or die (db_error());
			$row = db_fetch_row($q);
			...
Можно для удобства сохранить в переменной, например
Код:
	$brandid = row[индекс_поля]

4.2 Собственно комбо-бокс в таблице сделан по аналогии с комбо-боксом выбора категории
Код:
	<td align=right><?php echo ADMIN_PRODUCT_BRAND;?>:</td>
	<td>
		<select name="brandID" style="width: 150px;">
			<option value="0"><?php echo ADMIN_BRAND_EMPTY;?></option>
			<?php
				//show brands select element
				$brands = fillBrandsList(0,0);
				for ($i=0; $i<count($brands); $i++)
				{
					echo "<option value=\"".$brands[$i][0]."\"";
					if ($brandid == $brands[$i][0]) //<-----select
						echo " selected";
					echo ">";
					echo $brands[$i][1];
					echo "</option>";
				}
			?>
		</select>
	</td>

Функция fillBrandsList:

Код:
function fillBrandsList()
{
	$q = db_query("SELECT id, name, description , img_logo, site, sort_order FROM ss_brands ORDER BY name") or die (db_error());
	$a = array();
	while ($row = db_fetch_row($q))
	{
		$a[] = $row;
	}
	return $a;
}

4.3 Для сохранения идентификатора бренда необходимо дописать запросы вставки и обновления:

вставка:
Код:
	//add new product
	db_query("INSERT INTO ".PRODUCTS_TABLE." (categoryID, name, ..., [B]brandid[/B]) VALUES (".$_POST["categoryID"].",'".$_POST["name"]."', ..., [B]".$_POST["brandID"]."[/B] );") or die (db_error());

обновление:
Код:
	//generating query
	$s = "UPDATE ".PRODUCTS_TABLE." SET categoryID='".$_POST["categoryID"]."', name='".$_POST["name"]."', ... , [B]brandid=".$_POST["brandID"][/B];

5. Ну и под конец...

выбрать все бренды с правильной сортировкой:
Код:
$q = db_query("SELECT id, name, description, img_logo, site FROM ".BRANDS_TABLE." WHERE enabled != 0 ORDER BY sort_order, name") or die (db_error());

выбрать список продуктов выбранного бренда $brandID:
Код:
$q = db_query("SELECT productID, categoryID, ..., FROM ".PRODUCTS_TABLE." WHERE categoryID !=0 AND brandID = $brandID AND enabled = 1";

Это все. Осталось только в дизайне нарисовать вывод списка брендов. И прицепить на index.php обработку параметра brandID(или как назовете), чтоб по ссылке вида index.php?brandID=1 выводился список товаров по бренду 1 - это можно сделать по аналогии с выводом товаров по выбранной категории.
 

Вложения

  • scripts.zip
    4,9 KB · Просмотры: 84
Покажу все-таки как это выглядит у меня.
Первый скрин - выбрана категория (перед названием товара указан бренд, если он есть - неочень красиво, но пока руки не доходят переделать).
Второй скрин - выбран бренд (над списком товаров выводится его описание из поля description)
 

Вложения

  • category_select.JPG
    category_select.JPG
    80,9 KB · Просмотры: 149
  • brand_select.JPG
    brand_select.JPG
    80,8 KB · Просмотры: 133
А, кстати, вот еще вопрос: как сделать возможным добавление дополнительных родительских категорий для СУБкатегорий?

Поясняю, зачем надо: если будем делать "каталог по брэндам", то фактически мы должны продублировать тот каталог, который у нас есть (обычно слева под шапкой), но отдельно для каждого брэнда. Да еще в зависимости от того, что туда попадает или не попадает.
То есть брэнд будет "старшим" уровнем по сравнению с главной категорией. и одна категория может выводиться в разных брэндах.

Для собственно ТОВАРОВ есть такой пунктик "дополнительные родиельские категории". Вот что-то такое же нужно, чтобы прикрепить категорию к каждому брэнду, где она встречается.

Как вариант, можно формировать такой каталог (где под названием вложены все категории, к которым относится бренд) на основании наличия продуктов выбранного бренда в категории.
Т.е. проще говоря: пробегаемся по верхнему уровню категорий, если в них есть товары этого производителя, то добавляем в список. Также поступаем с подкатегориями.

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

Минус:
- нагрузка на базу данных.

Минус можно если не устанить, то уменьшить создав нужные индексы в базе данных. Если этого недостаточно, то можно попробовать прикрутить кэширование.

Я сам планирую такое сделать для себя, но руки дойдут не скоро :(
 
Буду ковырять для премиума, как прикручу скину сюда но думаю проблем возникнуть не должно. :ay:
 
Буду ковырять для премиума, как прикручу скину сюда но думаю проблем возникнуть не должно. :ay:

желаю удачи, видимо ко мне присоединятся более половины юзером юзающих shop-script, т.к. выложенного рабочего доделанного модуля нет.
 
Как вариант, можно формировать такой каталог (где под названием вложены все категории, к которым относится бренд) на основании наличия продуктов выбранного бренда в категории.
Т.е. проще говоря: пробегаемся по верхнему уровню категорий, если в них есть товары этого производителя, то добавляем в список. Также поступаем с подкатегориями.

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

Минус:
- нагрузка на базу данных.
Думала над этим. Но отказалась сразу: получится, что если у меня, скажем, стиральные машины 6 брэндов, плиты 7 и кондиционеры 10, то в итоге создастся 6 категорий-подкатегорий "стиралки", 7 штук "плит" и сответственно 10 "кондиционеров". Да это ж просто бар.... сорри, кавардак какой-то! И посетителю будет малореально сделать просто выборку "все плиты" или еще что-нить "по всем брэндам". А придется копаться в отдельных подкатегориях. Все равно что лопать салат из 6 тарелок, куда каждый компонент выложен. Неудобно же.
А вот решение с дополнительной таблицей мне кажется очень привлекательным... Ща пробовать буду.
 
Думала над этим. Но отказалась сразу: получится, что если у меня, скажем, стиральные машины 6 брэндов, плиты 7 и кондиционеры 10, то в итоге создастся 6 категорий-подкатегорий "стиралки", 7 штук "плит" и сответственно 10 "кондиционеров". Да это ж просто бар.... сорри, кавардак какой-то! И посетителю будет малореально сделать просто выборку "все плиты" или еще что-нить "по всем брэндам". А придется копаться в отдельных подкатегориях. Все равно что лопать салат из 6 тарелок, куда каждый компонент выложен. Неудобно же.
А вот решение с дополнительной таблицей мне кажется очень привлекательным... Ща пробовать буду.
Ну я предлагаю это решение вместе с доп. таблицей. Мы, наверное, по разному представляем результат.

Я считаю, так: каталог товаров не трогаем, оставляем его в покое.
Дополнительно, есть каталог брендов. Вот в нем, по выбору бренда, выводится список товара и, кроме того, ссылки на категории в которых есть товар данного бренда - получаем этакий фильтр товаров "бренд + категория". Думаю, будет полезно и удобно.
 
Назад
Сверху