Писать на форуме DIAFAN.CMS могут только зарегистрированные пользователи. Войдите или зарегистрируйтесь.
Всего найдено: 22
-
15 сентября , редакция: 1726350306
-
ХЗ, может сделал чтото лишнее (если есть комменты то с удовольствием почитаю), но в итоге получилось.
Вот инструкция для тех кто ищет решение "Как скопировать модуль Похожие товары":
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="Рекомендуемые товары">');
-
-
-
-
26 июля 2023 г.
-
Всех приветствую,
Как запретить отправку сообщений обратной связи с ссылками, если честно спам достал а капча и вопрос-ответ не сильно помогают.
Я так понял нужна проверка определенного поля на наличие ссылки по его ID.
Буду благодарен если напишите решение, если честно в PHP не особо силен. -
-
-
-
13 июля 2023 г.
-
Оставил для экспериманта копию на старом серваке, попробую разобраться.
- Обновил копию до последней версии,
- пробовал менять PHP на 7.0, 7.2, 7.4, 8.0
- сбросил кеш в админке,
- запустил Восстановление БД из админки,
- запустил Проверку оптимизации Таблиц БД цен товаров,
Результата нет ((( -
-
-
-
11 июля 2023 г.
-
Цитатато огда вместо "Все" выбирают каждую категорию с Ctrl, то когда вместо "Все" выбирают каждую категорию с Ctrl
Ну у меня таких характеристик совсем немного, не парился и выбирал везде "Все" просто в карточах их не заполнял
ЦитатаМожет где-то индексы с таблицах отвалились. Может наоборот, нужно поставить по полям, которые отбираются.Может где-то индексы с таблицах отвалились. Может наоборот, нужно поставить по полям, которые отбираются.
Тут я не знаю, в базах данных не разбираюсь -
-
-
-
08 июля 2023 г.
-
Всех приветсвую,
После недавнего сбоя и восстановления был сброшен кеш и запушена переиндексация поиска по товарам на сайте.
Сайт жутко тормозит, некоторые разделы не открываются. Те что открываются не содержат всех фильтров.
В админке так же наблюдаются проблемы с работой Каталога, при выборе показа Всех товаров они не отображаются + исчезают меню админки.
Если выбрать конкретную категорию товаров, то все норм.
В техподдержке хоста написали, что огромная нагрузка на БД и мол ждите ее снижения.
# Query_time: 126.335719 Lock_time: 0.000141 Rows_sent: 0 Rows_examined: 59433814
Сайт не работает уже неделю, чую что то не то.
Вопрос к знатокам - можно как то это поправить, ускорить?
P.S. Параллельно написал в поддержку хостинга и поддержку Diafan - жду ответ.
P.S. Сайт большой более 100к товаров, куча разных характеристик (реально разных - сайт стройматериалов). Читал гдето на форуме о подобной проблеме с неработающим сайтом для версии 6х, что это может быть из-за большого числа характеристик, но вроде поправили это дело или нет? -
-
-
-
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="Рекомендуемые товары">');
А вот тут уже не получается, подскажите что упустил. -
-
-
-
15 сентября , редакция: 1726350040
-
Добавил в /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"]);
}
Все выводится, спасибо за подсказку! -
-
-
Новости
-
18 июня
-
В сборке большое обновление demo-шаблона, дополнительная защита от спама, улучшение YML-импорта и еще много важного и интересного.
-
24 апреля
-
В новой сборке совершили революцию в структурировании кастомизированной информации в шаблонах, добавили авторегистрацию пользователей, усовершенствовали защиту от спама, актуализировали накопительную скидку, а также улучшили производительность и стабильность работы системы.
-
12 января
-
После выхода сборки 7.1 мы выпустили уже три патча, в каждом из которых улучшаем административную часть сайта. Сборка DIAFAN.CMS 7.1.3 уже доступна к установке.
Блоги
-
24.04.2024
-
Выпустили новую сборку DIAFAN.CMS 7.1.4.
Блоги
-
12.01.2024
-
В данном руководстве познакомим вас с панелью управления DIAFAN.CMS