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

3 ВАЖНЫХ ВОПРОСА: получение переменных, дополнительные фото товара, вьювер изображений|130418

Следить
Главная
08:26
20 янв
#
?
Сергей написал:

Версия 130418
1. Получение переменной $order (генерирующейся для страницы заказа) в шаблон главной страницы (Admin.Page.php?) для вывода ссылки "МОЙ ЗАКАЗ №X ОТ г-м-ч" на главную страницу.И вообще как получить ту или иную переменную для использования в любом субшаблоне?

2. При открытии страницы подробного описания товара, дополнительные изображения- совсем не миниатюры как должны быть а полноразмерные img с style="width:Xpx;", как получить цикл по products->images для подстановки в src="" как сделано с главным фото?

3. Админ панель-товары-товар-фотографии-чекбокс(Будет ли это изображение использоваться в слайдере или вьювере изображений)<-на что влияет, я так и не понял,а хотел бы что-бы помеченная фотография сохранялась в отдельную переменную и в product.htm ее можно было бы получить для использования в минислайдере для каждого товара.

15:15
20 янв
#
Разработчик написал:

Объединенный ответ на вопросы 2 и 3. Здесь показано и как пройтись по массиву $product->images, и как для каждой пробегаемой записи проверить состояние чекбокса "используется ли во вьювере изображений", и как из записи о фотографии выделить адрес полноразмерного фото плюс адрес его же миниатюры, и как выделить alt-подсказку и полное описание фотографии.

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

    {* url папки с фотографиями товаров *}
    {$url = $site|cat:'files/products/'|escape}

    {* перебираем массив дополнительных фотографий *}
    {foreach $product->images|default:null as $index => $filename}

        {* если фотография разрешена к показу в слайдере *}
        {if $product->images_view[$index]|default:false}

            {$alt = $product->images_alts[$index]|default:'Нет подсказки!'|escape}
            {$large = $filename|default:'no-photo.png'|escape}
            {$thumb = $product->images_thumbs[$index]|default:'no-photo.png'|escape}
            {$descr = $product->images_texts[$index]|default:'Нет описания!'}

            <div class="image-box">

                {* полноразмерная фотография *}
                <div class="image-full">
                    <img src="{$url}{$large}" alt="{$alt}" />
                </div>

                {* миниатюра *}
                <div class="image-small">
                    <img src="{$url}{$thumb}" alt="{$alt}" />
                </div>

                {* описание фото *}
                <div class="image-descr">
                    {$descr}
                </div>
            </div>

        {/if}

    {/foreach}


Маленький ликбез по Smarty Использованные модификаторы обозначают следующее:

  • $var|cat:ЗНАЧЕНИЕ = приклеить (добавить) ЗНАЧЕНИЕ в конец значения переменной $var
  • $var|default:ЗНАЧЕНИЕ = присовить значению переменной $var такое ЗНАЧЕНИЕ, если переменная не существует или пустая
  • $var|escape = экранировать символьные сущности (например кавычки, угловые скобки) в значении переменой $var, чтобы безопасно использовать в опциях тегов

Важно учесть, что модификаторы действуют на дубликаты значений, не меняя оригинальное значение переменной или выражения, к которому они применялись. Например, в следующем примере значение переменной $var2 останется неизменным, а переменная $var1 получит уже модифицированное значение.

    {$var1 = $var2|модификатор:НЕЧТО}


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

    {$var1 = $var2|модификатор1:НЕЧТО|модификатор2:НЕЧТО}


Бывает шаблоны пишут без применения модификаторов default и escape. Их использование просто позволяет обезопасить работу шаблона на случай, если какие-то сведения отсутствуют в отображаемых записях или содержат специфические символы html-разметки.

17:32
20 янв
#
?
Сергей написал:

Огромное спасибо за оперативный ответ.
Использую {$thumb = $item->images_thumbs[$index]} для вывода миниатюр на главной странице. Не получается вывести "Мой заказ №{$order->order_id} от {$order->date}" находящейся в order_htm.tpl на главную страницу index.tpl, как я понял $order создается в Order.php но ее нет в генераторе главной страницы Admin.Page.php, как добавить?

Я не соображаю.

Имеет ли смысл и возможно ли разделить Admin.Page.php на AdminPage.php и ClientPage.php, ведь кажется в таком случае клиентская сторона будет шустрее.

14:29
21 янв
#
Разработчик написал:

Во всех новых версиях движка производится постепенное разделение на отдельные файлы того кода, что был когда-то намешан в один файл. Примеры такого необдуманного намешивания - файлы Admin.Articles.php, Admin.Categories.php, Admin.Images.php, Admin.Page.php, Admin.Posts.php, Admin.Products.php - все они являются смесью классов от разных страниц админпанели. В результате когда менеджер заходит например на страницу товаров в админпанели, PHP вместе с нужным сейчас классом Products невольно парсит кучу классов, вообще не относящихся к товарам. Следствием чего становится бесполезная трата процессорного времени и ресурсов памяти сервера на хранение неиспользуемых в этот момент классов.

Попробуйте самую свежую версию движка, и вы увидите, что она несколько шустрее, чем версия 130418. И так будет от версии к версии - либо шустрее, либо менее прожорлива по сравнению с предыдущей. Ну и разумеется более навороченная :) в смысле функционала.

