понедельник, 22 февраля 2010 г.

Zend Framework: Quick Start

Ковыряю ZendFramework Quick Start Application. Много интересного, довольно мощная штука, но иногда кажется, что сильно мощная. Как по велопарку на джипе кататься...
Пока немного коробит от таких вещей:

<p><a href="<?php echo $this->url(
array(
'controller' => 'guestbook',
'action' => 'sign'
),
'default',
true) ?>">Sign Our Guestbook</a></p>

Guestbook Entries: <br />
<dl>
<?php foreach ($this->entries as $entry): ?>
<dt style="color:navy"><?php echo $this->escape($entry->email) ?></dt>
<dd style="color:gray"><?php echo $this->escape($entry->comment) ?></dd>
<hr/>
<?php endforeach ?>
</dl>

Привык я работать с template engine и не переношу смесь php и html кода...

Самый большой минус ZF, в том, что напихано в него множество того, что может вообще не пригодиться.

Например, в минимальной конфигурации таки библиотеки, как: Barcode, Currency, Locale (и его 9 метров локалей), TimeSync. Без них вес уменьшается в 2 раза...

воскресенье, 21 февраля 2010 г.

Zend Framework

Потихоньку начал осваивать Zend Framework.
Нашёл "легкий путь" слил скринкасты с Zend Cast... и обломался, первые скринкасте уже устарели. Придётся по старинке, через документацию.
Но, польза от скринкастов есть, иногда попадаются полезные фичи, типа:
define('APPLICATION_PATH',dirname(__FILE__) . '../application/');

пятница, 19 февраля 2010 г.

Разместил проект на googlecode.com

Use this command to anonymously check out the latest project source code:
# Non-members may check out a read-only working copy anonymously over HTTP.
svn checkout http://dev-mark.googlecode.com/svn/trunk/ dev-mark-read-only

Русификация calendar_lang.php в CodeIgniter

Оказалось в русском языке существует несколько вариантов сокращений. Взял, "советский", из википедии, знакомый с детства :)


<?php
$lang['cal_su'] = "Вс";
$lang['cal_mo'] = "Пн";
$lang['cal_tu'] = "Вт";
$lang['cal_we'] = "Ср";
$lang['cal_th'] = "Чт";
$lang['cal_fr'] = "Пт";
$lang['cal_sa'] = "Сб";
$lang['cal_sun'] = "Вск";
$lang['cal_mon'] = "Пнд";
$lang['cal_tue'] = "Втр";
$lang['cal_wed'] = "Срд";
$lang['cal_thu'] = "Чтв";
$lang['cal_fri'] = "Птн";
$lang['cal_sat'] = "Сбт";
$lang['cal_sunday'] = "Воскресенье";
$lang['cal_monday'] = "Понедельник";
$lang['cal_tuesday'] = "Вторник";
$lang['cal_wednesday'] = "Среда";
$lang['cal_thursday'] = "Четверг";
$lang['cal_friday'] = "Пятница";
$lang['cal_saturday'] = "Суббота";
$lang['cal_jan'] = "Янв";
$lang['cal_feb'] = "Фев";
$lang['cal_mar'] = "Мар";
$lang['cal_apr'] = "Апр";
$lang['cal_may'] = "Май";
$lang['cal_jun'] = "Июн";
$lang['cal_jul'] = "Июл";
$lang['cal_aug'] = "Авг";
$lang['cal_sep'] = "Сен";
$lang['cal_oct'] = "Окт";
$lang['cal_nov'] = "Ноя";
$lang['cal_dec'] = "Дек";
$lang['cal_january'] = "Январь";
$lang['cal_february'] = "Февраль";
$lang['cal_march'] = "Март";
$lang['cal_april'] = "Апрель";
$lang['cal_mayl'] = "Май";
$lang['cal_june'] = "Июнь";
$lang['cal_july'] = "Июль";
$lang['cal_august'] = "Август";
$lang['cal_september'] = "Сентябрь";
$lang['cal_october'] = "Октябрь";
$lang['cal_november'] = "Ноябрь";
$lang['cal_december'] = "Декабрь";


/* End of file calendar_lang.php */
/* Location: ./system/language/russian/calendar_lang.php */

среда, 17 февраля 2010 г.

