🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: pl.comp.www.server-side
Article #61339

Implementacja parametrów produktów

#61339
From: beherit / pn
Date: Wed, 17 Nov 2010 10:19
101 lines
4861 bytes
Witam,

mam taką pewną zagwozdkę. Chciałbym wykonać uniwersalny konfigurator 
parametrów produktów przypisanych do kategorii. Np. mamy kategorię 
*lodówki* i wszystkie produkty które dodajemy do lodówek:

1) miałyby parametry:
	- wymagalne
	- opcjonalne
2) parametry dzieliłyby się na typy:
	- text / int / decimal (podawane jako string)
	- select, multiselect / radio, checkbox (wybierany ze słownika 
przypisanego do parametru)
	- text-select (dodawany do słownika danego selecta, jeśli nie zostało w 
nim znalezione)
	- range (podawane jako zakres np. floatów)
	- off (wyłączony w danej akcji)
3) parametry są możliwe do wykonania w akcji:
	- dodawania,
	- wyszukiwania


gdzieś w tym konieczna jeszcze obsługa języka :). Wymyśliłem sobie taką 
strukturę bazy:

nazwy parametrów

CREATE TABLE `param` (
	`_param_id` MEDIUMINT(8) UNSIGNED NOT NULL COMMENT 'Parameter ID',
	`_language` CHAR(2) NOT NULL,
	`_param_name` VARCHAR(64) NOT NULL COMMENT 'Nazwa parametru używana w 
label for, oraz jako nazwa pola.',
	`_param_label` VARCHAR(64) NOT NULL COMMENT 'Label - opis do pola',
	`_type_search` 
ENUM('checkbox','select','radio','range','text','int','decimal','text-select','off') 
NOT NULL COMMENT 'Parameter type',
	`_type_add` 
ENUM('checkbox','select','radio','range','text','int','decimal','text-select','off') 
NOT NULL COMMENT 'Parameter type',
	`_weight` MEDIUMINT(8) UNSIGNED NOT NULL COMMENT 'Important (++ more, 
-- less)',
	`_status` ENUM('ON','OFF') NOT NULL DEFAULT 'OFF' COMMENT 'Czy 
pokazywany w szablonach (oczywiscie musi byc w nich zdefiniowany)',
	UNIQUE INDEX `_param_id__language__param_name` (`_param_id`, 
`_language`, `_param_name`),
	INDEX `FK__node_language` (`_language`),
	INDEX `FK_param_param_type` (`_type_search`),
	CONSTRAINT `FK__node_language` FOREIGN KEY (`_language`) REFERENCES 
`language` (`_language`) ON UPDATE CASCADE ON DELETE NO ACTION
)
COLLATE='utf8_general_ci'
ENGINE=InnoDB
ROW_FORMAT=DEFAULT

słowniki parametrów:

CREATE TABLE `param_value` (
	`_param_id` MEDIUMINT(8) UNSIGNED NOT NULL,
	`_language` CHAR(2) NULL DEFAULT NULL,
	`_param_value_id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
	`_param_value_text` VARCHAR(1024) NULL DEFAULT NULL,
	`_param_value_int` INT(10) NULL DEFAULT NULL,
	`_param_value_float` DECIMAL(12,4) NULL DEFAULT NULL,
	UNIQUE INDEX `_param_id__language__param_value_id` (`_param_id`, 
`_language`, `_param_value_id`),
	INDEX `FK_param_value_language` (`_language`),
	PRIMARY KEY (`_param_value_id`),
	CONSTRAINT `FK_param_value_param` FOREIGN KEY (`_param_id`) REFERENCES 
`param` (`_param_id`) ON UPDATE CASCADE ON DELETE NO ACTION,
	CONSTRAINT `FK_param_value_language` FOREIGN KEY (`_language`) 
REFERENCES `language` (`_language`) ON UPDATE CASCADE ON DELETE NO ACTION
)
COLLATE='utf8_general_ci'
ENGINE=InnoDB
ROW_FORMAT=DEFAULT

iw  końcu miejsce ich przechowywania:
CREATE TABLE `node_param` (
	`_revision` MEDIUMINT(8) UNSIGNED NOT NULL,
	`_param_value_id` INT(10) UNSIGNED NULL DEFAULT NULL,
	`_param_value_text` VARCHAR(1024) NULL DEFAULT NULL,
	`_param_value_int` INT(10) NULL DEFAULT NULL,
	`_param_value_float` DECIMAL(12,4) NULL DEFAULT NULL,
	UNIQUE INDEX `_revision__param_id__param_value_id` (`_revision`, 
`_param_value_id`),
	CONSTRAINT `FK_node_param_param_value` FOREIGN KEY (`_param_value_id`) 
REFERENCES `param_value` (`_param_value_id`) ON UPDATE CASCADE ON DELETE 
CASCADE,
	CONSTRAINT `FK_node_param_node_revision` FOREIGN KEY (`_revision`) 
REFERENCES `node_revision` (`_revision`) ON UPDATE CASCADE ON DELETE CASCADE
)
COLLATE='utf8_general_ci'
ENGINE=InnoDB
ROW_FORMAT=DEFAULT


czy to dobra ścieżka, a może ktoś zna jakieś fajne i ciekawe 
rozwiązanie... bo żeby to zrobić dobrze potrzeba trochę czasu na 
pomyślenie co i jak, a to rozwiązanie takie trochę na szybko.

pozdr,p.
Technical Details
Message-ID: <ic0a7o$bmf$1@inews.gazeta.pl>
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.gazeta.pl!not-for-mail

Show Full Headers
Complete Article Headers
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.gazeta.pl!not-for-mail
From: beherit / pn <beherit@sprawdzam-raz-w-miesiacu.firenet.eu.org>
Newsgroups: pl.comp.www.server-side
Subject: Implementacja parametrów produktów
Date: Wed, 17 Nov 2010 11:19:16 +0100
Organization: "Portal Gazeta.pl -> http://www.gazeta.pl"
Lines: 101
Message-ID: <ic0a7o$bmf$1@inews.gazeta.pl>
NNTP-Posting-Host: ip-89-174-118-156.multimo.pl
Mime-Version: 1.0
X-Trace: inews.gazeta.pl 1289989176 11983 89.174.118.156 (17 Nov 2010 10:19:36 GMT)
X-Complaints-To: usenet@agora.pl
NNTP-Posting-Date: Wed, 17 Nov 2010 10:19:36 +0000 (UTC)
X-User: beherit00
X-Antivirus: avast! (VPS 101116-1, 2010-11-16), Outbound message
X-Antivirus-Status: Clean
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; pl; rv:1.9.2.12) Gecko/20101027 Thunderbird/3.1.6
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit