Navigasi berlapis kustom berbasis atribut. Apakah ini satu-satunya cara untuk melakukannya?

8

Hari ini saya telah mengetuk opsi navigasi berlapis yang tidak didasarkan pada atribut. Ini untuk peringkat sehingga ujung depan dapat menunjukkan bintang mengkilap yang bagus.

Untuk melakukan ini saya punya:

  1. Membuat modul
  2. Tulis ulang catalog_block_layer_view

    <blocks>        
      <catalog>
        <rewrite>
          <layer_view>Bob_Catalog_Block_Layer_View</layer_view>
         </rewrite>                
       </catalog>
    </blocks>
    
  3. Membuat kelas bernama Bob_Catalog_Block_Layer_View yang meluas Mage_Catalog_Block_Layer_View

  4. Dibuat _initBlocks (), getFilters () dan _prepareLayout () untuk mengganti metode kelas induk. Ini semua memanggil kelas induk di beberapa titik dan kemudian menambahkan atau menambahkan data tambahan ke apa yang dikembalikan.
  5. Buat blok filter Bob_Catalog_Block_Layer_Filter_Rating yang meluas Mage_Catalog_Block_Layer_Filter_Abstrak dengan konstruktor yang menetapkan filterModelName dan memanggil induknya dan kemudian menetapkan templat kustom seperti yang terlihat Mage_Catalog_Block_Layer_Filter_Abstrak memiliki nama templat yang dibuat di hardcoded pada konstruksinya.
  6. Buat model Bob_Catalog_Model_Layer_Filter_Rating yang meluas Mage_Catalog_Model_Layer_Filter_Abstrak dan menerapkan berlaku (), getName (), _getItemsData ().

Ini semua berfungsi dengan baik. Bintang-bintang mengilap bagus ditampilkan di nav berlapis.

Saya punya firasat bahwa saya kehilangan sesuatu karena ketika datang ke template keadaan lapisan saya harus meletakkan kondisional di sana untuk mengambil filter peringkat kustom dan mengubah tata letak. Juga beberapa hal yang perlu saya lakukan (mengklon koleksi produk sehingga acara beban tidak mengacaukan jumlah koleksi pada pagination) membuat saya merasa seperti saya telah berenang ke atas bukit.

Jadi pertanyaannya adalah apakah ada di antara Anda yang punya saran lebih baik (atau mungkin posting blog mengedipkan mata ) tentang cara membuat filter navigasi berlapis yang didukung atribut non-atribut?

Terima kasih sudah membaca,

Si

Si Griffiths
sumber
Saya harus melakukannya hari-hari berikutnya dan saya berpikir untuk melakukannya seperti ini.
Fabian Blechschmidt

Jawaban:

5

Ada cara lain untuk melakukannya, Anda dapat menambahkan atribut normal ke produk Anda yang akan menjadi peringkat. Kemudian gunakan pengamat (saya tidak tahu bagaimana peringkat ini dibentuk) untuk memperbarui atribut produk. Atau, jika pengamat ada pilihan, mungkin menggunakan cronjob yang memperbarui atribut itu untuk setiap produk setiap x menit tergantung pada seberapa berat skripnya.

Dengan cara ini tidak ada penulisan ulang dan pengubahan Magento yang terlibat, semua modul navigasi akan tetap berfungsi dan lebih mudah dirawat.

Tentu saja pertanyaannya adalah, apakah ini pilihan untuk Anda? Dari mana datangnya peringkat?

EDIT Anda harus memberi style pada bintang menggunakan javascript atau memeriksa nama atribut dalam template.

Rick Kuipers
sumber
Saya pikir ini mencakup hampir semua opsi. Saran pengamat adalah ide yang menarik.
Si Griffiths
Jika saya ingat, gaya bintang standar hanya memiliki lebar CSS berdasarkan peringkat rata-rata dari 5. 1/5 = 20% lebar, 4,3 / 5 = 86% lebar, dll. Saya ragu bahwa perlu diubah ... tetapi memperbarui nilai atribut melalui skrip cron cukup pintar. +1
pspahn
2

Saya menggali ke dalam kode dan tidak menemukan acara. Tanpa menambahkan atribut tambahan tidak ada yang bisa dilakukan tanpa<rewrite>

Anda harus menambahkan blok Anda \Mage_Catalog_Block_Layer_View::_prepareLayout()sebelum apply()(jika tidak bisa Anda gunakan core_block_abstract_prepare_layout_after.

Dan Anda perlu menambahkannya \Mage_Catalog_Block_Layer_View::getFilters()dan tidak ada acara juga.

Fabian Blechschmidt
sumber
Inilah yang saya temukan. Tampaknya juga tidak ada cara untuk mengatasi templat state.phtml. Tampaknya cabang bersyarat diperlukan untuk mengubah output apa pun.
Si Griffiths
Saya menulis ulang catalog/layer_filter_category, catalog/layer_filter_attributedan catalog_resource/layer_filter_attributeuntuk menampilkan opsi setiap saat tanpa menggunakan state.phtmlsaat ini tidak ada cara untuk menghapus filter: - /
Fabian Blechschmidt
Pekerjaan saya memiliki if ($ _filter-> getName () === 'apa pun') {} Untuk berkeliling menampilkan html keadaan khusus. Ini bukan solusi yang bagus tetapi itu adalah solusi yang tidak kalah pentingnya. Ps. Semoga Anda baik-baik saja sejak terakhir kami bertemu di MDP.
Si Griffiths