Magento - переместить блок справа налево

Не знаю, почему это так сложно. Если я правильно понимаю ЭТО, я смогу быстро достичь своих целей... Но никакой радости.

Итак- Я создаю свою первую тему и все еще думаю о макете...

Я специально работаю над страницей Catalog Product Viewи преобразую эту страницу из макета правого столбца в макет левого столбца. Я просто хочу переместить блоки справа влево.

В каталоге по умолчанию.xml, определено product_list_related:

      
     //...

     
            
        
    

В моем локальном.xml я просто пытаюсь переместить этот блок:

    

    // bunch other page directives

   
        
            
        

        
            catalog.product.related
        

        
            catalog.product.related

            // note that that "catalog.leftnav" gets inserted as expected
            
        

    

    

Как уже отмечалось - вставка catalog.leftnavработает так, как ожидалось, поэтому я предполагаю, что все остальное настроено правильно. Целевой блок отображается так, как ожидалось, если я оставлю шаблон и другие директивы без изменений, что говорит мне о том, что блок должен отображаться после того, как он был правильно отсоединен и вставлен...

Это сводит меня с ума... но что еще нового в Magento.

Cheers -

b[]x

UPDATE

Поскольку я просто не могу получить local.xmlпереопределение для работы, я просто возвращаюсь к модифицированному каталогу .xml. Я достаточно умный парень... Меня беспокоит, что я не могу заставить это работать (и этот magento просто молча терпит неудачу, в любом случае) - но я не могу больше тратить время на болтовню с этим глупым вопросом.

Двигаемся дальше.

UPDATE, again. 

Я потратил некоторое время, работая в пурпурном цвете и знакомясь с его сложностями. Я вернулся к этому вопросу сегодня, так как мне нужно заставить мою местную.xml работать правильно.

Я действительно не знаю, что у меня было не так, но этот набор директив наконец-то сработал.

        
                
                    catalog.product.related
                
        

        
                
                    catalog.product.related
                
        

Ключевой момент, который я замечу для других, занимающихся этим:

Директивы Layout xml вызывают доступные методы в классах magento. В этом случае блок Page.xmls "Left" имеет тип Mage_Core_Block_Text, который наследует от Mage_Core_Block_Abstract, который содержит методы unsetChildи insert.

из Mage_Core_Block_Abstract:

/**
     * Unset child block
     *
     * @param  string $alias
     * @return Mage_Core_Block_Abstract
     */
    public function unsetChild($alias)
    {
        if (isset($this->_children[$alias])) {
            unset($this->_children[$alias]);
        }

        if (!empty($this->_sortedChildren)) {
            $key = array_search($alias, $this->_sortedChildren);
            if ($key !== false) {
                unset($this->_sortedChildren[$key]);
            }
        }

        return $this;
    }

и

  /**
     * Insert child block
     *
     * @param   Mage_Core_Block_Abstract|string $block
     * @param   string $siblingName
     * @param   boolean $after
     * @param   string $alias
     * @return  object $this
     */
    public function insert($block, $siblingName = '', $after = false, $alias = '')
    {
        if (is_string($block)) {
            $block = $this->getLayout()->getBlock($block);
        }
        if (!$block) {
            /*
             * if we don't have block - don't throw exception because
             * block can simply removed using layout method remove
             */
            //Mage::throwException(Mage::helper('core')->__('Invalid block name to set child %s: %s', $alias, $block));
            return $this;
        }
        if ($block->getIsAnonymous()) {
            $this->setChild('', $block);
            $name = $block->getNameInLayout();
        } elseif ('' != $alias) {
            $this->setChild($alias, $block);
            $name = $block->getNameInLayout();
        } else {
            $name = $block->getNameInLayout();
            $this->setChild($name, $block);
        }

        if ($siblingName === '') {
            if ($after) {
                array_push($this->_sortedChildren, $name);
            } else {
                array_unshift($this->_sortedChildren, $name);
            }
        } else {
            $key = array_search($siblingName, $this->_sortedChildren);
            if (false !== $key) {
                if ($after) {
                    $key++;
                }
                array_splice($this->_sortedChildren, $key, 0, $name);
            } else {
                if ($after) {
                    array_push($this->_sortedChildren, $name);
                } else {
                    array_unshift($this->_sortedChildren, $name);
                }
            }

            $this->_sortInstructions[$name] = array($siblingName, (bool)$after, false !== $key);
        }

        return $this;
    }

Локальные параметры xml важны, значит, не по названию (конкретно), но для того, чтобы т.е.


                
                    catalog.product.related
                    catalog.leftnav
                    1
                    catalog_product_related
                
        

В конечном счете, это делает локальный.xml действительно мощным методом манипулирования системой, но если вы не знакомы с ней и системой пурпурного цвета, приготовьтесь к неделям или месяцам работы, чтобы действительно разобраться в ней.

Cheers


Еще одно обновление

Я уже несколько раз сталкивался с проблемой, когда блок, который я хочу переместить, был удален. Это проблема, так как любой блок, который был удален из макета, исчезает навсегда.

Тем не менее, с помощью очень удобного плагина Alan Storm Unremove Pluginвы можете отменить то, что было сделано:


    
    
        
            checkout.progress.wrapper
        
    
    
        
            checkout.progress.wrapper
        
    

Он управляет этим подвигом, наблюдая за объектом макета и создавая список удаленных блоков, на которые можно позже сослаться.

Отлично!

7
задан Community 23 May 2017 в 10:30
поделиться