Где ID?
Надоело мне писать в начале каждого метода контроллера, требующего для работы ID записи, проверку на наличие этого самого ID.Ну вот например для вызовы методов /controller/view без ID записи смысла не имеют. Я в таких случаях делаю redirect на метод index. Примерно так:
Один раз это написать можно, два раза - начинает раздражать. В итоге задумываешься об автоматизации этой проверки. Что я и сделал. Read the rest of this post »function view() { if (!$this->Model->id) { $this->redirect(array('controller'=>'mycontroller', 'action'=>'index')); die(); } /* * Ну тут код дальше */ }
Многие ко многим - опасные связи
На этой неделе обновил CakePHP из SVN и тут же перестало работать добавление связей “многие-ко-многим” (hasAndBelongsToMany, HABTM). Небольшое расследование, сравнение изменений в коде и вопросы в гугл группе дали неутешительные результаты.Во-первых у меня сложилось впечатление, что разработчики, несмотря на статус ReleaseCandidate (RC3) все еще не пришли к единому мнению относительно структуры данных, которую надо скармливать методу save(). :-/
Во-вторых естественные ключи в CakePHP практически “вне закона”. Вот непонятно мне это - чем с точки зрения методов find(), save() и др. так сильно отличаются естественные ключи от синтетических? Тем более, что нечисловые первичные ключи все-таки поддерживаются. Это я про поля с UUID.
Проанализировав ситуацию, пришел к выводу, что на жанном этапе отказываться от естественных ключей пока неразумно и надо, видимо, добавлять такие связи самостоятельно. Тем более, что выборка по прежнему работает отлично. Т.е. нужно только реализовать добавление и удаление связей. Read the rest of this post »
Гарантированный способ потерять сессию в CakePHP 1.2RC3
Как исправить ситуацию я пока не придумал. Видимо, связано с желанием разработчиков улучшить защищенность системы.Для воспроизведения потребуется либо не очень быстрый сервер, либо сильно нагруженный сервер (хорошо бы еще добавить какой-нибудь хитрый запрос к Модели на выборку с JOIN’ами из большой таблицы - чтоб времени на запрос ощутимо уходило), или клиент на достаточно медленном канале.
Алгоритм следующий:
- Запускаем сессию и отдаем пользователю Вид (View) с двумя ссылками, например, на Controller1/action1 и на Controller2/action2
- Кликаем по первой ссылке
- Не дожидаясь загрузки страницы с видом Controller1/action1, кликаем по второй ссылке
- Сессия потеряна
Update: Как и предполагалось, это не бага, а фича для секьюрности. Лечится [вроде бы] сменой установки Security.level (в конфигурационном файле) с ‘high‘ на ‘medium‘.
Формат строки с ценой
В Shop-script Pro и Premium весьма интересная реализована функция форматирования числа в денежный формат. Чтоб точка была разделителем, разряды отделялись запятой и т.д. Приводить весь “оригинальный” код смысла нет, кто интересуется - может это сделать самостоятельно.Весь этот чудесный функционал находится в файле /core_functions/functions.php. Интересующая нас функция называется _formatPrice(). Все содержимое этой функции надо закомментировать и написать только одну строчку:
return number_format((float)$price,2);
Закомментированные 32 строки, в том числе 3 цикла делали то же самое. :-)
Кэшируй, кэшируй, кэшируй запрос назло буржуазной Европе!
Предыстория этого вопроса такова: одно время магаз на ShopScript работал у меня на довольно хилом VDS и посещения поисковых ботов практически клали сервер на обе лопатки. Типичная, так сказать, DDOS атака :-) Поэтому я озаботился производительностью самого скрипта. Предпринял следующие логичные, как мне кажется, шаги:- Добавил недостающие индексы в разные таблицы с товаром, параметрами товара, категории, валюты и т.д.
- Убрал подсчет запросов категорий и товаров. Во-первых это оказалась бесполезная фича, во-вторых это было просто.
- Закэшировал несколько запросов.
Отключаем у Shop-Script показ погоды на Луне
— Как же так, Родион, старушку – всего за 20 копеек!!!
— Ну не скажите, Порфирий Петрович… Пять старушек – уже рупь…
Сначала обоснование. Счетчик показов информации о товаре и показов категории – обычное целочисленное поле в БД. Каждый раз когда запрашивается категория или просмотр информации о товаре, Shop-Script прибавляет к значению единицу. В теории должна получиться статистика просмотров и распределение товаров по популярности. Но кроме людей сайт посещает еще много разной живности, да и, скажем троекратный, просмотр товара одним пользователем не может считаться тремя просмотрами. В итоге такие сомневающиеся пользователи вместе с шумной и прожорливой толпой поисковых ботов накручивают эти счетчики. Как следствие — наиболее точно эти самые счетчики показывают погоду на Луне. Read the rest of this post »
Улучшаем URL в Shop-Script
Идея в общем-то простая – с помощью апачевского модуля mod_rewrite преобразовать “красивые” URL в такой набор параметров, которые понимает скрипт.Самые частые пути:
www.shopscripsite.ru/index.php?productID=nnnn www.shopscripsite.ru/index.php?productID=nnnn&discuss=yes www.shopscripsite.ru/index.php?categoryID=nnnn
Создадим в корне сайта файл .htaccess, если, конечно, его еще нет. И добавим в него такие строчки:
Скажу честно – я не профессионал в составлении правил для mod_rewrite и Perl-овые регулярки знаю поверхностно. Наверняка эти команды можно оптимизировать, но надо же с чего-то начинать.<IfModule mod_rewrite.c> RewriteEngine On RewriteRule ^product/([^/]*)/discuss /product/$1/?discuss=yes [QSA,NE,L] RewriteRule ^product/([0-9]*) /index.php?productID=$1 [QSA,NE,L] RewriteRule ^category/([0-9]*) /index.php?categoryID=$1 [QSA,NE,L] </IfModule>
Собственно добавлением этих строчек все и заканчивается. Теперь вместе с теми URL, которые я написал выше будут работать и такие:
www.shopscripsite.ru/product/nnnn www.shopscripsite.ru/product/nnnn/discuss www.shopscripsite.ru/category/nnnn
А дальше надо править шаблоны. И, кое-где, файлы скрипта. Искать строчки типа
и заменять наindex.php?productID={$product_info.productID}
Переменная у Smarty может называться и по-другому – зависит от шаблона. В общем смотреть, где формируются ссылки на категории и продукты. А также менять относительные ссылки на картинки и т.п. на абсолютные. В смысле/product/{$product_info.productID}
<img src="producst_pictures/{какая-то_переменная_Smarty}" alt="" />
на
<img src="/producst_pictures/{какая-то_переменная_Smarty}" alt="" />
Какие еще URL перезаписать? :-)
Точка, точка, запятая
В русской локали разделитель десятичных разрядов – запятая. И это доставляет определенные неудобства при обновлении полей БД – MySQL не взирая на лица локаль для полей типа DOUBLE и FLOAT хочет видеть в качестве десятичного разделителя точку. И точка.
При установленной руской локали достаточно неосторожного движения пальца и вы в жопе, например:
$a = 7.62; $a = $a+0;
как значение переменной будет ‘7,62′. И у MySQL команда
UPDATE weapon SET weapon.caliber=7,62 WHERE weapon.slug = 'AK47';
вызовет изжогу. А вот заключение значения в кавычки, как ни странно, никаких последствий играть не будет:
UPDATE weapon SET weapon.caliber='7.62' WHERE weapon.slug = 'AK47';
при том, что тип у weapon.caliber – FLOAT, срабатывает отлично.
А еще MS Excel вместе с OpenOffice очень любят экспортировать данные с запятой в качестве десятичного разделителя.
Read the rest of this post »