Здравствуйте,
Подскажите как создать копию модуля "Похожие товары" для карточек.
Нужно сделать отдельный модуль "Рекомендуемые товары" с тем же функционалом что и "Похожие товары"
Чтоб при каком-то UPDATE не вылезло боком....
Я бы взял механизм (комплекты - он бестолковый и его не используют) - он уже и является дублем ПОХОЖИЕ ТОВАРЫ
- кое что закоментить и изменить заголовки ====> Радуемся! (на всё про всё - минут 30)
ХЗ, может сделал чтото лишнее (если есть комменты то с удовольствием почитаю), но в итоге получилось.
Вот инструкция для тех кто ищет решение "Как скопировать модуль Похожие товары":
1. В базе данных копируем структуру таблицы diafan_shop_rel Для phpMyAdmin запрос: CREATE TABLE diafan_shop_rek LIKE diafan_shop_rel; где diafan_shop_rek наша новая таблица
2. В файле /modules/shop/admin/shop.admin.php добавляем вывод нашего поля для карточки
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;
}
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;
В новой сборке совершили революцию в структурировании кастомизированной информации в шаблонах, добавили авторегистрацию пользователей, усовершенствовали защиту от спама, актуализировали накопительную скидку, а также улучшили производительность и стабильность работы системы.
После выхода сборки 7.1 мы выпустили уже три патча, в каждом из которых улучшаем административную часть сайта. Сборка DIAFAN.CMS 7.1.3 уже доступна к установке.