Автор Тема: Список записей + фильтр. Реализация?  (Прочитано 4213 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Aku Aku

  • Завсегдатай
  • Новичок
  • *
  • Сообщений: 47
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
стандартная бекофисная задача:

 есть список записей, к ним нужно приделать фильтр (+ORDER, +GROUP BY) а также постраничную разбивку.

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


$filter 
= new Filter();
$filter->addCondition($fieldName$string$conditionType);
//@param conditionType: like, startWith, greater, ... etc.
...
$fiter->addOrder($fieldNameORDER_TYPE);
...
$filter->setLimit($from$to);  


и сохранять этот обьект например в сессии (не суть важно где)
потом использовать его в SQL запросе:


$query 
"SELECT id, name, email FROM users " $filter->getConditions() . $filter->getOrders() . $filter->getLimit(); 


тут бы и взяться за работу, но:

1) есть сомнения что такие фокусы пройдут с более сложными запросами (с JOIN-нами например)
2) как то не очень елегантно смотрится второй блок кода :-)

Сейчас размышляю над таким вариантом:
сделать mapping обьекта (того который извлекается запросом, в данном случае User). Все условия и ограничения добавлять в XML-ю модель, а потом генерить SQL запрос.

Что думаете, бредовая идея? К тому же не могу найти никакого PHP инструмента (класса) для маппинга, кто знает подскажите - если даже для данной задачи его не применю, все равно пригодится.

Оффлайн Меняздесьдавнонет

  • новичЕк
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 5698
  • +0/-0
  • 2
    • Просмотр профиля
    • http://
Список записей + фильтр. Реализация?
« Ответ #1 : 10 Апреля 2004, 21:33:34 »
я бы отослал тебя к соответствующим наблам на dklab.ru
в пятом пхп, кстати, как Котеров утверждает, есть плэйсхолдеры

Оффлайн Макс

  • vir magni ingenii
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 3534
  • +0/-0
  • 2
    • Просмотр профиля
Список записей + фильтр. Реализация?
« Ответ #2 : 10 Апреля 2004, 21:37:47 »
что-то похожее реализовано в pear::DB::DataObject
посмотри
First learn computer science and all the theory. Next develop a programming style. Then forget all that and just hack. ( George Carrette )

Оффлайн Макс

  • vir magni ingenii
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 3534
  • +0/-0
  • 2
    • Просмотр профиля
Список записей + фильтр. Реализация?
« Ответ #3 : 10 Апреля 2004, 21:47:21 »
кстати почитай про паттерн DAO на phppatterns.com и на форуме
http://www.sitepoint.com/forums/forumdisplay.php?f=147 (там одно время этот паттерн очень часто обсуждался)
First learn computer science and all the theory. Next develop a programming style. Then forget all that and just hack. ( George Carrette )

Оффлайн AliMamed

  • \\o/ ali akbar \\o/
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 2409
  • +2/-0
  • 2
    • Просмотр профиля
    • http://alimamed.pp.ru
Список записей + фильтр. Реализация?
« Ответ #4 : 10 Апреля 2004, 22:11:47 »
а о какой БД идет речь? если не о MySQL, а скажем MS SQL то стоит смотреть в сторону процедур, ф-ций и тригеров
ну, будем исповедоваться?

Оффлайн Aku Aku

  • Завсегдатай
  • Новичок
  • *
  • Сообщений: 47
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Список записей + фильтр. Реализация?
« Ответ #5 : 11 Апреля 2004, 15:04:58 »
AliMamed
вообще-то это ООП фреймворк, костяк уже есть, теперь пишу специфеские классы для бекофиса. Но первый проект который сразу же на нем делается, именно на MySQL. А там посмотрим...

Макс
да пересмотрел весь PEAR, вообще как раз DataObject то и заинтересовал, но он не укладывается в логику фреймворка.
Я вообще отказался от создания обьектов типа например UserItem, ArticleItem, etc. с которыми работает DataObject. У меня на все сущности есть один класс FormBean который содержит в себе массив обьектов Field. И для каждой сущности (User, Article, News)
есть XML mapping такого типа:


<formBean>
    <
field name="id" 
            
value=""                      
            
type="hidden" />
    <
field name="username" 
            
value=""
            
title="Username"
            
tip="Enter valid username" 
            
type="text"
            
required="true"
            
varType="string"           
            
maxLength="20" />
...
</
formBean


такая структура мне кажется более гибкой. Ну а там время покажет :-)
За линк спасибо, почитаю.

RomikChef
да, либа интересная. кстати в pear::db я также нашел плейсхолдеры:
http://pear.php.net/manual/en/package.database.db.intro-execute.php
только не уточняется, применима ли эта фича к MySQL, нужно будет попробовать.

2 All
еще линк по теме (с phpbuilder.com):
A Practical Approach to Object-Relational Mapping in PHP

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

Христос воскрес!

Оффлайн Макс

  • vir magni ingenii
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 3534
  • +0/-0
  • 2
    • Просмотр профиля
Список записей + фильтр. Реализация?
« Ответ #6 : 12 Апреля 2004, 12:55:59 »
я в свое время тоже решал похожую проблему и все-таки решил делать через наследование.
Например.
Допустим есть две сущности - "новость" и "пользователь".
Действия, которые производятся с новостями - выборка/добавление/редактирование/удаление
А вот действия, которые могут произведены с пользователем -
 активация аккаунта, авторизация, выход, "вспомнить пароль" (+то что и с новостями).
Если делать как у тебя, то либо в базовом классе надо предусмотреть методы для всевозможных действий и класс быстро разрастется либо базовый класс будет делать лишь базовые действия (добавление/редактирование/удаление) и всю остальную логику работы с сущностью реализовывать "вручную" (то есть вне класса).
Оба эти метода мне кажутся кривыми.
First learn computer science and all the theory. Next develop a programming style. Then forget all that and just hack. ( George Carrette )

Оффлайн Aku Aku

  • Завсегдатай
  • Новичок
  • *
  • Сообщений: 47
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Список записей + фильтр. Реализация?
« Ответ #7 : 12 Апреля 2004, 16:13:36 »
Все таки выборка/добавление/редактирование/удаление это самые стандартные действия над обьектом. Пример с аутентификацией это скорее исключение. Но у меня, в рамках архитектуры, нету обязательного базового класса. Она вкратце такова:

Есть контейнеры, которые могут содержать модули (и другие контейнеры). Грубо говоря количество контейнеров равно количеству пунктов меню. Каждый контейнер и модуль имеют свой шаблон. Вся инфа о том какие модули входят в контейнер прописывается в XML конфиге. Модуль должен обязательно наследовать AbstractModule (кроме прочего, поставляет модулю обьекты шаблонизатора, БД, текущий контекст) и реализовывать один  метод: String render(), т.е. возвращать свой View  в контейнер. Других ограничений нету, т.е. можно создавать любые иерархии классов внутри модуля, или модуль просто может читать статический файл и возвращать его.

брр.. разошелся :-)
короче говоря, если интересно - могу выслать когда до ума доведу.

 

Sitemap 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28