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

Как продублировать функцию Похожие товары

  • 22 июля 2014 г.
  • Как продублировать функцию Похожие товары ?

    Что сделал:
    1. В файле shop.admin.php продублировал вывод кнопки
    'rel_elements_2' => array(
    'type' => 'function',
    'name' => 'Похожие товары 2',
    'help' => 'Похожие товары 2.',
    ),

    2. В файле shop.model.php продублировал полностью все функцию похожих товаров с изменение названия функции на public function show_block_rel_2 и название таблицы в БД на shop_rel_2

    3. В БД создана полностью идентичная таблица shop_rel Новая таблица shop_rel_2,

    Проблема в админке нет новой кнопки для добавления новых похожих товаров. Подскажите что еще отвечает за Похожие товары.
  • 22 июля 2014 г.
  • Накопал еще вот что:
    В папке adm/includes/ как я понимаю есть файлы отвечающие за это функцию

    Если кто делал подскажите пожалуйста как правильно все сделать.
    Выложим потом в примерах, думаю многим это может понадобиться.
    • 23 июля 2014 г.
    • Думаю в базе данных надо еще поля создавать

      http://cms.diafan.ru/dokument/full-manual/examples/createmodule/
      • 23 июля 2014 г.
      • В БД все создано
        • 24 июля 2014 г.
        • Логика добавления новых кнопок/полей и других элементов в административную панель следующая(если позволите, буду рассказывать на примере модуля bs. Предположим, что нам требуется создать текстовое поле с редактором:
          1. Добавляем в БД в таблицу yourprefix_bs столбец bannerTxt с типом text.
          1. Идем в bs.model.php
          1.1. Ищем строку запроса в БД и дописываем туда вновь созданное поле:

          Строка 36
          Код
          $result = DB::query("SELECT e.id, e.type, e.file, e.html, e.link, e.check_number, e.show_number, e.check_user, e.show_user, e.check_click, e.show_click, e.count_view, e.width, e.height, e.[alt], e.[title], e.target_blank, e.bannerTxt, e.name"


          Строка 59-61:
          Код
          $result = DB::query(
          "SELECT DISTINCT e.id, e.type, e.file, e.html, e.link, e.check_number,"
          ." e.show_number, e.check_user, e.show_user, e.check_click, e.show_click, e.count_view, e.width, e.height, e.[alt], e.[title], e.target_blank, e.bannerTxt, e.name"


          Идем в /bs/views/bs.view.show_block.php и дописываем в нужном месте:
          Код

          if(! empty($row["bannerTxt"]))
          {
          echo '<div class="text2"><span>';
          echo $row["bannerTxt"];
          echo '</span></div>';
          }


          Идем в /bs/admin/bs.admin.php
          Создаем там наше поле примерно так:
          Код
          public $variables = array (
          'main' => array (
          'name' => array(
          'type' => 'text',
          'name' => 'Название',
          ),
          'bannerTxt' => array(
          'type' => 'editor',
          'name' => 'Текст на банере'
          ),
          и т..д


          Вот, собственно и все. Поле должно появиться и работать(если Вы не используете категории)
          • 24 июля 2014 г.
          • Я вроде про похожие товары спрашивал, а не про баннеры
            • 24 июля 2014 г.
            • В похожих товарах совсем все по другому, и такой метод он не работает.
              Точнее по мимо этого нужно еще очень многое сделать
              • 24 июля 2014 г.
              • на самом деле не так уж и много, все делается по аналогии с rel_elements, единственное надо учесть что последнее обрабатывается в ядре движка. Соответственно туда надо будет добавлять код. + в скрипты
  • 02 марта 2015 г.
  • Виталий, можешь расписать как правильно сделать копию модуля похожих товаров? спасибо
  • 18 марта 2015 г.
  • Тоже интересует.

    Нарыл то что вывод кнопки и всплывающее окно находяться в файле admincludesedit_functions.php (Строка: 1115-1159)
    База отвечающая за хранения элементов (diafan_shop_rel)

    Отвечающие поля за вывод данных из базы: id, element_id, rel_element_id, trash.

    Мои попытки сделать копию не к чему хорошему не привели, но то что бы копия модуля отображалась в админке добился, остается реализовать получение данных из БД.
  • 14 сентября
  • Здравствуйте,
    Подскажите в итоге есть нормальная инструкция? Я добился почти )))

    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 Рекомендуемые товары
    *
    * @param integer $count количество товаров
    * @param integer $images количество изображений
    * @param string $images_variation размер изображений
    * @return array
    */
    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/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="Рекомендуемые товары">');

    А вот тут уже не получается, подскажите что упустил.
    • 14 сентября
    • А какой именно момент не получается?
      На скрине рекомендуемые товары видны.
      • 14 сентября , редакция: 14 сентября
      • Вывести теперь на страницу нужно както, желаельно через шорткод, конструкция из 10 пункта не работает (((
        Похоже гдето надо зарегистрировать копию модуля или както по другому его выводить
        • 14 сентября
        • Наверное, вам сюда: https://www.diafan.ru/dokument/full-manual/examples/template-tag/
          Т.е. show_block_rek такого шаблонного тега не существует, поэтому для начала его нужно создать.
          • 15 сентября , редакция: 15 сентября
          • Добавил в /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"]);
            }


            Все выводится, спасибо за подсказку!
            • 15 сентября
            • Вам спасибо за подробную инструкцию.
              Может быть кому-то еще пригодится.

Новости

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

Форум