среда, 31 октября 2012 г.

Изменения и Дополнения

Прошёл почти год, RC был использован во многих проектах, было много изменений, была практически написана новая версия.
А именно:
Событийная модель  была переписана с использованием лямбда ф-ий, также лямбды используются в классе кеширования, для которого теперь можно написать любой модуль, как для работы с файлами, так и с memcached и вообще чем угодно ...
Шаблоны выведены в отдельный класс.
Введена полная поддержка REST

Сорцы находятся здесь

CACHE

Инициализация и настройка

CACHE::init('frontend');
CACHE::$enabled = true;

/* rc/config/cache.php */
$cache = array(
    'modules' => array(
      'frontend' => array(
        'enabled' => false,
        'adapter' => 'Files'
      )
    ),

'classes' => array(
    '1min' => 60,
    '5min' => 300,
    '10min' => 600,
    '30min' => 1800,
    '1h' => 3600,
    '2h' => 7200,
    '6h' => 3600*6,
    '12h' => 3600*12,
    '24h' => 3600*24
    )
);

В шаблоне

<? if(CACHE::start('cache for 24 hours, '24h')): ?>
      HTML <?php  echo 'php';  ?>
<? endif; CACHE::end(); ?>

В моделях и контроллерах

$fff = function () use ($id, $place_id) {
    $e = new events();
    $p = new places();
    $event_item = $e->get($id, url::$lang);
    $event_item['place'] = $p->get($place_id, url::$lang);
    return $event_item;
};


$event_item = CACHE::process("EVENTS-show $place_id $id", '30min', $fff);

Пример использования шаблонов


function register($params) {
    $tparams = array();
    if(isset($_POST['email'])) {
      $data = array('email' => $_POST['email'], 'pass' =>  md5($_POST['pass']));
      if($user_id = USER::register($data)) {
        USER::force_login($user_id);
        redirect::go ('/'.USER::get_field('email'));
      }
      else {
        $tparams['err'] = 'Internal error';
      }
    }
    VIEW::template('register', $tparams, 'content');
    VIEW::display('main', array('method' => 'register'));

}

Event manager

events::on('event',
    function($param) {
      echo "The event has been triggered with param '$param'";
    });
//...
events::trigger('event', 'xxx');

USER class

USER::init(new userAdapterDB(new users()));
//...
if($user_id = USER::register($data)) {
    USER::force_login($user_id);
    redirect::go ('/'.USER::get_field('email'));
}

if(USER::login($_POST['email'], $_POST['pass']))
    redirect::go ('/'.USER::get_field('email'));

$user_id = USER::get_pk();

/*   rc/lib/USER/adapters/DB.php   */

public function login($email, $password) {
  //...
}

public function register($data) {
    $this->user_model->insert($data);
    return $this->user_model->get_last_id();
}

REST

$routes['todo/<:num>']['?GET'] = 'todos.get_item';
$routes['todo/<:num>']['?PUT'] = 'todos.edit';
$routes['todo']['?POST'] = 'todos.add';
$routes['todo/<:num>']['?DELETE'] = 'todos.del';


четверг, 5 января 2012 г.

Дополнения

Событийная Модель
Всё это добро я назвал EventManager, реализует паттерн observer и позволяетсоздавать события в разных местах фр., но в тоже время обрабатывать их (события) в одном определённом месте - папка protected/events. В этой папке находятся обозреватели (observers), они загружаются автоматически (средствами PHP). Каждый класс обозревателя имеет суффикс Observer (например testObserver), каждый такой класс наследуется от класса Observer . Название метода совпадает с названием события.

Запуск события осуществляется ф-ей:
function trigger_event($slot, $event, &$params)
$slot - слот событий
$event - название события
$params - параметры, передаваемые ссылкой

Например, если сработало событие trigger_event('test', "test_event", $params); , тогда в папке protected/events в файле test.php в классе class testObserver сработает метод test_event .

class testObserver extends Observer {
    public function test_event(&$params) {
      //....     
      $params['1'] = 'New param value';
    }
}

Это был обозреватель по умолчанию, также можно назначить сколько угодно пользовательских обозревателей (унаследованных от customObserver), при этом нужно соблюдать 2 условия:
1)Избегать конфликта имён классов
2)Обозреватель должен быть создан до срабатывания события

class test_observer extends customObserver {
  public function test_event(&$params) {
    print "Inside custom observer";
    $params['x'] = '
New param value';
  }
}
CACHE
Написал небольшой, простенький модуль для кеширования
cache::start(); - начать кеширование
public static function start($time = 10, $name = '')
  $time - промежуток кеширования (секунды)
  $name - название файла для кеша (по умолчанию - хеш из URL)
cache::end(); - закончить кеширование
Запускается всё это дело из frontController
Файлы хранятся в папке protected/cache

Ещё один вариант использования класса cache:

//Проверяем, закеширован ли 'translate',
//а также возраст кеша - меньше часа
if(cache::cache_exists_time('translate', 3600)) {
    //Загружаем
    $translate = cache::cache_load('translate');
}
else {

    //Загружаем данные в переменную $translate обычным способом
    //...

    //Сохраняем кеш
    cache::cache_save('translate', $translate);
}