Opencart vQmod Kullanımı


vQmod nedir:

vQmod opencart kaynak dosyaları değiştirmeden dosyalar üzerinde değişiklikler yapabilmeye imkan sağlayan bir araçtır. Böylece hem değişikliklerinizi tek bi yerden görüp kontrol etmeniz kolaylaşır hem de kaynak dosyalar değişmediği için opencart versiyon güncellemesi yapmanız kolaylaşır. vqmod github üzerinden indirip kurabilirsiniz (https://github.com/vqmod/vqmod). Kurulumu oldukça basit (google da kolayca örnek video bulabilirsiniz). xml klasörü içerisine ekleyeceğiniz özelleştirmeler ile istediğiniz değişiklikleri yapmaya başlayabilirsiniz. xml klasörü içerisine dosya-ismi.xml şeklinde xml uzantılı dosyalar oluşturmalısınız*** Genelde alakalı işlemleri tek bir xml dosyasında toplamanızı öneririm.
*** xml dosyalarınız sistem tarafından dosya adına göre sırayla çalıştırılır. Dolayısı ile ilk yapılacak değişiklikler için örneğin dosya ismini a_ilk_islemler.xml yapın.
Aşağıda bir xml dosyası örneğini ekliyorum, bu şablonu kullanabilirsiniz:
<modification>
    <name>urun-duzenlemeleri</name>
    <version>v1.0</version>
    <author>Ayhan</author>
    <code>urun-duzenlemeleri</code>

    <file path="catalog/controller/product/product.php">
    <operation info="urun id bilgisini bir degiskene aktar">
        <search index="1"><![CDATA[$data['manufacturer'] = $product_info['manufacturer'];]]></search>
        <add position="before"><![CDATA[$this_product_id = $data['product_id'];]]></add>
    </operation>
    </file>
    
</modification>

vQmod parametre kullanımı:

position, index, offset gibi parametreleri iki yere de yazabilirsiniz. <search index="1" position="before"> veya <add index="1" position="before"> İki türlü de çalışacaktır. Fakat ben position ve offset parametrelerini add satırına, index parametresini ise search satırına yazmayı tercih ediyorum. info ise operation satırına yazılır ve yapılan işlemle ilgili size yardımcı olacak bir ifade yazabilirsiniz. Bu parametrelerin kullanıldığı örnekleri bu yazıda bulabilirsiniz.  

vQmod position kullanımı:

position parametresi before, after ve replace olarak üç farklı değer alır. Belirttiğiniz değişiklik aranılan ifadenin öncesine eklenecekse before, sonrasına eklenecekse after kullanın. Eğer aranılan ifadeyi değiştirmek istiyorsanız o zaman replace kullanın. 
* replace kullanımından kaçınmanızı öneririm, çünkü değiştirdiğiniz bir satırı başka bir opencart eklentisi veya başka bir vqmod xml dosyası kullanmış olabilir. Çok mecbur kalmadıkça replace yerine before ve after kullanın.
* Yine aranılan ifadeyi tam bir satır olarak yazmanız şart değil. Satırda geçen bir kısmı arayabilirsiniz. Örneğin bir satırda yazan kod şu şekilde olsun: 
$data['stock'] = $product_info['quantity'];
Burada iki türlü arama yapabilirsiniz:

<search><![CDATA[$data['stock'] = $product_info['quantity'];]]></search>
<add position="after"><![CDATA[$data['stock']++;]]></add>

<search><![CDATA[$product_info['quantity'];]]></search>
<add position="replace"><![CDATA[1 + $product_info['quantity'];]]></add>

vQmod index kullanımı:

index parametresini aradığınız ifade birden fazla yerde geçiyorsa hangi sıradaki arama sonucunu kastettiğinizi belirlemek için kullanırsınız. Eğer tek yerde geçiyorsa index kullanmanıza gerek yok. index kullanımında en çok karıştırılan konulardan birisi ilk bulunan karakteri belirlemek istiyorsanız index="1" yazmalısınız, yine sırasıyla ikinci bulunan için index="2", ...vb sırayla gidecektir. İnternette bazı kaynaklarda ilk bulunan için index="0" yazılmalı demişler fakat bu bende işe yaramadı (vQmod 2.6.4 versiyonunu kullanıyorum). 
İlk bulunan ifadeyi kasteden bir örnek kullanım aşağıdadır:
<file path="catalog/controller/product/product.php">
<operation info="urun id bilgisini bir degiskene aktar">
    <search index="1"><![CDATA[$data['manufacturer'] = $product_info['manufacturer'];]]></search>
    <add position="before"><![CDATA[$this_product_id = $data['product_id'];]]></add>
</operation>
</file>

vQmod offset kullanımı:

offset parametresini position="replace" kullandığımız zamanlarda ve aynı anda birkaç satırı birden değiştirmek istiyorsanız kullanırız. 
Çalışma mantığı şu şekildedir: aradığınız ifade ile satır bulunur, offset değerinde yazdığınız sayı kadar daha satır aşağıya doğru seçilir (yani offset="3" ise aradığınız satır + altındaki 3 satır seçilir). Boş satır bile olsa onu da saymak zorundasınız. Örnek kullanımı aşağıdadır.
Orjinal kod:
$data['button_cart'] = $this->language->get('button_cart');

$data['button_wishlist'] = $this->language->get('button_wishlist');
$data['button_compare'] = $this->language->get('button_compare');
vQmod değişiklik kodu (boş satırı da sayarsak aranılan satırdan sonra 3 satırı daha seçmeliyiz):
<operation info="birkac satiri degistir">
    <search><![CDATA[$data['button_cart'] = $this->language->get('button_cart');]]></search>
    <add position="replace" offset="3"><![CDATA[
    $data['button_cart'] = 'Go: ' . $this->language->get('button_cart');

    $data['button_wishlist'] = 'Go: ' . $this->language->get('button_wishlist');
    $data['button_compare'] = 'Go: ' . $this->language->get('button_compare');
    ]]></add>
</operation>
Değişikliğin uygulanmış hali:
$data['button_cart'] = 'Go: ' . $this->language->get('button_cart');

$data['button_wishlist'] = 'Go: ' . $this->language->get('button_wishlist');
$data['button_compare'] = 'Go: ' . $this->language->get('button_compare');
.

Opencart Gmail SMTP Ayarları (2023)


Gmail artık güvensiz üçüncü taraf uygulama erişimini kapattı. Bu nedenle 2 adımlı doğrulama ve uygulama erişimini aktif hale getirerek Gmail hesabınızı opencart'da kullanabilirsiniz. Nasıl yapılacağını anlatan aşağıdaki sayfadan veya videodan inceleyebilirsiniz.


Son Güncelleme: 28/11/2022

Opencart'da "Error while sending QUERY packet. PID=" Hatası ve Çözümü


PHP Warning:  Error while sending QUERY packet. PID=29811 in /public_html/system/library/db/mpdo.php on line 57 gibi bir hata alıyorsanız bunun nedeni sorgulamalarınızın izin verilen maksimum değeri geçmesi olabilir. 

Bu hatanın çözümü için, ilgili dosyaya (system/library/db/mpdo.php) aşağıdaki satırı eklemenizi öneririm:
$this->connection->exec("SET GLOBAL max_allowed_packet=524288000");

Ben bu şekilde sorunu çözdüm. Kodu eklediğinizde aşağıdaki gibi olacaktır:

public function __construct($hostname, $username, $password, $database, $port = '3306') {
    try {
        $this->connection = new \PDO("mysql:host=" . $hostname . ";port=" . $port . ";dbname=" . $database, $username, $password, array(\PDO::ATTR_PERSISTENT => true));
    } catch(\PDOException $e) {
        throw new \Exception('Failed to connect to database. Reason: \'' . $e->getMessage() . '\'');
    }

    $this->connection->exec("SET NAMES 'utf8'");
    $this->connection->exec("SET CHARACTER SET utf8");
    $this->connection->exec("SET CHARACTER_SET_CONNECTION=utf8");
    $this->connection->exec("SET SQL_MODE = ''");
    $this->connection->exec("SET GLOBAL max_allowed_packet=524288000");
}


Opencart Ajax Filter by Dreamvention


Opencart standart yapısında kullanılışlı bir filtreleme maalesef bulunmuyor. Ajax yani sayfa yenilenmeden filtreleme yapabileceğiniz ücretsiz bir eklenti arıyorsanız Dreamvention tarafından yayınlanan Ajax Filter Free eklentisini öneririm:

MODÜL İÇİN TAVSİYE ETTİĞİM AYARLAR:
Aşağıdaki ayarlar tavsiye niteliğindedir fakat bazı ayarlar modülün çalışmasını direk etkilediği için önemlidir.







GÖRDÜĞÜM HATALAR ve ÇÖZÜMLERİ:

Buradan sonra yazacaklarım Opencart 2.3.0.2 versiyonu ve eklentisi için geçerlidir, diğer versiyonlarda benzer sorunlar mevcut ise uygulayabilirsiniz. 

Sorun 1: Bir kategori sayfasını açtınız diyelim ve hiç beklemeden menüden başka bir kategoriye tıkladınız. Bu durumda hala ilk tıkladığınız kategorinin ürünlerini görmeye devam ediyorsanız, bunun nedeni Ajax Filter eklentisinin veritabanındaki TEMP tablodan işlem yapmasıdır. Arada az zaman geçtiği için hala eski sorgudaki ürünleri listelemektedir.

Çözüm: Eklentiyi indirip kurduktan sonra aşağıdaki kodları bir xml dosyası olarak kaydedip vqmod/xml klasörünüze ekleyiniz. Vqmod kullanmıyorsanız ilgili dosyalardan bu değişiklikleri manuel olarak yapabilirsiniz. Burada HTTP_USER_AGENT hatası ile ilgili ek olarak bir düzeltme daha var, onu da eklemenizi tavsiye ederim.
  <file path="catalog/controller/extension/module/d_ajax_filter.php">
  <operation info="HTTP_USER_AGENT error">
      <search><![CDATA[if (preg_match('/(iPhone|iPod|iPad|Android|Windows Phone)/', $this->request->server['HTTP_USER_AGENT'])) {]]></search>
      <add position="replace"><![CDATA[
      if ( isset($this->request->server['HTTP_USER_AGENT']) && preg_match('/(iPhone|iPod|iPad|Android|Windows Phone)/', $this->request->server['HTTP_USER_AGENT']) ) {
      ]]></add>
  </operation>
  </file>
  <file path="catalog/model/extension/module/d_ajax_filter.php">
  <operation info="fix temp database">
      <search><![CDATA[$this->db->query($sql);]]></search>
      <add position="before" index="1"><![CDATA[
      $this->db->query("DROP TEMPORARY TABLE IF EXISTS `".DB_PREFIX."af_temporary`");
      ]]></add>
  </operation>
  </file>

Sorun 2: "Kurdum, ayarlamaları yaptım, fakat ajax mode çalışmıyor. Yani filtreleme yaptığımda hiçbir değişiklik olmuyor." diyorsanız bunun nedeni muhtemelen modülün ayarlarında bulunan Content Path'in doğru girilmemesidir. Burada bir jquery seçici girilmiştir. Fakat sizin temanıza ait kategori listeleme sayfasında bu id'ye sahip bir div elemanı bulunmadığı için ajax modu çalışmamaktadır.

Çözüm: Kendi temanıza ait kategori listeleme sayfasını açın ve <div id="content"> elemanından sonra gelen ilk div'e ait id'yi bulup buraya girin. Bu düzenlemeyi yukarıdaki modül ayarlarına ait resimlerde görebilirsiniz.

Opencart PHP Zip & Download (Ajax Method)


Opencart sayfasındaki bir butona tıklayarak dosyaları indirmek için ajax metodunu kullanabilirsiniz. Bunun için controller ve view dosyalarına ekleyeceğiniz kodlar aşağıdadır.

Controller:
public function downloadAllFiles() {
    $json = array();

    $zip_files = array(
        "file-1.jpg",
        "file-2.jpg",
        "file-3.jpg",
    );
    
    if ( count($zip_files) > 0 ) {
        $zipname = "indir.zip";
        $zip = new ZipArchive;
        $zip->open($_SERVER['DOCUMENT_ROOT']."/store/image/download/".$zipname, ZipArchive::CREATE);
        foreach ($zip_files as $file) {
          $zip->addFile($_SERVER['DOCUMENT_ROOT']."/store/image/download/".$file, $file);
        }
        $zip->close();

        //success and send zip file path
        $json['success'] = 'https://example.com/store/image/download/'.$zipname;
        $this->response->addHeader('Content-Type: application/json');
        $this->response->setOutput(json_encode($json));
    }
    else {
        $json['error'] = "İndirilecek dosya bulunamadı! Lütfen kontrol ediniz.";
        $this->response->addHeader('Content-Type: application/json');
        $this->response->setOutput(json_encode($json));
    }
}

View:
<!-- Add Download Button -->
<button id="btn-download-zip" data-loading-text="<?php echo $text_downloading; ?>" class="btn btn-info"><?php echo $text_download; ?> <i class="fa fa-download"></i></button>

<!-- Add Ajax Script -->
<script type="text/javascript">
    $(document).delegate('#btn-download-zip', 'click', function() {
        $.ajax({
            url: 'index.php?route=sale/order/downloadallfiles',
            type: 'post',
            dataType: 'json',
            beforeSend: function() {
                $('#btn-download-zip').button('loading');
            },
            complete: function() {
                $('#btn-download-zip').button('reset');
            },
            success: function(json) {
                $('.alert').remove();

                if (json['error']) {
                    $('#content > .container-fluid').prepend('<div class="alert alert-danger"><i class="fa fa-exclamation-circle"></i> ' + json['error'] + '</div>');
                }
                else {
                    //download zip file
                    window.location.href = json['success'];
                }
            },
            error: function(xhr, ajaxOptions, thrownError) {
                alert(thrownError + "\r\n" + xhr.statusText + "\r\n" + xhr.responseText);
            }
        });
    });
</script>

Opencart Sözlüğü

Opencart Dictionary


TR


Opencart Ürün Listeleme Modülleri
BestsellerEn çok satan ürünler. Genelde anasayfada en çok satan ürünleri listelemek için kullanılır.
FeaturedSeçilen ürünler. Sizin tek tek seçerek belirlediğiniz ürünlerden oluşan bir listedir.
LatestYeni ürünler. Mağazaya en son eklediğiniz ürünleri içeren listedir.
Specialİndirimli ürünler. İndirimli fiyat girdiğiniz ürünleri içeren listedir.

Diğer
AffiliateOrtaklık. Opencart ortaklık sistemine sahiptir. Modüller içinden bunu aktif hale getirebilir, mağaza ayarlarınızdan komisyon ve başvuru ayarlarını düzenleyebilirsiniz.
TransactionsMağaza kredisi. Mağazanın hesabınıza tanımladığı bakiye ile alışveriş yapabilirsiniz. Bu kredi ile yaptığınız işlemleri ve kalan bakiyenizi Hesabım > Bakiye İşlemleri menüsünden takip edebilirsiniz.

EN

Opencart Product Listing Modules
BestsellerBest selling products. It is often used to list the best selling products on the homepage.
FeaturedSelected products. It is a list of products that you choose individually.
LatestNew products. This is the list of products you recently added to the store.
SpecialDiscounted products. The discounted price is the list that contains the products you entered.

Other
AffiliateReseller. Opencart has reseller system. You can activate this from within the modules, and edit commission and application settings from your store settings.
TransactionsStore credit. You can shop with the balance defined by the store to your account. You can track your transactions with this credit and your remaining balance on the My Account > Your Transactions menu.

Opencart Müşteri Bilgileri (ad, soyad, eposta, telefon vb.)

Opencart Get Customer Info (firstname, lastname, email, telephone etc.)

Opencart sistemi üzerinde oturum açmış olan müşteriye ait bilgileri almak için aşağıdaki metodları kullanabilirsiniz. Bunları system/library/cart/customer.php (versiyona göre customer.php yolu değişmektedir) içerisinde detaylı olarak görebilirsiniz.

$customer_is_logged      = $this->customer->isLogged();
$customer_id             = $this->customer->getId();
$customer_first_name     = $this->customer->getFirstName();
$customer_last_name      = $this->customer->getLastName();
$customer_group_id       = $this->customer->getGroupId();
$customer_email          = $this->customer->getEmail();
$customer_telephone      = $this->customer->getTelephone();
$customer_fax            = $this->customer->getFax();
$customer_newsletter     = $this->customer->getNewsletter(); //müşterinin bülten aboneliği var mı (1,0)
$customer_address_id     = $this->customer->getAddressId();
$customer_balance        = $this->customer->getBalance(); //müşterinin toplam mağaza kredisi tutarı
$customer_reward_points  = $this->customer->getRewardPoints(); //müşterinin kazandığı puanların toplamı



Opencart Para Birimleri Mevzuları


T.C. MERKEZ BANKASINDAN KURLARI ALMA

erdalatabalkan Doviz Kurlari Guncellemesi eklentisi bu iş için bence en iyisi. Çünkü opencart standart özellikleri üzerinden çalışıyor ve hiçbir dosyayı upload etmek gerekmiyor. Döviz kurlarını TCMB efektif satış değeri üzerinden alıp günceller. Ben efektif satış değerini kullanıyorum çünkü en yüksek değer bu fakat kodlarda ufak değişiklik ile bunu değiştirebilirsiniz.


PARA BİRİMLERİNİ GÜNCELLEME

MANUEL YÖNTEM:
Eğer güncelleme işlemini manuel yapmak isterseniz Admin > Ayarlar > Yerelleştirme > Para Birimleri > Yenile (turuncu buton) tıklayın.

OTOMATİK YÖNTEMLER:
1) Admin > Ayarlar > Seçenekler > Yerel > Para Birimini Otomatik Güncelle > Evet seçerek opencart standart güncellemesini açabilirsiniz. Daha sonra Opencart Admin Panelin anasayfasına (diğer sayfayarda olmuyor) her girdiğinizde para birimleri otomatik güncellenecektir. Otomatik para birimi güncellemesi açık olsa dahi, Admin Panel anasayfasına girmezseniz güncelleme gerçekleşmeyecektir!!!

2) İlk maddede belirttiğim üzere Admin Panel anasayfasında gerçekleşen güncelleme komutlarını, yine Admin panelde daha sık girdiğiniz Siparişler sayfasına ekleyebilirsiniz. Bu kodu dashboard.php controller dosyası içinde bulabilirsiniz. Kopyalayıp siparişler sayfası controller dosyasındaki index metodu içine ekleyiniz. Bu işi yapan vqmod komutları aşağıdaki gibidir:
<file path="admin/controller/sale/order.php">
<operation>
  <search><![CDATA[public function index() {]]></search>
  <add position="after"><![CDATA[
  // Run currency update
  if ($this->config->get('config_currency_auto')) {
    $this->load->model('localisation/currency');

    $this->model_localisation_currency->refresh();
  }
  ]]></add>
</operation>
</file>
3) Yukarıda verdiğim kodlar ile bir admin/controller dosyası oluşturun. Ardından bu dosyanın url'si ile CPanel'den bir cron job oluşturun. Böylece otomatik güncellemeyi sağlamış olursunuz. Bu mantıkla hazırlanmış GrandCMS gibi eklentileri Opencart marketinden indirip kullanabilirsiniz. Ben test etmediğim için burada işin mantığını anlatmaya çalıştım.

Bu üç yöntemden birini veya hepsini birden aynı anda kullanabilirsiniz.

 

ÇOKLU PARA BİRİMİ İLE ÇALIŞMA

Opencart mağazanızda birden fazla para birimi ile çalışmanız mümkün. Bu işlem mağazanızın üst menüsünde bulunan para birimlerinden birini seçmek kadar kolay. Dolar, Euro, TL, ... ne seçerseniz o mağazaki bütün fiyatlar bu para biriminden gösterilmeye başlayacaktır. 

Taki ödeme aşamasına gelene kadar hiçbir sorun olmayacaktır. Eğer ödeme aşamasında mağazanın varsayılan para birimi ne ise o birimden işlemin gerçekleşmesini isterseniz bu sorun olacaktır. Kredi kartı modülünüzden veya herhangi bir sebepten dolayı, örneğin fiyatlar Euro olarak gösterilse dahi, son aşamada TL olarak ödensin isteyebilirsiniz.

İşte Opencart standart olarak bunu sağlamıyor malesef! Bu durumda çoklu para birimi eklentileri devreye giriyor. Çoklu para birimi kullanımından kastettiğim de budur. Çözüm için opencart eklenti mağazasında farklı eklentiler bulmanız ve sisteminize göre entegre etmeniz mümkün. Burada kendi hazırladığım Çoklu Para Birimi eklentisini paylaşamıyorum fakat benimle iletişime geçerek talep edebilirsiniz.


SSS

1) Opencart para birimlerini otomatik güncelleme özelliği nereden aktif hale getirilir?
Admin > Ayarlar > Seçenekler > Yerel > Para Birimini Otomatik Güncelle > Evet seçerek güncellemeyi aktif hale getirirsiniz.

