Thay đổi cách bố trí của điều hướng lớp


14

Tôi có một điều hướng lớp và khách hàng muốn có <select/>các trường thay vì một danh sách dài các liên kết.

Tôi nghĩ về việc chỉ thay đổi mẫu với người quan sát nếu tên / id của bộ lọc khớp.

Bất kỳ ý tưởng hoặc đề xuất tốt hơn? Các lựa chọn thay thế cho việc thay đổi mẫu, có thể ghi đè / ghi lại khối hoặc chỉ thay đổi lớp khối cho hai bộ lọc?

Sự kiện nào để sử dụng để thay đổi mẫu?

Sau đó, tôi có cùng một vấn đề như ở đây /programming/14524791/magento-enable-or-disable-a-module-in-code/14529629 vì tôi có một người quan sát thay đổi mọi thứ bố cục. Đây chỉ là chủ đề có liên quan. Vì vậy, chechking chủ đề trước khi chạy các bản cập nhật có thể là một ý tưởng tốt?


"Khách hàng muốn có các trường thay vì một danh sách dài các liên kết" Tôi không biết ý của bạn là gì.
Rick Kuipers

chết tiệt, stackexchange ăn của tôi <select>
Fabian Blechschmidt

1
Tôi muốn nói chỉ cần ghi đè lên catalog/layer/filter.phtmlmẫu và thay đổi những gì bạn cần, nó cũng sẽ là chủ đề cụ thể. Điều duy nhất bạn phải xử lý là các bit bộ lọc được chọn. Tôi đoán bạn muốn hiển thị tất cả các bộ lọc được chọn trong <select>đó có thể yêu cầu thêm một số chức năng Chặn, vì một khi bộ lọc được chọn, các tùy chọn khác sẽ biến mất.
Rick Kuipers

không, khách hàng muốn có các danh mục và "danh mục con" (thuộc tính) làm hộp chọn, mọi thứ khác có hộp kiểm (công việc phải làm) và lọc thêm theo xếp hạng :-) Nhưng sau đó tôi sẽ triển khai mọi thứ trong mẫu.
Fabian Blechschmidt

1
Nhận xét này phục vụ như là một lưu ý cho tôi. Tôi có một câu trả lời cho điều này nhưng trên điện thoại của tôi. Tình yêu làm việc trong Nav lớp. Tôi đã mở rộng nó để hỗ trợ chọn nhiều trường trong một dự án trước đó (nghĩ là các hộp kiểm)
Tim Reynold

Câu trả lời:


6

Ok, những việc bạn cần làm: 1. Ghi đè khối 'catalog / layer_view' để đặt mẫu của riêng bạn. Tôi đặt điều hướng lớp của tôi trong khu vực tiêu đề như là một phần của bố cục 1 cột

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

Trong tệp mẫu đó, bạn cần chỉ định mẫu bị ghi đè cho các thành phần riêng lẻ.

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

Cuối cùng, bạn cần tạo bộ lọc thả xuống. Đó nên là thẳng về phía trước. Đây là định dạng kém vì tôi gặp rắc rối với trình soạn thảo này, nhưng ý tưởng chung là ở đây. Một số Javascript cũng sẽ cần thiết.

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

Tại sao phải làm lại bố cục viết lại? Tại sao không chỉ sao chép mẫu cơ sở vào thư mục chủ đề trang web? Tôi có bỏ lỡ điều gì ở đây không (một chút mệt mỏi, thức cả đêm với đứa con gái mới chào đời của tôi)
ProxiBlue

@dedmeet chúc mừng con gái của bạn và tôi có cùng một câu hỏi. Một ghi đè mẫu chủ đề đơn giản sẽ làm.
Rick Kuipers

@Tim: Bài đăng trên điện thoại di động của tôi dường như đã nuốt [at] Tim, vì vậy điều này chỉ để Tim nhận được thông báo.
ProxiBlue

@dedmeet Khi bạn bình luận, poster gốc của bài đăng sẽ luôn được thông báo ngay cả khi bạn không đề cập đến anh ấy :)
mpaepper

Xin lỗi, vâng, mẫu viết lại sẽ hoạt động. Tôi đã đề cập rằng tôi đã di chuyển lớp điều hướng của mình đến trung tâm của trang bên dưới menu. Điều đó không liên quan đến câu trả lời nên tôi đã bỏ nó đi.
Tim Reynold

10

Bạn có thể sử dụng core_block_abstract_prepare_layout_aftersự kiện trên Mage_Catalog_Block_Layer_Viewkhối để thay đổi mẫu của bộ lọc thuộc tính cụ thể của mình.

Nó có thể là một cái gì đó như thế này:

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

Tóm lược:

Mỗi khối bộ lọc con đều có bí danh trong khối điều hướng được xếp lớp [attribute_code]_filtervà tất cả chúng được tạo trong _prepareLayout()phương thức để bạn có thể dễ dàng sửa đổi mẫu của nó trong core_block_abstract_prepare_layout_aftersự kiện.

Ngoài ra, bạn có thể kiểm tra trong trình quan sát của mình rằng chủ đề hiện tại giống với chủ đề dự kiến ​​bằng cách gọi:

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

Trân trọng, Ivan


Nếu khối bộ lọc con được gán attribute_code_filterbí danh, tại sao bạn không thể đặt mẫu trong bố cục xml?
pspahn

1
@pspahn Bởi vì bạn không thể truy cập nó bằng bí danh mặc dù bố cục. Nếu bạn kiểm tra đầu ra của getNameInLayout()bạn sẽ thấy, mỗi khối này có tên duy nhất là ANNONYMOUS_30, ANNONYMOUS_23, v.v. Vì vậy, bạn không thể dựa vào nó.
Ivan Chepurnyi
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.