레이어 탐색의 레이아웃 변경


14

계층화 된 내비게이션이 있는데 고객이 <select/>긴 링크 목록 대신 필드를 원합니다 .

필터의 이름 / ID가 일치하면 관찰자로 템플릿을 변경하는 것에 대해서만 생각했습니다.

더 나은 아이디어 나 권장 사항이 있습니까? 템플릿 변경에 대한 대안으로, 블록을 덮어 쓰거나 다시 쓰거나 두 필터의 블록 클래스 만 변경할 수 있습니까?

템플릿 변경에 어떤 이벤트를 사용해야합니까?

레이아웃 내용을 변경하는 관찰자가 있기 때문에 여기 /programming/14524791/magento-enable-or-disable-a-module-in-code/14529629 와 동일한 문제가 있습니다 . 이것은 테마에만 해당됩니다. 업데이트를 실행하기 전에 테마를 확인하는 것이 좋습니다.


"고객이 긴 링크 목록 대신 필드를 원합니다"나는 이것이 무엇을 의미하는지 전혀 모른다.
Rick Kuipers

빌어 먹을, stackexchange 먹고 내 <선택>
파비안 Blechschmidt

1
catalog/layer/filter.phtml템플릿을 덮어 쓰고 필요한 것을 변경하면 테마별로도 달라집니다. 처리해야 할 유일한 것은 선택된 필터 비트입니다. <select>필터를 선택하면 다른 옵션이 사라지기 때문에 일부 차단 기능을 추가해야 할 수도 있는에서 선택한 모든 필터를 표시하려고합니다 .
Rick Kuipers

아니요, 고객은 카테고리 및 "하위 카테고리"(속성)를 선택 상자로 사용하고, 확인란이있는 다른 모든 작업 (작업 수행)을 추가로 등급별로 필터링하고 싶습니다.
Fabian Blechschmidt

1
이 의견은 나를위한 메모 역할을합니다. 이에 대한 답변이 있지만 전화를 받고 있습니다. 계층 Nav에서 일하는 것을 좋아합니다. 이전 프로젝트에서 여러 필드를 선택하도록 지원하도록 확장했습니다 (확인란을 생각하십시오)
Tim Reynolds

답변:


6

확인해야 할 사항 : 1. 'catalog / layer_view'블록을 재정 의하여 고유 한 템플릿을 설정하십시오. 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>

왜 레이아웃 재 작성을 귀찮게합니까? 왜 기본 템플릿을 사이트 테마 폴더에 복사하지 않습니까? 내가 여기서 뭔가를 놓치고
있는가?

@dedmeet 당신의 딸에게 축하와 같은 질문이 있습니다. 간단한 테마 템플릿 재정의가 수행합니다.
Rick Kuipers

@Tim : 모바일 게시물이 [at] Tim을 삼킨 것처럼 보였으므로 Tim이 알림을받습니다.
ProxiBlue

당신이 언급 할 때 @dedmeet, 게시물의 원래 포스터는 항상 : 당신이 그를 언급하지 않은 경우에도 통지합니다
mpaepper

예, 템플릿 재 작성이 작동합니다. 계층 내비를 메뉴 아래의 페이지 중앙으로 이동했다고 언급했습니다. 그것은 대답과 관련이 없으므로 생략해야합니다.
Tim Reynolds

10

block core_block_abstract_prepare_layout_afteron event를 사용 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.