Pull to refresh
5
0
Владислав @Drinker

User

Send message

CakePHP. Behaviors — измена!

Reading time2 min
Views501
Как обычно я не ищу лёгких путей, и как обычно сталкиваюсь с задачами не рассмотренными в book.cakephp.org ;-)

Всегда, самой хлопотной частью проекта для меня являлся paginate и всё что с ним связано (выборки, сортировки).

И вот сейчас, я в очередной раз наступил на грабли, причём ответа на мой вопрос — нет.

Итак, в чём состояла задача:

Model A — hasMany Model B
Model B — belongsTo Model A

Model B — actAs ('Image')

Image — чудесный behavior Евгения Томенко, который служит для связки записи в модели с сохранённой картинкой.

В случае запроса Model B ->… любой формы — behavior срабатывал как часы, и я получал нужные мне данные, в данном случае — картинки.

Однако, когда стала задача построить запрос вида

Model B -> Model -> A ( с условиями, где выборка идёт по полям Model A)

оказалось — что поиск и педжинация работают отлично, однако в результатах связанной Model B — нет и следа работы behavior… Я просто получал поля модели, без нужных мне «искривлений».

Никакие танцы-пляски с Contain, порядком запроса и т.д. — ни к чему не привели. Ответа так же нет и в гуглегруппе.

А сегодня я нашёл ещё одни грабли, но уже с behavior Translate. Если воспользоваться инструкцией, и сделать как там советуется — всё работает отлично, кроме мой любимой педжинации…

А именно — сортировать по полям, расположенным в i18n таблице — нельзя. Не получится. Только по тем полям, которые присутствуют в явном виде. Вот так.

Я, конечно, не хочу сказать, что сортировка построенная через i18n таблицу будет работать быстро, или в принципе будет работать вменяемым образом. Может и не будет. Но в таком случае, если необходимо как-то сортировать результаты кроме id,created — то никаких шансов использовать этот behavior у вас нет. Он не сработает. :(

И если первые грабли можно обойти вторым запросом (сначала получив список id Model B, а потом затребовать непосредственно из Model B все записи (тут-то behavior сработает). То во вторых граблях, единственный способ сортировать — обходиться без коробочного behavior.

2All: Если кто-то решил данные вопросы — поделитесь решением в комментариях. Речь идёт о CakePHP 1.2.3.8166
Total votes 3: ↑1 and ↓2-1
Comments8

Evernote — моя визитница

Reading time1 min
Views799
С того самого момента, как Evernote стал распознавать русский текст, я понял, как я смогу его использовать.

Достав из ящика стола коллекцию визиток, полученных от разных людей в самое разное время, я их все методично перефотографию (процесс идёт), и аккуратно запихну в специально созданный блокнот «Визитки».

К сожалению старые визитки сложно отмечать какими-либо тэгами, но по-тихоньку, шаг за шагом это можно сделать. В конце концов — у меня, например, новая визитка появляется несколько раз в месяц. За исключением тех случаев, когда я посещаю какую-нибудь выставку или конференцию. Тогда всё проще — новая визитка, ещё свежи воспоминания — что за фирма? Кто этот человек? И выбор тэгов не составляет труда.

Итого — у меня вся коллекция визиток в идеальном порядке в моём Evernote. И я всегда могу найти нужного мне человека, по тэгу, по телефону, по фамилии и т.д.

Хотя, конечно, с фотографированием придётся повозиться (да, у меня нет сканера :)
Total votes 24: ↑20 and ↓4+16
Comments8

CakePHP и хитрая pagination

Reading time1 min
Views748
У меня в CakePHP самое больное место — pagination. Особенно когда дело касается хитростей. Банальный ->find('all') работает всегда (ну почти всегда) хорошо и замечательно, а вот pagination…
Дано:

  1. Есть табличка объектов недвижимости (Immovable) с указанной ценой (Immovable.price) и типом валюты (Immovable.currency_id)
  2. Есть табличка валюты (Currency) с полями: id, name, coeff (коэффициент)

Соответственно в таблице валюты есть коэффициенты USD coeff = 1, для валюты Euro coeff=1.34.
Задача:

Сортировать выдачу (paginate) по цене, с учётом валюты. Т.е. дом за 100 000 евро дороже, чем дом за 110 000 долларов (при курсе 1 к 1.34)
Решение

$this->paginate = array('order' => array('Count' => 'ASC'),
'fields' => array('*','((`Immovable`.`price`*`Currency`.`coeff`)) as Count'));


Да, именно в двойных скобках. Тогда запрос будет правильным с положенным LEFT JOIN к Currency и правильной сортировкой по вычисляемому полю.

Да, тестировал с MySQL, ибо с другими базами работать не довелось. Надеюсь кому-нить это поможет :)
Total votes 9: ↑5 and ↓4+1
Comments4

Капля, Унция и Ведро

Reading time2 min
Views636
Это суперски, что на Хабре есть обучающие статьи. Так сказать: изучаем по шагам: Ruby по каплям, Питон унциями и что-то (забыл что) вёдрами. А… Чуть не забыл — Java — чашками.

На будущее можно предложить следующие единицы измерения:

  • карат
  • грамм
  • милилитр (не капля!)
  • фунт (это для среднего уровня)
  • пуд (это уже при изучении на уровне senior)


Можно, также, переключиться на скорость измерения: изучаем javascript со скоростью две функции в час, или разгоняем PHP до 50 строк в секунду.

Здорово, что есть учебные материалы, и странно, что так неоригинально придумывают названия. Видимо, чтобы взгляд цепляло? Но мне кажется, если человеку интересен Python то всё равно — каплями его выдавливают, или вёдрами льют :)

