Где 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‘.

Формат строки с ценой

В Shop-script Pro и Premium весьма интересная реализована функция форматирования числа в денежный формат. Чтоб точка была разделителем, разряды отделялись запятой и т.д. Приводить весь «оригинальный» код смысла нет, кто интересуется — может это сделать самостоятельно.

Весь этот чудесный функционал находится в файле /core_functions/functions.php. Интересующая нас функция называется _formatPrice(). Все содержимое этой функции надо закомментировать и написать только одну строчку:

Закомментированные 32 строки, в том числе 3 цикла делали то же самое. :-)

Кэшируй, кэшируй, кэшируй запрос назло буржуазной Европе!

Предыстория этого вопроса такова: одно время магаз на ShopScript работал у меня на довольно хилом VDS и посещения поисковых ботов практически клали сервер на обе лопатки. Типичная, так сказать, DDOS атака :-) Поэтому я озаботился производительностью самого скрипта. Предпринял следующие логичные, как мне кажется, шаги:

  1. Добавил недостающие индексы в разные таблицы с товаром, параметрами товара, категории, валюты и т.д.
  2. Убрал подсчет запросов категорий и товаров. Во-первых это оказалась бесполезная фича, во-вторых это было просто.
  3. Закэшировал несколько запросов.

Эти три пункта помогли решить проблему. Не знаю, какой оказал бОльшее влияние, но первого точно было недостаточно. Читать далее Кэшируй, кэшируй, кэшируй запрос назло буржуазной Европе!

Отключаем у Shop-Script показ погоды на Луне

— Как же так, Родион, старушку – всего за 20 копеек!!!
— Ну не скажите, Порфирий Петрович… Пять старушек – уже рупь…

Сначала обоснование. Счетчик показов информации о товаре и показов категории – обычное целочисленное поле в БД. Каждый раз когда запрашивается категория или просмотр информации о товаре, Shop-Script прибавляет к значению единицу. В теории должна получиться статистика просмотров и распределение товаров по популярности. Но кроме людей сайт посещает еще много разной живности, да и, скажем троекратный, просмотр товара одним пользователем не может считаться тремя просмотрами. В итоге такие сомневающиеся пользователи вместе с шумной и прожорливой толпой поисковых ботов накручивают эти счетчики. Как следствие — наиболее точно эти самые счетчики показывают погоду на Луне. Читать далее Отключаем у Shop-Script показ погоды на Луне

Улучшаем URL в Shop-Script

Идея в общем-то простая – с помощью апачевского модуля mod_rewrite преобразовать “красивые” URL в такой набор параметров, которые понимает скрипт.

Самые частые пути:

Создадим в корне сайта файл .htaccess, если, конечно, его еще нет. И добавим в него такие строчки:

Скажу честно – я не профессионал в составлении правил для mod_rewrite и Perl-овые регулярки знаю поверхностно. Наверняка эти команды можно оптимизировать, но надо же с чего-то начинать.

Собственно добавлением этих строчек все и заканчивается. Теперь вместе с теми URL, которые я написал выше будут работать и такие:

А дальше надо править шаблоны. И, кое-где, файлы скрипта. Искать строчки типа

и заменять на

Переменная у Smarty может называться и по-другому – зависит от шаблона. В общем смотреть, где формируются ссылки на категории и продукты. А также менять относительные ссылки на картинки и т.п. на абсолютные. В смысле

на

Какие еще URL перезаписать? :-)

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

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

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

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

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

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

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

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