Форум пользователей Impera CMS
Impera CMS - отличный движок для лёгкого создания интернет магазина.
Обладает невероятным количеством функций, необходимых в онлайн торговле.

Следить
Главная
01:34
26 янв
#
?
написал:

Сегодня я поставлю относительно простое задание, на мой взгляд. Однако в нём есть тонкое условие, справиться с которым сможет лишь опытный верстальщик. Поэтому если сомневаетесь в собственных способностях, даже не отвечайте. Остальных приглашаю к участию.

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

Первая часть: сверстать мини карточку

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

В качестве фундамента будущего шаблона мы взяли одну из стартовых тем, собранных за минувший год практикующими вебмастерами для современного сайтостроительного движка Impera CMS. Особенность подобных стартовых сборок в том, что они предельно минифицированы, обладают простым исходным кодом и легко масштабируются при необходимости нарастить функционал.

Структуру папок в получившейся у нас заготовке шаблона (мы назвали его FashionWear) покажу на всякий случай, начиная от корня сайта:

  • design
    • FashionWear
      • css
      • fonts
      • html
        • abstract
        • email
        • modules
        • sms
      • images
        • backgrounds
        • demo
        • icons
      • js
      • video

Здесь обозначенные папки содержат: стили сайта, подключаемые на клиентской стороне шрифты, разметку макетов стандартных и абстрактных страниц или отдельных модулей (в том числе емейл-писем и СМС-сообщений), картинки используемые в шаблоне для фона или прочего, всякие клиентские скрипты, видеофайлы используемые в шаблоне для фона или других целей.

Так вот в нашей заготовке шаблона есть файл html/modules/product.htm, с помощью которого выводятся все мини карточки товаров во всевозможных товарных списках, например когда товары показаны на странице категории, или бренда, или в результатах поиска.

Вам как раз и предстоит сверстать этот маленький файл (модуль) шаблона. А упоминавшееся выше тонкое условие заключается в том, что вёрстка должна состоять из как можно меньшего числа тегов и подходить сразу под все 6 видов карточек. Грубо говоря, один и тот же модуль вызывается 6 раз подряд, принимая на входе некую переменную с данными очередного товара, и каждый раз этот модуль выводит очередной вид карточки.

Жду ваших предложений!

15:13
26 янв
#
?
написал:

Я обсудил с представителем заинтересованной стороны некоторые изменения в макете карточки товара. Прошу исполнителя реализовать эти исправления в конечной вёрстке упоминавшегося выше модуля. Все изменения отмечены на следующем снимке.

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

Учтите Ленивая загрузка уже реализована в выбранной нами стартовой теме с помощью маленького скрипта js/lazy-loading.js.

Поэтому вам остаётся лишь придумать в шаблоне картинку images/loading-image.gif для процесса загрузки и запрограммировать правильный стиль в карточке товара, чтобы индикатор загрузки исчезал и заменялся оригинальной фотографией после успешной загрузки или сменялся изображением images/no-photo.png в случае неудачи.

А для программирования стиля загрузки скриптом используются следующие селекторы: img[data-lazy], .loaded, .failed.

Изменение №2 касается ссылки на автора снимка. Дело в том, что админпанель Impera CMS позволяет для любой фотографии, загружаемой в товар, указать свой альтернативный текст (название снимка), уточняющее описание и ссылку. И вот если менеджер записал название и ссылку, оно должно появиться в карточке товара сбоку от фотографии.

Изменения №3, №4, №5 касаются замены указанных текстовых элементов ссылкой на страницу бренда, к которому прикреплён этот товар, текущей ценой товара и статической надписью "действует до понедельника".

Изменение №6 - сделать указанный элемент ссылкой на страницу товара. Причём подсветка всех ссылок карточки товара при наведении курсора или нажатии пусть будет красного цвета.

23:02
26 янв
#
?
написал:

Можна увидеть сперва блок кода? Как на странице вызываетса модуль карточки.

08:53
27 янв
#
?
написал:

Модуль карточки товара html/modules/product.htm последовательно вызывается нужное число раз из модуля списка товаров html/modules/products.htm, который получает на входе список постов (массив товаров) и перечисляет в цикле элементы списка.

В момент очередного перечисления и происходит вызов модуля карточки товара. Под вызовом понимается обычное подключение файла, то есть воображаемая вставка другого HTML-файла на место текущего короткого тега.

Чтобы стало понятнее, я покажу полный исходный код модуля списка товаров и обозначу точку вызова мини карточки таким цветом.

Исходный код файла html/modules/products.htm

Давайте сразу договоримся, что финальные исходные коды файлов шаблона во всех постах ниже я буду печатать на таком фоне как сейчас показано следом за этим параграфом, а разные фрагменты кода для целей обучения - на сереньком фоне. Ещё один важный момент: скорее всего шаблон будет периодически усовершенствоваться разными мастерами в будущем, поэтому финальные коды некоторых его файлов, распечатанные здесь, могут быть старее, то есть отличаться в худшую сторону от кодов в общедоступном архиве шаблона.

{* <!-- ====================================================================
                                                                           |
    Fashion Wear theme                                                     |
        Copyright 2020 Impera CMS > www.imperacms.com                      |
        Licensed under CC BY 4 > www.creativecommons.org/licenses/by/4.0   |
                                                                           |
    --------------------------------------------------------------------   |
                                                                           |
    The module for displaying product posts                     [STEP 1]   |
                                                                           |
    --------------------------------------------------------------------   |
    Input parameters:                                                      |
        $products = list of posts                                          |
                                                                           |
===================================================================== --> *}{strip}

    {* <!-- ================================================================
    |                                                                      |
    |   Display posts                                                      |
    |   ----------------------------------------------------------------   |
    |   If the list exists                                                 |
    |       Store the $item variable                                       |
    |           Enumerate product posts                                    |
    |               Replace current post with Demo data (at Demo mode only)|
    |               Display current post                                   |
    |           Display pages navigator block                              |
    |       Restore the $item variable                                     |
    |                                                                      |
    ================================================================= --> *}

        <section class="listing catalog">
            {ifProducts}
                {pushItem}
                    {enumProducts}
                        {modDemoProduct}
                        {modProduct}
                    {/enumProducts}
                    {pagination}
                {popItem}
            {/ifProducts}

            {* <!-- ========================================================
            |                                                              |
            |   Otherwise notify about NO ITEMS                            |
            |                                                              |
            ========================================================= --> *}

            {ifNotProducts}
                <div class="msg noitems">
                    {polyglot}
                        [!-- Products Not Found text --]
                    {/polyglot}
                </div>
            {/ifNotProducts}
        </section>

Схематический вид

Вот такой модуль с простым исходным кодом как раз и "рисует" часть страницы, отведённой под список товаров. Логически модуль разделён на две ветви.

Ветвь 1 При наличии на входе непустого списка товаров данный модуль выведет ровно столько мини карточек, сколько содержится элементов во входном списке. И завершит список блоком пагинации (предполагается, что содержимое блока уже сгенерировано с помощью модуля html/navigation.htm и его осталось только вывести).

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

Результат работы модуля выглядит схематически так.

14:10
29 янв
#
?
написал:

Напомню еще раз про языки сайта. Я указал разрабу на проблему год назад, все как было так осталось на месте.

Итак рассмотрим вот приям на примере кода выше. Вы обернули в полиглотный тег псевдоимя переводимой строки.

{polyglot}
    [!-- Products Not Found text --]
{/polyglot}

Теперь Вы наверное запишете переводы в полиглотную базу html/modules/polyglot.htm для всех локалей на которых хотите иметь перевод сайта. Допустим английский и русский, EN и RU.

<def>
    [!-- Products Not Found text --]
    <hr class="en"> Products not found!
    <hr class="ru"> Товары не найдены!
</def>

Все вроде работает. Но что вдруг я хочу вернуть сайт на единственный дефолтный язык, для чего удалю полиглотную базу? Вместо ожидаемых английских выражений мой сайт станет выводить Ваши псевдоимена.

Я считаю что надо в полиглотном теге сразу писать выражение на дефолтном языке. Так.

{polyglot}
    Products not found!
{/polyglot}

А в полиглотной базе писать перевод на используемые локали кроме дефолтной.

<def>
    Products not found!
    <hr class="ru"> Товары не найдены!
</def>
21:32
30 янв
#
?
написал:

Я поняла мне кажется как устроена тема этой CMS.

Дмитрий, давайте я сверстаю карточку. Только подскажите теги. Я не знаю как вывести из CMS фото товара, альтернативный текст, ссылку, название бренда, ссылку, цену товара, ссылку.