Что касается вывода данных заказа на страницу index.tpl, то это можно сделать например с помощью файла emulator.php - если в шаблоне наряду с другими tpl-файлами размещен такой php-файл, отрисовка каждого tpl-файла будет начинаться с вызова emulator.php, чтобы он подготовил недостающие переменные. Это позволяет писать свою конфигурацию шаблона без влезания в код движка и не бояться затирания в момент обновления на новую версию.

Некоторые подробности о строении файла emulator.php можно прочесть здесь. Дальше я приведу код этого файла, разработанный под ваш задачу, если я правильно понял, что вы хотели бы показывать в файле index.tpl номер последнего заказа авторизованного в этот момент пользователя.

1 То есть задача будто бы поставлена так: вывести в шапке сайта блок "Мой заказ №ЧИСЛО от ДАТА", если сайт смотрит авторизованный пользователь, иначе блок не выводим. Предположим, нам хотелось бы, чтобы этот блок содержал перечень из не более чем 3 последних заказов пользователя.

<?php
    class TemplateEmulator {

        public function prepare ( $template, & $cms, & $body = null ) {

            // не хотим самостоятельно генерировать другой контент шаблона
            $body = null;

            // какой tpl-файл сейчас отрисовывается?
            switch (strtolower($template->name)) {

                // если общий макет страницы
                case 'index.tpl':
                case 'page.tpl':

                    // пока у нас еще нет списка заказов
                    $orders = null;

                    // если это авторизованный пользователь
                    if (isset($cms->user->user_id)) {

                        // создаем объект фильтра записей
                        $filter = new stdClass;

                        // хотим найти заказы текущего пользователя
                        $filter->user_id = $cms->user->user_id;

                        // заказы просим отсортировать по убыванию даты
                        $filter->sort = SORT_ORDERS_MODE_BY_DATE;
                        $filter->sort_direction = SORT_DIRECTION_DESCENDING;

                        // и отобрать только 3 верхних в получившемся списке
                        $filter->maxcount = 3;

                        // получаем список заказов
                        $cms->orders->get($orders, $filter);

                        // распаковываем поля записей (некоторые поля хранятся в упакованном виде)
                        $cms->orders->unpack_records($orders);
                    }

                    // передаем список заказов в шаблон
                    $cms->smarty->assignByRef('last_orders', $orders);

                    break;
            }

            // нас устраивает отрисовка шаблона с указанным именем
            return $template->name;
        }
    }
?>


2 Теперь в файле index.tpl шаблона у нас становится доступной переменная $last_orders, которая содержит список последних заказов авторизованного пользователя. Вывести эту переменную можно было бы так:

    {* если существует список последних заказов *}
    {if isset($last_orders) && is_array($last_orders) && !empty($last_orders)}

        <div class="last-orders">
            {foreach $last_orders as $order}

                {* ссылка на страницу заказа *}
                <a href="{$site}order/{$order->code|default:''|escape}">
                    Мой заказ №{$order->order_id|default:'?'|escape} от {$order->date_date|default:'Нет даты!'|escape}
                </a>
                <br />

            {/foreach}
        </div>

    {/if}
10:04
22 янв
#
?
Сергей написал:

Спасибо. Вы дали отличное обратно совместимое решение, я же сделал (скорее всего это не правельно, может кому-то пригодится) так: 1. В файле формирования клиентской страницы "Мой заказ" (статус заказа)- Order.php, в функцию создания контента модуля- function fetch, после строки $code = $this->param("order_code"); и после проверки переменной $code, добавил следующее:

// добавляем куку MyOrder в браузер со значением $code

setcookie("MyOrder", $code, $time + $year_lifetime, '/');

// создаем класс

$params = new stdClass;

$params->code = $code;

// добавляем или берем? в базу данных

$this->db->orders->one($order, $params);

2. В файле Admin.Page.php в клиентской функции- fanction fetch(), после обработки входных параметров- $this->process();, добавил следующее:

// создаем новый класс

$params = new stdClass;

// передаем в параметры полученную из браузера куку

$params->code = $_COOKIE["MyOrder"];

// добавляем или берем? значения в базу данный

$this->db->orders->one($order, $params);

// передаем в шаблонизатор

$this->smarty->assignByRef(SMARTY_VAR_ORDER, $order);

Теперь любой пользователь осуществивший заказ получит уникальную куку с помощью которой на главную страницу можно будет вывести следующие: <a href="/order/{$order->code}">Мой заказ №{$order->order_id} от {$order->date}</a> (еще необходима проверка на существование $order). При таком способе появляется зависимость от cookie.

На сколько имеет смысл обновляться до последней версии движка, сильно ли вырастит оперативность клиентской стороны (админская потерпит)? Какие усовершенствования у последних версий в плане логики, ядра?

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

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


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


Хостинг для сайта

Хостинг для интернет магазина

Svai.net

Украина
г. Черкассы
5+ Заказать

TutHost.ua

Украина
г. Киев
Заказать

Mirohost.net

Украина
г. Киев
? Заказать

HyperHosting.com.ua

Украина
г. Винница
i подробнее Заказать

Agava.ru

Россия
г. Москва
Заказать

Ukraine.com.ua

Украина
г. Киев
5 Заказать
Импераготовасотрудничатьс провайдерами Важно Учтите Этот список перечисляет лишь некоторых хостинг-провайдеров, у которых существуют специальные тарифные планы для интернет магазинов, а сам список не означает, что другие провайдеры чем-то хуже.

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

Демо Главная Хронология Соглашение Материалы Контакты