С Новым, 1969-м, годом!

Советская новогодняя открытка 1979 годаЭто почти не прикол. В новой версии PHP 5.3 добавлен новый оператор. GOTO называетя. Я вполне серьезно, можете сами посмотреть анонс. Там английским по белому написано:

Added «jump label» operator (limited «goto»). (Dmitry, Sara)

Это, конечно, не вчера случилось, анонс от 1 августа. Просто эти длинные списки мало кто внимательно читает, но Johannes Schlüter внимание свое на эту строчку обратил.

А мы тут, понимаешь, сожалеем об отсутствии множественного наследования…

SluggableBehavior — помощник в создании ЧПУ

После выхода стабильной версии CakePHP количество постов в разных блогах, посвященных этому фреймворку, сократилось. Даже в Bakery тишина. Либо Рождество с Новым годом, либо все, засучив рукава, занялись разработкой.

В помощь неутомимым пекарям я решил рассказать об удобном расширении модели (behavior). Вещь, на мой взгляд, полезная. Работает отлично, я этим behavior пользуюсь уже почти год. Он помогает автоматически, при записи, сгенерировать slug для строки таблицы.

Вот, кстати, мне всегда было интересно, как правильно перевести на русский слово slug в этом контексте. Ярлык?

Этот behavior написал Mariano Iglesias. Это часть его проекта Cake Syrup. О другой интересной составляющей, SoftDeletableBehavior, недавно, кстати, можно прочесть здесь.

Это расширение не использует Inflector::slug() — когда оно создавалось, этого метода еще не было. Зато поддержка транслита русских букв в UTF-8 уже встроена, не без помощи Вашего покорного слуги. ;-) Читать далее SluggableBehavior — помощник в создании ЧПУ

Индекс Яндекса

Весь декабрь мучился вопросом — есть-ли ограничение у Яндекса на количество страниц с одного сайта в индексе. Никак не попадало в индекс страниц, более чем 100 тысяч. Это был повод для некоторой грусти. Сегодня увидел, что барьер в 100 тыс. страниц преодолен. Ура!

Количество страниц в индексе Яндекса

Рождественский пирог: долгожданный релиз CakePHP 1.2

К Рождеству разработчики CakePHP выпустили долгожданный релиз фреймворка версии 1.2. Разработка этой версии длилась почти 2 года и, надо сказать, пирог получился отменный! Что больше всего нравится лично мне:

  • Behaviors — расширение функционала моделей. PHP досих пор страдает отсутствием множественного наследования и behaviors в CakePHP очень технично эту проблему решают.
  • Тесты — CakePHP интегрируется с пакетом SimpleTest и позволяет создавать тесты для всех методов контроллеров и моделей. Это очень важно при разработке
  • Консольная утилита, позволяющая создавать типичные модели, контроллеры, каркас приложения и т.д. Очень удобная, на мой взгляд.
  • Законченная и понятная концепция плагинов. Части приложения, более-менее самостоятельные, можно изготавливать в виде плагинов и использовать в разных проектах.

Это, конечно, не полный список «вкусностей», а только то, что сразу вспомнилось. В целом, по сравнению с версией 1.1 фреймворк сильно изменился в лучшую сторону. Стал более понятным и удобным.

Читать далее Рождественский пирог: долгожданный релиз CakePHP 1.2

Производительность фреймворков — CodeIgniter уходит в отрыв

Хуан Бассо протестировал несколько современных версий популярных PHP-фреймворков. Увы, оба два моих предпочитаемых: CakePHP и ZendFramework слили CodeIgniter’у по полной программе. В лидерах оказался и неизвестный мне Yii.

Автор тестировал производительность 3-х приложений: стандартного ‘Hello, world’, запрос к базе данных на выборку 10 записей и запрос на выборку 1000 записей. Для тестирования использовался, как я понял, массовый бразильский сервер: Debian, PHP 5.2.0, MySQL 5.0, Apache 2.2.3, процессор Xeon 2.66G и 256 мегабайт оперативки. Всяческие хитрости типа Memcache были отключены и не использовались, все приложения запускались, как принято говорить, в production режиме, т.е. с отключенной отладочной информацией и тому подобное.

Тестовые приложения для каждого фреймворка были разработаны на основе документации, а не взяты из готовых примеров. Это, конечно, может наложить некоторый отпечаток, поскольку вряд-ли Хуан одинаково хорошо разбирается во всех пакетах, зато такой подход наглядно демонстрирует то, что можно получить, если завтра принять решение о смене фреймворка. :-)

