saltanat @saltanat
Merhaba, aşağıdaki kod bloklarından products.php dosyasını containeradmin yolunu takip ederek güncelleyebilirsiniz
<?php
	if (!defined('IN_ADMIN')) {
		exit;
	}
	$sonuc = '';
	$sonucType = 'success';
	
	if (Tools::isSubmit('deleteProduct'))
	{
		$formToken = md5(Tools::getValue('deleteProduct'));
		if (md5($adminToken) == $formToken)
		{
			$idProduct 	= (int)Tools::getValue('idProduct');
			$isHave		= DB::getRow('products', 'id_product = '.(int)$idProduct.'', 'product_name');
			if ($isHave)
			{
				DB::execute('DELETE FROM products WHERE id_product = '.(int)$idProduct.' LIMIT 1');
				$sonuc = $isHave.' ürünü başarıyla silindi';
			}
		}
	}

	if (Tools::isSubmit('duplicateProduct'))
	{
		$formToken = md5(Tools::getValue('duplicateProduct'));
		if (md5($adminToken) == $formToken)
		{
			$idProduct = (int)Tools::getValue('idProduct');
			
			$isHave = DB::getRow('products', 'id_product = ' . (int)$idProduct, 'product_name');
			
			if ($isHave)
			{
				$suffix = time();
				
				$sql = "INSERT INTO products (
							id_category, id_brand, id_supplier, product_name, short_description, 
							meta_title, meta_description, description, product_link, price, 
							pack_price_override, cost, doviz, doviz_price, doviz_old_price, 
							doviz_cost, old_price, vat, active, stock, sale_unit, 
							sale_qty_min, sale_qty_step, cargo_day, label, product_video, 
							stock_code, barcode, desi, product_type, virtual_kind, 
							virtual_file, virtual_file_name, virtual_text
						)
						SELECT 
							id_category, id_brand, id_supplier, 
							CONCAT(product_name, ' (Kopya)'), 
							short_description, meta_title, meta_description, description, 
							CONCAT(product_link, '-kopya-{$suffix}'), 
							price, pack_price_override, cost, doviz, doviz_price, 
							doviz_old_price, doviz_cost, old_price, vat, active, stock, 
							sale_unit, sale_qty_min, sale_qty_step, cargo_day, label, 
							product_video, 
							CONCAT(stock_code, '-{$suffix}'), 
							barcode, desi, product_type, virtual_kind, 
							virtual_file, virtual_file_name, virtual_text
						FROM products 
						WHERE id_product = " . (int)$idProduct;
				
				$result = DB::execute($sql);
				
				if ($result) {
					$sonuc = 'Ürün başarıyla kopyalandı.';
					$sonucType = 'success';
				} else {
					$sonuc = 'Ürün kopyalanırken bir hata oluştu.';
					$sonucType = 'danger';
				}
			} else {
				$sonuc = 'Kopyalanacak ürün bulunamadı.';
				$sonucType = 'danger';
			}
		}
	}

	if (Tools::isSubmit('bulkProductAction'))
	{
		$formToken = md5(Tools::getValue('bulkProductToken'));
		if (md5($adminToken) === $formToken)
		{
			$action = trim((string) Tools::getValue('bulkProductAction'));
			$productIds = Tools::getValue('productIds');
			$ids = is_array($productIds) ? $productIds : [];

			if ($action === 'activate') {
				$result = Product::bulkSetActive($ids, 1);
			} elseif ($action === 'deactivate') {
				$result = Product::bulkSetActive($ids, 0);
			} elseif ($action === 'delete') {
				$result = Product::bulkDelete($ids);
			} else {
				$result = ['success' => false, 'message' => 'Geçersiz toplu işlem'];
			}

			$sonuc = (string) ($result['message'] ?? '');
			$sonucType = !empty($result['success']) ? 'success' : 'danger';
		}
	}


	$currentPage 	= max(1, (int) Tools::getValue('page'));
	$query 			= trim((string) Tools::getValue('q'));
	$idCategory 	= (int) Tools::getValue('category');
	$idBrand 		= (int) Tools::getValue('brand');
	$idSupplier 	= (int) Tools::getValue('supplier');
	$activeRaw 		= Tools::getValue('active', -1);
	$activeFilter 	= ($activeRaw === '' || $activeRaw === false || $activeRaw === null)
		? -1
		: (int) $activeRaw;
	$perPage 		= 30;

	$total = Product::countAdmin($query, $idCategory, $idBrand, $activeFilter, $idSupplier);
	$queryParams = array_filter([
		'q' 			=> $query,
		'category' 		=> $idCategory > 0 ? $idCategory : null,
		'brand' 		=> $idBrand > 0 ? $idBrand : null,
		'supplier' 		=> $idSupplier > 0 ? $idSupplier : null,
		'active' 		=> $activeFilter >= 0 ? $activeFilter : null,
	], static fn($v) 	=> $v !== null && $v !== '');

	$pagination = Pagination::build($total, $currentPage, $perPage, Admin::url('products'), $queryParams);
	$products 	= Product::getAdminList($query, $idCategory, $idBrand, $activeFilter, $perPage, $pagination['offset'], $idSupplier);

	$flash = class_exists('ExportExcelService', false) ? ExportExcelService::consumeFlash() : null;
	if ($flash && $flash['message'] !== '') {
		$sonuc = $flash['message'];
		$sonucType = $flash['type'] === 'danger' ? 'danger' : 'success';
	}

	$smarty->assign([
		'products' 			=> $products,
		'pagination' 		=> $pagination,
		'searchQuery' 		=> $query,
		'categoryFilter' 	=> $idCategory,
		'brandFilter' 		=> $idBrand,
		'supplierFilter' 	=> $idSupplier,
		'activeFilter' 		=> $activeFilter,
		'categoryOptions' 	=> Category::getProductSelectOptions(),
		'brandOptions' 		=> Brand::getOptions(),
		'supplierOptions' 	=> Supplier::getOptions(),
		'sonuc' 			=> $sonuc,
		'sonucType' 		=> $sonucType,
	]);

	AdminPage::add('products', 'Products');