MY_Loader.php расширения загрузчика для подключения "глобальных моделей"


<?php
/**
* MY_Loader Class
*
* Loads global_models
*
* @package CodeIgniter
* @subpackage Libraries
* @author snake.nf
* @category Loader
*/
class MY_Loader extends CI_Loader
{
function MY_Loader()
{
parent::CI_Loader();
}

/**
* Global Model Loader
*
* This function lets users load and instantiate global models.
*
* @access public
* @param string the name of the class
* @param string name for the model
* @param bool database connection
* @return void
*/
function global_model($model, $name = '', $db_conn = FALSE)
{
if (is_array($model))
{
foreach($model as $babe)
{
$this->model($babe);
}
return;
}

if ($model == '')
{
return;
}

// Is the model in a sub-folder? If so, parse out the filename and path.
if (strpos($model, '/') === FALSE)
{
$path = '';
}
else
{
$x = explode('/', $model);
$model = end($x);
unset($x[count($x)-1]);
$path = implode('/', $x).'/';
}

if ($name == '')
{
$name = $model;
}

if (in_array($name, $this->_ci_models, TRUE))
{
return;
}

$CI =& get_instance();
if (isset($CI->$name))
{
show_error('The model name you are loading is the name of a resource that is already being used: '.$name);
}

$model = strtolower($model);

if ( ! file_exists(APPPATH.'../global_models/'.$path.$model.EXT))
{
show_error('Unable to locate the model you have specified: '.$model);
}

if ($db_conn !== FALSE AND ! class_exists('CI_DB'))
{
if ($db_conn === TRUE)
$db_conn = '';

$CI->load->database($db_conn, FALSE, TRUE);
}

if ( ! class_exists('Model'))
{
load_class('Model', FALSE);
}

require_once(APPPATH.'../global_models/'.$path.$model.EXT);

$model = ucfirst($model);

$CI->$name = new $model();
$CI->$name->_assign_libraries();

$this->_ci_models[] = $name;
}

}
?>

CodeIgniter: Multiple Applications и общие модели в приложениях

CodeIgniter Недавно столкнулся с тем, что в приложениях backend и frontend используются общие модели. Пытался найти в CodeIgniter механизм подключения общих моделей для нескольких приложений. В течении дня были просмотрены несколько русско- и англоязычных сообществ и их форумов, множество блогов и т.д.
Все кто используют frontend и backend на CodeIgniter умалчивают о том, как они работают с моделями.
К вечеру уже начал подниматься вопрос о переходе с CodeIgniter на другой фреймворк, в частности на Zend Framework. После беглого осмотра возможностей Zend Framework'a не нашёл нативной возможности подключения внешних моделей. :(

Сегодня решил по глубже посмотреть ядро CodeIgniter, на предмет добавления хака для работы с общими моделями.
Решение вопроса былой найдено в классе ядра CI_Loader.
Собственно вопрос решался изменением двух строк 162 и 180 в которых используются пути к моделям.
Строка 162:
if ( ! file_exists(APPPATH.'models/'.$path.$model.EXT))
Cтрока 180:
require_once(APPPATH.'models/'.$path.$model.EXT)
Первой мыслью было просто заменить пути и не париться, но тогда лишился бы возможности использовать локальные модели для каждого приложения.
Просмотрев документацию по созданию классов ядра, нашёл более простое и нативное решение. Расширение класса ядра CI_Loader.
class MY_Loader extends CI_Loader {

function My_Loader()
{
parent::CI_Loader();
}

function global_model($model, $name = '', $db_conn = FALSE)
{
....
}

}

global_model полностью копирует model за исключением двух строк в которых изменяем пути.
Остаётся положить MY_Loader в libraries обоих приложений и теперь имеем возможность использовать глобальные и локальные модели.

На мой взгляд такой вариант наиболее оптимальным, т.к. это не вност изменения в ядро системы, легко переноситься в другие приложения, не требует лишних телодвижений при обновлении CodeIgniter'а.

Естественно нельзя использовать локальные и глобальные модели с одинаковыми именами. В контроллерах, за исключеним замены $this->load->model('Model_name'), на $this->load->global_model('Model_name') для глобальных моделей, ничего менять не придётся, т.к. мы только расширим Loader.

На практике пока не опробовано, но займусь этим в ближайшее время.