И мне понадобится тег для номера итерации цикла. Вид карточки менять же согласно номеру?

22:33
30 янв
#
?
написал:

Ну, конечно, все необходимые теги подскажу. Даже рассмотрю использование отдельных тегов с углублением в некоторые частные случаи, а каждый впервые названный тег выделю таким цветом, и далее - уже обычным цветом.

Начнём с нумерации шагов цикла

Когда внутри библиотеки ShortCodes Helper происходит перечисление некоторого массива записей, текущий элемент всегда попадает в неявную переменную $item, а индекс элемента и номер текущего шага в переменные $itemIdx и $itemNum соответственно. Обратиться к ним из шаблона можно некрасиво - напрямую через имена переменных, или красиво - с помощью следующих коротких тегов.

<div class="card-{idx} product">
    [... здесь тело карточки ...]
</div>

или

<div class="card-{num} product">
    [... здесь тело карточки ...]
</div>

Замечу, что индекс и номер - не одно и то же. Всё зависит от ассоциативности перечисляемого массива. Но в большинстве случаев это два числа, где индекс элемента на единицу меньше номера шага.

Подобное использование нумерующего тега в вымышленном классе контейнера мини карточки позволит вам сверстать карточку в единственном экземпляре, а внешний вид 6 карточек менять с помощью правил в стилях, определяя каждое правило через селектор .card-NN кратный по модулю 6. Ведь карточки различаются лишь фоном и относительным положением внутренних элементов.

Вывод фотографий товара

Поскольку в товар может быть загружено более одного снимка, а для отображения карточки нам нужна только миниатюра, то мы можем перечислить фотографии одну за другой и вывести URL-ы их миниатюр вот так.

{enumPhotos}
    <figure class="image thumbnail">
        <img src="{thumb}" alt="">
    </figure>
{/enumPhotos}

Однако дизайн каждой из 6 мини карточек предполагает лишь одну фотографию. Следовательно, мы должны вывести миниатюру только первой фотографии и затем сразу прервать перечисление вот так.

{enumPhotos}
    <figure class="image thumbnail">
        <img src="{thumb}" alt="">
    </figure>
    {out}
{/enumPhotos}

Теперь вспомним о необходимости поддержать технологию ленивой загрузки изображений. Следовательно, мы должны вывести на изображении некий индикатор загрузки images/loading-image.gif, который заранее разместим внутри нашей темы, а миниатюру фотографии мы должны указать в специальном атрибуте data-lazy. Упоминавшийся в верхних постах скрипт ленивой загрузки сам подхватит нужный атрибут и сделает всю работу как только картинка попадёт на экран.

{enumPhotos}
    <figure class="image thumbnail">
        <img src="{theme}images/loading-image.gif" data-lazy="{thumb}" alt="">
    </figure>
    {out}
{/enumPhotos}

Ссылка на автора

Такая ссылка - это просто элемент вежливости, тем более на сайтах моды. Для примера вынесем её за пределы контейнера фотографии.

{enumPhotos}
    <figure class="image thumbnail">
        <img src="{theme}images/loading-image.gif" data-lazy="{thumb}" alt="">
    </figure>
    <a data-href="{altUrl}" class="link credits" target="_blank">
        {alt}
    </a>
    {out}
{/enumPhotos}

Ссылка записана с атрибутом target, уводящим в другое окно, чтобы сохранить открытой текущую страницу. Также использован атрибут data-href в целях SEO - ведь это посторонняя ссылка. Если вдруг впервые слышите подобную аббревиатуру, тогда расшифрую: SEO - специальная оптимизация вёрстки и текстового контента сайта для улучшения позиций в результатах органической выдачи поисковых систем.

Вывод бренда товара

Здесь мы предполагаем, что названия брендов не следует переводить на другие языки сайта, поэтому внутри ссылки не используем тег полиглота.

<a data-href="{itemBrandUrl}{htmlLangMarker}" class="link brand">
     {itemBrand}
</a>

Заметьте также, что к ссылке на страницу бренда мы добавляем маркер текущего языка сайта с помощью соответствующего короткого тега. А сама ссылка записана в атрибуте data-href для SEO целей - ведь это не основная ссылка в карточке.

Вывод категории товара

Здесь всё так же как для бренда, только название категории предполагаем переводить на другие языки, поэтому внутри ссылки используем тег полиглота.

<a data-href="{itemCategoryUrl}{htmlLangMarker}" class="link category">
     {polyglot}
         {itemCategory}
     {/polyglot}
</a>

Вывод цены

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

{enumVariants}
    <div class="price" data-currency="{sign}">
        {price}
    </div>
    {out}
{/enumVariants}

Хочу обратить ваше внимание, как размещён знак валюты - в атрибуте data-currency контейнера цены. Это позволит вам с помощью стилей выводить знак справа или слева от цены, определяя такое правило через селектор html[lang="##"], потому что в разных странах есть сложившиеся традиции обозначения цены.

Ссылка на страницу товара

<a href="{url}{htmlLangMarker}" class="link product">
     {polyglot}
         [!-- Shop Now label --]
     {/polyglot}
</a>

Разумеется, в базу данных полиглота (это файл html/modules/polyglot.htm) мы должны записать переводы данной метки на все языки нашего сайта. Например, шаблон предполагаем выпустить на трёх языках: английском, русском, украинском. Поэтому пишем перевод метки так.

<def>
    [!-- Shop Now label --]
    <hr class="en"> Read More
    <hr class="ru"> Подробнее
    <hr class="uk"> Докладнiше
</def>
21:57
04 фев
#
?
написал:

Я сверстала. Карточка получилась немного не по дизайну, с изменениями от себя. Дмитрий, номрально?

  • Шрифт заменила Roboto Slab
  • "Действует до понедельника" заменила названием товара
  • Бренд центрировала и уменьшила кегль шрифта
  • Вывела все фотографии с переключателем
  • Вывела краткий текст товара

Дайте еще 2 дня, подверстаю фоны карточек. Сейчас только карточка 1 имеет фон.

01:16
05 фев
#
?
написал:

Ять!!!! повзрослому пьянка если началась, я заверстаю логин и авторизацию давай Димыч. 30+30 баксов за обе страницы прошу. То меня один клиент с нового года сайт просит для взрослых утех поднять с админкой. Аж задолбал нетирпением, что тупее opencart для сайта ничего не предложил. А тут шаблончик красотища я представляю вроде наклевывается.

08:01
05 фев
#
?
написал:

Супер! Вы настоящий мастер, Марина!

Кому интересно уже сейчас видеть что получилось, показываю анимированный скриншот мини карточки. Заметьте, на пинах слайдов есть подсветка красным контуром при наведении на пин и красной точкой внутри пина при его выборе. Замечательно и то, что Марина реализовала поддержку работы пальцем, мышкой и с клавиатуры (клавиша табуляции - для перемещения по кнопкам "Смотреть", клавиши влево-вправо - для переключения слайдов в текущей карточке).

И код модуля, получившийся у Марины, это пример чистой вёрстки.

Исходный код файла html/modules/product.htm

