Terminal - Autocomplete Eklentisi




Terminal'de bir komut yazarken otomatik tamamlama önerileri almak ister misiniz? Bunun için iki yöntem vereceğim fakat benim tercihim birincisidir (popup autocomplete). Tabiki ikisini aynı zamanda kullanabilirsiniz.

1. Popup Autocomplete


Popup pencere içinde komut önerilerini listeleyen harika bir eklenti. fig.io adresinden eklentinin sayfasına ulaşabilirsiniz.


2. Standard Autocomplete


MacOs işletim sisteminde input autocomplete varsayılan olarak kapalıdır. Bu özelliği açarsanız komutun birkaç harfini yazıp "tab" tuşuna bastığınızda otomatik tamamlanır. Örneğin "cd des" + Tab yaptığınızda otomatik olarak "cd desktop" olacaktır. Tabiki burada birkaç farklı sonuç listelenmiyor, yada komut önerisi/yardımcısı gibi bir tamamlama yapmıyor. Yine de faydalı bir özellik ve açmak isterseniz terminalde sırayla şu işlemleri yapınız:

nano ~/.inputrc

.inputrc dosyası nano (terminal editörü) editöründe açılacaktır. (Bu dosya Users/KulanıcıAdınız/.inputrc konumundadır ve gizlidir. Farklı bir editörle bu dosyayı açarak da yapabilirsiniz. Eğer bu dosya yok ise kendiniz oluşturunuz.) Ardından aşağıdaki satırları kopyalayıp .inputrc dosyasına ekleyin ve kaydedip çıkın (kntrl + x tuşlarına basın ve kaydedilsin mi sorusuna Y ile cevap verin).

set completion-ignore-case on
set show-all-if-ambiguous on
TAB: menu-complete

Terminalden çıkıp tekrar açınız. Artık cd des yazıp tab tuşuna basarak deneyebilirsiniz.

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.

PHP Fonksiyonu Çağıran Sayfa Bilgilerini Almak

debug_backtrace()

Php'de fonksiyon ve metodlar çeşitli sayfalardan çağrılabilir. Bir hata durumunda metoda parametre gönderen sayfayı görmek isteyebilirsiniz. Bu gibi hata ayıklama durumlarında kullanabileceğiniz debug_backtrace fonksiyonu için aşağıdaki kodu kullanabilirsiniz.

$trace = debug_backtrace();
$caller = array(
    "file" => $trace[1]['file'],
    "line" => $trace[1]['line'],
    "function" => $trace[1]['function'],
    "class" => $trace[1]['class'],
);
var_dump( $caller );

ÖNEMLİ NOT: Burada dikkat etmeniz gereken husus; direk olarak var_dump( debug_backtrace() ) şeklinde kullanarak bütün sonucu bastırmamanızdır. Projenize göre değişmekle birlikte MB'larca bir sonuç döndürebilir. Bu nedenle dizideki 4 değeri çıktı olarak almanızı öneririm.

var_dump yerine error dosyasına yazdırmak için var_error_log($caller) kullanabilirsiniz.

CSS Opacity Kullanımı - Tüm Tarayıcılar


CSS Opacity - All Browsers

Eğer çok eski tarayıcıları desteklesin gibi bir derdiniz yoksa kısaca şu 3 satır işinizi görecektir. Tavsiye edilen kullanımdır. zoom ve filter komutları IE içindir (başımızın belası:))
zoom: 1;
filter: alpha(opacity=85);
opacity: 0.85;

Eğer önemli bir projeniz var ve tüm tarayıcılarda sorunsuz görünmesi gerekiyorsa (en eski tarayıcılarda dahi) o zaman bu uzun versiyonu kullanmanız tavsiye edilir.
-ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=85)"; /* IE 8 */
filter: alpha(opacity=85);  /* IE 5-7 */
-moz-opacity: 0.85; /* Netscape */
-khtml-opacity: 0.85; /* Safari 1.x */
opacity: 0.85; /* Good browsers */

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>

2020 En İyi Wordpress Eklentileri



2020 En İyi Wordpress Eklentileri | 2020 Best Wordpress Plugins
Son Güncelleme | Last Update: 1.12.2020

  • Bir çok eklenti arasından en kullanılışlı gördüklerimi (en çok indirilenleri değil) sizlerle paylaşacağım. 
  • Hepsini kullandım ve sizlere öneriyorum. Genelde pro veya premium kısıtlaması olmayan tamamen ücretsiz eklentileri seçtim. 
  • Kullanım amaçlarına göre listeleyeceğim. 
  • Yazılan eklenti adlarını kopyalayıp Admin > Plugins > Add New tıklayarak aratınız.