2) Opencart otomatik olarak para birimlerini hangi aralıkta / ne zaman günceller?
Admin Panel anasayfasına her girdiğinizde günceller. Admin panelin diğer sayfalarında güncelleme olmaz sadece anasayfasında olur. Tabiki 1. maddede belirttiğim gibi otomatik güncelleme özelliğinin açık olması gereklidir.



Bu yazıda paylaştığım eklentileri hazırlayan arkadaşlara teşekkür ederim.
Son Güncelleme: 4/6/2020

Opencart Samesite Hatası ve Çözümü


Samesite Hatası:
Yeni Chrome güncellemesi ile yaşanan Samesite hatası opencart için de sıkıntı oluşturmaktadır. Özellikle ödeme aşamasında 3D güvenlik sms'i için banka sayfasına gidip geri döndüğünüzde oturumunuzun sonlanması durumu ciddi sıkıntılara yol açmaktadır. Ödeme alınsa dahi sipariş oluşmamaktadır. Samesite hatası hakkında ayrıntılı bilgi için: https://dev.iyzipay.com/tr/sss/samesite-problemi-nedir


Çözüm:
Öncelikle kullandığınız php sürümünün 7.3 veya üstü olduğuna emin olunuz. Bu çözüm için en az 7.3 sürümü gereklidir fakat daha düşük bir sürüm kullanıyorsanız verdiğim kaynaklara bakarak kodları değiştirebilirsiniz, ben test edemediğim için eklemedim. Yine bu çözümü opencart 2.3 versiyonu üzerinde denediğimi ve sorunsuz çalıştığını belirtmeliyim. Eksik gördüğünüz bir kısım olursa yorum yazmanızı rica ederim. Ayrıntısını aşağıda vereceğim fakat genel olarak session_start() ve setcookie() komutları öncesine 'samesite' => 'None' ve secure parametrelerini ekleyerek çözdüm.
Not: Bu çözümü opencart için yazdım fakat kendi yazılımınız için de uygulayabilirsiniz. Bulup değiştireceğiniz komutlar yine bu iki komuttur.

