Ну вообще здесь рассказано как сделать свой модуль с примером.
А также есть Руководство для разработчика.

Также привожу пример того как сделать модуль который добавляет доп. поле к товару например.
Вот пример рабочего кода

Нужно дописать модуль, который будет подписываться на хуки системы.
Вот как надо:

1. В папке  modules делаем папку с названием модуля. Например custom
2. В ней создаём папку config
3. В папке config создаём файл file.inc.php с содержимым:

<?php
namespace Custom\Config;

class File extends \RS\Orm\ConfigObject
{
    /**
    * Возвращает значения свойств по-умолчанию
    * 
    * @return array
    */
    public static function getDefaultValues()
    {
        return array(
            //Default - значения
            'name' => t('Собственный модуль'),
            'description' => t('Позволяет расширять функционал сайта'),
            'version' => '1.0.0.0',
            'author' => 'Alexander Zakusilo'
        );
    }      
}


Сохраняем.
4. В папке config создаём файл handlers.inc.php с содержимым:

<?php
namespace Custom\Config;

class Handlers extends \RS\Event\HandlerAbstract
{
    function init()
    {
        $this->bind('orm.init.catalog-product'); //Хук на инициализацию объекта товара.
    }
    
    
    /**
    * Функция подвешивается на инициализацию товара
    * 
    */
    public static function ormInitCatalogProduct(\Catalog\Model\Orm\Product $product)
    {
        $product->getPropertyIterator()->append(array(
            t('Основные'),
           'new_image' => new Type\Image(array(
                        'maxLength' => '255', //Длинна поля
                        'max_file_size' => 10000000, //Максимальный размер загружаемой картинки
                        'allow_file_types' => array('image/pjpeg', 'image/jpeg', 'image/png', 'image/gif'), //Поддерживаемые типы
                        'description' => 'Новая картинка', //Название поля
            )),
        ));
        return $product;
    }
}

Сохраняем.
6.Собственно далее идём в Веб-сайт -> Настройка модулей. Сбрасываем кэш. Должен появится наш модуль. После чего устанавливаем его.
7. Идём Управление -> Настройки системы. Справа ищем "Исправить структуру БД". Нажимаем ждём результат.
Всё. Теперь у товара появится поле с добавлением картинки. Тоже самое действие для всех ORM объектов.

P.S.
Ну и напоследок как же к нему обратится?
В обычном случае в шаблонах это выглядит так

{$product.new_picture}

т.е. $product.алиас поля добавленного
Но в нашем случае используется изображение, поэтому для отображения существует функция:

{$product->__new_picture->getUrl(700, 304, 'xy')} 

{$product->__new_picture->getUrl(ширина, высота, 'метод обрезки')}

Подробнее о системе изображений здесь

Включить можно так Включить отображение ошибок.

Ну а если в двух словах. В корне сайта лежит .htaccess
В нём меняем строку

php_flag display_errors off

на

php_flag display_errors on

Далее идём в админку. Управление -> Настройки системы.
Ставим галку на:

- Всегда проверять шаблоны на предмет модификации
- Подробно отображать информацию об исключениях

Снимаем галку с:
- Включить кэширование данных
- Включить кэширование Smarty

Всё

Добрый день.
Вообщем как-то при продаже маек потребовалось сделать модуль, который выводил бы для фильтров разные в графическом виде. Да так чтобы можно было мышкой ткнуть и выбрался цвет и соответственно применялся фильтр.
Вот решение.
1. Качаем модуль цветов здесь.
2. Закидываем содержимое в папку modules
3. Устанавливаем модуль в админке Веб-сайт -> Настройка модулей. (Ищем Справочник цветов). Ссылка не установлен будет красным цветом
4. После установки обновляем кэш.
5. В меню появится "Цвета" в меню "Магазин".

