Mengubah tata letak navigasi berlapis

14

Saya memiliki navigasi berlapis, dan pelanggan ingin memiliki <select/>bidang alih-alih daftar panjang tautan.

Saya berpikir untuk mengganti template dengan pengamat jika nama / id dari filter cocok.

Ada ide atau rekomendasi yang lebih baik? Alternatif untuk mengubah templat, mungkin menimpa / menulis ulang blok atau hanya mengubah kelas blok untuk dua filter?

Peristiwa apa yang digunakan untuk mengubah templat?

Saya kemudian memiliki masalah yang sama seperti di sini /programming/14524791/magento-enable-or-disable-a-module-in-code/14529629 karena saya memiliki pengamat yang mengubah hal-hal tata letak. Ini hanya tema yang relevan. Jadi memilih tema sebelum menjalankan pembaruan mungkin merupakan ide yang bagus?

Fabian Blechschmidt
sumber
"Pelanggan ingin memiliki bidang alih-alih daftar panjang tautan" Saya tidak tahu apa yang Anda maksudkan dengan ini.
Rick Kuipers
sial, stackexchange memakan <select> saya
Fabian Blechschmidt
1
Saya akan mengatakan hanya menimpa catalog/layer/filter.phtmltemplate dan mengubah apa yang Anda butuhkan, itu akan menjadi tema khusus juga. Satu-satunya hal yang harus Anda hadapi adalah sedikit filter yang dipilih. Saya kira Anda ingin menampilkan semua filter yang dipilih di <select>yang mungkin perlu menambahkan beberapa fungsi Blok, karena begitu filter dipilih, opsi lain menghilang.
Rick Kuipers
tidak, pelanggan ingin memiliki kategori dan "subkategori" (atribut) sebagai kotak pilih, yang lainnya dengan kotak centang (pekerjaan yang harus dilakukan) dan juga memfilter menurut peringkat :-) Tapi kemudian saya akan mengimplementasikan semua yang ada di templat.
Fabian Blechschmidt
1
Komentar ini berfungsi sebagai catatan bagi saya. Saya punya jawaban untuk ini tetapi ada di ponsel saya. Senang bekerja di Nav berlapis. Saya memperluasnya untuk mendukung memilih beberapa bidang dalam proyek sebelumnya (pikirkan kotak centang)
Tim Reynolds

Jawaban:

6

Oke, hal-hal yang perlu Anda lakukan: 1. Ganti blok 'catalog / layer_view' untuk mengatur template Anda sendiri. Saya menempatkan nav berlapis saya di area header sebagai bagian dari tata letak 1 kolom

<layout>
    <catalog_category_layered>        
        <reference name="header">
            <block type="catalog/layer_view" name="mylayered"  template="mymodule/catalog/layer/view.phtml"/>
        </reference>    
    </catalog_category_layered>
</layout>

Dalam file templat itu, Anda perlu menentukan templat yang ditimpa untuk elemen individual Anda.

<?php if($this->canShowBlock()): ?>
<div class="block block-layered-nav">
    <div class="block-title">
        <strong><span><?php echo $this->__('Shop By') ?></span></strong>
    </div>
    <div class="block-content">
        <?php echo $this->getStateHtml() ?>
        <?php if ($this->getLayer()->getState()->getFilters()): ?>
            <div class="actions"><a href="<?php echo $this->getClearUrl() ?>"><?php echo $this->__('Clear All') ?></a></div>
        <?php endif; ?>
        <?php if($this->canShowOptions()): ?>
            <p class="block-subtitle"><?php echo $this->__('Shopping Options') ?></p>
            <dl id="narrow-by-list">
                <?php $_filters = $this->getFilters() ?>
                <?php foreach ($_filters as $_filter): ?>
                <?php /* !!! HERE !!! */ ?>
                <?php if(some_condition == true){ $_filter->setTemplate('path/to/your/new/filter.phtml'); } ?>
                <?php if($_filter->getItemsCount()): ?>
                    <dt><?php echo $this->__($_filter->getName()) ?></dt>
                    <dd><?php echo $_filter->getHtml() ?></dd>
                <?php endif; ?>
                <?php endforeach; ?>
            </dl>
            <script type="text/javascript">decorateDataList('narrow-by-list')</script>
        <?php endif; ?>
    </div>