Düzenlediğim opencart dosyaları ve değişiklikler:

1. system/library/session.php

Bul:
session_set_cookie_params(0, '/');
session_start();
Değiştir:
if (PHP_VERSION_ID < 70300) {
    session_set_cookie_params(0, '/; samesite=None', '.yoursite.com', true, true);
} else {
    ini_set('session.cookie_samesite', 'None');
    session_set_cookie_params([
        'lifetime' => 0,
        'path' => '/',
        'domain' => '.yoursite.com',
        'secure' => true,
        'httponly' => true,
        'samesite' => 'None'
    ]);
}
session_start();

Bul:
setcookie($key, $this->session_id, ini_get('session.cookie_lifetime'), ini_get('session.cookie_path'), ini_get('session.cookie_domain'), ini_get('session.cookie_secure'), ini_get('session.cookie_httponly'));Değiştir:
if (PHP_VERSION_ID < 70300) {
    setcookie($key, $this->session_id, ini_get('session.cookie_lifetime'), ini_get('session.cookie_path'), ini_get('session.cookie_domain'), ini_get('session.cookie_secure'), ini_get('session.cookie_httponly'));
} else {
    $samsite_cookie_options = array (
        'expires' => ini_get('session.cookie_lifetime'),
        'path' => ini_get('session.cookie_path'),
        'domain' => ini_get('session.cookie_domain'),
        'secure' => true, // or false
        'httponly' => true, // or false
        'samesite' => 'None' // None || Lax || Strict
    );
    setcookie($key, $this->session_id, $samsite_cookie_options);
}

