Он писал, что там объекты хранятся, сейчас гляну. У меня как бы есть уже что-то, но все оно через ж0пу сделано, мне не нравится. Думаю, что можно лучше сделать.
да (вот там как раз это уже есть). А еще сейчас работаю над механизмом учетных записей, так там хочу реализовать возможность "навешивания" пользователям N-ого числа полей. Ну типа для покупателей это будет ФИО, телефон, адрес доставки по умолчанию, для студента это будет вуз, факультет на котором он обучается и тд. (вот здесь я хочу это сделать правильно)
а, вспомнил. Еще думаю о модуле "анкетирование". Типа когда создаешь список вопросов, отвечать на которые нужно по-разному: текст, текстовое поле, да/нет, выбор 1 из многого, нескольких из многого и тд.
я не прошу полностью рабочий код, подходят решения на псевдокоде, описание структур таблиц, прочие советы.
да уж. Пора завязывать с этим. Отпуск глупо проходит. так вот, сейчас в товарах имеем следующее: таблица атрибуты id, type_id, title, сравниваемый, видимый, обязательный, text_id - нужно для "мануального" вывода на страницу attr_text id, value_default, check - тип проверки, которую нужно выполнить attr_textarea id, value_default attr_boolean id, value_default attr_select id, is_multiple - типа один выбираем или несколько attr_select_options attr_id, option_id, value, is_selected теперь нужно ж как-то сохранять заполненные атрибуты attr_text_values attr_id, product_id, value attr_textarea_values attr_id, product_id, value attr_bool_values attr_id, product_id, value attr_select_values attr_id, product_id, value - хранятся через запятую выбранные параметры из таблицы _options жирным показаны связи. Вот такое говнецо получается. А еще есть желание реализовать мультиязычность. В "пользователях" чуток попроще. Ибо времени совсем мало на разработку, нужно уже внедрять это все users_fields id, type_id, title - по этому title мы бум обращаться к полю, так что он типа заменитель идента, должен быть уникален users_fields_values field_id, user_id, v_text, v_textarea, v_boolean в зависимости от типа атрибута сохраняем в разные колонки. Запах говнеца от этой поделки еще сильнее, чем от товаров. Вставка еденичной записи выглядит так: PHP: <?php class Users { // ... private function setValue($userId, $field, $value) { //TODO: сделать отложенную запись //TODO: написать метод, в котором будут устанавливаться множество правил $this->db->multiQuery(' SET @TITLE = ?s; SET @VALUE = ?s; SET @FIELD_ID = (SELECT id FROM ?t WHERE title=@TITLE); SET @FIELD_TYPE = (SELECT type FROM ?t WHERE title=@TITLE); SET @VAL_TEXT = if(@FIELD_TYPE = 1, @VALUE, ""); SET @VAL_TEXTAREA = if(@FIELD_TYPE = 2, @VALUE, ""); SET @VAL_BOOLEAN = if(@FIELD_TYPE = 3, @VALUE, ""); REPLACE INTO ?t SET user_id=?i, field_id=@FIELD_ID, `text`=@VAL_TEXT, textarea=@VAL_TEXTAREA, `bool`=@VAL_BOOLEAN', $field, $value, self::USERS_FIELDS, self::USERS_FIELDS, self::USERS_FIELDS_VALUES, $userId); } // ... }
как обещано. все, что нам надо это уметь создавтаь объекты с динамическим набором свойств и уметь их сохранять и загружать обратно. для решения этой задачи я использовал протопит объектной модели. класс -> экземпляры класса. для решения такой задачи мне потребовалось уметь работать с моделью(классами) и самими объектами, сгенеренными по нужному классу. 1. работа с моделью. для работы с моделью нам потребуется: - уметь хранить и работать с древовидной стуктурой. - каждому узлу дерева сопоставлять определенный набор свойств. - уметь работать со свойстывами и их значениями. итак. с деревьями все просто. я не стал ничего мудрить и сделал классическую структуру: отец->сын tree_id - идентификатор узла tree_fid - предок tree_name - имя узла далее мне потребовалось каждому узлу сопоставлять некоторые свойства. делаем это через связь один-много через связующую таблицу. t2p_tree_id t2p_prop_id и сама таблица свойств prop_id prop_name prop_type пока все просто. далее мне надо было хранить значения свойств. причем некоторые свойства (например множественный выбор) требуют тоже хранения нескольких значений. делаем так же промежуточную таблицу p2v_prop_id p2v_val_id и саму таблицу свойств. val_id val_pos - порядковый номер свойства val_name val_pos(0) - дефолтное значение. пркатически не использоватлось. теперь я умел работать с деревом и привязывать к любому узлу дерева свойства и их значения. так же при работе с деревом я получил наследование свойст узлов более высого уровня. например сделав свойство ИМЯ я получал это свойство во всех узлах объектной модели. как пример: -------------------------------- Код (Text): root (name) son1 (val1) son2 (val2) -------------------------------- class root { var $name; } class son1 extends root { var $p1; } class son2 extends root { var $p2; } -------------------------------- класс son(1,2) наследовал $name и все было хорошо. причем узлы могли иметь свои собственные свойства. повторюсь, это как пример для понимания!!! теперь собственно о самих объектах. имея динамическую модель хранения свойств объектов я мог приступить к работе с самими объектами. obj_id obj_tree_id промежуточная таблица связей один-много o2p_obj_id o2p_prop_id и их свойствами prop_id prop_val что я получил. я умел создавать объектную модель с нужными мне свойствами и умел генерировать по этой модели объекты.