{* <!-- ====================================================================
                                                                           |
    Fashion Wear theme                                                     |
        Copyright 2020 Impera CMS > www.imperacms.com                      |
        Licensed under CC BY 4 > www.creativecommons.org/licenses/by/4.0   |
                                                                           |
        Designed by PikiSuperStar > www.freepik.com/pikisuperstar          |
        Assembled by PriM@ry > Prilepa Marina                              |
                                                                           |
    --------------------------------------------------------------------   |
                                                                           |
    The module for displaying miniature of the product post     [STEP 1]   |
                                                                           |
    --------------------------------------------------------------------   |
    Input parameters:                                                      |
        $item = post object                                                |
                                                                           |
===================================================================== --> *}{strip}

    {* <!-- ================================================================
    |                                                                      |
    |   Set a card number (by modulus of 6) to the $value variable         |
    |                                                                      |
    ================================================================= --> *}

        {setValue}
            {num max=6}
        {/setValue}

    {* <!-- ================================================================
    |                                                                      |
    |   Set a card ID (random) to the $type variable                       |
    |                                                                      |
    ================================================================= --> *}

        {setType}
            product-card-{randomId}
        {/setType}

    {* <!-- ================================================================
    |                                                                      |
    |   Set a design through class "design-CARDNUMBER" (by modulus of 6)   |
    |                                                                      |
    ================================================================= --> *}

        <div class="item product design-{value}">
            <div class="wrapper">
                <img class="info" src="{theme}images/icons/information.svg" alt="" />

                {* <!-- ====================================================
                |                                                          |
                |   Thumbnails slider                                      |
                |   ----------------------------------------------------   |
                |   Enumerate the post images with "enabled" state         |
                |       (internal variables:                               |
                |           $imageNum = number of the iteration            |
                |           $image = data of the current image             |
                |       )                                                  |
                |                                                          |
                ===================================================== --> *}

                {enumThumbnails}

                    {* <!-- ================================================
                    |                                                      |
                    |   Thumbnail pin                                      |
                    |                                                      |
                    ================================================= --> *}

                    <input id="{type}-{$imageNum}" name="switch-{type}" type="radio" {activeFirst} />
                    <label class="pin" for="{type}-{$imageNum}"></label>

                    {* <!-- ================================================
                    |                                                      |
                    |   Thumbnail                                          |
                    |                                                      |
                    ================================================= --> *}

                    <figure class="image thumbnail">
                        <img src="{theme}images/loading-image.gif" data-lazy="{$image.thumb}" alt="" />
                    </figure>

                    {* <!-- ================================================
                    |                                                      |
                    |   Credits link if assigned                           |
                    |                                                      |
                    ================================================= --> *}

                    {if $image.alt}
                        <a data-href="{$image.link}" class="link credits" target="_blank" tabindex="-1">
                            {$image.alt|escape}
                        </a>
                    {/if}
                {/enumThumbnails}

                {* <!-- ====================================================
                |                                                          |
                |   Background                                             |
                |   ----------------------------------------------------   |
                |   Minify code (strip to one-line)                        |
                |       Insert a source code of related SVG file           |
                |           (parameters:                                   |
                |               type = type of file                        |
                |               name = path + file name (by modulus of 6)  |
                |           )                                              |
                |                                                          |
                ===================================================== --> *}

                <figure class="image background">
                    {censor change=[ '~[ \t]*[\r\n][ \t\r\n\s]*~u' => ' ' ]}
                        {printTextFile
                              type = svg
                              name = "backgrounds/card-$value.svg"}
                    {/censor}
                </figure>

                {* <!-- ====================================================
                |                                                          |
                |   Link to category                                       |
                |                                                          |
                ===================================================== --> *}

                <a data-href="{itemCategoryUrl}{htmlLangMarker}" class="link category" data-brand="{itemBrand}" tabindex="-1">
                    <span class="value">
                        {polyglot}
                            {itemCategory}
                        {/polyglot}
                    </span>
                </a>

                {* <!-- ====================================================
                |                                                          |
                |   Link to brand                                          |
                |                                                          |
                ===================================================== --> *}

                <a data-href="{itemBrandUrl}{htmlLangMarker}" class="link brand" tabindex="-1">
                    <span class="value">
                        {itemBrand}
                    </span>
                </a>

                {* <!-- ====================================================
                |                                                          |
                |   Product price                                          |
                |                                                          |
                ===================================================== --> *}

                {enumVariants}
                    <div class="price">
                        <span class="label">
                            {polyglot}
                                [!-- Price label --]
                            {/polyglot}
                        </span>

                        <span class="value" data-currency="{sign}">
                            {price}
                        </span>
                    </div>

                    {out}
                {/enumVariants}

                {* <!-- ====================================================
                |                                                          |
                |   Product name                                           |
                |                                                          |
                ===================================================== --> *}

                <h3 class="name">
                    {polyglot}
                        {name}
                    {/polyglot}
                </h3>

                {* <!-- ====================================================
                |                                                          |
                |   Product short text                                     |
                |                                                          |
                ===================================================== --> *}

                <div class="annotation">
                    {polyglot}
                        {annotation}
                    {/polyglot}
                </div>

                {* <!-- ====================================================
                |                                                          |
                |   Link to product page                                   |
                |                                                          |
                ===================================================== --> *}

                <a href="{url}{htmlLangMarker}" class="link product">
                    {polyglot}
                        [!-- Shop Now label --]
                    {/polyglot}
                </a>
            </div>
        </div>

Языковые версии

Так как в исходном коде модуля Марины упоминались две текстовые "константы", следует сразу же показать, как в базе данных полиглота html/modules/polyglot.htm выполнены переводы этих констант на все языки: английский, русский, украинский, - которые поддерживает наш шаблон сайта.

<def>
    [!-- Price label --]
    <hr class="en"> Price
    <hr class="ru"> Цена
    <hr class="uk"> Ціна
</def>

<def>
    [!-- Shop Now label --]
    <hr class="en"> View
    <hr class="ru"> Смотреть
    <hr class="uk"> Дивитися
</def>

Олег из Санкт-Петербурга напоминал выше своё видение ситуации с применением "констант" для обеспечения языковых версий сайта. Я считаю, это всего лишь стиль мультиязычной разметки шаблона, и склоняюсь к варианту, когда переводы всех строк интерфейса собраны в одном файле и легко могут быть допереведены на другие языки хоть все сразу, хоть по одной.

Чтобы стало понятно, как это делать, давайте переведём одну строку интерфейса, например на испанский язык (его код - es). Вот что у нас получится:

<def>
    [!-- Price label --]
    <hr class="en"> Price
    <hr class="ru"> Цена
    <hr class="uk"> Ціна
    <hr class="es"> Precio
</def>
13:03
05 фев
#
?
написал:

Порадовала соотечественница, не просто же делать качественную верстку. Беларусь на высоте!

14:01
06 фев
#
?
написал:

Марина, я внёс следующую поправку по загрузке фона карточки в вашем модуле: если среди картинок шаблона присутствует PNG-фон, значит выбрать его, иначе выбрать SVG-фон. Прошу учесть и готовить фоновые изображения в формате Portable Network Graphics (PNG). Для первого вида карточки вы уже изготовили подложку в формате Scalable Vector Graphics (SVG) - пусть остаётся, но остальные делайте в PNG.

Ведь с целью проверки адаптивности я открыл вёрстку на разных мобильных устройствах. Везде выглядит отлично, кроме узкого экрана с шириной до 480 пикселей. Там проявляется дефект: карточка немного ужимается краями экрана, становясь прямоугольной, а векторный фон продолжает сохранять квадратную форму и низ карточки оголяется.

При попытке стилевым правилом растянуть SVG-фон на всю высоту карточки, он всё равно сохраняется квадратным, просто центрируется по вертикали - в результате равномерно оголяет верх и низ карточки. Выглядит отвратительно. Если же фон заменить PNG-изображением, то дефект исчезает - фон становится резиновым.

16:21
06 фев
#
?
написал:
Pachulli JR, Prima-Yug Service, Таганрог написал: я заверстаю логин и авторизацию давай

Я не против делегировать это задание вам, однако если уж верстать формы входа на сайт, то в рамках дизайна близкого к фирменному.

Вторая часть: сверстать страницы с формами ввода

Вот такой графический макет есть, опять от дизайнера из сообщества Freepik. Попробуйте реализовать. Только цвет для левой части подберите #ffad1a - как выше на первой мини карточке товара, и скруглённые углы формы сделать острыми, и флажок перед кнопкой замените на "даю согласие на обработку моих данных", и ссылку восстановления пароля перенесите в правый нижний угол формы, и шрифт подобрать такой же как подобрала Марина для карточек.

Такой же будет и форма регистрации пользователя, но заменить цвет левой части на #54bbfc - это фон третьей карточки выше, заменить заголовок формы и набор полей.

Такой же будет и форма восстановления пароля, но заменить цвет левой части на #ff7c6b - это фон второй карточки выше, заменить заголовок формы и набор полей.

Обратите внимание, что слева в центре присутствует демонстрационный логотип, который будет выводиться поверх разноокрашенных форм, следовательно изготовить его необходимо в формате SVG или PNG, белым цветом на прозрачной подложке. Лучше сделать логотип в формате PNG и сохранить как файл images/favicon.png, так как в общем макете html/index.tpl нашей заготовки шаблона этот ярлыковый файл прописан в качестве иконки для закладки любой страницы сайта.

12:05
07 фев
#
?
написал:

Привет. Я сверстал уже макеты страниц логин, регистрация, восстановить пароль. Без внутренней части форм. Формы будт отдельными модулями в шаблоне.

Отправил готовые макеты тебе не мейл для проверки. Дополнительно макет обратная связь сверстал. Внутренние части доверстаю на днях.

15:46
07 фев
#
?
написал:

Спасибо! Ваши макеты проверил, пока что всё отлично. Жду отсутствующие модули форм:

  • html/modules/login.htm
  • html/modules/remind.htm
  • html/modules/registration.htm
  • html/modules/feedback.htm

А сейчас публикую исходные коды вёрстки Михаила - кому интересно узнать что у него получилось с макетами упоминавшихся страниц.

Исходный код файла html/login.htm

Примечательно, что сразу реализована возможность работы формы в AJAX-режиме, то есть без перезагрузки страницы. За подобный сценарий отвечает первый блок кода. Однако по умолчанию форма работает в обычном режиме, и соответственно бизнес-логика реализуется вторым блоком кода.

{* <!-- ====================================================================
                                                                           |
    Fashion Wear theme                                                     |
        Copyright 2020 Impera CMS > www.imperacms.com                      |
        Licensed under CC BY 4 > www.creativecommons.org/licenses/by/4.0   |
                                                                           |
        Designed by Freepik > www.freepik.com/freepik                      |
        Assembled by Pachulli JR > www.imperacms.com/forum.htm?channel=29  |
                                                                           |
    --------------------------------------------------------------------   |
                                                                           |
    The template for displaying the Login page                  [STEP 1]   |
                                                                           |
    --------------------------------------------------------------------   |
    Input parameters:                                                      |
        $section              = post object if assigned                    |
            $login_title      = system's default title for such posts      |
        $login_accepted       = TRUE if form accepted                      |
            $login_message    = informational message if exists            |
            $login_error      = error message if occured                   |
            $login_bad_fields = array of errors indexed by field           |
            $login_fields     = array of expected fields                   |
        $login_login          = user's entered login                       |
        $login_copystop       = system's temporary ID for the form         |
                                                                           |
    --------------------------------------------------------------------   |
    Used private tags:                                                     |
        {fashionwearRepairMixedHTTPS} - see file "html/mod-helper.php"     |
                                                                           |
    --------------------------------------------------------------------   |
    Related style file:                                                    |
        css/modules-login.css                                              |
                                                                           |
    --------------------------------------------------------------------   |
    Related EMAIL templates:                                               |
        html/email/login-to-admin.htm                                      |
        html/email/login-to-user.htm                                       |
                                                                           |
    --------------------------------------------------------------------   |
    Related SMS templates:                                                 |
        html/sms/login-to-admin.htm                                        |
        html/sms/login-to-user.htm                                         |
                                                                           |
===================================================================== --> *}{strip}

    {* <!-- ================================================================
    |                                                                      |
    |   Start a page generation                                            |
    |   ----------------------------------------------------------------   |
    |   Init the page environment                                          |
    |   If the page was requested through AJAX                             |
    |       Disambiguate HTTPS/HTTP links (see the mod-helper.php file)    |
    |           Send only changed content of the form                      |
    |                                                                      |
    ================================================================= --> *}

        {modInit}
        {ifAjax}
            {fashionwearRepairMixedHTTPS}
                {modLogin}
            {/fashionwearRepairMixedHTTPS}
        {/ifAjax}

    {* <!-- ================================================================
    |                                                                      |
    |   Otherwise, reset SEO parameters                                    |
    |                                                                      |
    ================================================================= --> *}

        {ifNotAjax}
            {setTitle}
                {polyglot noAdminPin=TRUE}
                    [!-- Login Page title --]
                {/polyglot}
            {/setTitle}
            {noMetaDescription}
            {noMetaKeywords}

            {* <!-- --------------------------------------------------------
            |                                                              |
            |   Destroy page variable                                      |
            |       Replace settings with Demo data (at Demo mode only)    |
            |       Set up default image for OpenGraph tags                |
            |                                                              |
            --------------------------------------------------------- --> *}

            {noItem}
                {modDemo}
                {modOpenGraph}

            {* <!-- --------------------------------------------------------
            |                                                              |
            |   Send a signal to the search robot                          |
            |                                                              |
            --------------------------------------------------------- --> *}

            {putOtherMeta}
                <meta name="robots" content="noindex, follow" />
            {/putOtherMeta}

            {* <!-- ========================================================
            |                                                              |
            |   Render the entire page                                     |
            |                                                              |
            ========================================================= --> *}

            {fashionwearRepairMixedHTTPS}
                <!DOCTYPE html>
                <html lang="{htmlLang}" class="sign-in-page {demoClass}">
                    {modHead}

                    <body>
                        <div class="wrapper">
                            <div class="content">
                                <main class="main">

                                    {* <!-- --------------------------------
                                    |                                      |
                                    |   Link to the Home page              |
                                    |                                      |
                                    --------------------------------- --> *}

                                    <a class="link home" href="{site}{htmlLangMarker}">
                                        <img class="icon" src="{theme}images/icons/home.svg" alt="" />
                                        <span class="value">
                                            {polyglot}
                                                [!-- Go Home label --]
                                            {/polyglot}
                                        </span>
                                    </a>

                                    {* <!-- --------------------------------
                                    |                                      |
                                    |   Form                               |
                                    |                                      |
                                    --------------------------------- --> *}

                                    <section class="sign-in">
                                        <figure class="image logo">
                                            <img src="{theme}images/logo-over.png" alt="" />
                                        </figure>

                                        <h1 class="title">
                                            {title}
                                        </h1>

                                        <form class="form ajax" action="{canonicalUrl}{htmlLangMarker}" method="post">
                                            {modLogin}
                                        </form>
                                    </section>

                                    {* <!-- --------------------------------
                                    |                                      |
                                    |   Run informers                      |
                                    |                                      |
                                    --------------------------------- --> *}

                                    {modInform}
                                    {modTechnical}
                                </main>
                            </div>
                        </div>

                        {* <!-- --------------------------------------------
                        |                                                  |
                        |   Client javascripts                             |
                        |                                                  |
                        --------------------------------------------- --> *}

                        {modScripts}
                    </body>
                </html>
            {/fashionwearRepairMixedHTTPS}

            {* <!-- --------------------------------------------------------
            |                                                              |
            |   This template is final of rendering                        |
            |                                                              |
            --------------------------------------------------------- --> *}

            {lastTemplate}
        {/ifNotAjax}

Языковые версии

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

<def>
    [!-- Login Page title --]
    <hr class="en"> Sign in
    <hr class="ru"> Вход на сайт
    <hr class="uk"> Вхід на сайт
</def>

<def>
    [!-- Go Home label --]
    <hr class="en"> Go to Home
    <hr class="ru"> На главную
    <hr class="uk"> На головну
</def>

Схематический вид

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

Зачем использовались обозначенные в схеме модули?

  • {modLogin} - здесь находится разметка внутренней части формы авторизации. Она помещена в отдельный модуль для обеспечения AJAX-возможностей, то есть работы с формой без перезагрузки страницы. Если в шаблоне включен AJAX-режим (по умолчанию отключен), тогда форма отправляет себя через динамический запрос и получает в ответ только изменившуюся часть. А для этого необходимо иметь возможность обратиться к внутренней части формы как к отдельному модулю.
  • {modInform} - является чисто техническим модулем и служит для моментального уведомления администратора о визите на текущую страницу сайта. В случае малого бизнеса является хорошей альтернативой Google Analytics и Яндекс.Метрика, так как даёт менеджеру сайта сиюминутное представление о хождении пользователей по сайту. Однако при увеличении бизнеса становится заметным раздражителем от возросшего потока уведомлений на телефон или емейл менеджера.
  • {modTechnical} - тоже технический модуль, который срабатывает только при нахождении сайта в демонстрационном режиме и выводит вебмастеру технические сведение: каким файлом шаблона был сгенерирован контент текущей страницы. Удобен новичкам для общего ознакомления с основными макетами шаблона.

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

Скриншот

Теперь посмотрим, как выглядит страница авторизации с уже довёрстанной внутренней частью формы, то есть модулем html/modules/login.htm, который обещал Михаил в предыдущем посте. Забегая вперёд скажу, что я добавил этот скриншот сюда через несколько дней, когда Михаил прислал мне довёрстанные формы.

15:54
07 фев
#
?
написал:

После того как мы рассмотрели исходный код страницы авторизации, логично перейти к её ответвлению - странице восстановления пароля. Один и тот же макет шаблона под названием html/password_remind.htm используется для трёх ключевых этапов этого процесса: форма запроса на восстановление пароля, конечная страница для подтверждающей ссылки из контрольного письма запросившему пользователю, конечное уведомление о генерации нового пароля.

Исходный код файла html/password_remind.htm

Макет этой страницы напоминает с незначительными отличиями предыдущий макет и по вёрстке, и по бизнес-логике. Я обозначил отличия таким цветом.