Bul:
setcookie($key, '', time() - 42000, ini_get('session.cookie_path'), ini_get('session.cookie_domain'));
Değiştir:
if (PHP_VERSION_ID < 70300) {
    setcookie($key, '', time() - 42000, ini_get('session.cookie_path'), ini_get('session.cookie_domain'));
} else {
    $samsite_cookie_options = array (
        'expires' => time() - 42000,
        'path' => ini_get('session.cookie_path'),
        'domain' => ini_get('session.cookie_domain'),
        'secure' => true, // or false
        'httponly' => true, // or false
        'samesite' => 'None' // None || Lax || Strict
    );
    setcookie($key, '', $samsite_cookie_options);
}

2. catalog/controller/startup/startup.php

Bul:
setcookie('language', $code, time() + 60 * 60 * 24 * 30, '/', $this->request->server['HTTP_HOST']);
Değiştir:
if (PHP_VERSION_ID < 70300) {
    setcookie('language', $code, time() + 60 * 60 * 24 * 30, '/', $this->request->server['HTTP_HOST']);
} else {
    $samsite_cookie_options = array (
        'expires' => time() + 60 * 60 * 24 * 30,
        'path' => '/',
        'domain' => $this->request->server['HTTP_HOST'],
        'secure' => true, // or false
        'httponly' => true, // or false
        'samesite' => 'None' // None || Lax || Strict
    );
    setcookie('language', $code, $samsite_cookie_options);
}