KULLANIM AMAÇLARINA GÖRE EKLENTİLER

Wordpress üyelik sistemini ve sayfalarını düzenleme
User Registration WPEverest
Simgesi laleye benzeyen bu eklenti, standart accounts, login, register, forgot password vs gibi üyelik sayfalarını özelleştirmenizi sağlayacaktır. Kendi üye kayıt formunuzu oluşturmanıza imkan vermektedir ki bu benzerleri arasından bu eklentiyi tercih sebebim oldu. Dökümantasyon sayfası kurulumda size yardımcı olacaktır.

Wordpress sayfaları veya sayfa içeriklerini üyelere özel yaparak gizleme
Private Content Aldo Latino
Örneğin bir sayfanız var ve üye olmayanlar sadece bir mesaj görsün ve giriş yapmaya yönlendirilsin istiyorsunuz, üye olanlar ise bu sayfa içeriğini görebilsin istiyorsunuz. İşte bu durumda işinize yarayacak short code desteği olan bir eklentidir. Aslında bütün özellikleri short code olarak çalışıyor desek daha doğru olacak. github sayfası kurulumdan sonra size yardımcı olacaktır.

Wordpress eklentilerini farklı dillere çevirme
Loco Translate
Kullandığınız bir eklentinin Türkçe desteği yoksa bu eklenti tam size göre. Plugin translate deyince ilk akla gelen ve en kapsamlı eklenti gördüğü kadarıyla. Fakat ilk denemenizde işe yaramadı çevirmedi gibi düşünmeyin. 1) Öncelikle çevirmek istediğiniz eklentiyi listeden seçin. 2) New language butonuna tıklayın ve burdan wp genel ayarlar sekmenizde seçili olan sistem diliniz ne ise onu seçin (burası önemli!). 3) Yine önemli olan diğer kısım location kısmı yani dil dosyasının nereye ekleneceği. Burda 3 farklı yöntem var. Ben burda languages/loco/plugins/ornek-plugin-tr_TR.po yolunu seçtim. 4) Çeviri yapacağınız ifadeyi aratın ve alta seçtiğiniz dildeki tercümesini ekleyin ve kaydedin. 5) Bu eklentiyi kullandığınız sayfayı/postu update yapın (bunu yapmayınca çeviri aktif olmayabiliyor). 6) Yine de olmazsa mevcut çeviri dosyasını silip, 3. aşamada söylediğim diğer iki location için işlemleri tekrarlayın.

