Исходные тексты CakeBook

Это, конечно, уже не новость — некоторое время назад на всеобщее обозрение были выложены исходные тексты CakeBook. Это то самое приложение, которое работает на сайте http://book.cakephp.org — сайте с официальной документацией на CakePHP.

Мне было очень интересно посмотреть на различные приемы, использованные при написании этого приложения. Вдруг какая-нибудь идея пригодится? Похоже, что приложение написано на версии 1.1 фреймворка, поэтому не все вещи полезны, и кое-какие куски кода могут и не работать. Тем не менее, есть несколько вещей, на которые я обратил внимание. Читать далее Исходные тексты CakeBook

Где ID?

Надоело мне писать в начале каждого метода контроллера, требующего для работы ID записи, проверку на наличие этого самого ID.

Ну вот например для вызовы методов /controller/view без ID записи смысла не имеют. Я в таких случаях делаю redirect на метод index. Примерно так:

Один раз это написать можно, два раза — начинает раздражать. В итоге задумываешься об автоматизации этой проверки. Что я и сделал. Читать далее Где ID?

Многие ко многим — опасные связи

На этой неделе обновил CakePHP из SVN и тут же перестало работать добавление связей «многие-ко-многим» (hasAndBelongsToMany, HABTM). Небольшое расследование, сравнение изменений в коде и вопросы в гугл группе дали неутешительные результаты.

Во-первых у меня сложилось впечатление, что разработчики, несмотря на статус ReleaseCandidate (RC3) все еще не пришли к единому мнению относительно структуры данных, которую надо скармливать методу save(). :-/

Во-вторых естественные ключи в CakePHP практически «вне закона». Вот непонятно мне это — чем с точки зрения методов find(), save() и др. так сильно отличаются естественные ключи от синтетических? Тем более, что нечисловые первичные ключи все-таки поддерживаются. Это я про поля с UUID.

Проанализировав ситуацию, пришел к выводу, что на жанном этапе отказываться от естественных ключей пока неразумно и надо, видимо, добавлять такие связи самостоятельно. Тем более, что выборка по прежнему работает отлично. Т.е. нужно только реализовать добавление и удаление связей. Читать далее Многие ко многим — опасные связи

Гарантированный способ потерять сессию в CakePHP 1.2RC3

Как исправить ситуацию я пока не придумал. Видимо, связано с желанием разработчиков улучшить защищенность системы.

Для воспроизведения потребуется либо не очень быстрый сервер, либо сильно нагруженный сервер (хорошо бы еще добавить какой-нибудь хитрый запрос к Модели на выборку с JOIN’ами из большой таблицы — чтоб времени на запрос ощутимо уходило), или клиент на достаточно медленном канале.

Алгоритм следующий:

  1. Запускаем сессию и отдаем пользователю Вид (View) с двумя ссылками, например, на Controller1/action1 и на Controller2/action2
  2. Кликаем по первой ссылке
  3. Не дожидаясь загрузки страницы с видом Controller1/action1, кликаем по второй ссылке
  4. Сессия потеряна

Досконально я не проверял, но по результатам рассмотра файлов с сессиями в директории /tmp, думаю, что AuthComponent или еще какой, например RequestHandler виноваты.

Update: Как и предполагалось, это не бага, а фича для секьюрности. Лечится [вроде бы] сменой установки Security.level (в конфигурационном файле) с ‘high‘ на ‘medium‘.

Точка, точка, запятая

В русской локали разделитель десятичных разрядов – запятая. И это доставляет определенные неудобства при обновлении полей БД – MySQL не взирая на лица локаль для полей типа DOUBLE и FLOAT хочет видеть в качестве десятичного разделителя точку. И точка.

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

как значение переменной будет ‘7,62’. И у MySQL команда

вызовет изжогу. А вот заключение значения в кавычки, как ни странно, никаких последствий играть не будет:

при том, что тип у weapon.caliber – FLOAT, срабатывает отлично.

А еще MS Excel вместе с OpenOffice очень любят экспортировать данные с запятой в качестве десятичного разделителя.

Читать далее Точка, точка, запятая