Bul:
setcookie('tracking', $this->request->get['tracking'], time() + 3600 * 24 * 1000, '/');
Değiştir:
if (PHP_VERSION_ID < 70300) {
    setcookie('tracking', $this->request->get['tracking'], time() + 3600 * 24 * 1000, '/');
} else {
    $samsite_cookie_options = array (
        'expires' => time() + 3600 * 24 * 1000,
        'path' => '/',
        'domain' => $this->request->server['HTTP_HOST'],
        'secure' => true, // or false
        'httponly' => true, // or false
        'samesite' => 'None' // None || Lax || Strict
    );
    setcookie('tracking', $this->request->get['tracking'], $samsite_cookie_options);
}

Bul:
setcookie('currency', $code, time() + 60 * 60 * 24 * 30, '/', $this->request->server['HTTP_HOST']);
Değiştir:
if (PHP_VERSION_ID < 70300) {
    setcookie('currency', $code, time() + 60 * 60 * 24 * 30, '/', $this->request->server['HTTP_HOST']);
} else {
    $samsite_cookie_options = array (
        'expires' => time() + 60 * 60 * 24 * 30,
        'path' => '/',
        'domain' => $this->request->server['HTTP_HOST'],
        'secure' => true, // or false
        'httponly' => true, // or false
        'samesite' => 'None' // None || Lax || Strict
    );
    setcookie('currency', $code, $samsite_cookie_options);
}

