Если Вы создаете систему, которая использует ajax-запросы и делает многочисленные вызовы метода $this->getLayout()->getUpdate()->load() (который позволяет загружать разделы файла layout xml) на одной странице, Вы столкнетесь с ошибкой, когда все вызываемые блоки окажутся в качестве первого блока в вызове метода. Это связано с тем, как работает идентификатор кэша этих блоков.

Эту функциональность можно увидеть в методе _getShippingMethodsHtml() контроллера OnepageController.php чекаута:


$layout = $this->getLayout();
$update = $layout->getUpdate();
$update->load('checkout_onepage_shippingmethod');
$layout->generateXml();
$layout->generateBlocks();
$output = $layout->getOutput();
return $output;

Чтобы решить эту проблему, Вам нужно вручную установить идентификатор кэша перед вызовом метода load():


$this->getLayout()->getUpdate()->setCacheId(uniqid("some_custom_cache_id"));

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

Таким образом в примере выше можно изменить код функции и избежать каких-либо проблем кэширования. Вы должны будете добавлять пользовательские идентификаторы кеша во всех вызовах метода $this->getLayout()->getUpdate()->load ():


$layout = $this->getLayout();
$update = $layout->getUpdate();
$update->setCacheId(uniqid("custom_checkout_onepage_shippingmethod"));
$update->load('checkout_onepage_shippingmethod');
$layout->generateXml();
$layout->generateBlocks();
$output = $layout->getOutput();
return $output;