Berry

Небольшой фреймворк, в который собраны функции использованые в различных проектах.

Надо заметить, что система контроллеров развита минимальна, а системы прав нет вовсе, так как первичной целью было подключение Berry к сторонним проектам и подгрузка дополнительных внешних библиотек (оттого и несколько неочивидное именование и расположение классов в папке lib/), а в таких ситуациях больше нужны различные помощники, хорошая модель и приятное представление.

Модель

Например, написать модуль для OpenCart не сложно, если разобраться что уже есть в движке, как выводит представление и как используется модель. Проще подключить Berry и использовать её в качестве основы для моделей и представления.

$query = $this->db->query("
    SELECT * FROM " . DB_PREFIX . "category c
    LEFT JOIN " . DB_PREFIX . "category_description cd ON (c.category_id = cd.category_id)
    WHERE
        c.parent_id = '" . (int)$parent_id . "' AND
        cd.language_id = '" . (int)$this->language->getId() . "'
    ORDER BY c.sort_order
");

Чуть выше листинг кода модели OpenCart. Кстати, в оригинале он весь в кучку. В склейке текста с константами и переменными приведёнными к типу очевидным раздражителем является всё. :) Не проще ли писать:

$query = sql::from('category')->
    select('*', 'cDesc.*')->
    where('parent_id = ?d', $parent_id)->
    where('cDesc.language_id = ?d', $this->language->getId())->
    order_by('sort_order')->
    fetch();

Имя таблицы category_description легко переименовать в симпатичный cDesc не трогая саму таблицу.

Представление

Один из самых простейших шаблонов OpenCart:

<?php if ($reviews) { ?>
<?php foreach ($reviews as $review) { ?>
<div style="background: #F7F7F7; border: 1px solid #DDDDDD; padding: 10px; margin-bottom: 10px;"><b><?php echo $review['author']; ?></b> |
<img src="catalog/view/theme/default/image/stars_<?php echo $review['rating'] . '.png'; ?>" alt="<?php echo $review['stars']; ?>" /><br />
  <?php echo $review['date_added']; ?><br />
  <br />
  <?php echo $review['text']; ?></div>
<?php } ?>
<div class="pagination"><?php echo $pagination; ?></div>
<?php } else { ?>
<div style="background: #F7F7F7; border: 1px solid #DDDDDD; padding: 10px; margin-bottom: 10px;"><?php echo $text_no_reviews; ?></div>
<?php } ?>

И его альтернатива для Berry:

<? if ($reviews) { ?>
    <? foreach ($reviews as $review){ ?>
        <div style="background: #F7F7F7; border: 1px solid #DDDDDD; padding: 10px; margin-bottom: 10px;">
            <b>${review.author}</b> |
            <img src="catalog/view/theme/default/image/stars_${review.rating}.png" alt="${review.stars}" /><br />
            ${review.date_added}<br /><br />
            ${review.text}
        </div>
    <? } ?>

    <div class="pagination">${pagination}</div>
<? } else { ?>
    <div style="background: #F7F7F7; border: 1px solid #DDDDDD; padding: 10px; margin-bottom: 10px;">${text_no_reviews}</div>
<? } ?>

Текста меньше, подсветка редактора не портится, доступ к переменным в разы проще. А короткие теги — часть шаблонизатора, а не PHP, следовательно не будет никаких проблем с не-PHP тегами вроде <?xml ?> и его вариациями.

Piles (шаблонизатор Berry так зовут) в отличии от других шаблонизаторов практически чистый PHP-way  — соблюдает «путь» того PHP, который создавался для внедрения в HTML. Разница лишь в том, что HTML-теги могут взаимодействовать с PHP имея возможность быть его частью — функциями.