3. Bütün dosyalarınızı aratarak session_start() ve setcookie() komutlarını yukarıdaki gibi değiştiriniz. Aslında ilk 2 dosya üzerindeki değişiklikler yeterli olmaktadır ama yine de bir süprizle karşılaşmamak için diğer dosyalarınızı da taramanızı öneririm.


...


Gelen sorular üzerine ekliyorum. Opencart 2.1.0.1 için aşağıdaki ekran görüntülerindeki 3 dosyayı düzenlemeniz gerekmektedir. session_start ve setcookie komutlarını arayarak kendiniz de bulabilirsiniz. Bu satırları bulup yukarıdaki örneklerdeki gibi değiştiriniz.





Opencart Sık Kullanılan MYSQL Sorguları

Mağazanızdaki ürünlerin bilgilerinde toplu olarak bir değişiklik yapmanız gerektiğinde mysql database üzerinde çalıştıracağınız örnek update sorguları aşağıdadır.

Ürün Adında Toplu Güncelleme Yapma:
UPDATE oc_product_description SET name = REPLACE(name, 'Sarı Defter', 'Yeşil Defter') WHERE INSTR(name, 'Sarı Defter') > 0
Böylece tüm ürün adında "Sarı Defter" geçenler "Yeşil Defter" olarak güncellenir. Örneğin "Kareli Sarı Defter" --> "Kareli Yeşil Defter" haline gelir.


Ürün Açıklamasında Toplu Güncelleme Yapma:
UPDATE oc_product_description SET description = REPLACE(description, 'Bağımsız tabakalar halindedir', 'Bağımsız yapraklar halindedir') WHERE INSTR(description, 'Bağımsız tabakalar halindedir') > 0
Böylece text içindeki bir kelime veya cümleyi değiştirebilirsiniz.


Ürün Açıklamasında Toplu Güncelleme Yapma (Ürün Adına Göre Arayarak):
UPDATE oc_product_description SET description = REPLACE(description, '%100 pamuklu tuval bezi, köknar ağacından üretilir', '%90 pamuklu tuval bezi, çınar ağacından üretilir') WHERE INSTR(name, 'Basic Seri Tuval') > 0


Birden Fazla Ürünün Durumunu Tek Seferde Güncelleme:
Product ID'leri belli olan birden fazla ürünün durumunu tek seferde güncellemek için:
UPDATE oc_product SET status = 0 WHERE product_id IN (1563,1564,1566,1607,1617,1620)


Ürün seçenek tablosunda çift girilmiş verileri bulma:
Hatalı olarak iki kere girilen verileri bulmak için:
SELECT name, COUNT(*) c FROM oc_option_value_description WHERE language_id=2 GROUP BY name HAVING c > 1


Ürün fiyatlarını toplu güncelleme:
Örneğin ürün kodunda digital geçmeyenlerin fiyatını %15 arttırmak için:
UPDATE oc_product SET price = (price * 1.15) WHERE model NOT LIKE '%digital%'



Son Güncelleme: 8/12/2021

Opencart Different Session ID Error in Multi Stores


Opencart Different Session ID Error in Multi Stores | Opencart Çoklu Mağazalar Arası Farklı Oturum Hatası

Durum: 

store1.example.com ---> birinci mağazanıza ait sub domain
store2.example.com ---> ikinci mağazanıza ait sub domain
Her iki mağaza da aynı alışveriş sepetini kullanıyor ve ödemesi tek bir checkout sayfasından yapılıyor olsun.

Hata: 

Menü üzerinden bir mağazadan diğer mağazaya geçtiğinizde sepete ekledikleriniz görünmüyor! Yani store1'de sepete elma ekledim fakat store2'ye gidince sepet boş görünüyor.

Çözüm: 

1) Öncelikle admin panelden her ürün için şu kontrolü yapın; admin>katalog>(ilgili ürün)>düzenle>bağlantılar bölümüne gelin, mağazalar kısmında store1 ve store2'yi seçili hale getirin ve Kaydedin. Böylece ürün her iki mağazada tanımlı hale gelmiş oldu.

2) 1. aşamayı yaptığınız halde sorun devam ediyorsa sorun sistemin her iki mağaza için ziyaretçiye farklı sesssion id vermesi olabilir. Böylece aslında sepete ekleyen aynı kişi olsa bile farklı kişilermiş gibi algılanmış olur. Tabiki burada tarayıcının gizli sekme özelliğini kullanmamanız gerektiğini unutmayın. Bu duruma emin olmak için header.php sonuna var_dump($this->session->session_id); komutunu uygulayıp her iki mağazada test edebilirsiniz.
Gelelim çözüme:
system/library/session.php dosyasını açın. İlgili satırı bulun ve değiştirin.
Bul:
session_set_cookie_params(0, '/');

Değiştir:
session_set_cookie_params(0, '/', '.example.com');

admin panelden modifikasyonlar>refresh yaptıktan sonra tarayıcının tarama verilerini temizleyip tekrar sepet işlemlerini deneyin. Bu sefer mağazalar arası geçişte sepetiniz aynı şekilde kalıyor olması gerekir. Ben aynı sorunu yaşıyordum ve bu yöntemle sorunu çözdüm. Fakat sizde olmuyor ise farklı bir sorun var demektir ve bunu yorumlara yazmanızı rica ederim.