Wordpress sayfalarında sağ tuş ve içerik kopyalanmasını engelleme
WP Content Copy Protection with Color Design
Sayfalarınnızda sağ tuşa tıklanmasını ve içerik kopyalanmasını (seçerek, ctrl+a, vs) engellemek istiyorsanız bu eklentiyi kullanabilirsiniz. Sağ tuşa tıklandığında editlenebilir bir uyarı mesajı çıkması ve belirli sayfa/postlar için bu engellemeyi yapabilmesi bu eklentiyi benzerlerinden öne çıkarmaktadır.

    Wordpress sayfalarına css veya js kodları ekleme
    Simple Custom CSS and JS
    Bu eklenti ile sayfaların header veya footer kısmına js, css veya html kodları ekleyebilmektesiniz. Bu tarzda farklı eklentiler var fakat sağlıklı çalışmıyor, bu eklenti sağlıklı bir şekilde çalışmaktadır.

     

    Wordpress Çıkış Sonrası Onay İsteminin Kapatılması

    Wordpress Bypass Logout Confirmation 

    Kullanıcı çıkış yaptığında gelen "Çıkmak istiyor musunuz?" benzeri bir soruyu almadan direk çıkış yapmak istiyorsanız, aşağıdaki kodu functions.php içerisine ekleyin. Böylece çıkış butonuna tıkladıktan sonra oturumunuz sonlanacak ve direk anasayfaya yönlendirileceksiniz.

    /**
     * Generates custom logout URL
     */
    function getLogoutUrl($redirectUrl = ''){
        if(!$redirectUrl) $redirectUrl = site_url();
        $return = str_replace("&amp;", '&', wp_logout_url($redirectUrl));
        return $return;
    }
    /**
     * Bypass logout confirmation on nonce verification failure
     */
    function logout_without_confirmation($action, $result){
        if(!$result && ($action == 'log-out')){ 
            wp_safe_redirect(getLogoutUrl()); 
            exit(); 
        }
    }
    add_action( 'check_admin_referer', 'logout_without_confirmation', 1, 2);
    

    Wordpress Admin Menü Çubuğunu Kaldırma

    Wordpress'e Admin Menü Çubuğunu Kaldırma (Admin Hariç Diğer Kullanıcılar İçin)

    Kullanıcı siteye giriş yaptığında en üstte görünen siyah menü çubuğunu (admin menu bar) kaldırmak için aşağıdaki kodu functions.php içine ekleyin. Admin hariç diğer kullanıcılar için kaldırılmış olacaktır.

    /**
     * Remove Admin Bar
    */
    function wpb_remove_admin_bar() {
        if (!current_user_can('administrator') && !is_admin()) {
              show_admin_bar(false);
        }
    }
    add_action('after_setup_theme', 'wpb_remove_admin_bar');
    

    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ı
    



    MYSQL Sayısal(int) Değerlerin Farkları


    Tinyint, Smallint, Mediumint, Int, Bigint alanları arasındaki farklar:

    
              | Byte     Range(signed)                                Range (unsigned)
    --------------------------------------------------------------------------------------------
    tinyint   | 1 byte   -128 to 127                                  0 to 255
    smallint  | 2 bytes  -32768 to 32767                              0 to 65535
    mediumint | 3 bytes  -8388608 to 8388607                          0 to 16777215
    int       | 4 bytes  -2147483648 to 2147483647                    0 to 4294967295
    bigint    | 8 bytes  -9223372036854775808 to 9223372036854775807  0 to 18446744073709551615

    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

    Regex

    Favori Regex Kodlarım

    TC Kimlik No:

    /([1-9])([0-9])([0-9])([0-9])([0-9])([0-9])([0-9])([0-9])([0-9])([0-9])([0-9])/
    
    Daha kısa ve son hanenin çift olmasını kontrol eden hali:
    ^[1-9]{1}[0-9]{9}[02468]{1}$
    


    Javascript Turkish Title Case

    Kelimelerin İlk Harflerini Türkçe Uyumlu Büyük Harf Yapma

    Eğer Javascript veya Jquery kullanarak kelimelerin ilk harflerini büyük harfe çevirmek ve bunu Türkçe harfler için de sorunsuz çalıştırmak istiyorsanız aşağıdaki fonksiyonu kullanabilirsiniz.

    Turkish TitleCase:
    /**
     * Kelimelerin sadece ilk harfini buyuk hale cevirip yollar (Title Case)
     * Turkce karakterleri dogru cevirir.
     * . , ; ! : - ? ve bosluk karakterlerini kelime ayirici olarak sayar. 
     */
    function toTitleCaseTR(str) {
        return str.toLocaleLowerCase('tr-TR').replace(/(?:^|\s|,|;|!|:|-|\.|\?)[a-z0-9ğçşüöı]/g, function(match) {
            return match.toLocaleUpperCase('tr-TR');
        });
    }
    

    Eğer metnin hepsini büyük veya küçük yapacaksanız aşağıdaki şekilde kullanabilirsiniz.

    Turkish UpperCase:
    str.toLocaleUpperCase('tr-TR');
    

    Turkish LowerCase:
    str.toLocaleLowerCase('tr-TR');
    

    Change A Href All Colors with CSS


    Change A Href All Colors with CSS

    a, a:link, a:visited, a:hover, a:active {
      color: #fff;
    }


    Vertical Align Center


    Yatay/Dikey Ortala

    <div style="position: relative;">
      <button class="center">PHP</button>
    </div>
    

    .center {
      position: absolute;
      top: 50%;
      left: 50%;
      -webkit-transform: translate(-50%, -50%);
      -ms-transform: translate(-50%, -50%);
      transform: translate(-50%, -50%);
    }

    Sadece Dikey Ortala

    <div style="position: relative;">
      <button class="center">PHP</button>
    </div>
    

    .center {
      position: absolute;
      top: 50%;
      -webkit-transform: translateY(-50%);
      -ms-transform: translateY(-50%);
      transform: translateY(-50%);
    }

    Sadece Yatay Ortala

    <div style="position: relative;">
      <button class="center">PHP</button>
    </div>
    

    .center {
      position: absolute;
      left: 50%;
      -webkit-transform: translateX(-50%);
      -ms-transform: translateX(-50%);
      transform: translateX(-50%);
    }

    Div İçinde Span Ortala

    <div class="container">
      <button class="center">PHP</button>
    </div>
    

    .container {
      height: 25px;
      line-height: 25px;
      text-align: center;
    }
    .center {
      width: 12px;
      height: 12px;
      display: inline-block;
      vertical-align: middle;
      line-height: normal;
    }
    


    Javascript Reload Page


    Best way for reload the page with javascript:

    window.location.reload(false);
    

    True:  load from server.
    False: load from cache.