вторник, июля 31, 2007

Ubuntu 7.04 (Feisty): PHP installation with MSSQL

Ubuntu is a great Linux distribution, but MSSQL support is poor. There is nothing about MSSQL in apt-get or Synaptic package manager. This small HOWTO fixes problem. See HOWTO: PHP with MSSQL on Ubuntu 6.06 if you are using Ubuntu 6.06 or want to try another way to reach PHP with MSSQL.



Step 1. Get the sources and packages

You must have a php5, php5-dev, php5-src and freetds.

sudo apt-get install php5 php5-dev freetds
sudo apt-get source php5


Step 2. Building MSSQL module

Apt-get will unpack php5 sources into php5-5.x.x directory. Navigate to php5-5.x.x/ext/mssql:

sudo phpize
sudo ./configure --with-mssql
sudo make

After make you will see something like this:
...
Libraries have been installed in:
/home/snick/Software/php5-5.2.1/ext/mssql/modules
...

PHP modules located in /usr/lib/php5/20060613+lfs/ (change last directory if differs). Just copy new module:
sudo cp php5-5.2.1/ext/mssql/modules/mssql.so \
/usr/lib/php5/20060613+lfs


Step 3. Configuring PHP

Setup PHP to use new module:

sudo vim /etc/php5/conf.d/mssql.ini

Add text extension=mssql.so and save the file. Restart Apache.


Make sure that you correctly setup /etc/freetds/freetds.conf for your servers.

пятница, марта 02, 2007

JCal Pro - Russian language

Натолкнулся недавно на CMS Joomla. Симпатичная штука, задачи свои решает, обросла множеством плагинчиков и является веткой известной CMS Mambo. Понадобился мне календарь с хорошим внешним видом и с возможностью публикации событий пользователями. После нескольких дней перелопачивания всевозможных JEvents, Easy Calendar и т.п., я натолкнулся на JCal Pro.

Выглядит замечательно, функционирует нормально, но русского нет в принципе. Пара часов и этот недостаток устранен =)

Один момент: потребовался небольшой фикс самого JCal Pro. В файле JOOMLA_ROOT/components/com_jcalpro/config.inc.php есть вызов setlocale(LC_TIME, ...). Перед ним нужно добавить setlocale(LC_CTYPE, ...).

Файл с переводом (надо положить в JOOMLA_ROOT/components/com_jcalpro/languages/russian): http://www.snick.ru/jcalpro/russian_v1.5.0.1.zip

Файл с переводом и фиксом (надо положить в JOOMLA_ROOT/components/com_jcalpro): http://www.snick.ru/jcalpro/russian_with_fix_v1.5.0.1.zip

Анонс на сайте JCal Pro

UPD (en): I've moved files to GoogleCode availale at http://code.google.com/p/ru-jcalpro. As bonus - pre-encoded Windows-1251 (aka CP1251) and UTF-8 versions.

UPD (ru): Файлы теперь хостятся у гугла http://code.google.com/p/ru-jcalpro. В качестве бонуса там две версии - под виндовую CP1251 и универсальную UTF-8 кодировки.

PS: Спасибо Юре Духничу - я уж думал, что вместе со snick.ru мой перевод канул в лету =)

пятница, января 19, 2007

Кириллица и php_json

Поддержка UTF-8 в PHP весьма слабая, то же касается и кириллицы. Начав использовать javascript-библиотеку Prototype и AJAX я столкнулся с тем, что модуль php_json, который включен в PHP с версии 5.2.0 (для остальных доступен в виде extension), категорически отказывается воспринимать русский язык. Кириллица просто вырезается.

Дело в том, что php_json обрабатывает только ISO-8859-1, а остальные символы отбрасывает. Функция utf8_encode() тоже не подходит из-за того, что неправильно определяет код символа. Например, русская буква "а" имеет код \u0434, а utf8_encode() кодирует ее как \u00e4. В итоге - на странице кракозябры.

Положение спасает iconv(): iconv('cp1251', 'utf-8', $string). Преобразование корректное. Но, к сожалению, это исключает использование функции json_encode() "как есть" - придется написать свою функцию json_safe_encode() для кодирования данных в формат JSON:
function json_safe_encode($var)
{
return json_encode(json_fix_cyr($var));
}

function json_fix_cyr($var)
{
if (is_array($var)) {
$new = array();
foreach ($var as $k => $v) {
$new[json_fix_cyr($k)] = json_fix_cyr($v);
}
$var = $new;
} elseif (is_object($var)) {
$vars = get_object_vars($var);
foreach ($vars as $m => $v) {
$var->$m = json_fix_cyr($v);
}
} elseif (is_string($var)) {
$var = iconv('cp1251', 'utf-8', $var);
}
return $var;
}

PS.
На www.json.org масса полезных ссылок.

UPD 2008-02-06: $vars = get_object_vars($var); instead of $vars = get_class_vars(get_class($var));. Thanks to Pascal Martineau