{* <!-- ====================================================================
                                                                           |
    Fashion Wear theme                                                     |
        Copyright 2020 Impera CMS > www.imperacms.com                      |
        Licensed under CC BY 4 > www.creativecommons.org/licenses/by/4.0   |
                                                                           |
        Designed by Freepik > www.freepik.com/freepik                      |
        Assembled by Pachulli JR > www.imperacms.com/forum.htm?channel=29  |
                                                                           |
    --------------------------------------------------------------------   |
                                                                           |
    The template for displaying the Remind page                 [STEP 1]   |
                                                                           |
    --------------------------------------------------------------------   |
    Input parameters:                                                      |
        $item             = user's entered information                     |
            ->email                                                        |
            ->email2                                                       |
        $message          = informational message if exists                |
            $new_password = new generated password if exists               |
        $error            = error message if occurred                      |
                                                                           |
    --------------------------------------------------------------------   |
    Used private tags:                                                     |
        {fashionwearRepairMixedHTTPS} - see file "html/mod-helper.php"     |
                                                                           |
    --------------------------------------------------------------------   |
    Related style file:                                                    |
        css/modules-login.css                                              |
                                                                           |
    --------------------------------------------------------------------   |
    Related EMAIL template:                                                |
        html/email_password_remind.tpl                                     |
                                                                           |
===================================================================== --> *}{strip}

    {* <!-- ================================================================
    |                                                                      |
    |   Start a page generation                                            |
    |   ----------------------------------------------------------------   |
    |   Init the page environment                                          |
    |   If the page was requested through AJAX                             |
    |       Disambiguate HTTPS/HTTP links (see the mod-helper.php file)    |
    |           Send only changed content of the form                      |
    |                                                                      |
    ================================================================= --> *}

        {modInit}
        {ifAjax}
            {fashionwearRepairMixedHTTPS}
                {modRemind}
            {/fashionwearRepairMixedHTTPS}
        {/ifAjax}

    {* <!-- ================================================================
    |                                                                      |
    |   Otherwise, reset SEO parameters                                    |
    |                                                                      |
    ================================================================= --> *}

        {ifNotAjax}
            {setTitle}
                {polyglot noAdminPin=TRUE}
                    [!-- Remind Page title --]
                {/polyglot}
            {/setTitle}
            {noMetaDescription}
            {noMetaKeywords}

            {* <!-- --------------------------------------------------------
            |                                                              |
            |   Destroy page variable                                      |
            |       Replace settings with Demo data (at Demo mode only)    |
            |       Set up default image for OpenGraph tags                |
            |                                                              |
            --------------------------------------------------------- --> *}

            {noItem}
                {modDemo}
                {modOpenGraph}

            {* <!-- --------------------------------------------------------
            |                                                              |
            |   Send a signal to the search robot                          |
            |                                                              |
            --------------------------------------------------------- --> *}

            {putOtherMeta}
                <meta name="robots" content="noindex, follow" />
            {/putOtherMeta}

            {* <!-- ========================================================
            |                                                              |
            |   Render the entire page                                     |
            |                                                              |
            ========================================================= --> *}

            {fashionwearRepairMixedHTTPS}
                <!DOCTYPE html>
                <html lang="{htmlLang}" class="remind-page {demoClass}">
                    {modHead}

                    <body>
                        <div class="wrapper">
                            <div class="content">
                                <main class="main">

                                    {* <!-- --------------------------------
                                    |                                      |
                                    |   Link to the Home page              |
                                    |                                      |
                                    --------------------------------- --> *}

                                    <a class="link home" href="{site}{htmlLangMarker}">
                                        <img class="icon" src="{theme}images/icons/home.svg" alt="" />
                                        <span class="value">
                                            {polyglot}
                                                [!-- Go Home label --]
                                            {/polyglot}
                                        </span>
                                    </a>

                                    {* <!-- --------------------------------
                                    |                                      |
                                    |   Form                               |
                                    |                                      |
                                    --------------------------------- --> *}

                                    <section class="remind">
                                        <figure class="image logo">
                                            <img src="{theme}images/logo-over.png" alt="" />
                                        </figure>

                                        <h1 class="title">
                                            {title}
                                        </h1>

                                        <form class="form ajax" action="{canonicalUrl}{htmlLangMarker}" method="post">
                                            {modRemind}
                                        </form>
                                    </section>

                                    {* <!-- --------------------------------
                                    |                                      |
                                    |   Run informers                      |
                                    |                                      |
                                    --------------------------------- --> *}

                                    {modInform}
                                    {modTechnical}
                                </main>
                            </div>
                        </div>

                        {* <!-- --------------------------------------------
                        |                                                  |
                        |   Client javascripts                             |
                        |                                                  |
                        --------------------------------------------- --> *}

                        {modScripts}
                    </body>
                </html>
            {/fashionwearRepairMixedHTTPS}

            {* <!-- --------------------------------------------------------
            |                                                              |
            |   This template is final of rendering                        |
            |                                                              |
            --------------------------------------------------------- --> *}

            {lastTemplate}
        {/ifNotAjax}

Кстати, если внимательно изучить отличия этого и предыдущего исходного кода, то станет понятно, что меняется лишь список входных параметров страницы (это логично), плюс список связанных емейл-шаблонов, меняется также стилевой класс страницы, её заголовок и подключаемый на страницу модуль формы.

Языковые версии

В этом файле тоже применялись две текстовые "константы", однако вторая аналогична такой же константе [!-- Go Home label --] в предыдущем распечатанном файле. Поэтому рассмотрим мультиязычный перевод только новой константы.

<def>
    [!-- Remind Page title --]
    <hr class="en"> Forgotten Password?
    <hr class="ru"> Забыли пароль?
    <hr class="uk"> Забули пароль?
</def>

Схематический вид

Схема расположения элементов страницы и точек подключения модулей идентична продемонстрированной в предыдущем посте, кроме названия одного модуля.

  • {modRemind} - здесь находится разметка внутренней части формы восстановления пароля. Помещена в отдельный модуль тоже для поддержки AJAX.
16:03
07 фев
#
?
написал:

Исходный код файла html/registration.htm

Здесь тоже небольшие отличия относительно первого макета, которые обозначены тем же цветом.

{* <!-- ====================================================================
                                                                           |
    Fashion Wear theme                                                     |
        Copyright 2020 Impera CMS > www.imperacms.com                      |
        Licensed under CC BY 4 > www.creativecommons.org/licenses/by/4.0   |
                                                                           |
        Designed by Freepik > www.freepik.com/freepik                      |
        Assembled by Pachulli JR > www.imperacms.com/forum.htm?channel=29  |
                                                                           |
    --------------------------------------------------------------------   |
                                                                           |
    The template for displaying the Registration page           [STEP 1]   |
                                                                           |
    --------------------------------------------------------------------   |
    Input parameters:                                                      |
        $section                     = post object if assigned             |
            $registration_title      = system's default title for posts    |
        $registration_accepted       = TRUE if form accepted               |
            $registration_message    = informational message if exists     |
            $registration_error      = error message if occured            |
            $registration_bad_fields = array of errors indexed by field    |
            $registration_fields     = array of expected fields            |
        $registration_nickname       = user's entered nick                 |
        $registration_name           = user's entered surname              |
        $registration_name2          = user's entered name                 |
        $registration_name3          = user's entered patronymic           |
        $registration_email          = user's entered email                |
        $registration_phone          = user's entered phone                |
        $registration_skype          = user's entered Skype name           |
        $registration_icq            = user's entered ICQ number           |
        $registration_coupon         = user's entered discount coupon code |
        $registration_password       = user's entered password             |
        $registration_password2      = user's entered copy of password     |
        $registration_copystop       = system's temporary ID for the form  |
                                                                           |
===================================================================== --> *}{strip}

    {* <!-- ================================================================
    |                                                                      |
    |   Start a page generation                                            |
    |   ----------------------------------------------------------------   |
    |   Init the page environment                                          |
    |   If the page was requested through AJAX                             |
    |       Disambiguate HTTPS/HTTP links (see the mod-helper.php file)    |
    |           Send only changed content of the form                      |
    |                                                                      |
    ================================================================= --> *}

        {modInit}
        {ifAjax}
            {fashionwearRepairMixedHTTPS}
                {modRegistration}
            {/fashionwearRepairMixedHTTPS}
        {/ifAjax}

    {* <!-- ================================================================
    |                                                                      |
    |   Otherwise, reset SEO parameters                                    |
    |                                                                      |
    ================================================================= --> *}

        {ifNotAjax}
            {setTitle}
                {polyglot noAdminPin=TRUE}
                    [!-- Registration Page title --]
                {/polyglot}
            {/setTitle}
            {noMetaDescription}
            {noMetaKeywords}

            {* <!-- --------------------------------------------------------
            |                                                              |
            |   Destroy page variable                                      |
            |       Replace settings with Demo data (at Demo mode only)    |
            |       Set up default image for OpenGraph tags                |
            |                                                              |
            --------------------------------------------------------- --> *}

            {noItem}
                {modDemo}
                {modOpenGraph}

            {* <!-- --------------------------------------------------------
            |                                                              |
            |   Send a signal to the search robot                          |
            |                                                              |
            --------------------------------------------------------- --> *}

            {putOtherMeta}
                <meta name="robots" content="noindex, follow" />
            {/putOtherMeta}

            {* <!-- ========================================================
            |                                                              |
            |   Render the entire page                                     |
            |                                                              |
            ========================================================= --> *}

            {fashionwearRepairMixedHTTPS}
                <!DOCTYPE html>
                <html lang="{htmlLang}" class="sign-up-page {demoClass}">
                    {modHead}

                    <body>
                        <div class="wrapper">
                            <div class="content">
                                <main>
                                    <section class="sign-up">
                                        <figure class="image logo">
                                            <img src="{theme}images/logo-over.png" alt="" />
                                        </figure>
                                        <h1 class="title">
                                            {title}
                                        </h1>
                                        <form class="form ajax" action="{canonicalUrl}{htmlLangMarker}" method="post">
                                            {modRegistration}
                                        </form>
                                    </section>
                                </main>

                                {modInform}
                                {modTechnical}
                            </div>
                        </div>

                        {modScripts}
                    </body>
                </html>
            {/fashionwearRepairMixedHTTPS}

            {* <!-- --------------------------------------------------------
            |                                                              |
            |   This template is final of rendering                        |
            |                                                              |
            --------------------------------------------------------- --> *}

            {lastTemplate}
        {/ifNotAjax}

