Блог веб-программиста

16Дек/090

Доступны репозитории Ubuntu Lucid Lynx

С недавнего времени доступны репозитории разрабатываемой версии Ubuntu Lucid Lynx.
Для обновления до Ubuntu 10.04 LTS введите в консоли следующую команду:

sudo do-release-upgrade -d -p

Ubuntu 10.04 (Lucid Lynx) является LTS релизом и выйдет в апреле 2010 года. Будет поддерживаться особенно долго и тщательно.

Связано с категорией: linux Нет комментариев
20Сен/090

Разработчики Sabayon Linux планируют выпустить версию 5.0 через 2 недели

Wolfden в своём блоге написал о начале тестирования второй беты Sabayon 5.0.

Он надеется выпустить финальную версию Sabayon 5.0 через две недели, однако точной даты никто не знает.

Связано с категорией: linux Читать полностью
16Сен/093

Создаём расширяемую структуру на Yii Framework

Хочу предложить Вашему вниманию концепт расширяемой структуры приложения на Yii Framework. Я уже писал как сделать свои Actions на Yii.

Сегодня же речь пойдёт о написании стандартных экшенов для контроллеров и их расширения.

Предположим, в приложении у нас все контроллеры наследуются от класса dotPlantFrontMainController.

Нам необходимо, чтобы у всех контроллеров было действие Breadcrumb.

Для этого, в базовом контроллере dotPlantFrontMainController переопределяем функцию actions() следующим образом:

public function actions()
 {
 return array(
 'breadcrumb' => 'application.extensions.actionBreadcrumb',
 );
 }

Если в унаследованном контроллере(скажем News) мы используем экшены из других файлов, то нам необходимо также переопределить функцию примерно вот так:

public function actions()
 {
 // return external action classes, e.g.:
 return array_merge(
 parent::actions(),
 array(
 'admin'=>'application.controllers.News.ActionAdmin',
 )
 );
 }

Таким образом, в News будут экшены определенные в базовом классе dotPlantFrontMainController плюс ActionAdmin.

Переписать же actionBreadcrumb можно уже в теле самого News.

В итоге имеем легко расширяемую структуру. В самом же базовом классе массив actions можно автоматически генерировать в соответствии с установленными расширениями. Всё легко и просто icon smile Создаём расширяемую структуру на Yii Framework

Связано с категорией: Code 3 Комментарии
6Сен/091

О Sabayon 4.2 и не только

Поставил я как то себе на домашний компьютер Sabayon 4.2 Gnome x86_64. Конечно хотелось бы скачать Sabayon 5, но его ещё нигде нет - одни слухи только. Первое впечатление о системе было замечательное.

Ну Gentoo как Gentoo, только ставится быстрее, не надо с хэндбуком сидеть. Есть встроенный менеджер пакетов entropy с графическим фронтэндом Sulfur. Из консоли всё ставится через equo install. emerge также работает.

Связано с категорией: linux Читать полностью
4Сен/096

Декодируем gzip страницу на PHP

Недавно при разработке одного сайта, столкнулся с проблемой декодирования на PHP полученной через curl страницы, сжатой в gzip.

Допустим у нас есть код, который делает запрос через php-CURL с возвращением заголовков:

$ch = curl_init();
 curl_setopt($ch, CURLOPT_URL,$url);
 
 //curl_setopt ($ch, CURLOPT_VERBOSE, 2); // Отображать детальную информацию о соединении
 curl_setopt ($ch, CURLOPT_USERAGENT, 'Mozilla/5.0'); //Прописываем User Agent, чтобы приняли за своего
 
 curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);  // Возвращать результат
 
 curl_setopt ($ch, CURLOPT_HEADER, 1); // Наши заголовочки
 curl_setopt ($ch, CURLINFO_HEADER_OUT, 1); // Где то наткнулся на этот параметр, решил оставить
 curl_setopt ($ch, CURLOPT_CONNECTTIMEOUT, 30);
 
 $result = curl_exec($ch);

В итоге получаем в $result нашу страницу с заголовками сервера. Проверим, закодированна ли она и дешифруем её, если нужно:

if (strstr($result,"Content-Encoding: gzip"))
 {
 $result = preg_replace("/(.*)Content\-Encoding: gzip\s+/isU","",$result);
 $result = gzinflate(substr($result, 13));
 }

Вот и всё. Если Вам нужно просто gzip контент расшифровать, то можно в substr заменить 13 на 10. (+3 из-за \n после заголовков).

Связано с категорией: Code 6 Комментарии
2Сен/090

The new look

Вот мой блог и переехал с Blogger на WordPress.

Дизайн пока временный. Скоро переделаю. Надеюсь, это не затянется icon smile The new look

Связано с категорией: Новости Нет комментариев
30Июн/095

Почему disabled input элементы формы не передаются?

Сегодня столкнулся с одной особенностью INPUT элементов с атрибутом disabled. Как оказалось - они не передаются серверу при сабмите формы.
Вышел из положения вот таким изящным способом на jQuery:

$(function(){
 $("form").submit(function(){
 $("input").attr("disabled", ""); $("select").attr("disabled", "");
 });
 });

Таким образом, при действии submit у всех input и select элементов убирается атрибут disabled. Один минус - не работает при отключенных скриптах. Но в моём случае без JavaScript и jQuery не работает вообще всё приложение, так что это не так страшно.

Связано с категорией: Code 5 Комментарии
25Июн/090

jQuery Serialize — PHP like serialize function for jQuery

ENG: I've addapted a JavaScript serialize function by Kevin van Zonneveld to jQuery. Function works like the same named function in PHP. Be free to use it in your projects. It is especially needed when you want to post Object in AJAX (in jQuery "$.ajax()").
RUS: Я адаптировал JavaScript serialize функцию, написанную Kevin van Zonneveld, для использования с jQuery. Serialize работает также как и одноименная функция в PHP. Она хорошо выручит Вас, если Вы захотите передать в AJAX запросе Объект (JavaScript object).

Example of using: $.serialize({data: 'value'});

Связано с категорией: Code Читать полностью
24Июн/090

Яндекс.Метрика — Демография — DailySnap

Установил себе на сайт бета версию счетчика Яндекс.Метрика. Сегодня покопавшись, нашёл интересную страничку.
 Яндекс.Метрика   Демография   DailySnap
Кликабельно

Интересно, Как Яндекс определяет пол и возраст посетителей?

Связано с категорией: Новости Нет комментариев
29Май/090

Yii — создание своих типов Action-ов

Пишу одно прлиожение на Yii Framework. Структура приложения такова, что необходимо разграничить экшены контроллеров(CController) по папкам и сделать их типовыми.
Экшены разграничиваются легко.
Предположим, что у нас есть ряд экшенов для администрирования. Всем им надо установить какие-либо свойства или же сделать при их вызове какие-то типовые действия.
Рассмотрим на примере изменения титла страницы.
Вот код моего базового экшена:

class dotPlantAdminAction extends CAction
 {
 /**
 * Constructor.
 * Runs CAction constructor and makes some changes for Admin action type
 */
 public function  __construct($controller,$id)
 {
 parent::__construct($controller,$id);
 $this->controller->pageTitle       = dotPlant::getName() . " - Admin ";
 
}
 
public function run()
 {
 
 }
 }

В конструкторе мы сначала вызываем parent::__construct с необходимыми параметрами. Это грубо-говоря идёт инициализация базового CAction.

Допустим у нас есть контроллер SettingsController. И нам нужно сделать его на основе нашего экшена. Создаем папку  protected/controllers/Settings/. В ней создаем файл ActionAdmin.php с таким вот кодом:

class ActionAdmin extends dotPlantAdminAction
{
 public function run()
 {
    $this->controller->render('admin');    
 }
}

Видите? Нам достаточно только объявить run() и уже всё готово. При загрузке запустится необходимый нам конструктор базового контроллера с нашими действиями.

Вот по такому принципу я разграничиваю например админку в своей CMS dotPlant на Yii Framework. Слава PHP пятому!

Связано с категорией: Code Нет комментариев