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)

Bera Ramazan @admin 10.09.2026 15:29
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
saltanat @saltanat 10.09.2026 15:42
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
Bera Ramazan @admin 10.09.2026 16:35
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
saltanat @saltanat 11.09.2026 10:40
Merhaba Çerez onay modülü linktedir.
https://dosya.co/sa9b2l62ozdt/home-cerez.rar.html

cerez onay.jpg