Исходный код файла html/feedback.htm

{* <!-- ====================================================================
                                                                           |
    Fashion Wear theme                                                     |
        Copyright 2020 Impera CMS > www.imperacms.com                      |
        Licensed under CC BY 4 > www.creativecommons.org/licenses/by/4.0   |
                                                                           |
        Designed by Freepik > www.freepik.com/freepik                      |
        Assembled by Pachulli JR > www.imperacms.com/forum.htm?channel=29  |
                                                                           |
    --------------------------------------------------------------------   |
                                                                           |
    The template for displaying the Feedback page               [STEP 1]   |
                                                                           |
    --------------------------------------------------------------------   |
    Input parameters:                                                      |
        $section                 = post object if assigned                 |
            $feedback_title      = system's default title for such posts   |
        $feedback_accepted       = TRUE if form accepted                   |
            $feedback_message    = informational message if exists         |
            $feedback_error      = error message if occured                |
            $feedback_bad_fields = array of errors indexed by field        |
            $feedback_fields     = array of expected fields                |
        $feedback_name           = user's entered name                     |
        $feedback_email          = user's entered email                    |
        $feedback_phone          = user's entered phone                    |
        $feedback_department     = user's choice for department names      |
        $feedback_subject        = user's entered subject                  |
        $feedback_message        = user's entered message                  |
        $feedback_copystop       = system's temporary ID for the form      |
                                                                           |
===================================================================== --> *}{strip}

    {* <!-- ================================================================
    |                                                                      |
    |   Start a page generation                                            |
    |   ----------------------------------------------------------------   |
    |   Init the page environment                                          |
    |   If the page was requested through AJAX                             |
    |       Disambiguate HTTPS/HTTP links (see the mod-helper.php file)    |
    |           Send only changed content of the form                      |
    |                                                                      |
    ================================================================= --> *}

        {modInit}
        {ifAjax}
            {fashionwearRepairMixedHTTPS}
                {modFeedback}
            {/fashionwearRepairMixedHTTPS}
        {/ifAjax}

    {* <!-- ================================================================
    |                                                                      |
    |   Otherwise, reset SEO parameters                                    |
    |                                                                      |
    ================================================================= --> *}

        {ifNotAjax}
            {setTitle}
                {polyglot noAdminPin=TRUE}
                    [!-- Feedback Page title --]
                {/polyglot}
            {/setTitle}
            {noMetaDescription}
            {noMetaKeywords}

            {* <!-- --------------------------------------------------------
            |                                                              |
            |   Destroy page variable                                      |
            |       Replace settings with Demo data (at Demo mode only)    |
            |       Set up default image for OpenGraph tags                |
            |                                                              |
            --------------------------------------------------------- --> *}

            {noItem}
                {modDemo}
                {modOpenGraph}

            {* <!-- --------------------------------------------------------
            |                                                              |
            |   Send a signal to the search robot                          |
            |                                                              |
            --------------------------------------------------------- --> *}

            {putOtherMeta}
                <meta name="robots" content="noindex, follow" />
            {/putOtherMeta}

            {* <!-- ========================================================
            |                                                              |
            |   Render the entire page                                     |
            |                                                              |
            ========================================================= --> *}

            {fashionwearRepairMixedHTTPS}
                <!DOCTYPE html>
                <html lang="{htmlLang}" class="feedback-page {demoClass}">
                    {modHead}

                    <body>
                        <div class="wrapper">
                            <div class="content">
                                <main>
                                    <section class="feedback">
                                        <figure class="image logo">
                                            <img src="{theme}images/logo-over.png" alt="" />
                                        </figure>
                                        <h1 class="title">
                                            {title}
                                        </h1>
                                        <form class="form ajax" action="{canonicalUrl}{htmlLangMarker}" method="post">
                                            {modFeedback}
                                        </form>
                                    </section>
                                </main>

                                {modInform}
                                {modTechnical}
                            </div>
                        </div>

                        {modScripts}
                    </body>
                </html>
            {/fashionwearRepairMixedHTTPS}

            {* <!-- --------------------------------------------------------
            |                                                              |
            |   This template is final of rendering                        |
            |                                                              |
            --------------------------------------------------------- --> *}

            {lastTemplate}
        {/ifNotAjax}
00:01
09 фев
#
?
написал:

Друзья! Вот маленький промежуточный отчёт. Я ранее показывал анимированные скриншоты уже готовой карточки 1. Марина прислала карточки 2 и 3 полностью отлаженные. Я снова сделал скриншоты, подвигав мышью над оперативными элементами, и показываю снимки вам.

Эта карточка была на общем снимке под номером 5. Текст с правого бока, конечно, выглядит иначе чем на оригинале. Но, в общем, тоже годится, учитывая что происходит неизбежная подгонка печатного макета под функционал конкретной CMS: например, товар всегда подвязан к какой-то категории и опционально может быть подвязан к бренду.

Кроме того, названия категорий и брендов могут существенно различаться по количеству символов, а выводятся все одним макетом. Приходится также учитывать возможность на сайте нескольких валют и следовательно разного по длине написания их знака: руб, евро. А то что на сайте несколько языков может быть, не забыли? И так далее...

Вдобавок не всякий шрифт, использованный в иностранных печатных макетах, имеет версию с кириллицей (то есть знаки славянских и русских букв).

12:38
09 фев
#
?
написал:

Оч красивые карточки. Я добавил бы артикул в угол. Для интернет магазина одежды это важный элемент.

И еще вопрос о лицензии. Шаблон издадите бесплатным? Для пользователей Wordpress я имею ввиду.

10:44
10 фев
#
?
написал:
Дмитрий, LocalNet, Стаханов написал: Марина, я внёс следующую поправку по загрузке фона карточки в вашем модуле: если среди картинок шаблона присутствует PNG-фон, значит выбрать его, иначе выбрать SVG-фон.

Вы нашли граблю и вместо попытки убрать зачем-то прячете в условии. Оставьте лучшую ветвь условия, зачем усложнять код, если квадратный SVG не тянется в высоту. Тем более Вы сами предлагаете Марине делать оставшиеся фоны только в PNG.

Gen gena, Altair Network, Тула написал: Я добавил бы артикул в угол.

Плюсую за

Gen gena, Altair Network, Тула написал: И еще вопрос о лицензии. Шаблон издадите бесплатным?

Посмотрите выше в его исходный код. Написал же Licensed under CC BY 4 в заголовочном комментарии каждого файла, следом дает ссылку на текст лицензии.