UTF-8 Error in Opencart

Warning: htmlentities(): charset `UTF-8;' not supported, assuming utf-8

SORUN:
Opencart admin panel ve mağaza sayfalarınızda aşağıdaki UTF-8 hatasını alıyorum:
Warning: htmlentities(): charset `UTF-8;' not supported, assuming utf-8 in

ÇÖZÜM:
php.ini dosyasını açın (Cpanel MultiPHP INI Düzenleyici üzerinden de yapabilirsiniz) ve UTF-8 olan satırın başına ; ekleyerek kaydedin. Böylece bu özelliği devre dışı bırakmış olacaksınız.
Önce:

Sonra:

Opencart Modal-Popup Login&Register&Forget (Free)


Opencart sisteminde oturum açma, kayıt olma işlemleri için sistem sizi ayrı sayfalara yönlendirmektedir. Bu da tekrar aradığı ürüne dönmek isteyen kullanıcı için bir sorun teşkil etmektedir. Bu eklenti sayesinde popup/modal pencere ile olduğunuz sayfadan ayrılmadan üyelik işlemlerini yapabilirsiniz. Bu eklenti neleri sağlıyor:

- Modal pencere ile Oturum Açma işlemi
- Modal pencere ile Kayıt Olma işlemi
- Modal pencere ile Şifremi Unuttum işlemi
- Oturum Açma, Çıkış ve Kayıt Ol işlemlerinden sonra son açılan sayfaya geri dönme

Live Demo
Opencart 2.3.0.2 için denenmiştir.


https://drive.google.com/file/d/1xnw5IyaSnqlDy1oPPIxlKBpZeNp7etmY/view?usp=sharing


Not: Bu eklentinin orjinal hali ehub tarafından yapılmıştır. Fakat buradaki halinde hatalar olduğu için düzenleyip yükledim.

Opencart İade Nedenleri İngilizce-Türkçe



ENGLISH TÜRKÇE
Dead On Arrival Ürün Tarafıma Ulaşmadı
Faulty (Please Supply Details) Ayıplı/Hasarlı Ürün (Detayları Aşağıya Yazınız)
Order Error Hatalı Sipariş Verdim
Other (Please Supply Details) Diğer (Detayları Aşağıya Yazınız)
Received Wrong Item Farklı Ürün Geldi


Sipariş durumlarının çevirisi için tıklayınız >

Opencart Sipariş Durumları İngilizce-Türkçe Çeviri



ENGLISH TÜRKÇE ALTERNATİF
Canceled İptal
Canceled Reversal İptal İşleminden Vazgeçildi İptali Geri Al
Chargeback Taksitli Geri Ödeme Kredi Kartına Taksitli İade
Completed Teslim Edildi Tamamlandı
Denied Reddedildi
Expired Süresi Doldu
Failed Başarısız
Pending (Default) Onay Bekliyor
Processed Hazırlandı
Processing Hazırlanıyor
Refunded Geri Ödendi
Reversed İade İşleminden Vazgeçildi İadeyi Geri Al
Shipped Kargoya Verildi
Voided Hükümsüz
Returned İade Edildi
Pending Approval for Return İade İçin Onay Bekliyor
Pending Product Ürün Bekleniyor
Product Changed Ürün Değişimi Yapıldı

İade nedenleri çevirisi için tıklayınız >

SEO İçin Google Veri İşaretleme ve Kullanıcı Oyları Konusu


Google Search Console araçlarından olan Veri İşaretleyici ile sitenizdeki içerikleri başlık, resim, tarih, puan, yorum, ... gibi işaretleyerek Google aramalarında bu sayfaların daha güzel zenginleştirilmiş kartlar şeklinde görünmesini sağlayabilirsiniz. Örneğin ürün sayfalarının yıldızlı olarak görünmesi gibi...vs.

- Bu işaretleme de ilk olarak örnek bir sayfayı etiketliyorsunuz. Aslında google'a bi nevi sayfanızın neresinde başlık, neresinde resim, neresinde puan var olduğunu anlaması için yol göstermiş oluyorsunuz.
- Daha sonra buna benzer sayfaları Google tarıyor ve size kontrol ettiriyor.
- Daha sonra işlemi bitirip yayınlıyorsunuz. Bu kadar.
- Fakat bu işaretlemeyi yaparken bir husus kafa karıştırıcı oluyor. Puan kısmı. Şu örneklerle anlatmaya çalışayım.

Örnek 1; sitenizde ürünün puanı 5 yıldız üzerinden 4 yıldız almış ise ve 4/5 şeklinde bir ibare ile sitenizde gösteriliyor olduğunu varsayalım. Bu durumda 4 sayısını seçip Ortalama Puan/Gelişmiş/Puan olarak etiketlemeniz gerekiyor. Aynı şekilde 5 sayısını da Ortalama Puan/Gelişmiş/Mümkün Olan En İyi Puan olarak etiketlemeniz gerekiyor. Eğer yorum sayısı da yazıyor ise onu da Ortalama Puan/Gelişmiş/Oy Sayısı olarak etiketlemeniz gerekiyor.

Örnek 2; sitenizde ürünün puanı 4,8 şeklinde ondalıklı bir ibare ile sitenizde gösteriliyor olduğunu varsayalım. Bu durumda 4,8 sayısını seçip Ortalama Puan/Kullanıcı Oyu olarak etiketlemeniz gerekiyor.

