การเปลี่ยนเค้าโครงของการนำทางแบบเลเยอร์


14

ฉันมีการนำทางแบบเลเยอร์และลูกค้าต้องการมี<select/>เขตข้อมูลแทนรายการลิงก์ที่มีความยาว

ฉันคิดถึงการเปลี่ยนแม่แบบด้วยผู้สังเกตการณ์หากชื่อ / รหัสของตัวกรองตรงกัน

มีข้อคิดเห็นหรือคำแนะนำที่ดีกว่านี้ไหม ทางเลือกในการเปลี่ยนเทมเพลตอาจจะเขียนทับ / เขียนบล็อกใหม่หรือเปลี่ยนคลาสบล็อกสำหรับตัวกรองทั้งสองเท่านั้น

เหตุการณ์ใดที่จะใช้สำหรับการเปลี่ยนแม่แบบ

ฉันมีปัญหาเดียวกันกับที่นี่/programming/14524791/magento-enable-or-disable-a-module-in-code/14529629เพราะฉันมีผู้สังเกตการณ์ที่เปลี่ยนสิ่งโครงร่าง นี่เป็นเพียงธีมที่เกี่ยวข้อง ดังนั้นการตรวจสอบธีมก่อนใช้งานการอัปเดตอาจเป็นความคิดที่ดีใช่ไหม


"ลูกค้าต้องการมีฟิลด์แทนที่จะเป็นลิงค์ที่มีความยาว" ฉันไม่รู้ว่าคุณหมายถึงอะไร
ริก Kuipers

แช่ง, stackexchange กิน <select> ของฉัน
Fabian Blechschmidt

1
ฉันจะบอกว่าเพียงแค่เขียนทับcatalog/layer/filter.phtmlแม่แบบและเปลี่ยนสิ่งที่คุณต้องการมันจะเป็นรูปแบบเฉพาะเช่นกัน สิ่งเดียวที่คุณต้องจัดการคือบิตตัวกรองที่เลือก ฉันเดาว่าคุณต้องการแสดงตัวกรองทั้งหมดที่เลือกไว้ใน<select>นั้นอาจต้องเพิ่มฟังก์ชั่น Block บางอย่างเนื่องจากเมื่อเลือกตัวกรองแล้วตัวเลือกอื่น ๆ จะหายไป
Rick Kuipers

ไม่ลูกค้าต้องการให้มีหมวดหมู่และ "หมวดหมู่ย่อย" (แอตทริบิวต์) เป็นกล่องที่เลือกทุกอย่างที่มีช่องทำเครื่องหมาย (ใช้งานได้) และกรองเพิ่มเติมตามการให้คะแนน :-) แต่แล้วฉันจะใช้ทุกอย่างในเทมเพลต
Fabian Blechschmidt

1
ความคิดเห็นนี้ทำหน้าที่เป็นบันทึกสำหรับฉัน ฉันมีคำตอบสำหรับสิ่งนี้ แต่อยู่ในโทรศัพท์ของฉัน รักที่จะทำงานใน Nav ชั้น ฉันขยายมันเพื่อรองรับการเลือกหลายเขตข้อมูลในโครงการก่อนหน้า (คิดว่าช่องทำเครื่องหมาย)
Tim Reynolds

คำตอบ:


6

ตกลงสิ่งที่คุณต้องทำ: 1. แทนที่บล็อก 'catalog / layer_view' เพื่อตั้งค่าเทมเพลตของคุณเอง ฉันวาง nav ชั้นในพื้นที่ส่วนหัวเป็นส่วนหนึ่งของเค้าโครงคอลัมน์ 1

<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>

ในไฟล์เทมเพลตนั้นคุณจะต้องระบุเทมเพลตที่ถูกเขียนทับสำหรับแต่ละองค์ประกอบ

<?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; ?>

สุดท้ายคุณต้องสร้างตัวกรองแบบหล่นลง filter.phtml ที่ควรจะตรงไปข้างหน้า นี่เป็นรูปแบบที่ไม่ดีเนื่องจากฉันมีปัญหากับตัวแก้ไขนี้ แต่แนวคิดทั่วไปอยู่ที่นี่ จาวาสคริปต์บางตัวก็จำเป็นเช่นกัน

<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>

ทำไมต้องทำการเขียนเลย์เอาต์ใหม่อีกครั้ง? ทำไมไม่คัดลอกแม่แบบฐานไปยังโฟลเดอร์ชุดรูปแบบไซต์ ฉันขาดอะไรบางอย่างที่นี่ (เหนื่อยไปทั้งคืนกับลูกสาวแรกเกิดที่ป่วย)
ProxiBlue

@dedmeet ขอแสดงความยินดีกับลูกสาวของคุณและฉันมีคำถามเดียวกัน การแทนที่เท็มเพลตธีมที่เรียบง่ายจะทำ
Rick Kuipers

@ ทิม: โพสต์มือถือของฉันดูเหมือนจะกลืน [ที่] ทิมดังนั้นนี่จึงทิมได้รับการแจ้งเตือน
ProxiBlue

@dedmeet เมื่อคุณแสดงความคิดเห็นโปสเตอร์เดิมของการโพสต์มักจะได้รับการแจ้งถึงแม้คุณจะไม่ได้พูดถึงเขา :)
mpaepper

ขออภัยใช่การเขียนเทมเพลตจะใช้งานได้ ฉันพูดถึงว่าฉันย้าย nav ชั้นของฉันไปที่กึ่งกลางของหน้าใต้เมนู นั่นไม่เกี่ยวข้องกับคำตอบดังนั้นฉันควรจะทิ้งมันไว้
ทิมเรย์โนลด์ส

10

คุณสามารถใช้core_block_abstract_prepare_layout_afterเหตุการณ์ในMage_Catalog_Block_Layer_Viewบล็อกเพื่อเปลี่ยนแม่แบบของตัวกรองคุณลักษณะเฉพาะของคุณ

อาจเป็นอะไรเช่นนี้

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

สรุป:

บล็อกตัวกรองเด็กทั้งหมดมีนามแฝงในบล็อกการนำทางแบบเลเยอร์เป็น[attribute_code]_filterและทั้งหมดถูกสร้างใน_prepareLayout()วิธีเพื่อให้คุณสามารถปรับเปลี่ยนแม่แบบในcore_block_abstract_prepare_layout_afterเหตุการณ์ได้อย่างง่ายดาย

นอกจากนี้คุณสามารถตรวจสอบภายในผู้สังเกตการณ์ของคุณว่าชุดรูปแบบปัจจุบันเหมือนกันตามที่คาดไว้โดยการโทร:

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

ขอแสดงความนับถือ Ivan


หากบล็อกตัวกรองลูกได้รับattribute_code_filterชื่อแทนที่กำหนดทำไมจึงไม่สามารถตั้งค่าแม่แบบในรูปแบบ xml ได้
pspahn

1
@pspahn เพราะคุณไม่สามารถเข้าถึงได้โดยใช้นามแฝงว่าเลย์เอาต์ หากคุณตรวจสอบผลลัพธ์ของgetNameInLayout()คุณจะเห็นว่าแต่ละบล็อคเหล่านี้มีชื่อเฉพาะเป็น ANNONYMOUS_30, ANNONYMOUS_23 เป็นต้นดังนั้นคุณจึงไม่สามารถเชื่อถือได้
Ivan Chepurnyi
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.