В тесте принимали участие самые свежие версии:

Читать далее Производительность фреймворков — CodeIgniter уходит в отрыв

Табличная верстка

ГЛАГНЕ Яндекс и Firebug. Кликабельно.
ГЛАГНЕ Яндекс и Firebug. Кликабельно.

Вот все морщат нос и ругают табличную верстку. А вот тем тем не менее кое-кто ее вполне себе использует. Это я не к тому, что надо срочно все переверстывать в таблицы. Скажем так, просто информация к размышлению ;-)

На самом деле просто решил посмотреть, как люди делают список в несколько колонок. Теория есть на A List Apart, а вот как оно в реальности, стало интересно.

Самый последний CakePHP Release Candidate

Поскольку «последний перед финальный релизом» Candidate был RC3, то сегодня вышел вышел «последний-последний RC4». Авторы Cake, видимо, тоже подвержены приступам перфекционизма. Изменений, по сравнению с RC3 немного и моих проектов, они, кажется, не коснулись. Не то, что RC3.

  • Из компонента AclComponent убрали методы setAro(), setAco(), getAro() и getAco()
  • Убран метод Model::normalizeFindParams()
  • Из параметров метода JavascriptHelper::codeBlock() убран $safe, ранее отмеченный как deprecated
  • Изменен параметр вызова метода XmlNode::toArray(). Вместо $object (=null) теперь $camelize (= true)
  • Исправлены какие-то стили, скорее всего для вывода тестов или scaffold views. В общем, если пользуетесь стандартным файлом со стилями, сake.css, обновите его.
  • Методы ClassRegistry::_duplicate() и Router::matchRoute() теперь private, переименованы в ClassRegistry::__duplicate() и Router::__matchRoute() соответственно

M — for model

Очень-очень редко, но бывает нужно использовать в каком-нибудь методе контроллера несколько несвязанных между собой моделей. Еще раз, ключевые слова: «редко-редко» и «несвязанных».

Можно такие модели перечислить в переменной класса $uses — тогда, они, правда, будут загружаться для любого метода контроллера.

В версии 1.1 фреймворка была функция loadModel(), которая теперь отменена.

Есть еще метод requestAction(), но он объявлен «плохим». И правда, это, по сути, еще один запрос к приложению по полной программе, с диспетчеризацией, роутингом, стартом и инициализацией всех сопутствующих классов. В общем, путь неоптимальный и пользоваться им можно лишь от полной безысходности.

Можно воспользоваться методом App::import() — это хороший метод для многих классов. Но загруженная модель будет неполной. Т.е. это будет просто загруженный класс модели, без всех предварительных инициализаций самой модели и т.п. Этим методом лучше пользоваться для подгрузки своих классов или библиотек сторонних разработчиков.

В общем, я лично чаще всего в Cake 1.2 использовал именно App::import(), мирясь с некоторыми ограничениями. Но, оказывается есть еще один метод, позволяющий полностью загрузить модель, со всем ее «обвесом»

Читать далее M — for model

Показ товаров в категории Shop-Script

Во всех магазинах товар имеет свойство заканчиваться. Однако мы все надеемся на лучшее и временно отсутствующий товар с сайта не убираем.

В ShopScript есть 2 пути не дать заказать пользователю отсутствующий товар — включить в разделе «Настройки ->Корзина и оформление заказов» опцию «Вести учет товаров на складе» и тогда в свойствах товара надо будет вести количество по каждой позиции. Второй путь проще: установить товару нулевую цену, тогда ShopScript не будет показывать для этого товара ссылку на добавление в корзину.

Лично я предпочитаю второй путь, он для меня немного проще.

Однако, при показе товаров в категории ShopScript сортирует их по полям sort_order (порядок сортировки) и name (название). Из-за этого отсутствующие товары идут вперемешку с наличиствующими. Хотелось бы наоборот, чтобы те товары, которых в данный момент нет в наличии отображались бы в конце списка и на это не влиял выбор порядка сортировки (по имени, по цене и т.п.). То есть, чтобы все типы сортировок, которые науказывал посетитель применялись к тем товарам, которые можно заказать, а отсутствующие были все равно в конце списка. Читать далее Показ товаров в категории Shop-Script

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

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

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