• CakePHP. Behaviors — измена!

      Как обычно я не ищу лёгких путей, и как обычно сталкиваюсь с задачами не рассмотренными в 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
    • Evernote — моя визитница

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

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

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

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

        Хотя, конечно, с фотографированием придётся повозиться (да, у меня нет сканера :)
      • CakePHP и хитрая pagination

          У меня в 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, ибо с другими базами работать не довелось. Надеюсь кому-нить это поможет :)
        • Капля, Унция и Ведро

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

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

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


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

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

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

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

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

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

            А вам?
          • Уи, джквери, уи!

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

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

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

              Качать ещё не бегал — пока удовлетворяюсь jquery + plugin и самописное
              Но, если вам уже нужны стандартные UI-возможности — велкам — качайте (читайте) jQuery UI 1.6rc5