Было бы очень метко отмечать уроки в %, однако, все кто публикует (я так думаю) вряд ли имеют чёткий план изучения того или иного языка программирования. Поэтому для кого-то это будет 20%, а кто-то поймёт что язык стал понятен, а фунции — всегда можно будет глянуть в api документации.

У меня, по-крайней мере, на определённом этапе изучения «чего угодно» наступает момент «просветления», после которого любой учебный курс становится уже избыточным, а вопросы, которые возникают в ходе программирования находятся на грани возможностей языка (или, если быть точным, моих возможностей) — и почти с вероятностью 99% не раскрываются ни в каких учебных курсах, и что бывает совсем обидно — практически не предусмотрены во фреймворках.

Ну а что поделаешь? Типичные задачи решаются базовыми функциями, расширенные — приходится самому писать функции. Но самые интересные задачи — приходится ковыряться самому — от начала и до конца.

Кстати, как у вас — я не знаю, у меня в области веб-программирования, самое интересное начинается именно при построении запросов к базе данных. Именно хитрые выборки со всевозможными ускорениями и оптимизацией — вот что тонкое место. А всё остальное (я пишу на CakePHP) — в основном настолько тривиально, что без особых хлопот «портанётся» на любой другой язык или фреймворк. Мне так кажется.

А вам?
Total votes 49: ↑23 and ↓26-3
Comments15

Уи, джквери, уи!

Reading time1 min
Views455
В блоге jquery был анонсирован 1.6rc5 UI.JQuery. Разумеется совместимый с jquery 1.3, с положенными примерами использования. И, как водится, всё большим и большим объёмом.

К счастью в ui.jquery можно самому скомпоновать необходимый набор из Core и, скажем, Draggable. Получив в результате меньший размер и ограничивая библиотеку только необходимым функционалом, без подгруза всего лишнего и ненужного в данном случае.

Судя по перечню возможностей, вошедших в стандартный ui — ничего нового туда не добавилось. Надеюсь, впрочем, что стабильность того, что там было и совместимость со всеми существующими браузерами стала лучше, стабильнее, надёжнее.

Качать ещё не бегал — пока удовлетворяюсь jquery + plugin и самописное
Но, если вам уже нужны стандартные UI-возможности — велкам — качайте (читайте) jQuery UI 1.6rc5
Total votes 17: ↑13 and ↓4+9
Comments5

Information

Rating
Does not participate
Location
Киев, Киевская обл., Украина
Date of birth
Registered
Activity