Не знаю, почему это так сложно. Если я правильно понимаю ЭТО, я смогу быстро достичь своих целей... Но никакой радости.
Итак- Я создаю свою первую тему и все еще думаю о макете...
Я специально работаю над страницей Catalog Product View
и преобразую эту страницу из макета правого столбца в макет левого столбца. Я просто хочу переместить блоки справа влево.
В каталоге по умолчанию.xml, определено product_list_related
:
//...
В моем локальном.xml я просто пытаюсь переместить этот блок:
// bunch other page directives
page/2columns-left.phtml
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
Он управляет этим подвигом, наблюдая за объектом макета и создавая список удаленных блоков, на которые можно позже сослаться.
Отлично!