23:57
11 фев
#
?
написал:

Благодарю Марину за прекрасно выполненную вёрстку мини карточек товаров. Это задание завершено. Предлагаю вам приступить к следующему. Если для его выполнения вам необходима учебная информация по ещё неизвестным тегам, - скажите, я подготовлю примеры кода с такими тегами.

Третья часть: сверстать боковую панель сайта

Итак, у нас есть вертикальный графический макет от дизайнера Freepik. Скриншот показан ниже. Мы хотели бы сверстать этот макет и встроить на место правой боковой панели, пустышка которой существует сейчас под видом модуля html/modules/aside-right.htm в заготовке нашего шаблона.

Вам следует сверстать этот модуль шаблона. Вместо использованных в графическом макете цветов (жёлтый, салатный, пурпурный) примените "фирменные" цвета карточек товара: жёлтый, голубой, красный.

Детали верстки:

  • Белый и салатный лучи убрать.
  • Пурпурный круг убрать.
  • Шрифт - тот же что вы применили в карточках товара.
  • Меню - здесь вывести все пункты меню, которое названо в админпанели "Верхнее меню".
  • Фотография - та что загружена контент-менеджером сайта в текущую страницу (публикацию) и отмечена словом "sidebar" в поле описания фотографии. Если фотографий с таким идентифицирующим словом загружено несколько, значит выбираем первую.
  • Слоган - здесь вывести текстовую строку, которую контент-менеджер введёт в поле ALT загруженной фотографии.

Детали адаптивности:

  • При широком экране панель неподвижно стоит сбоку центральной части страницы.
  • На узком экране панель отъезжает за край экрана, оставляя иконку "гамбургер" справа в верхнем углу экрана, и выезжает над страницей при нажатии иконки.

Таким образом модуль позволит контент-менеджеру украшать правый бок сайта уникальным изображением и слоганом для конкретной публикации. Если же специально отмеченное изображение не загружено в текущую публикацию, договоримся тогда выводить по умолчанию картинку images/sidebar.jpg из шаблона и некий абстрактный слоган "Одежда для вашего имиджа".

14:39
12 фев
#
?
написал:

CMS в общем простая. Разберусь. Пока верстала карточки я нашла главные ответы, дефолтные теги системы перечислены здесь objects/.any-models/SmartyTags.php, публичные теги шаблона html/helper.php, приватные теги html/mod-helper.php.

Если покажите пример кода для вывода меню "верхнее", скажу спасибо. Я знаю публичный тег {getTopMenu} читает контент меню. Как затем перечислить пункты не смогла разобрать.

Из дефолтных тегов я уже знаю {findImage} для поиска фотографий поста. Не поняла как в этом теге использовать входной параметр desc для отбора по ключевому слову.

09:15
13 фев
#
?
написал:

Как вывести меню сайта

Сначала азы. Каждое меню имеет произвольное, но обязательно уникальное название. Ну например: "Верхнее меню", "Меню sidebar 2", "подвал" и так далее. А создаются менюшки контент-менеджером в разделе страницы » Меню сайта вашей админпанели.

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

Однако Подобное неудобство управления менюшкой исчезает при установке визуальных инструментов администратора в клиентский шаблон сайта. Там есть инструмент для интуитивно понятного перемещения пунктов меню относительно друг друга.

Структура готовой менюшки представляет собой обычный список ссылок на страницы с упорядочением ссылок по весу их страниц. Но поскольку в меню могли быть добавлены страницы разного типа (категории, бренды, товары, новости, статьи, медиафайлы, специальные или как их ещё называют - "статические" страницы), то эти страницы группируются в структуре меню по типу и перечисляются с помощью соответствующего тега.

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

Пример кода

Простейший случай вывода пунктов меню с поддержкой мультиязычности сайта выглядит так:

{getTopMenu}
<ul class="menu sections">
    {enumSections}
        <li class="item" {activeSection}>
            <a href="{url}{htmlLangMarker}" class="link section">
                {polyglot}
                    {name}
                {/polyglot}
            </a>
        </li>
    {/enumSections}
</ul>

Принцип действия С помощью первого тега мы извлекли из CMS структуру главнейшего меню. По умолчанию главнейшим считается менюшка, названная в админпанели как "Верхнее меню". Затем с помощью второго тега мы перечислили все ссылки типа "статическая страница", так как первый тег по умолчанию извлекал в структуру ссылки именно такого типа, игнорируя прочие. И затем для каждой перечисляемой ссылки мы вывели анкор на страницу, на всякий случай отметив также активную ссылку.

Для продемонстрированной выше разметки у нас получится следующий каркас стилей меню:

.menu.sections {
}
    /* обычный пункт меню */
    .menu.sections .item {
    }
        .menu.sections .link.section {
        }
    /* активный пункт меню */
    .menu.sections .item[selected] {
    }
        .menu.sections [selected] .link.section {
        }

Другие меню и типы ссылок

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

  • Как быть если меню названо иначе чем "Верхнее меню"?
  • Как быть если в меню прикреплены не только специальные страницы?

Для решения первого вопроса в теге {getTopMenu} предусмотрен необязательный параметр name, в котором вы можете указать название желаемой менюшки. Например, давайте выведем все статические страницы меню "Hello", скажем для случая одноязычного сайта.

{getTopMenu name='Hello'}
<menu>
    {enumSections}
        <a href="{url}">
            {name}
        </a>
    {/enumSections}
</menu>

А для решения второго вопроса предусмотрен необязательный параметр type, в котором задаётся желаемый тип ссылок. Возможные значения параметра: categories, brands, products, sections, files, articles, news. Например, выведем все товары меню "Акции".

{getTopMenu name='Акции'
            type='products'}
<menu>
    {enumSections}
        <a href="{url}">
            {name}
        </a>
    {/enumSections}
</menu>

Длина меню

Иногда возникает необходимость искусственно ограничить число выводимых пунктов меню. Скажем, в подвале сайта хотим вывести не более 5 статических страниц дефолтной менюшки (напомню, это "Верхнее меню"). Тогда во втором теге используем необязательный параметр max.

{getTopMenu}
<menu>
    {enumSections max=5}
        <a href="{url}">
            {name}
        </a>
    {/enumSections}
</menu>

Вложенные уровни

Так как контент-менеджеру позволено вкладывать категории друг в друга и при необходимости даже бренды друг в друга, то прикрепляя категорию или бренд к менюшке, следует понимать, что вы прикрепляете всю её вложенную ветвь. А значит при перечислении становится доступна проверка на наличие вложенности и соответственно перечисление этой вложенности. Например, давайте выведем прикреплённые в верхнее меню категории и их вторые уровни, если они есть:

{getTopMenu type='categories'}
<menu>
    {enumSections}
        <a href="{url}">
            {name}
        </a>
        {ifHasBranch}
            <div class="submenu">
                {enumSubcats from=item}
                    <a href="{url}">
                        {name}
                    </a>
                {/enumSubcats}
            </div>
        {/ifHasBranch}
    {/enumSections}
</menu>

Принцип действия Сначала мы извлекли список прикреплённых категорий дефолтного меню. Затем перечисляем категории - и для каждой выводим ссылку на страницу. Если притом категория имеет ветвление, тогда перечисляем подкатегории - и для каждой тоже выводим ссылку на страницу.

Параметр from использован для того, что тег {enumSubcats} по умолчанию работает с переменной $category, а перечисление категорий менюшки у нас выполнялось тегом {enumSections} через неявную переменную $item, поэтому пришлось в этом месте принудительно указать правильное имя оперируемой переменной, доставшейся от родительского перечисления.

16:26
15 фев
#
?
написал:

А все таки хорошее получается руководство для желающего сверстать тему сайта самостоятельно. Рекомендовать такое к чтению обязательно, потому что шаг за шагом показали что взято в качестве образца, какой код сверстан в итоге.

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

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

02:11
16 фев
#
?
написал:

Та где Вы такое видели про контроль со стороны сообщества.

Сообществу Wordpress плевать на код чьего-то шаблона. Разработчику WP тем более. А заказчик вообще другими заботами занят.

Я поддерживаю сайты на Wordpress который год, ни разу заказчик не снизил мою ставку за какашный код в его шаблоне на WP.

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

17:22
17 фев
#
?
написал:

Остынь. Благодаря контролю разработчика мы имеем аккуратные исходники. Пересказываю со слов фрилансера взятого для поддержки сайта. Хвалит, говорит код шаблона понятный.

21:22
17 фев
#
?
написал:

Привет, я тоже учусь сейчас на разработчика шаблонов. А где исходники, о которых говорит webibigon? Скиньте пожалуйста ссылочку ребят. Чтоб я скачала одним архивом с предустановлеными плагиноами. Как шаблон opencart когда покупаешь на templatemoster, содержит архив full для установки шаблона сразу с cms с нужными настройками и архив update для заливки шаблона сверху cms.

Я хотела еще посоветовать вам записывать видосики с разбором процесса верстки каждого файла. Удобней же смотреть на youtube живой урок разработки шаблона, а не просто читать с форума инструкции программирования разных модулей. На смартфоне текстовое описание урока не вариант, максимум пока в автобусе едешь видос просмотреть для общего ознакомления с модулем. А за компьютером вечером уже можно открыть форум чтоб учить базу.

23:45
19 фев
#
?
написал:

Благодарю Михаила Пачулли! Задание по вёрстке форм выполнено на отлично. Причём удивительно, что без каких-либо специальных javascripts реализован ввод телефона и емейла по заданному паттерну с подсветкой ошибки ввода и выпадающей подсказкой правильного примера.

Вот этим мне как раз и нравится сообщество Impera CMS, что в силу принципов подбора участников здесь тусуются вебмастера с сильными знаниями в области HTML, CSS, компактного программирования шаблона, высокоточной SEO оптимизации сайта.

Ну да ладно, оставим в стороне похвалу, вернёмся к делу. Предлагаю Михаилу, в который раз подтвердившему мастерство сборщика шаблонов, заняться следующим заданием.

Четвёртая часть: сверстать страницу "Ошибка 404"

В нашей заготовке шаблона присутствует файлик html/missing_template.htm, предназначенный для вывода нейтральной страницы при наступлении некоторых ситуаций:

  • например, в шаблоне отсутствует макет для текущей страницы
  • например, модуль текущей страницы отключен в админпанели
  • например, неавторизованный пользователь попал на закрытую страницу
  • например, страница удалена или никогда не размещалась на этом адресе

Вам необходимо сверстать в том файлике страницу "Ошибка 404" на основе изображённого далее концепта, который придумал дизайнер с сайта Freepik. По стилистике картинка вполне подходит для сайта одежды. Можете поиграть фирменными цветами из карточек товара, но оставляю на ваше усмотрение право пропустить данную заморочку, так как это не принципиально для бесплатного шаблона.

То есть ставим изображение по центру экрана, под ним отцентрированная надпись "Страница не найдена!" и следом - стандартный текст с пояснением случившегося. Под текстом должна находиться ссылка на главную страницу сайта. Всё это, разумеется, с поддержкой трёх языков, на которых мы готовим шаблон к выпуску. Заставочное изображение страницы давайте договоримся поместить сюда: images/error-404.jpg.

14:50
20 фев
#
?
написал:

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

В современном веб-дизайне очень много нюансов, от них нельзя отмахнуться аргументом о бесплатности шаблона, который вы собираетесь затем отдать всем желающим в интернете. На профильных курсах для верстальщиков всегда говорится об основных правилах верстки сайта по чужому дизайну. Сверстанный шаблон должен строго соответствовать исходному PSD макету.

Но в вашем сборочном проекте что я вижу?

Дизайнер потратил сколько часов на прорисовку каждого элемента, а ваш верстальщик Pachulli все испортил - и вы еще хвалите его. Ах, какой умница, он же такой простой и легко читаемый HTML код сделал! И даже использовал все принципы семантической верстки, а как же - ведь теги применял по их прямому назначению. Только вот проблемка, отступил от оригинального дизайна непростительно далеко. Сравните радиус закругления углов формы, тень под ней, интервалы между элементами формы, заголовок и шрифт далее, значки в полях ввода, радио флажок, кнопка отправки формы, сноски под кнопкой. Все не совпадает с исходным PSD.

Я хочу донести вашему верстальщику следующую мысль, закрепить в памяти как несокрушимую истину. В каком случае допускается вольно менять дизайнерский замысел? Когда вы и есть тот самый дизайнер, который увидел нужный образ и отразил в PSD, а затем сам же и верстает. А так, когда вы взялись верстать PSD другого дизайнера, уж будьте добры перенести замысел в HTML с точностью до пикселя.

01:17
23 фев
#
?
написал:

Доброй всем ночи!

Заметил сегодня козяки в шаблоне.

У меня магазин одежды. Там выставляются местные производители. Товар штучный. Фотографии отснятые производителем на свою камеру.

Функция благодарственных авторских ссылок возле фотографий товара вроде не нужна.

Решаю проверить свое предположение. Вызываюсь испытать 6-карточный интерфейс с реальной одеждой производителя. Топикстартер дал мне шаблон на тестдрайв. На выходные.

Загружаю фотографии и понимаю, внешняя ссылка на сайт автора нужна. Но разместить бы вместо нее локальную ссылку на раздел производителя.

Вписываю ссылку - действует. Производитель возле фотографии указан. Щелчок открывает нужный раздел на моем же сайте. Только в новом окне почему-то.

Супер!

А козяки вот они.

Первый - если ссылка с моего на мой сайт, не надо открывать раздел производителя в новом окне.

Второй - если перейти на другой язык сайта и нажать ссылку раздела около любой фотографии, она не помнит выбранный язык. Указывает на раздел в основном языке.

08:03
23 фев
#
?
написал:
Леонид, CSU Network, Кировоград написал: Заметил сегодня козяки в шаблоне.

Спасибо, Леонид! Учтём ваше замечание.

Марина, прошу вас изменить вёрстку карточки товара так, чтобы ссылки в прикреплённых фотографиях анализировались по домену и снабжались атрибутами target="_blank" и rel="nofollow" в случае внешней ссылки и тегом языковой метки - в случае внутренней ссылки.

Реализовать доработку можно с помощью нового приватного тега, например назовём его {fashionwearImageLink} и будем использовать в шаблоне так:

{if $image.alt}
    <a data-href="{fashionwearImageLink}" class="link credits" tabindex="-1">
        {$image.alt|escape}
    </a>
{/if}

Соответственно, вам придётся написать обработчик нового тега в файле html/mod-helper.php, предназначенном как раз для этих целей. Примерно так:

public function fashionwearImageLink ( $params = null, & $smarty = null ) {
    $attribute = '';
    $link = $this->getVar('image->link', $smarty);
    if ($link) {
        $domain = $this->getSiteDomain();
        ... найти домен в ссылке   ...
        ... и согласно найденному  ...
        ... установить $found      ...
        $attribute = $found ? $this->htmlLangMarker(null, $smarty)
                            : '" target="_blank" rel="nofollow';
    }
    return $link . $attribute;
}

Здесь предполагается, что данные текущей фотографии уже находятся в переменной $image во время вызова тега.

08:17
23 фев
#
?
написал:
Руслан, ER-Telecom Holding, Волгоград написал: Пусть шаблон верстали не по моему дизайну, хочу выразить профессиональное мнение и неудовлетворенность проделаной работой верстальщиков.

Вы же знаете, цена хорошего дизайна, учитывающего все состояния элементов на экране интернет-магазина одежды, будет не менее 10 тысяч евро. Это простой баланс по меркам бюджетных площадок типа ThemeForest. Для примера, столько стоят 10 макетов разных одностраничников с лицензией массового изготовления сайтов по этим макетам.

Но дизайн ещё нужно сверстать. И значит, во столько же примерно оценят и качественную натяжку дизайна на CMS магазина. А потом ещё - оптимизация под поисковые системы, и много чего ещё.

Итоговая сумма выйдет достаточно большой, где-то под тридцатку тысяч, чтобы за мой счёт издавать натянутый шаблон бесплатно. На этом фоне предложение макетов Freepik с атрибуцией в виде благодарственной ссылки выглядит куда привлекательнее, чем ваш коммерческий дизайн без права тиражирования. Ведь даже за натяжку бесплатных макетов Freepik плачу верстальщикам всё равно я. Хоть сумма выходит и на два порядка меньше, но всё же ощутимая.

Конечно, бесплатные макеты сопровождают вечные минусы: как минимум, не продуманы типичные сценарии взаимодействия пользователя с изображённой страницей сайта. Однако я готов мириться с этими недостатками, если верстальщик способен додумать отсутствующий сценарий на свой вкус.

Написание ответа

Перед публикацией рекомендуется использовать Предпросмотр, чтобы увидеть конечный вид сообщения.


Обратите внимание! Для противодействия спаму новые посты форума проявляются с задержкой от нескольких минут, пока не пройдут модерацию.