TvorZasp Опубліковано: 19 липня 2011 Share Опубліковано: 19 липня 2011 crystal.martinrusev.net - отличный инструмент для работы с базой данных. Конечно, для монстров-магазинов он не годится, но для небольших сайтов - самое то. Тем более, очень часто, скорость разработки важнее. Статья, как подключить crystal Надіслати Поділитися на інших сайтах More sharing options...
Yesvik Опубліковано: 19 липня 2011 Share Опубліковано: 19 липня 2011 По большому счету Crystal ничего не даёт, только синтаксис другой... $information = $this->crystal->get(DB_PREFIX.'information_description') ->where(array('information_id' => 1, 'language_id' => 1)) ->fetch_row(); и "SELECT * FROM ".DB_PREFIX."information_description WHERE information_id = 1 AND language_id = 1"особой разницы в скорости разработки не вижу (Crystal только экранирует сам), а по скорости работы - Crystal проиграет, потому что ему надо собирать SQL-запрос.Валидация которая есть в Crystal не принципиальна, multiple - тоже не нужен, а когда начнёш собирать трёхэтажные джойны - запаришся обдумывать как он соберёт запрос и думаю без вставок raw'ом не обойдёшся... Поделись соображениями в каком месте жизнь облегчается... Надіслати Поділитися на інших сайтах More sharing options... TvorZasp Опубліковано: 19 липня 2011 Автор Share Опубліковано: 19 липня 2011 Все таки $this->db->query("INSERT INTO " . DB_PREFIX . "customer SET store_id = '" . (int)$this->config->get('config_store_id') . "', firstname = '" . $this->db->escape($data['firstname']) . "', lastname = '" . $this->db->escape($data['lastname']) . "', email = '" . $this->db->escape($data['email']) . "', telephone = '" . $this->db->escape($data['telephone']) . "', fax = '" . $this->db->escape($data['fax']) . "', password = '" . $this->db->escape(md5($data['password'])) . "', newsletter = '" . (isset($data['newsletter']) ? (int)$data['newsletter'] : 0) . "', customer_group_id = '" . (int)$this->config->get('config_customer_group_id') . "', status = '1', date_added = NOW()");Выглядит не так красиво как $data['store_id'] = (int)$this->config->get('config_store_id'); $data['customer_group_id'] = $this->config->get('config_customer_group_id'); $data['status'] = 1; $data['date_added'] = NOW(); $data['password'] = md5($data['password']); $this->crystal->insert(DB_PREFIX."customer", $data)->execute();Хотя, конечно, кому как удобней. Надіслати Поділитися на інших сайтах More sharing options... Yesvik Опубліковано: 19 липня 2011 Share Опубліковано: 19 липня 2011 Все таки давай по честному... Куда делось $data['newsletter'] = (isset($data['newsletter']) ? (int)$data['newsletter'] : 0);и вот это $data['date_added'] = NOW();скорее всего не пройдёт, потому что думаю получиш date_added = 'NOW()'и тут надо будет raw'ом изголяться, с лёту даже не соображу как именно... и уже не так красиво получается.Да и пример ты взял который выгоден тебе, с готовым массивом данных. Если готовить массив с нуля - то разница будет только в том что надо эскейпить и я об этом говорил. Надіслати Поділитися на інших сайтах More sharing options... Yesvik Опубліковано: 19 липня 2011 Share Опубліковано: 19 липня 2011 А если вот так сравнить? $data['store_id'] = (int)$this->config->get('config_store_id'); $data['customer_group_id'] = $this->config->get('config_customer_group_id'); $data['status'] = 1; $data['date_added'] = NOW(); $data['password'] = md5($data['password']); $data['newsletter'] = (isset($data['newsletter']) ? (int)$data['newsletter'] : 0); $this->crystal->insert(DB_PREFIX."customer", $data)->execute(); и $data['store_id'] = (int)$this->config->get('config_store_id'); $data['customer_group_id'] = $this->config->get('config_customer_group_id'); $data['status'] = 1; $data['date_added'] = NOW(); $data['password'] = md5($data['password']); $data['newsletter'] = (isset($data['newsletter']) ? (int)$data['newsletter'] : 0); $data = array_map(array($this->db, 'escape'), $data); $this->db->query("INSERT INTO ".DB_PREFIX."customer (".implode(',', array_keys($data)).") VALUES (".implode(',', $data).")"); как бы и разницы уже почти нет... Надіслати Поділитися на інших сайтах More sharing options... TvorZasp Опубліковано: 19 липня 2011 Автор Share Опубліковано: 19 липня 2011 Cори, с $data['date_added'] затупил. Нужно $data['date_added'] = date(Y-m-d h:i:s); newsletter в базе по дефолту ставить в 0(так можно и со status поступить). Надіслати Поділитися на інших сайтах More sharing options... TvorZasp Опубліковано: 19 липня 2011 Автор Share Опубліковано: 19 липня 2011 И конечно, я не говорю о полной замене SQL синтаксиса, но есть ситуации, когда crystal удобней Надіслати Поділитися на інших сайтах More sharing options... TvorZasp Опубліковано: 19 липня 2011 Автор Share Опубліковано: 19 липня 2011 $this->db->query("INSERT INTO ".DB_PREFIX."customer (".implode(',', array_keys($data)).") VALUES (".implode(',', $data).")"); В crystal, по сути, это и реализовано в insert() только в более удобной форме. Так почему бы не пользоваться наряду с чистым sql? Надіслати Поділитися на інших сайтах More sharing options... Yesvik Опубліковано: 19 липня 2011 Share Опубліковано: 19 липня 2011 Лично мне намного приятнее видеть вот такой запрос $this->db->query("INSERT INTO " . DB_PREFIX . "customer SET store_id = '" . (int)$this->config->get('config_store_id') . "', firstname = '" . $this->db->escape($data['firstname']) . "', lastname = '" . $this->db->escape($data['lastname']) . "', email = '" . $this->db->escape($data['email']) . "', telephone = '" . $this->db->escape($data['telephone']) . "', fax = '" . $this->db->escape($data['fax']) . "', password = '" . $this->db->escape(md5($data['password'])) . "', newsletter = '" . (isset($data['newsletter']) ? (int)$data['newsletter'] : 0) . "', customer_group_id = '" . (int)$this->config->get('config_customer_group_id') . "', status = '1', date_added = NOW()");Посмотрел и сразу всё понятно, всё под контролем, не надо лазить по коду и выяснять что там в этой $data, не попало ли туда что-то лишнее.Смотреть надо и контроллер и вьювер, мало ли чего во вьювере дизайнер начудит. А пока полазил - глядиш и скорость разработки уже совсем не скорость, а тормоз... 1 Надіслати Поділитися на інших сайтах More sharing options... Yesvik Опубліковано: 19 липня 2011 Share Опубліковано: 19 липня 2011 По хорошему в Кристале надо перед выполнением запроса вот такое добавлять $allowed = array(store_id, firstname, lastname, email, telephone, fax, password, newsletter, customer_group_id, status, date_added); $data = array_intersect_key($data, array_flip($allowed));Это немного добавит наглядности запросу, и защитит от "подарков" со стороны верстальщика :) Надіслати Поділитися на інших сайтах More sharing options... TvorZasp Опубліковано: 19 липня 2011 Автор Share Опубліковано: 19 липня 2011 Это верно. Но, по хорошему, в форме не должно быть никаких подарков от верстальщиков, а формироваться формы должны в зависимости от моделей/таблиц(как во всех нормальных фреймворках). И лучше всего - делать валидацию перед записью в бд Надіслати Поділитися на інших сайтах More sharing options... Yesvik Опубліковано: 19 липня 2011 Share Опубліковано: 19 липня 2011 Даже без "подарков" от верстальщика, частенько из одной формы надо раскинуть данные по разным таблицам. Надіслати Поділитися на інших сайтах More sharing options... Fix305 Опубліковано: 19 липня 2011 Share Опубліковано: 19 липня 2011 а я то думал, что я один остался приверженцем чистого SQL кода без всяких там active records и ORM) Надіслати Поділитися на інших сайтах More sharing options... TvorZasp Опубліковано: 20 липня 2011 Автор Share Опубліковано: 20 липня 2011 Даже без "подарков" от верстальщика, частенько из одной формы надо раскинуть данные по разным таблицам.Для этого, кстати, есть отличное решение: имена типа name="Blog[title]", name="Blog[body]", name="User[name]", name="User". Тогда данные будут храниться в разных массивах. $this->request->post['Blog'] и $this->request->post['User'] . Посмотрите, как работает Yii или CakePHP. Там все именно по такому принципу. Надіслати Поділитися на інших сайтах More sharing options... Yesvik Опубліковано: 20 липня 2011 Share Опубліковано: 20 липня 2011 Даёш руку на отсечение что при работе с $this->request->post['Blog'] не понадобятся данные из $this->request->post['User']? Только не надо рассказывать что криво построена модель и т.д., ситуации разные бывают. Я ничего против Кристала не имею, я за то что-бы каждый инструмент использовался по назначению и не был избыточным. Микроскопом можно забить гвоздь, но не нужно... для этого есть молоток. И если у тебя в багажнике лежит молоток - совсем не обязательно ложить туда второй только потому что у него ручка красивее. Если есть четкое обоснование того что надо два молотка - тогда без проблем... А я пока не услышал ничего кроме "код красивее". Если нет четкого ответа на вопрос - ничего страшного и не надо искать оправданий. Ну нравится тебе Кристал и ладно... Да мне не нравится то как реализована работа с БД и я думал что ты действительно нашел нечто что ускользнуло от меня при знакомстве с Кристалом, потому и спросил. По большому счету - старый, добрый, DbSimple Димы Котерова гораздо интереснее чем Crystal, как минимум за счет наличия плейсхолдеров, макроподстановок и более интересных вариантов выборки данных. Надіслати Поділитися на інших сайтах More sharing options... 3 weeks later... Shaman Опубліковано: 10 серпня 2011 Share Опубліковано: 10 серпня 2011 ORM как правило выручает в больших проектах с задействованием спецов разного профиля. Лично мне нравятся проекты, использующие инкапсуляцию. А то, что парадигме OpenCart до этого далеко - это другой разговор. За статью спасибо ;) Надіслати Поділитися на інших сайтах More sharing options... Створіть аккаунт або увійдіть для коментування Ви повинні бути користувачем, щоб залишити коментар Створити обліковий запис Зареєструйтеся для отримання облікового запису. Це просто! Зареєструвати аккаунт Вхід Уже зареєстровані? Увійдіть тут. Вхід зараз Share More sharing options... Передплатники 0 Перейти до списку тем Зараз на сторінці 0 користувачів Ні користувачів, які переглядиють цю сторінку Последние темы Последние дополнения Последние новости Вся активність Головна Підтримка та відповіді на запитання. Модулі та розширення ORM в OpenCart Покупцям Оплата розширень фізичними особами Оплата розширень юридичними особами Політика повернень Розробникам Регламент розміщення розширень Регламент продажу та підтримки розширень Віртуальний обліковий запис автора Політика просування оголошень API каталогу розширень Вирішення спорів щодо авторських прав Корисна інформація Публічна оферта Політика повернень Політика конфіденційності Платіжна політика Політика передачі особистих даних Політика прозорості Останні розширення SP Telegram повідомлення FREE Автор: spectre Відключити порожні категорії Автор: spectre SEO Автор тексту категорії / фільтра / блогу з датою оновлення контенту + мікророзмітка Автор: radaevich Промо банери в категоріях товарів Автор: IHOR1989 Trend - адаптивний універсальний шаблон Автор: DSV × Уже зареєстровані? Ввійти Реєстрація Ваші замовлення Назад Придбані модулі та шаблони Ваші рахунки Лист очікувань Альтернативні контакти Форум Новини ocStore Назад Офіційний сайт Демо ocStore 3.0.3.2 Демо ocStore 2.3.0.2.4 Завантажити ocStore Документація Історія версій ocStore Блоги Модулі Шаблони Назад Безкоштовні шаблони Платні шаблони Де купувати модулі? Послуги FAQ OpenCart.Pro Назад Демо Купити Порівняння × Створити... Important Information На нашому сайті використовуються файли cookie і відбувається обробка деяких персональних даних користувачів, щоб поліпшити користувальницький інтерфейс. Щоб дізнатися для чого і які персональні дані ми обробляємо перейдіть за посиланням . Якщо Ви натиснете «Я даю згоду», це означає, що Ви розумієте і приймаєте всі умови, зазначені в цьому Повідомленні про конфіденційність. Я даю згоду
TvorZasp Опубліковано: 19 липня 2011 Автор Share Опубліковано: 19 липня 2011 Все таки $this->db->query("INSERT INTO " . DB_PREFIX . "customer SET store_id = '" . (int)$this->config->get('config_store_id') . "', firstname = '" . $this->db->escape($data['firstname']) . "', lastname = '" . $this->db->escape($data['lastname']) . "', email = '" . $this->db->escape($data['email']) . "', telephone = '" . $this->db->escape($data['telephone']) . "', fax = '" . $this->db->escape($data['fax']) . "', password = '" . $this->db->escape(md5($data['password'])) . "', newsletter = '" . (isset($data['newsletter']) ? (int)$data['newsletter'] : 0) . "', customer_group_id = '" . (int)$this->config->get('config_customer_group_id') . "', status = '1', date_added = NOW()");Выглядит не так красиво как $data['store_id'] = (int)$this->config->get('config_store_id'); $data['customer_group_id'] = $this->config->get('config_customer_group_id'); $data['status'] = 1; $data['date_added'] = NOW(); $data['password'] = md5($data['password']); $this->crystal->insert(DB_PREFIX."customer", $data)->execute();Хотя, конечно, кому как удобней. Надіслати Поділитися на інших сайтах More sharing options...
Yesvik Опубліковано: 19 липня 2011 Share Опубліковано: 19 липня 2011 Все таки давай по честному... Куда делось $data['newsletter'] = (isset($data['newsletter']) ? (int)$data['newsletter'] : 0);и вот это $data['date_added'] = NOW();скорее всего не пройдёт, потому что думаю получиш date_added = 'NOW()'и тут надо будет raw'ом изголяться, с лёту даже не соображу как именно... и уже не так красиво получается.Да и пример ты взял который выгоден тебе, с готовым массивом данных. Если готовить массив с нуля - то разница будет только в том что надо эскейпить и я об этом говорил. Надіслати Поділитися на інших сайтах More sharing options... Yesvik Опубліковано: 19 липня 2011 Share Опубліковано: 19 липня 2011 А если вот так сравнить? $data['store_id'] = (int)$this->config->get('config_store_id'); $data['customer_group_id'] = $this->config->get('config_customer_group_id'); $data['status'] = 1; $data['date_added'] = NOW(); $data['password'] = md5($data['password']); $data['newsletter'] = (isset($data['newsletter']) ? (int)$data['newsletter'] : 0); $this->crystal->insert(DB_PREFIX."customer", $data)->execute(); и $data['store_id'] = (int)$this->config->get('config_store_id'); $data['customer_group_id'] = $this->config->get('config_customer_group_id'); $data['status'] = 1; $data['date_added'] = NOW(); $data['password'] = md5($data['password']); $data['newsletter'] = (isset($data['newsletter']) ? (int)$data['newsletter'] : 0); $data = array_map(array($this->db, 'escape'), $data); $this->db->query("INSERT INTO ".DB_PREFIX."customer (".implode(',', array_keys($data)).") VALUES (".implode(',', $data).")"); как бы и разницы уже почти нет... Надіслати Поділитися на інших сайтах More sharing options... TvorZasp Опубліковано: 19 липня 2011 Автор Share Опубліковано: 19 липня 2011 Cори, с $data['date_added'] затупил. Нужно $data['date_added'] = date(Y-m-d h:i:s); newsletter в базе по дефолту ставить в 0(так можно и со status поступить). Надіслати Поділитися на інших сайтах More sharing options... TvorZasp Опубліковано: 19 липня 2011 Автор Share Опубліковано: 19 липня 2011 И конечно, я не говорю о полной замене SQL синтаксиса, но есть ситуации, когда crystal удобней Надіслати Поділитися на інших сайтах More sharing options... TvorZasp Опубліковано: 19 липня 2011 Автор Share Опубліковано: 19 липня 2011 $this->db->query("INSERT INTO ".DB_PREFIX."customer (".implode(',', array_keys($data)).") VALUES (".implode(',', $data).")"); В crystal, по сути, это и реализовано в insert() только в более удобной форме. Так почему бы не пользоваться наряду с чистым sql? Надіслати Поділитися на інших сайтах More sharing options... Yesvik Опубліковано: 19 липня 2011 Share Опубліковано: 19 липня 2011 Лично мне намного приятнее видеть вот такой запрос $this->db->query("INSERT INTO " . DB_PREFIX . "customer SET store_id = '" . (int)$this->config->get('config_store_id') . "', firstname = '" . $this->db->escape($data['firstname']) . "', lastname = '" . $this->db->escape($data['lastname']) . "', email = '" . $this->db->escape($data['email']) . "', telephone = '" . $this->db->escape($data['telephone']) . "', fax = '" . $this->db->escape($data['fax']) . "', password = '" . $this->db->escape(md5($data['password'])) . "', newsletter = '" . (isset($data['newsletter']) ? (int)$data['newsletter'] : 0) . "', customer_group_id = '" . (int)$this->config->get('config_customer_group_id') . "', status = '1', date_added = NOW()");Посмотрел и сразу всё понятно, всё под контролем, не надо лазить по коду и выяснять что там в этой $data, не попало ли туда что-то лишнее.Смотреть надо и контроллер и вьювер, мало ли чего во вьювере дизайнер начудит. А пока полазил - глядиш и скорость разработки уже совсем не скорость, а тормоз... 1 Надіслати Поділитися на інших сайтах More sharing options... Yesvik Опубліковано: 19 липня 2011 Share Опубліковано: 19 липня 2011 По хорошему в Кристале надо перед выполнением запроса вот такое добавлять $allowed = array(store_id, firstname, lastname, email, telephone, fax, password, newsletter, customer_group_id, status, date_added); $data = array_intersect_key($data, array_flip($allowed));Это немного добавит наглядности запросу, и защитит от "подарков" со стороны верстальщика :) Надіслати Поділитися на інших сайтах More sharing options... TvorZasp Опубліковано: 19 липня 2011 Автор Share Опубліковано: 19 липня 2011 Это верно. Но, по хорошему, в форме не должно быть никаких подарков от верстальщиков, а формироваться формы должны в зависимости от моделей/таблиц(как во всех нормальных фреймворках). И лучше всего - делать валидацию перед записью в бд Надіслати Поділитися на інших сайтах More sharing options... Yesvik Опубліковано: 19 липня 2011 Share Опубліковано: 19 липня 2011 Даже без "подарков" от верстальщика, частенько из одной формы надо раскинуть данные по разным таблицам. Надіслати Поділитися на інших сайтах More sharing options... Fix305 Опубліковано: 19 липня 2011 Share Опубліковано: 19 липня 2011 а я то думал, что я один остался приверженцем чистого SQL кода без всяких там active records и ORM) Надіслати Поділитися на інших сайтах More sharing options... TvorZasp Опубліковано: 20 липня 2011 Автор Share Опубліковано: 20 липня 2011 Даже без "подарков" от верстальщика, частенько из одной формы надо раскинуть данные по разным таблицам.Для этого, кстати, есть отличное решение: имена типа name="Blog[title]", name="Blog[body]", name="User[name]", name="User". Тогда данные будут храниться в разных массивах. $this->request->post['Blog'] и $this->request->post['User'] . Посмотрите, как работает Yii или CakePHP. Там все именно по такому принципу. Надіслати Поділитися на інших сайтах More sharing options... Yesvik Опубліковано: 20 липня 2011 Share Опубліковано: 20 липня 2011 Даёш руку на отсечение что при работе с $this->request->post['Blog'] не понадобятся данные из $this->request->post['User']? Только не надо рассказывать что криво построена модель и т.д., ситуации разные бывают. Я ничего против Кристала не имею, я за то что-бы каждый инструмент использовался по назначению и не был избыточным. Микроскопом можно забить гвоздь, но не нужно... для этого есть молоток. И если у тебя в багажнике лежит молоток - совсем не обязательно ложить туда второй только потому что у него ручка красивее. Если есть четкое обоснование того что надо два молотка - тогда без проблем... А я пока не услышал ничего кроме "код красивее". Если нет четкого ответа на вопрос - ничего страшного и не надо искать оправданий. Ну нравится тебе Кристал и ладно... Да мне не нравится то как реализована работа с БД и я думал что ты действительно нашел нечто что ускользнуло от меня при знакомстве с Кристалом, потому и спросил. По большому счету - старый, добрый, DbSimple Димы Котерова гораздо интереснее чем Crystal, как минимум за счет наличия плейсхолдеров, макроподстановок и более интересных вариантов выборки данных. Надіслати Поділитися на інших сайтах More sharing options... 3 weeks later... Shaman Опубліковано: 10 серпня 2011 Share Опубліковано: 10 серпня 2011 ORM как правило выручает в больших проектах с задействованием спецов разного профиля. Лично мне нравятся проекты, использующие инкапсуляцию. А то, что парадигме OpenCart до этого далеко - это другой разговор. За статью спасибо ;) Надіслати Поділитися на інших сайтах More sharing options... Створіть аккаунт або увійдіть для коментування Ви повинні бути користувачем, щоб залишити коментар Створити обліковий запис Зареєструйтеся для отримання облікового запису. Це просто! Зареєструвати аккаунт Вхід Уже зареєстровані? Увійдіть тут. Вхід зараз Share More sharing options... Передплатники 0 Перейти до списку тем Зараз на сторінці 0 користувачів Ні користувачів, які переглядиють цю сторінку Последние темы Последние дополнения Последние новости Вся активність Головна Підтримка та відповіді на запитання. Модулі та розширення ORM в OpenCart Покупцям Оплата розширень фізичними особами Оплата розширень юридичними особами Політика повернень Розробникам Регламент розміщення розширень Регламент продажу та підтримки розширень Віртуальний обліковий запис автора Політика просування оголошень API каталогу розширень Вирішення спорів щодо авторських прав Корисна інформація Публічна оферта Політика повернень Політика конфіденційності Платіжна політика Політика передачі особистих даних Політика прозорості Останні розширення SP Telegram повідомлення FREE Автор: spectre Відключити порожні категорії Автор: spectre SEO Автор тексту категорії / фільтра / блогу з датою оновлення контенту + мікророзмітка Автор: radaevich Промо банери в категоріях товарів Автор: IHOR1989 Trend - адаптивний універсальний шаблон Автор: DSV × Уже зареєстровані? Ввійти Реєстрація Ваші замовлення Назад Придбані модулі та шаблони Ваші рахунки Лист очікувань Альтернативні контакти Форум Новини ocStore Назад Офіційний сайт Демо ocStore 3.0.3.2 Демо ocStore 2.3.0.2.4 Завантажити ocStore Документація Історія версій ocStore Блоги Модулі Шаблони Назад Безкоштовні шаблони Платні шаблони Де купувати модулі? Послуги FAQ OpenCart.Pro Назад Демо Купити Порівняння × Створити... Important Information На нашому сайті використовуються файли cookie і відбувається обробка деяких персональних даних користувачів, щоб поліпшити користувальницький інтерфейс. Щоб дізнатися для чого і які персональні дані ми обробляємо перейдіть за посиланням . Якщо Ви натиснете «Я даю згоду», це означає, що Ви розумієте і приймаєте всі умови, зазначені в цьому Повідомленні про конфіденційність. Я даю згоду
Yesvik Опубліковано: 19 липня 2011 Share Опубліковано: 19 липня 2011 А если вот так сравнить? $data['store_id'] = (int)$this->config->get('config_store_id'); $data['customer_group_id'] = $this->config->get('config_customer_group_id'); $data['status'] = 1; $data['date_added'] = NOW(); $data['password'] = md5($data['password']); $data['newsletter'] = (isset($data['newsletter']) ? (int)$data['newsletter'] : 0); $this->crystal->insert(DB_PREFIX."customer", $data)->execute(); и $data['store_id'] = (int)$this->config->get('config_store_id'); $data['customer_group_id'] = $this->config->get('config_customer_group_id'); $data['status'] = 1; $data['date_added'] = NOW(); $data['password'] = md5($data['password']); $data['newsletter'] = (isset($data['newsletter']) ? (int)$data['newsletter'] : 0); $data = array_map(array($this->db, 'escape'), $data); $this->db->query("INSERT INTO ".DB_PREFIX."customer (".implode(',', array_keys($data)).") VALUES (".implode(',', $data).")"); как бы и разницы уже почти нет... Надіслати Поділитися на інших сайтах More sharing options... TvorZasp Опубліковано: 19 липня 2011 Автор Share Опубліковано: 19 липня 2011 Cори, с $data['date_added'] затупил. Нужно $data['date_added'] = date(Y-m-d h:i:s); newsletter в базе по дефолту ставить в 0(так можно и со status поступить). Надіслати Поділитися на інших сайтах More sharing options... TvorZasp Опубліковано: 19 липня 2011 Автор Share Опубліковано: 19 липня 2011 И конечно, я не говорю о полной замене SQL синтаксиса, но есть ситуации, когда crystal удобней Надіслати Поділитися на інших сайтах More sharing options... TvorZasp Опубліковано: 19 липня 2011 Автор Share Опубліковано: 19 липня 2011 $this->db->query("INSERT INTO ".DB_PREFIX."customer (".implode(',', array_keys($data)).") VALUES (".implode(',', $data).")"); В crystal, по сути, это и реализовано в insert() только в более удобной форме. Так почему бы не пользоваться наряду с чистым sql? Надіслати Поділитися на інших сайтах More sharing options... Yesvik Опубліковано: 19 липня 2011 Share Опубліковано: 19 липня 2011 Лично мне намного приятнее видеть вот такой запрос $this->db->query("INSERT INTO " . DB_PREFIX . "customer SET store_id = '" . (int)$this->config->get('config_store_id') . "', firstname = '" . $this->db->escape($data['firstname']) . "', lastname = '" . $this->db->escape($data['lastname']) . "', email = '" . $this->db->escape($data['email']) . "', telephone = '" . $this->db->escape($data['telephone']) . "', fax = '" . $this->db->escape($data['fax']) . "', password = '" . $this->db->escape(md5($data['password'])) . "', newsletter = '" . (isset($data['newsletter']) ? (int)$data['newsletter'] : 0) . "', customer_group_id = '" . (int)$this->config->get('config_customer_group_id') . "', status = '1', date_added = NOW()");Посмотрел и сразу всё понятно, всё под контролем, не надо лазить по коду и выяснять что там в этой $data, не попало ли туда что-то лишнее.Смотреть надо и контроллер и вьювер, мало ли чего во вьювере дизайнер начудит. А пока полазил - глядиш и скорость разработки уже совсем не скорость, а тормоз... 1 Надіслати Поділитися на інших сайтах More sharing options... Yesvik Опубліковано: 19 липня 2011 Share Опубліковано: 19 липня 2011 По хорошему в Кристале надо перед выполнением запроса вот такое добавлять $allowed = array(store_id, firstname, lastname, email, telephone, fax, password, newsletter, customer_group_id, status, date_added); $data = array_intersect_key($data, array_flip($allowed));Это немного добавит наглядности запросу, и защитит от "подарков" со стороны верстальщика :) Надіслати Поділитися на інших сайтах More sharing options... TvorZasp Опубліковано: 19 липня 2011 Автор Share Опубліковано: 19 липня 2011 Это верно. Но, по хорошему, в форме не должно быть никаких подарков от верстальщиков, а формироваться формы должны в зависимости от моделей/таблиц(как во всех нормальных фреймворках). И лучше всего - делать валидацию перед записью в бд Надіслати Поділитися на інших сайтах More sharing options... Yesvik Опубліковано: 19 липня 2011 Share Опубліковано: 19 липня 2011 Даже без "подарков" от верстальщика, частенько из одной формы надо раскинуть данные по разным таблицам. Надіслати Поділитися на інших сайтах More sharing options... Fix305 Опубліковано: 19 липня 2011 Share Опубліковано: 19 липня 2011 а я то думал, что я один остался приверженцем чистого SQL кода без всяких там active records и ORM) Надіслати Поділитися на інших сайтах More sharing options... TvorZasp Опубліковано: 20 липня 2011 Автор Share Опубліковано: 20 липня 2011 Даже без "подарков" от верстальщика, частенько из одной формы надо раскинуть данные по разным таблицам.Для этого, кстати, есть отличное решение: имена типа name="Blog[title]", name="Blog[body]", name="User[name]", name="User". Тогда данные будут храниться в разных массивах. $this->request->post['Blog'] и $this->request->post['User'] . Посмотрите, как работает Yii или CakePHP. Там все именно по такому принципу. Надіслати Поділитися на інших сайтах More sharing options... Yesvik Опубліковано: 20 липня 2011 Share Опубліковано: 20 липня 2011 Даёш руку на отсечение что при работе с $this->request->post['Blog'] не понадобятся данные из $this->request->post['User']? Только не надо рассказывать что криво построена модель и т.д., ситуации разные бывают. Я ничего против Кристала не имею, я за то что-бы каждый инструмент использовался по назначению и не был избыточным. Микроскопом можно забить гвоздь, но не нужно... для этого есть молоток. И если у тебя в багажнике лежит молоток - совсем не обязательно ложить туда второй только потому что у него ручка красивее. Если есть четкое обоснование того что надо два молотка - тогда без проблем... А я пока не услышал ничего кроме "код красивее". Если нет четкого ответа на вопрос - ничего страшного и не надо искать оправданий. Ну нравится тебе Кристал и ладно... Да мне не нравится то как реализована работа с БД и я думал что ты действительно нашел нечто что ускользнуло от меня при знакомстве с Кристалом, потому и спросил. По большому счету - старый, добрый, DbSimple Димы Котерова гораздо интереснее чем Crystal, как минимум за счет наличия плейсхолдеров, макроподстановок и более интересных вариантов выборки данных. Надіслати Поділитися на інших сайтах More sharing options... 3 weeks later... Shaman Опубліковано: 10 серпня 2011 Share Опубліковано: 10 серпня 2011 ORM как правило выручает в больших проектах с задействованием спецов разного профиля. Лично мне нравятся проекты, использующие инкапсуляцию. А то, что парадигме OpenCart до этого далеко - это другой разговор. За статью спасибо ;) Надіслати Поділитися на інших сайтах More sharing options... Створіть аккаунт або увійдіть для коментування Ви повинні бути користувачем, щоб залишити коментар Створити обліковий запис Зареєструйтеся для отримання облікового запису. Це просто! Зареєструвати аккаунт Вхід Уже зареєстровані? Увійдіть тут. Вхід зараз Share More sharing options... Передплатники 0 Перейти до списку тем Зараз на сторінці 0 користувачів Ні користувачів, які переглядиють цю сторінку Последние темы Последние дополнения Последние новости Вся активність Головна Підтримка та відповіді на запитання. Модулі та розширення ORM в OpenCart Покупцям Оплата розширень фізичними особами Оплата розширень юридичними особами Політика повернень Розробникам Регламент розміщення розширень Регламент продажу та підтримки розширень Віртуальний обліковий запис автора Політика просування оголошень API каталогу розширень Вирішення спорів щодо авторських прав Корисна інформація Публічна оферта Політика повернень Політика конфіденційності Платіжна політика Політика передачі особистих даних Політика прозорості Останні розширення SP Telegram повідомлення FREE Автор: spectre Відключити порожні категорії Автор: spectre SEO Автор тексту категорії / фільтра / блогу з датою оновлення контенту + мікророзмітка Автор: radaevich Промо банери в категоріях товарів Автор: IHOR1989 Trend - адаптивний універсальний шаблон Автор: DSV × Уже зареєстровані? Ввійти Реєстрація Ваші замовлення Назад Придбані модулі та шаблони Ваші рахунки Лист очікувань Альтернативні контакти Форум Новини ocStore Назад Офіційний сайт Демо ocStore 3.0.3.2 Демо ocStore 2.3.0.2.4 Завантажити ocStore Документація Історія версій ocStore Блоги Модулі Шаблони Назад Безкоштовні шаблони Платні шаблони Де купувати модулі? Послуги FAQ OpenCart.Pro Назад Демо Купити Порівняння × Створити... Important Information На нашому сайті використовуються файли cookie і відбувається обробка деяких персональних даних користувачів, щоб поліпшити користувальницький інтерфейс. Щоб дізнатися для чого і які персональні дані ми обробляємо перейдіть за посиланням . Якщо Ви натиснете «Я даю згоду», це означає, що Ви розумієте і приймаєте всі умови, зазначені в цьому Повідомленні про конфіденційність. Я даю згоду
TvorZasp Опубліковано: 19 липня 2011 Автор Share Опубліковано: 19 липня 2011 Cори, с $data['date_added'] затупил. Нужно $data['date_added'] = date(Y-m-d h:i:s); newsletter в базе по дефолту ставить в 0(так можно и со status поступить). Надіслати Поділитися на інших сайтах More sharing options...
TvorZasp Опубліковано: 19 липня 2011 Автор Share Опубліковано: 19 липня 2011 И конечно, я не говорю о полной замене SQL синтаксиса, но есть ситуации, когда crystal удобней Надіслати Поділитися на інших сайтах More sharing options...
TvorZasp Опубліковано: 19 липня 2011 Автор Share Опубліковано: 19 липня 2011 $this->db->query("INSERT INTO ".DB_PREFIX."customer (".implode(',', array_keys($data)).") VALUES (".implode(',', $data).")"); В crystal, по сути, это и реализовано в insert() только в более удобной форме. Так почему бы не пользоваться наряду с чистым sql? Надіслати Поділитися на інших сайтах More sharing options...
Yesvik Опубліковано: 19 липня 2011 Share Опубліковано: 19 липня 2011 Лично мне намного приятнее видеть вот такой запрос $this->db->query("INSERT INTO " . DB_PREFIX . "customer SET store_id = '" . (int)$this->config->get('config_store_id') . "', firstname = '" . $this->db->escape($data['firstname']) . "', lastname = '" . $this->db->escape($data['lastname']) . "', email = '" . $this->db->escape($data['email']) . "', telephone = '" . $this->db->escape($data['telephone']) . "', fax = '" . $this->db->escape($data['fax']) . "', password = '" . $this->db->escape(md5($data['password'])) . "', newsletter = '" . (isset($data['newsletter']) ? (int)$data['newsletter'] : 0) . "', customer_group_id = '" . (int)$this->config->get('config_customer_group_id') . "', status = '1', date_added = NOW()");Посмотрел и сразу всё понятно, всё под контролем, не надо лазить по коду и выяснять что там в этой $data, не попало ли туда что-то лишнее.Смотреть надо и контроллер и вьювер, мало ли чего во вьювере дизайнер начудит. А пока полазил - глядиш и скорость разработки уже совсем не скорость, а тормоз... 1 Надіслати Поділитися на інших сайтах More sharing options... Yesvik Опубліковано: 19 липня 2011 Share Опубліковано: 19 липня 2011 По хорошему в Кристале надо перед выполнением запроса вот такое добавлять $allowed = array(store_id, firstname, lastname, email, telephone, fax, password, newsletter, customer_group_id, status, date_added); $data = array_intersect_key($data, array_flip($allowed));Это немного добавит наглядности запросу, и защитит от "подарков" со стороны верстальщика :) Надіслати Поділитися на інших сайтах More sharing options... TvorZasp Опубліковано: 19 липня 2011 Автор Share Опубліковано: 19 липня 2011 Это верно. Но, по хорошему, в форме не должно быть никаких подарков от верстальщиков, а формироваться формы должны в зависимости от моделей/таблиц(как во всех нормальных фреймворках). И лучше всего - делать валидацию перед записью в бд Надіслати Поділитися на інших сайтах More sharing options... Yesvik Опубліковано: 19 липня 2011 Share Опубліковано: 19 липня 2011 Даже без "подарков" от верстальщика, частенько из одной формы надо раскинуть данные по разным таблицам. Надіслати Поділитися на інших сайтах More sharing options... Fix305 Опубліковано: 19 липня 2011 Share Опубліковано: 19 липня 2011 а я то думал, что я один остался приверженцем чистого SQL кода без всяких там active records и ORM) Надіслати Поділитися на інших сайтах More sharing options... TvorZasp Опубліковано: 20 липня 2011 Автор Share Опубліковано: 20 липня 2011 Даже без "подарков" от верстальщика, частенько из одной формы надо раскинуть данные по разным таблицам.Для этого, кстати, есть отличное решение: имена типа name="Blog[title]", name="Blog[body]", name="User[name]", name="User". Тогда данные будут храниться в разных массивах. $this->request->post['Blog'] и $this->request->post['User'] . Посмотрите, как работает Yii или CakePHP. Там все именно по такому принципу. Надіслати Поділитися на інших сайтах More sharing options... Yesvik Опубліковано: 20 липня 2011 Share Опубліковано: 20 липня 2011 Даёш руку на отсечение что при работе с $this->request->post['Blog'] не понадобятся данные из $this->request->post['User']? Только не надо рассказывать что криво построена модель и т.д., ситуации разные бывают. Я ничего против Кристала не имею, я за то что-бы каждый инструмент использовался по назначению и не был избыточным. Микроскопом можно забить гвоздь, но не нужно... для этого есть молоток. И если у тебя в багажнике лежит молоток - совсем не обязательно ложить туда второй только потому что у него ручка красивее. Если есть четкое обоснование того что надо два молотка - тогда без проблем... А я пока не услышал ничего кроме "код красивее". Если нет четкого ответа на вопрос - ничего страшного и не надо искать оправданий. Ну нравится тебе Кристал и ладно... Да мне не нравится то как реализована работа с БД и я думал что ты действительно нашел нечто что ускользнуло от меня при знакомстве с Кристалом, потому и спросил. По большому счету - старый, добрый, DbSimple Димы Котерова гораздо интереснее чем Crystal, как минимум за счет наличия плейсхолдеров, макроподстановок и более интересных вариантов выборки данных. Надіслати Поділитися на інших сайтах More sharing options... 3 weeks later... Shaman Опубліковано: 10 серпня 2011 Share Опубліковано: 10 серпня 2011 ORM как правило выручает в больших проектах с задействованием спецов разного профиля. Лично мне нравятся проекты, использующие инкапсуляцию. А то, что парадигме OpenCart до этого далеко - это другой разговор. За статью спасибо ;) Надіслати Поділитися на інших сайтах More sharing options... Створіть аккаунт або увійдіть для коментування Ви повинні бути користувачем, щоб залишити коментар Створити обліковий запис Зареєструйтеся для отримання облікового запису. Це просто! Зареєструвати аккаунт Вхід Уже зареєстровані? Увійдіть тут. Вхід зараз Share More sharing options... Передплатники 0 Перейти до списку тем Зараз на сторінці 0 користувачів Ні користувачів, які переглядиють цю сторінку Последние темы Последние дополнения Последние новости Вся активність Головна Підтримка та відповіді на запитання. Модулі та розширення ORM в OpenCart Покупцям Оплата розширень фізичними особами Оплата розширень юридичними особами Політика повернень Розробникам Регламент розміщення розширень Регламент продажу та підтримки розширень Віртуальний обліковий запис автора Політика просування оголошень API каталогу розширень Вирішення спорів щодо авторських прав Корисна інформація Публічна оферта Політика повернень Політика конфіденційності Платіжна політика Політика передачі особистих даних Політика прозорості Останні розширення SP Telegram повідомлення FREE Автор: spectre Відключити порожні категорії Автор: spectre SEO Автор тексту категорії / фільтра / блогу з датою оновлення контенту + мікророзмітка Автор: radaevich Промо банери в категоріях товарів Автор: IHOR1989 Trend - адаптивний універсальний шаблон Автор: DSV
Yesvik Опубліковано: 19 липня 2011 Share Опубліковано: 19 липня 2011 По хорошему в Кристале надо перед выполнением запроса вот такое добавлять $allowed = array(store_id, firstname, lastname, email, telephone, fax, password, newsletter, customer_group_id, status, date_added); $data = array_intersect_key($data, array_flip($allowed));Это немного добавит наглядности запросу, и защитит от "подарков" со стороны верстальщика :) Надіслати Поділитися на інших сайтах More sharing options... TvorZasp Опубліковано: 19 липня 2011 Автор Share Опубліковано: 19 липня 2011 Это верно. Но, по хорошему, в форме не должно быть никаких подарков от верстальщиков, а формироваться формы должны в зависимости от моделей/таблиц(как во всех нормальных фреймворках). И лучше всего - делать валидацию перед записью в бд Надіслати Поділитися на інших сайтах More sharing options... Yesvik Опубліковано: 19 липня 2011 Share Опубліковано: 19 липня 2011 Даже без "подарков" от верстальщика, частенько из одной формы надо раскинуть данные по разным таблицам. Надіслати Поділитися на інших сайтах More sharing options... Fix305 Опубліковано: 19 липня 2011 Share Опубліковано: 19 липня 2011 а я то думал, что я один остался приверженцем чистого SQL кода без всяких там active records и ORM) Надіслати Поділитися на інших сайтах More sharing options... TvorZasp Опубліковано: 20 липня 2011 Автор Share Опубліковано: 20 липня 2011 Даже без "подарков" от верстальщика, частенько из одной формы надо раскинуть данные по разным таблицам.Для этого, кстати, есть отличное решение: имена типа name="Blog[title]", name="Blog[body]", name="User[name]", name="User". Тогда данные будут храниться в разных массивах. $this->request->post['Blog'] и $this->request->post['User'] . Посмотрите, как работает Yii или CakePHP. Там все именно по такому принципу. Надіслати Поділитися на інших сайтах More sharing options... Yesvik Опубліковано: 20 липня 2011 Share Опубліковано: 20 липня 2011 Даёш руку на отсечение что при работе с $this->request->post['Blog'] не понадобятся данные из $this->request->post['User']? Только не надо рассказывать что криво построена модель и т.д., ситуации разные бывают. Я ничего против Кристала не имею, я за то что-бы каждый инструмент использовался по назначению и не был избыточным. Микроскопом можно забить гвоздь, но не нужно... для этого есть молоток. И если у тебя в багажнике лежит молоток - совсем не обязательно ложить туда второй только потому что у него ручка красивее. Если есть четкое обоснование того что надо два молотка - тогда без проблем... А я пока не услышал ничего кроме "код красивее". Если нет четкого ответа на вопрос - ничего страшного и не надо искать оправданий. Ну нравится тебе Кристал и ладно... Да мне не нравится то как реализована работа с БД и я думал что ты действительно нашел нечто что ускользнуло от меня при знакомстве с Кристалом, потому и спросил. По большому счету - старый, добрый, DbSimple Димы Котерова гораздо интереснее чем Crystal, как минимум за счет наличия плейсхолдеров, макроподстановок и более интересных вариантов выборки данных. Надіслати Поділитися на інших сайтах More sharing options... 3 weeks later... Shaman Опубліковано: 10 серпня 2011 Share Опубліковано: 10 серпня 2011 ORM как правило выручает в больших проектах с задействованием спецов разного профиля. Лично мне нравятся проекты, использующие инкапсуляцию. А то, что парадигме OpenCart до этого далеко - это другой разговор. За статью спасибо ;) Надіслати Поділитися на інших сайтах More sharing options... Створіть аккаунт або увійдіть для коментування Ви повинні бути користувачем, щоб залишити коментар Створити обліковий запис Зареєструйтеся для отримання облікового запису. Це просто! Зареєструвати аккаунт Вхід Уже зареєстровані? Увійдіть тут. Вхід зараз Share More sharing options... Передплатники 0 Перейти до списку тем Зараз на сторінці 0 користувачів Ні користувачів, які переглядиють цю сторінку Последние темы Последние дополнения Последние новости Вся активність Головна Підтримка та відповіді на запитання. Модулі та розширення ORM в OpenCart
TvorZasp Опубліковано: 19 липня 2011 Автор Share Опубліковано: 19 липня 2011 Это верно. Но, по хорошему, в форме не должно быть никаких подарков от верстальщиков, а формироваться формы должны в зависимости от моделей/таблиц(как во всех нормальных фреймворках). И лучше всего - делать валидацию перед записью в бд Надіслати Поділитися на інших сайтах More sharing options...
Yesvik Опубліковано: 19 липня 2011 Share Опубліковано: 19 липня 2011 Даже без "подарков" от верстальщика, частенько из одной формы надо раскинуть данные по разным таблицам. Надіслати Поділитися на інших сайтах More sharing options... Fix305 Опубліковано: 19 липня 2011 Share Опубліковано: 19 липня 2011 а я то думал, что я один остался приверженцем чистого SQL кода без всяких там active records и ORM) Надіслати Поділитися на інших сайтах More sharing options... TvorZasp Опубліковано: 20 липня 2011 Автор Share Опубліковано: 20 липня 2011 Даже без "подарков" от верстальщика, частенько из одной формы надо раскинуть данные по разным таблицам.Для этого, кстати, есть отличное решение: имена типа name="Blog[title]", name="Blog[body]", name="User[name]", name="User". Тогда данные будут храниться в разных массивах. $this->request->post['Blog'] и $this->request->post['User'] . Посмотрите, как работает Yii или CakePHP. Там все именно по такому принципу. Надіслати Поділитися на інших сайтах More sharing options... Yesvik Опубліковано: 20 липня 2011 Share Опубліковано: 20 липня 2011 Даёш руку на отсечение что при работе с $this->request->post['Blog'] не понадобятся данные из $this->request->post['User']? Только не надо рассказывать что криво построена модель и т.д., ситуации разные бывают. Я ничего против Кристала не имею, я за то что-бы каждый инструмент использовался по назначению и не был избыточным. Микроскопом можно забить гвоздь, но не нужно... для этого есть молоток. И если у тебя в багажнике лежит молоток - совсем не обязательно ложить туда второй только потому что у него ручка красивее. Если есть четкое обоснование того что надо два молотка - тогда без проблем... А я пока не услышал ничего кроме "код красивее". Если нет четкого ответа на вопрос - ничего страшного и не надо искать оправданий. Ну нравится тебе Кристал и ладно... Да мне не нравится то как реализована работа с БД и я думал что ты действительно нашел нечто что ускользнуло от меня при знакомстве с Кристалом, потому и спросил. По большому счету - старый, добрый, DbSimple Димы Котерова гораздо интереснее чем Crystal, как минимум за счет наличия плейсхолдеров, макроподстановок и более интересных вариантов выборки данных. Надіслати Поділитися на інших сайтах More sharing options... 3 weeks later... Shaman Опубліковано: 10 серпня 2011 Share Опубліковано: 10 серпня 2011 ORM как правило выручает в больших проектах с задействованием спецов разного профиля. Лично мне нравятся проекты, использующие инкапсуляцию. А то, что парадигме OpenCart до этого далеко - это другой разговор. За статью спасибо ;) Надіслати Поділитися на інших сайтах More sharing options... Створіть аккаунт або увійдіть для коментування Ви повинні бути користувачем, щоб залишити коментар Створити обліковий запис Зареєструйтеся для отримання облікового запису. Це просто! Зареєструвати аккаунт Вхід Уже зареєстровані? Увійдіть тут. Вхід зараз Share More sharing options... Передплатники 0 Перейти до списку тем Зараз на сторінці 0 користувачів Ні користувачів, які переглядиють цю сторінку
Fix305 Опубліковано: 19 липня 2011 Share Опубліковано: 19 липня 2011 а я то думал, что я один остался приверженцем чистого SQL кода без всяких там active records и ORM) Надіслати Поділитися на інших сайтах More sharing options...
TvorZasp Опубліковано: 20 липня 2011 Автор Share Опубліковано: 20 липня 2011 Даже без "подарков" от верстальщика, частенько из одной формы надо раскинуть данные по разным таблицам.Для этого, кстати, есть отличное решение: имена типа name="Blog[title]", name="Blog[body]", name="User[name]", name="User". Тогда данные будут храниться в разных массивах. $this->request->post['Blog'] и $this->request->post['User'] . Посмотрите, как работает Yii или CakePHP. Там все именно по такому принципу. Надіслати Поділитися на інших сайтах More sharing options...
Yesvik Опубліковано: 20 липня 2011 Share Опубліковано: 20 липня 2011 Даёш руку на отсечение что при работе с $this->request->post['Blog'] не понадобятся данные из $this->request->post['User']? Только не надо рассказывать что криво построена модель и т.д., ситуации разные бывают. Я ничего против Кристала не имею, я за то что-бы каждый инструмент использовался по назначению и не был избыточным. Микроскопом можно забить гвоздь, но не нужно... для этого есть молоток. И если у тебя в багажнике лежит молоток - совсем не обязательно ложить туда второй только потому что у него ручка красивее. Если есть четкое обоснование того что надо два молотка - тогда без проблем... А я пока не услышал ничего кроме "код красивее". Если нет четкого ответа на вопрос - ничего страшного и не надо искать оправданий. Ну нравится тебе Кристал и ладно... Да мне не нравится то как реализована работа с БД и я думал что ты действительно нашел нечто что ускользнуло от меня при знакомстве с Кристалом, потому и спросил. По большому счету - старый, добрый, DbSimple Димы Котерова гораздо интереснее чем Crystal, как минимум за счет наличия плейсхолдеров, макроподстановок и более интересных вариантов выборки данных. Надіслати Поділитися на інших сайтах More sharing options... 3 weeks later... Shaman Опубліковано: 10 серпня 2011 Share Опубліковано: 10 серпня 2011 ORM как правило выручает в больших проектах с задействованием спецов разного профиля. Лично мне нравятся проекты, использующие инкапсуляцию. А то, что парадигме OpenCart до этого далеко - это другой разговор. За статью спасибо ;) Надіслати Поділитися на інших сайтах More sharing options... Створіть аккаунт або увійдіть для коментування Ви повинні бути користувачем, щоб залишити коментар Створити обліковий запис Зареєструйтеся для отримання облікового запису. Це просто! Зареєструвати аккаунт Вхід Уже зареєстровані? Увійдіть тут. Вхід зараз Share More sharing options... Передплатники 0
Shaman Опубліковано: 10 серпня 2011 Share Опубліковано: 10 серпня 2011 ORM как правило выручает в больших проектах с задействованием спецов разного профиля. Лично мне нравятся проекты, использующие инкапсуляцию. А то, что парадигме OpenCart до этого далеко - это другой разговор. За статью спасибо ;) Надіслати Поділитися на інших сайтах More sharing options...
Recommended Posts