Алгоритм добавления такой:
1. Создаём характеристику цвет в "Товары"->"Характеристики"
2. Заполняем значения характеристики и  сохраняем. Например Красный Синий и т.д.
3. Идём к редактированию товара и выставляем у него значение характеристики цвет.
4. После заполнения значениями характеристики цвет товаров, идём в "Магазин" -> "Цвета". Нажимаем добавить цвет.
5. Указываем название точно равное Варианту цвета. Например "Красный" и собсвенно указываем красный цвет ему. И т.д. Создав палитру.

Работа с шаблонами:
Теперь необходимо вывести наше решение в фильтрах.
Для этого копируем шаблон из
/modules/catalog/view/blocks/sidefilters/filters.tpl
в

/templates/Ваша тема/moduleview/catalog/blocks/sidefilters/

И меняем его примерно так:

{addjs file="history.min.js" basepath="common"}
{addjs file="{$mod_js}jquery.filter.js" basepath="root"}
{*Подгружаем цвета*}
{modulegetvars name="\Colors\Controller\BlockValues" var="colors"}
{*Подгружаем цвета*}
<form method="GET" class="filters" action="{urlmake f=null bfilter=null p=null}">
    <div class="side-left">
        <div class="overlay"></div>
        <div class="properties" data-base-url="{urlmake f=null p=null}">
        {foreach from=$prop_list item=item}
            {foreach from=$item.properties item=prop}
                {if $prop.title == 'Цвет'}
                    <div class="block block-colors" data-filter-id="{$prop.id}">
                        <div class="separator-text">ЦВЕТ</div>
                        <div class="separator">&nbsp;</div>
                        <ul>
                            {foreach from=$prop->getAllowedValues() key=key item=value}
                                <li {if isset($filters[$prop.id]) && in_array($value, $filters[$prop.id])}class="checked"{/if} data-filter-value="{$value}">
                                    <div class="selected"></div>                            
                                    <a href="?f[{$prop.id}][]={$value}" class="filter color{if $value=='Разноцвет'} multicolor{/if}" style="background-color:{$colors.colors[$value].color}" title="{$value}"></a>
                                    <input type="checkbox" {if is_array($filters[$prop.id]) && in_array($value, $filters[$prop.id])}checked{/if} name="f[{$prop.id}][]" value="{$value}" style="display:none;"/>
                                </li>
                            {/foreach}
                        </ul>
                    </div>
                {else}
                    <div class="block block-select" data-filter-id="{$prop.id}">
                        <div class="separator-text">{$prop.title}</div>
                        <div class="separator">&nbsp;</div>
                        <ul>
                            {assign var=prop_values value=$prop->getAllowedValues()}
                            {if $prop.title=='Скидка %' && $prop_values}
                                {php}unset($prop_values[0]);{/php}
                            {/if}
                            {foreach from=$prop_values key=key item=value name=i}
                                {if !($prop.title=='Скидка %' && $value==0)}
                                    <li {if isset($filters[$prop.id]) && in_array($value, $filters[$prop.id])}class="checked"{/if} data-filter-value="{$value}">
                                        <a class="filter checkbox" href="?f[{$prop.id}][]={$value}">{$value}</a>
                                        <input type="checkbox" {if is_array($filters[$prop.id]) && in_array($value, $filters[$prop.id])}checked{/if} name="f[{$prop.id}][]" value="{$value}" style="display:none;"/>
                                    </li>
                                {/if}
                            {/foreach}
                        </ul>
                    </div>            
                {/if}
            {/foreach}
        {/foreach}  
        <input type="submit" value="Применить" class="onemore submitFilter" style="display:none;">
        </div>
    </div>
</form>

<script>
$(function() {
    
    $(function() {
        $('.side-left').productFilter({
            targetList : '.updatable' //Div в который будет обновлён
        });
    });
    
    $(window).bind('new-content', function() {
        $('.side-left .overlay').hide();
    });    
    
    $('.filter').on('click',function() {
        var wrap = $(this).closest('li');
        $(wrap).toggleClass('checked');
        if ($(wrap).hasClass('checked')){
           $('input',wrap).prop('checked',true).change();  
        }else{
           $('input',wrap).prop('checked',false).change();  
        }
        
        return false;
    });
});
</script>

