Berry Framework

Фреймворк, в который собраны функции использованные в различных проектах. В том числе: ORM, шаблонизатор и ряд других полезных в хозяйстве вещей.

Скачать
trunk-версия (650 КБ)
Наверх

Запуск Berry

Запуск Berry в виде самостоятельного движка.

Berry можно использовать отдельно или как часть другого движка.

Будем считать, что движок лежит в папке berry. Нужно создать два файла в тойже директории, что и berry: index.php и .htaccess.

index.php

// Выставляем уровень ошибок: выводить все ошибки, исключая notice
error_reporting(E_ALL ^ E_NOTICE);

// Подключаем главный класс
include 'berry/berry/b.php';

// Запускаем Berry
b::init();

// Подключаемся к БД
sql::init(array(
    'username' => 'user',
    'password' => '***',
    'database' => 'localhost/test_berry',
    'prefix' => '',
    'profiler' => true
));

////////////////////////////////////////////////////////////////////////////////

// Делаем класс для страниц
class Page {
    public $title = 'Мой сайт';

    // Обязательное свойство, может не быть public
    public $content;

    // Страница index
    function index($a = 0){
        $this->title .= ' // Из index';
        print_r(array('index' => func_get_args()));
    }

    // Страница show
    function show($id = 0){
        $this->title .= ' // Из show';
        print_r(array('show' => func_get_args()));
    }

    // Все прочии страницы
    function __call($page, $params){
        // Перенаправляем запросы к /ext/ в директорию движка
        if ($page == 'ext')
            if (file_exists($path = file::path($file = b::q(1, 0)))){
                $file = basename(str_replace($file, '', $path)).'/'.$file;
                request::redirect(b::q(0).'/'.$file.'?'.http_build_query($_GET));
            }

        // Ставим 404-ую ошибку
        request::status(404);

        $this->title .= ' // 404';
        print_r(array('__call' => func_get_args()));
    }

    // Показываем
    function __toString(){
        // Подключаем berry/index.phtml, как оснеовной слой
        // и передаём в него все свойства класса
        $output = piles::show('index', (array)$this);

        // Парсим тег <block:* />
        $output = preg_replace('/<block(_|:|-|\.)(.*?)(\s+)?\/>/ie', "join('', html::block('\\2'))", $output);

        // Заменяем УРЛы ~/path на http://example/path
        $output = preg_replace('/(href|src)=("|\'|)\~\/(.*)\\2/iU', '\\1=\\2'.b::q(0).'/\\3\\2', $output);
        $output = preg_replace('/(\W)url(\s+)?\(("|\'|)\~\/(.*)\\3\)/i', '\\1url\\2(\\3'.b::q(0).'/~/\\4\\3)', $output);

        return html::form_persister($output);
    }
}

////////////////////////////////////////////////////////////////////////////////

// Регистрируем УРЛы
b::router(array(
    'home' => new Page
));

////////////////////////////////////////////////////////////////////////////////

echo '<pre>';
b_stat(b::stat());
echo "\n\n";
sql_log();
echo '</pre>';

////////////////////////////////////////////////////////////////////////////////

function echo_r($var){
    $var = func_get_args();

    if (func_num_args() == 1)
        $var = $var[0];

    echo highlight_string(print_r($var, true), true);
}

////////////////////////////////////////////////////////////////////////////////

function b_stat($array, $i = 0){
    foreach ($array as $k => $v){
        if (is_array($v)){
            echo $k.":\r\n";
            b_stat($v, ($i + 1));
        } else {
            echo str_repeat('    ', $i);
            echo $k.': '.$v."\r\n";
        }
    }
}

////////////////////////////////////////////////////////////////////////////////

function sql_log(){
    $profiler = Zend_Db_Table::getDefaultAdapter()->getProfiler();

    if ($queries = $profiler->getQueryProfiles())
        foreach ($queries as $query){
            echo str_repeat('=', 80)."\r\n\r\n";
            echo $query->getQuery()."\r\n";
            echo '-- '.$query->getElapsedSecs()."\r\n\r\n";
        }
}

.htaccess

// На всякий случай
AddDefaultCharset utf-8

<IfModule mod_rewrite.c>
    RewriteEngine on

    # Перенаправляем УРЛы на DirectoryIndex и поручаем обработку Berry
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule . index.php [QSA,L]
</IfModule>

<IfModule mod_php5.c>
    # Магические кавычки та ещё поебень, нах её
    php_value magic_quotes_gpc 0
    php_value magic_quotes_runtime 0
    php_value magic_quotes_sybase 0

    # Заменяем стандартные строковые функции на функции mbstring
    php_value mbstring.func_overload 7
    php_value mbstring.internal_encoding utf-8
    php_value mbstring.script_encoding utf-8
</IfModule>

mbstring является необязательным, но крайне желательным расширением для PHP.

berry/index.phtml

<!DOCTYPE HTML>
<html>
    <head>
        <meta charset="utf-8" />
        <title>${title}</title>

        <block:head />
    </head>

    <body>
        ${content}
    </body>
</html>

Это, собственно, и всё. Berry запущен как самостоятельный движок.