aşağıdaki kod bloğunu  templatesadmin yolunda  products.tpl dosyasını değiştirerek ürün kopyalama için gerekn html kodu ile  ekli görünecektir.
php
{if $sonuc}







{$sonuc|escape}





{/if}





{include file='admin/partials/filter-funnel-icon.tpl'}
{'Filters'|adminT}

{'Search...'|adminT}





{'Search'|adminT}



{'Category'|adminT}

{'All categories'|adminT}
{foreach $categoryOptions as $cat}
{if isset($cat.depth) && $cat.depth > 0}{for $i=1 to $cat.depth}—{/for} {/if}{$cat.categoryname|escape}
{/foreach}



{'Brand'|adminT}

{'All brands'|adminT}
{foreach $brandOptions as $b}
{$b.brand
name|escape}
{/foreach}



{'Supplier'|adminT}

{'All suppliers'|adminT}
{foreach $supplierOptions as $s}
{$s.suppliername|escape}
{/foreach}



{'Status'|adminT}

{'All statuses'|adminT}
{'Active'|adminT}
{'Inactive'|adminT}






{'Filter'|adminT}
{'Clear'|adminT}









{'New Product'|adminT}





0 {'selected'|adminT}
{'Active'|adminT}
{'Deactive'|adminT}
{'Delete'|adminT}











{'ID'|adminT}
{'Product'|adminT}
{'Category'|adminT}
{'Brand'|adminT}
{'Supplier'|adminT}
{'Price'|adminT}
{'Stock'|adminT}
{'Status'|adminT}




{if $products|@count}
{foreach $products as $row}





{$row.id
product}
{$row.productname|escape|truncate:40}{if $row.producttype|default:'physical' == 'virtual'} {'Virtual'|adminT}{/if}
{$row.categoryname|escape}
{$row.brand
name|escape}
{if $row.suppliername|default:'' != ''}{$row.suppliername|escape}{else}—{/if}
{$row.priceformatted}
{$row.stock
formatted|default:$row.stock}
{$row.active_label|escape}
















{/foreach}
{else}
{'No records found.'|adminT}
{/if}





{include file='admin/plugin/pagination.tpl'}


(function () {
'use strict';

var selectAll = document.getElementById('productsSelectAll');
var bulkForm = document.getElementById('productsBulkForm');
var countEl = document.getElementById('productsBulkCount');

function getBoxes() {
return document.querySelectorAll('.js-product-select');
}

function updateBulkBar() {
var checked = document.querySelectorAll('.js-product-select:checked');
var total = getBoxes().length;
var selected = checked.length;

if (bulkForm) {
bulkForm.hidden = selected === 0;
}

if (countEl) {
countEl.textContent = selected + ' ürün seçildi';
}

if (!selectAll) {
return;
}

selectAll.checked = total > 0 && selected === total;
selectAll.indeterminate = selected > 0 && selected < total;
}

if (selectAll) {
selectAll.addEventListener('change', function () {
getBoxes().forEach(function (box) {
box.checked = selectAll.checked;
});
updateBulkBar();
});
}

document.addEventListener('change', function (event) {
if (event.target && event.target.classList.contains('js-product-select')) {
updateBulkBar();
}
});

document.querySelectorAll('.js-bulk-product-submit').forEach(function (btn) {
btn.addEventListener('click', function (event) {
if (document.querySelectorAll('.js-product-select:checked').length === 0) {
event.preventDefault();
event.stopPropagation();
if (window.AdminToast) {
AdminToast.show('{'Select at least one product'|adminT|escape:'javascript'}', 'warning');
}
}
});
});
})();

Replies (5)

Merhaba paylaşımız için çok teşekkür ederim güzel olmuş eline sağlık v3 de ürün kopyalama özelliği yerleşik olarak var önceki sürümler için ise faydalı bir dökümasyon olmuş
FriSay E-Commerce
teşekkür ederim yorumunuz için. fakat bende 3 sürümü indirdim fakat kopyalama dair link göremedim yanlış sürüme mi baktım acaba,birde home-cerez modulu yaptım .admin paneli vs mevcut asktif pasif destei ile uygunsa yada henüz bçyle bir modul yapmadıysanız size göndereyim kontrol ederek modülü indirmeye açık hale getirin. cevabınız bekliyorum
Merhaba v3 sümünü geliştirmeye devam ediliyor henüz yayınlamadığımız sürümde şuan mevcuttur birde modülü buradan paylaşırsanız hem biz hemde başka kullanıcılarda faydalanacaktır. Teşekkürler
image
FriSay E-Commerce
Merhaba Çerez onay modülü linktedir.
https://dosya.co/sa9b2l62ozdt/home-cerez.rar.html

cerez onay.jpg