Umarım yardımcı olmuştur. Kullanıcı oylarının etiketlenmesi ile ilgili Google yardımı için https://support.google.com/webmasters/answer/3113241 adresini ziyaret edebilirsiniz.

Opencart için bu konuda hazırladığım eklenti için: SEO İçin Ürün Sayfasında Puanını Göster

Opencart Ürün Linklerini Kategorisiz Hale Dönüştürme (Product Seo Url Without Category)


Opencart sitenizde kategorilerdin birine girip, herhangi bir ürüne tıkladığınızda Url'ye üründen önce kategori ismi de eklenmektedir. Bu da Google'ın sitenizi yanlış indekslemesine yol açabilir. Çünkü aynı ürüne direk anasayfadan tıklayınca Url'ye kategori eklenmiyor. Bu şekilde bir ürün için iki farklı Url Google tarafından algılanıyor. Url'den kategoriyi çıkartarak bu durumu düzeltmek için:

- catalog/controller/startup/seo_url.php dosyasını açınız.
$url .= '/' . $query->row['keyword']; yazan ilk satırı arayınız ve şu değişikliği yapınız:
  $url = '/' . $query->row['keyword'];
- Diğer satırlarda değişikliğe gerek yok.
- Kaydedip, modifikasyonlardan refresh yapınız. Bu kadar.

Bu düzeltme Opencart 2.3.0.2 versiyonu için denenmiştir. Versiyona göre seo_url.php dosyasının yeri değişebilir.

https://www.opencart.com/index.php?route=marketplace/extension/info&extension_id=32399

Google Yapısal Veri Test Aracında Belirtilmeyen Tür Hatası (structured data testing tool unspecified type) [Çözüldü]


Bu hata bende; Open Graph denilen facebook için zenginleştirilmiş kart oluşturma kodlarında oluştu. Burada @type kısmında belirtilmeyen tür yazmakta idi. Bu durum sizde de varsa boşuna Open Graph kodlarınızla uğraşmayın sorun base etketinde.

Çözüm:
- Etiketleriniz arasında bulunan BASE etiketini silin ve tekrar test edin. Hepsi bu kadar...
etiketleriniz arasında bulunan BASE etiketini silin ve tekrar test edin. Hepsi bu kadar...

Önemli: 
Eğer bu işlemi opencart sistemi üzerinde yapacaksanız, şu işlemi de uygulamanız gerekiyor:
- catalog/controller/startup/seo_url.php dosyasını açınız.
$url .= '/' . $query->row['keyword']; yazan ilk satırı arayınız ve şu değişikliği yapınız: $url = '/' . $query->row['keyword'];
- Diğer satırlarda değişikliğe gerek yok.
- Kaydedip, modifikasyonlardan refresh yapınız. Bu kadar.
Bu düzeltme Opencart 2.3.0.2 versiyonu için denenmiştir. Versiyona göre seo_url.php dosyasının yeri değişebilir.

https://www.opencart.com/index.php?route=marketplace/extension/info&extension_id=32399

Sadece Belli Sayfalarda HTTPS ve SSL Sertifika Sorunu

Sitenize SSL kurulumu yaptınız ve bütün sayfalarınız https:// ile başlıyor ve sorunsuz çalışıyor. Fakat bazı sayfalarınıza girdiğinizde https:// ile başlamasına rağmen Güvenli Değil hatası alıyorsanız yani SSL sertifikası yokmuş gibi görünüyorsa, bu sorunu nasıl çözeceğinizi anlatacağım;

Ben bu sorunu Opencart Product yani Ürünler sayfasında aldım. Opencart'ın genelinde SSL sertifikası doğru çalışıyordu ve Güvenli işareti çıkıyordu fakat sitedeki ürünlerden birine tıkladığımda https:// ile başlamasına rağmen sayfada Güvenli işareti çıkmıyordu.

Çözüm:
- Sayfa içeriğindeki html kodlarına bakın.
- http:// ile başlayan kısımları https:// yapın veya /image şeklinde site adını hiç yazmadan belirtin.
- Örneğin img ile verilen site içi resimlerinizde
  img src="http://www.siteniz.com/images/urun.jpg" yazıyorsa bunu
  img src="/images/urun.jpg" şeklinde değiştirin.
- css, js, img, diğer link verdiğiniz dosyalar gibi bütün kısımlara bakın ve dediğim gibi http olan bir
  bağlantı kalmasın.

Bu şekilde bendeki sorun düzeldi. Eğer farklı şekilde sorun yaşayanlar var ise buradan paylaşabilirsiniz.

Http to Https ve www'siz to www'li Yönlendirmesi (.htaccess)

.htaccess dosyamıza şu kodu ekliyoruz:
RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTP_HOST} !^www\.example\.com$ [NC]
RewriteRule ^(.*)$ https://www.example.com/$1 [L,R=301]
eğer htaccess dosyanızda üst satırlarda RewriteEngine On yazılmamış ise o zaman şu şekilde ekleyin:
RewriteEngine On
RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTP_HOST} !^www\.example\.com$ [NC]
RewriteRule ^(.*)$ https://www.example.com/$1 [L,R=301]

Bu kod ile şu sonucu elde edersiniz:

  • example.com -> www.example.com
  • http://example.com -> https://www.example.com
  • http://www.example.com -> https://www.example.com

Sadece www yönlendirmesi için:
RewriteCond %{HTTP_HOST} !^www\.example\.com
RewriteRule (.*) https://www.example.com/$1 [R=301,L]
Sadece http -> https yönlendirmesi için:
RewriteCond %{HTTPS} !on
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}