</div>
<?php endif; ?>

Akhirnya, Anda perlu membuat drop.php down filter. Itu harus lurus ke depan. Ini diformat dengan buruk karena saya mengalami masalah dengan editor ini, tetapi ide umumnya ada di sini. Beberapa Javascript akan dibutuhkan juga.

<ol>

    <li><select>
    <?php foreach ($this->getItems() as $_item): ?>
        <option value="<?php echo $this->urlEscape($_item->getUrl()); ?>">
        <?php if ($_item->getCount() > 0): ?>
        <a href="<?php echo $this->urlEscape($_item->getUrl()) ?>"><?php echo $_item->getLabel() ?></a>
        <?php else: echo $_item->getLabel() ?>
        <?php endif; ?>
        <?php if ($this->shouldDisplayProductCount()): ?>
        (<?php echo $_item->getCount() ?>)
        <?php endif; ?>
    </option>
<?php endforeach ?>
</select></li>
</ol>
Tim Reynolds
sumber
mengapa repot-repot melakukan tata letak menulis ulang? Mengapa tidak menyalin saja template dasar ke folder tema situs? Apakah saya kehilangan sesuatu di sini (sedikit lelah, terjaga sepanjang malam dengan putri saya yang baru lahir yang sakit)
ProxiBlue
@dedmeet congratz pada putri Anda dan saya memiliki pertanyaan yang sama. Override template tema sederhana akan dilakukan.
Rick Kuipers
@Tim: Pos seluler saya sepertinya telah menelan [at] Tim, jadi ini supaya Tim mendapat pemberitahuan.
ProxiBlue
@dedmeet Ketika Anda berkomentar, poster asli pos akan selalu diberitahukan meskipun Anda tidak menyebut
nyebutnya
Maaf, ya, penulisan ulang templat akan berfungsi. Saya menyebutkan bahwa saya memindahkan nav berlapis saya ke tengah halaman di bawah menu. Itu tidak relevan dengan jawaban jadi saya harus meninggalkannya.
Tim Reynolds
10

Kamu bisa memakai core_block_abstract_prepare_layout_after acara di Mage_Catalog_Block_Layer_Viewblok untuk mengubah template dari filter atribut khusus Anda.

Bisa jadi sesuatu seperti ini:

public function yourObserver($observer) 
{
    $block = $observer->getBlock();
    if ($block instanceof Mage_Catalog_Block_Layer_View) {
        $block->getChild($yourAttributeCodeGoesHere . '_filter')
           ->setTemplate('your/template.phtml');
    }
}

Ringkasan:

Setiap blok filter anak memiliki alias di blok navigasi berlapis seperti [attribute_code]_filter, dan semuanya dibuat_prepareLayout() metode sehingga Anda dapat dengan mudah memodifikasi templatnya pada core_block_abstract_prepare_layout_afteracara.

Anda juga dapat memeriksa dalam pengamat Anda bahwa tema saat ini sama dengan yang diharapkan dengan menelepon:

$design = Mage::getSingleton('core/design_package')
$design->getPackageName(); // Returns current design package
$design->getTheme('layout'); // Returns current design layout

Hormat saya, Ivan

Ivan Chepurnyi
sumber
Jika blok filter anak ditugaskan attribute_code_filteralias, mengapa Anda tidak bisa mengatur template di layout xml?
pspahn
1
@ pspahn Karena Anda tidak dapat mengaksesnya dengan tata letak alias olah. Jika Anda memeriksa output getNameInLayout()Anda akan melihat, bahwa masing-masing blok ini memiliki nama unik sebagai ANNONYMOUS_30, ANNONYMOUS_23, dll. Jadi, Anda tidak dapat mengandalkannya.
Ivan Chepurnyi