Сохраняем.
Теперь поправим CSS добавив стили нашим цветам. Например добавив в style.css

.block-colors ul .selected {
    border: 2px solid #dd0080;
    bottom: -2px;
    display: none;
    left: -4px;
    position: absolute;
    right: -2px;
    top: -4px;
}
.block-colors ul .checked .selected {
    display: block;
}

.block-colors ul {
    list-style: none outside none;
    margin: 0 18px;
    overflow: hidden;
    padding: 0;
}
.block-colors ul li {
    background: none repeat scroll 0 0 #ececec;
    float: left;
    height: 24px;
    margin: 5px;
    position: relative;
    width: 24px;
}
.block-colors ul .selected {
    border: 2px solid #dd0080;
    bottom: -2px;
    display: none;
    left: -4px;
    position: absolute;
    right: -2px;
    top: -4px;
}
.block-colors ul .checked .selected {
    display: block;
}
.block-colors ul li a {
    box-shadow: 0 0 3px silver;
    left: -1px;
    position: relative;
    top: -1px;
}

Добрый день.
Во первых копируем шаблон как описано здесь Как вносить изменения в стандартные шаблоны
После чего нужно скопировать шаблон, который отвечает за отображение вида и отредактировать его.
Если это тема "Классическая", то копируем файл

/modules/main/view/blocks/logo/foot_logo.tpl

в папку /templates/ваша тема/moduleview/main/blocks/logo/

После чего открываем этот файл и редактируем.

Всё предельно просто. Вам необходимо поправить шаблон, добавив в него строку со ссылкой.
Для начала ознакомьтесь со статьёй которая разъясняет, как нужно создавать свои шаблоны Создние шаблона.

Это необходимо потому, что те шаблоны, которые идут в поставке по умолчанию могут обновляться и соотвественно могут быть перезаписаны.

сам шаблон с темой лежит в /templates/ и называется default
Скопируйте скопируйте эту папку и переименуйте. Ну например в default2. Внутри также лежит файл .xml с названием темы оформления. Откройте его и тоже переименуйте в нём название темы.
Далее заходим в админ. панель.:

Веб-сайт -> настройки сайта

Выбираем вновь созданный шаблон и сохраняем его.
Всё, теперь можно работать с шаблоном, не опасаясь, что его подменят во время обновления сайта.
Сам шаблон находится в папке:

корень сайта/modules/catalog/view/blocks/topproducts/top_products.tpl

Его мы копируем в папку:

корень сайта/templates/название нового шаблона/moduleview/catalog/blocks/topproducts/

Далее открываем этот файл:
После строки

{foreach from=$products item=product}

Можно добавить следующую строку:

<a href="{$router->getUrl('shop-front-cartpage', ["add" => $product.id])}" class="cartButton addToCart noShowCart" title="В корзину">&nbsp;</a>

Если Вам необходимо, чтобы был полный спектр всех учтённых условий, то в начале файла добавляем:

{assign var=shop_config value=ConfigLoader::byModule('shop')}
{assign var=check_quantity value=$shop_config->check_quantity}

А после перебора товаров:

{if $shop_config}
      {if $product->shouldReserve()}
          <a href="{$router->getUrl('shop-front-reservation', ["product_id" => $product.id])}" class="cartButton inDialog reserv" title="Заказать">&nbsp;</a>
      {else}        
           {if $check_quantity && $product.num<1}
                 <span class="cartButton unobt" title="Нет в наличии">&nbsp;</span>
           {else}
                 <span data-href="{$router->getUrl('shop-front-multioffers', ["product_id" => $product.id])}" class="cartButton showComplekt inDialog" title="В корзину">&nbsp;</span>
                  <a href="{$router->getUrl('shop-front-cartpage', ["add" => $product.id])}" class="cartButton addToCart noShowCart" title="В корзину">&nbsp;</a>
            {/if}
       {/if}
{/if}

Также не забывайте сбрасывать, или отключать кэш Readyscript