Вход • Регистрация

Создание копии модуля Похожие товары

  • 13 сентября, пятница
  • Здравствуйте,
    Подскажите как создать копию модуля "Похожие товары" для карточек.
    Нужно сделать отдельный модуль "Рекомендуемые товары" с тем же функционалом что и "Похожие товары"
    • 15 сентября, воскресенье
    • Чтоб при каком-то UPDATE не вылезло боком....
      Я бы взял механизм (комплекты - он бестолковый и его не используют) - он уже и является дублем ПОХОЖИЕ ТОВАРЫ

      - кое что закоментить и изменить заголовки ====> Радуемся! (на всё про всё - минут 30)
  • 13 сентября, пятница
  • Как бы не раз поднимали эту тему...
    https://user.diafan.ru/forum/show1834/
    Очень много там нужно файлов пилить + еще и в БД новые таблицы создавать.
    • 13 сентября, пятница
    • Эти темы все изучал, но вот конкретной инструкции "как скопировать модуль", к сожалению, так и не нашел.
  • 14 сентября, суббота , редакция: 15 сентября, воскресенье
  • ХЗ, может сделал чтото лишнее (если есть комменты то с удовольствием почитаю), но в итоге получилось.
    Вот инструкция для тех кто ищет решение "Как скопировать модуль Похожие товары":

    1. В базе данных копируем структуру таблицы diafan_shop_rel
    Для phpMyAdmin запрос: CREATE TABLE diafan_shop_rek LIKE diafan_shop_rel;
    где diafan_shop_rek наша новая таблица

    2. В файле /modules/shop/admin/shop.admin.php добавляем вывод нашего поля для карточки
    Код
    'hr7' => 'hr',
    'rek_elements' => array(
    'type' => 'function',
    'name' => 'Рекомендуемые товары',
    'help' => 'Рекомендуемые товары выводятся шаблонным тегом show_block_rek',
    ),


    3. В файле /modules/shop/shop.model.php добавляем
    Код
    /**
    * Генерирует данные для шаблонной функции: блоr Рекомендуемые товары
    */
    public function show_block_rek($count, $images, $images_variation)
    {
    $time = mktime(23, 59, 0, date("m"), date("d"), date("Y"));

    //кеширование
    $cache_meta = array(
    "name" => "block_rek",
    "count" => $count,
    "lang_id" => _LANG,
    "good_id" => $this->diafan->_route->show,
    "images" => $images,
    "images_variation" => $images_variation,
    "access" => ($this->diafan->configmodules('where_access_element', 'shop') || $this->diafan->configmodules('where_access_cat', 'shop') ? $this->diafan->_users->role_id : 0),
    "discounts" => $this->person_discount_ids,
    "time" => ($this->diafan->configmodules('where_period_element', 'shop') ? $time : '')
    );

    if (! $this->result = $this->diafan->_cache->get($cache_meta, "shop"))
    {
    $this->result["rows"] = DB::query_range_fetch_all(
    "SELECT e.id, e.[name], e.[anons], e.timeedit, e.site_id, e.brand_id, e.no_buy, e.article,"
    ." e.[measure_unit], e.hit, e.new, e.action, e.is_file FROM {shop} AS e"
    ." INNER JOIN {shop_rek} AS r ON e.id=r.rel_element_id AND r.element_id=%d"
    .($this->diafan->configmodules("rel_two_sided") ? " OR e.id=r.element_id AND r.rel_element_id=".$this->diafan->_route->show : '')
    .($this->diafan->configmodules('where_access_element', 'shop') ? " LEFT JOIN {access} AS a ON a.element_id=e.id AND a.module_name='shop' AND a.element_type='element'" : "")
    .($this->diafan->configmodules('hide_missing_goods', 'shop') && $this->diafan->configmodules('use_count_goods', 'shop') ? " INNER JOIN {shop_price} AS prh ON prh.good_id=e.id AND prh.count_goods>0" : "")
    ." WHERE e.[act]='1' AND e.trash='0'"
    .($this->diafan->configmodules('where_period_element', 'shop') ? " AND e.date_start<=".$time." AND (e.date_finish=0 OR e.date_finish>=".$time.")" : '')
    .($this->diafan->configmodules('where_access_element', 'shop') ? " AND (e.access='0' OR e.access='1' AND a.role_id=".$this->diafan->_users->role_id.")" : '')
    .($this->diafan->configmodules('hide_missing_goods', 'shop') ? " AND e.no_buy='0'" : "")
    ." GROUP BY e.id"
    ." ORDER BY e.id DESC",
    $this->diafan->_route->show, 0, $count
    );
    $this->elements($this->result["rows"], 'block', array("count" => $images, "variation" => $images_variation));
    $this->diafan->_cache->save($this->result, $cache_meta, "shop");
    }
    foreach ($this->result["rows"] as &$row)
    {
    $this->prepare_data_element($row);
    }
    foreach ($this->result["rows"] as &$row)
    {
    $this->format_data_element($row);
    }

    $this->result["view_rows"] = 'rows';
    }


    4. В папке /adm/includes делаем копию файла rel_elements.php, называем rek_elements.php
    Переименовывем там rel в rek

    5. В файле /adm/includes/save_functions.php добавляем
    Код
    /**
    * Сохранение поля "Рекомендуемые товары"
    * @return void
    */
    public function save_variable_rek_elements(){}


    6. В файле /adm/js/edit/admin.edit.rel_elements.js
    Добавляем
    Код
    $(document).on('click', ".rek_element_actions a", function() {
    var self = $(this);
    if (self.attr("action") != 'delete_rek_element')
    {
    return true;
    }
    if (! confirm(self.attr("confirm")))
    {
    return false;
    }
    diafan_ajax.init({
    data:{
    action: 'delete_rek_element',
    element_id : self.parents(".rek_element").attr("element_id"),
    rel_id : self.parents(".rek_element").attr("rel_id"),
    rel_two_sided: $("#rek_elements").attr("rel_two_sided")
    },
    success: function(response){
    self.parents(".rek_element").remove();
    }
    });
    return false;
    });


    7. В файл /adm/includes/edit_functions.php добавляем
    Код
    /**
    * Редактирование поля "Ревомендуемые товары"
    *
    * @return void
    */
    public function edit_variable_rek_elements()
    {
    $rek_two_sided = $this->diafan->configmodules("rek_two_sided", $this->diafan->_admin->module, (! empty($this->values["site_id"]) ? $this->values["site_id"] : $this->diafan->_route->site));

    if($this->diafan->variable_list("name", "variable"))
    {
    $name = $this->diafan->variable_list("name", "variable");
    }
    else
    {
    $name = 'name';
    }

    echo '
    <div class="unit" id="rek_elements" rek-two_sided="'.($rek_two_sided ? 'true' : '').'">
    <div class="infofield">'.$this->diafan->variable_name().$this->diafan->help().'</div>
    <div class="rek_elements">';
    if ( ! $this->diafan->is_new)
    {
    $rows = DB::query_fetch_all("SELECT s.id, s.[".$name."], s.site_id FROM {".$this->diafan->table."} AS s"
    ." INNER JOIN {".$this->diafan->table."_rek} AS r ON s.id=r.rel_element_id AND r.element_id=%d"
    .($rel_two_sided ? " OR s.id=r.element_id AND r.rel_element_id=".$this->diafan->id : "")
    ." WHERE s.trash='0' GROUP BY s.id",
    $this->diafan->id
    );
    foreach ($rows as $row)
    {
    $link = $this->diafan->_route->link($row["site_id"], $row["id"], $this->diafan->table);
    if($this->diafan->is_variable("images") || $this->diafan->is_variable("image"))
    {
    $row_img = DB::query_fetch_array("SELECT name, folder_num FROM {images} WHERE element_id=%d AND module_name='%s' AND element_type='element' AND trash='0' ORDER BY sort ASC LIMIT 1", $row["id"], $this->diafan->table);
    }
    echo '
    <div class="rek_element" element_id="'.$this->diafan->id.'" rel_id="'.$row["id"].'">'
    .(! empty($row_img) ? '<img src="'.BASE_PATH.USERFILES.'/small/'.($row_img["folder_num"] ? $row_img["folder_num"].'/' : '').$row_img["name"].'">' : '').$this->diafan->short_text($row[$name], 50)
    .'
    <div class="rek_element_actions">';
    if($this->diafan->configmodules("page_show", $this->diafan->_admin->module, $this->diafan->_route->site))
    {
    echo '
    <a href="'.BASE_PATH.$link.'" target="_blank"><i class="fa fa-laptop"></i> '.$this->diafan->_('Посмотреть на сайте').'</a>';
    }
    echo '
    <a href="javascript:void(0)" confirm="'.$this->diafan->_('Вы действительно хотите удалить запись?').'" action="delete_rek_element" class="delete"><i class="fa fa-times-circle"></i> '.$this->diafan->_('Удалить').'</a>
    </div>
    </div>';
    }
    }
    echo '</div>
    <a href="javascript:void(0)" class="rek_module_plus btn btn_small btn_blue plink">
    <i class="fa fa-plus-square"></i> '.$this->diafan->_('Добавить').'
    </a>
    </div>';
    }


    8. В файл /adm/includes/frame.php добавляем
    Код

    case 'show_rek_elements':
    $this->_theme = new Theme_admin($this->diafan);

    case 'rek_elements':
    case 'delete_rek_element':
    Custom::inc("adm/includes/rek_elements.php");
    $this->action_object = new Rek_elements_admin($this->diafan);
    $this->ajax();


    9. Стилизуем вывод превьюшек в /adm/css/main.css
    Ищем начало стилей rel_elements примерно строка 2677, я просто дописал свои стили с _rek

    10. Добавляем в /modules/shop/shop.php
    Код
    /**
    * Шаблонная функция: на странице товара выводит РЕКОМЕНДУЕМЫЕ товары. По умолчанию связи между товарами являются односторонними, это можно изменить, отметив опцию «В блоке похожих товаров связь двусторонняя» в настройках модуля.
    *
    * @param array $attributes атрибуты шаблонного тега
    * count - количество выводимых товаров (по умолчанию 3)
    * images - количество изображений, прикрепленных к товару
    * images_variation - тег размера изображений, задается в настроках модуля
    * defer - маркер отложенной загрузки шаблонного тега: **event** – загрузка контента только по желанию пользователя при нажатии кнопки "Загрузить", **emergence** – загрузка контента только при появлении в окне браузера клиента, **async** – асинхронная (одновременная) загрузка контента совместно с контентом шаблонных тегов с тем же маркером, **sync** – синхронная (последовательная) загрузка контента совместно с контентом шаблонных тегов с тем же маркером, по умолчанию отложенная загрузка не используется, обычный вывод шаблонных тегов в коде страницы
    * defer_title - текстовая строка, выводимая на месте появления загружаемого контента с помощью отложенной загрузки шаблонного тега
    * template - шаблон тега (файл modules/shop/views/shop.view.show_block_rel_**template**.php; по умолчанию шаблон modules/shop/views/shop.view.show_block_rel.php)
    * @return void
    */

    public function show_block_rek($attributes)
    {
    if ($this->diafan->_site->module != "shop" || ! $this->diafan->_route->show)
    return false;

    $this->diafan->attributes($attributes, 'count', 'images', 'images_variation', 'template');

    $count = $attributes["count"] ? intval($attributes["count"]) : 3;
    $images = intval($attributes["images"]);
    $images_variation = $attributes["images_variation"] ? strval($attributes["images_variation"]) : 'medium';

    $this->model->show_block_rek($count, $images, $images_variation);
    $this->model->result();
    $this->model->result["attributes"] = $attributes;

    echo $this->diafan->_tpl->get('show_block_rek', 'shop', $this->model->result, $attributes["template"]);
    }


    11. В папке /modules/shop/views копируем файл shop.view.show_block_rel.php, называем shop.view.show_block_rek.php

    Выводим наш блок в нужном месте
    Код
    echo $this->htmleditor('<insert name="show_block_rek" module="shop" count="4" images="1" defer="emergence" defer_title="Рекомендуемые товары">');

Новости

  • 18 июня
  • В сборке большое обновление demo-шаблона, дополнительная защита от спама, улучшение YML-импорта и еще много важного и интересного.
  • 24 апреля
  • В новой сборке совершили революцию в структурировании кастомизированной информации в шаблонах, добавили авторегистрацию пользователей, усовершенствовали защиту от спама, актуализировали накопительную скидку, а также улучшили производительность и стабильность работы системы.
  • 12 января
  • После выхода сборки 7.1 мы выпустили уже три патча, в каждом из которых улучшаем административную часть сайта. Сборка DIAFAN.CMS 7.1.3 уже доступна к установке.