Руководство по Mage::register
6 дек. 2012
Реестр переменных magento представляет собой отличный способ обмена и получения информации в любом месте вашего магазина. Другими словами реестр позволяет создавать новые глобальные переменные, которые могут быть доступны в любом месте вашего магазина.
В отличие от динамических функций, будучи статической функцией, реестр magento может быть вызван напрямую без создания экземпляра объекта. Шаблон вызова :
ClassName::StaticFunctionName()
Имеются 2 основные функции для добавления и удаления переменных из реестра.
register() – добавляет переменные в реестр, разрешенные типы данных: integer, string, array. unregister() – удаляет переменную из реестра. registry() – функция вызова переменной из реестра.
Как добавить переменную в реестр?
Для добавление данных посредством переменных в реестр достаточно только вызвать функцию register(), рассмотрим несколько примеров:
Добавление в реестр store_id.
Mage::register('store_id', Mage::app()->getStore()->getId());
// Mage::app()->getStore()->getId()); получаем store id.
Mage::registry('store_id'); // регистрируем store_id .
Mage::unregister('store_id'); // убираем регистрацию store_id
Добавление в реестр product_id.
// Mage::register($key, $value);
$productId = 10; // product ID товара, доступного в вашем store
$_myproductID = Mage::getModel('catalog/product')->load($productId);
Mage::register('myproductID', $_ myproductID);
Как получить product_id из реестра.
Получить данные из реестра несложно, нужно только вызвать функцию register():
// $value = Mage::registry($key)
$_myproductID = Mage::registry('myproductID')
Вы наверное думаете что когда magento обращается к регистру он вызывает некий метод, наподобие $_product = $this->getProduct() , который в свою очередь делает запрос в базу данных. Одна из самых интересных вещей в реестре, это то что он не делает запросов в базу данных а только проверяет, есть ли в нем соответствующее значение. Это гораздо быстрее чем запросы в базу данных. Взгляните на то, как мы извлекли значение $_myproductID из реестра. Magento использует ту же технику для ускорения запросов.
Точно также реестр Magento может дать вам соответствующие данные без необходимости обращения к базе данных для многих операций, таких как:
Узнать текущую страницу CMS модель.
$_thispage = Mage::registry('cms_page');
echo $_thispage->getTitle().'<br/>';
echo $_thispage->getContent();
Доступ к текущей модели категории
$_category = Mage::registry('current_category');
echo $_category->getName();
Как просматривать содержимое реестра Magento
Увидеть то, что записано в реестре Magento при помощи стандартных методов нельзя. Вам нужно изменить Mage.php, чтобы просмотреть содержимое реестра. Создайте резервную копию файла Mage.php, чтобы откатиться на нее когда манипуляции с просмотром будут завершены.
Mage.php содержит много статических функций, которые могут вызываться без создания экземпляра класса. Откройте файл Mage.php и добавьте следующий метод в любом месте Mage.php который в конечном итоге вернет весь реестр Magento.
public static function getRegistry() { return self::$_registry; }
<?php $entireregistryArray = Mage::getRegistry() ?>
Теперь у вас есть весь реестр в виде массива в $ entireregistryArray. Вы можете просмотреть весь реестр либо так:
<?php print_r($entireregistryArray);?>
Или так, со всеми ключами, значениями, типами данных и классами:
<?php $registry = Mage::getRegistry() ?>
<?php if (count($registry) > 0): ?>
<h2>Store’s Current Registry</h2>
<ul>
<?php foreach($registry as $index => $value): ?>
<li>
Registry['<a href="#"><?php echo $index ?></a>'] =
(<em><?php echo gettype($value) ?></em>)
<strong>
<?php if (is_object($value)): ?>
<?php echo get_class($value) ?>
<?php elseif (is_array($value)): ?>
Array
<?php else: ?>
<?php echo $value ?>
<?php endif; ?>
</strong>
</li>
<?php endforeach; ?>
</ul>
<?php endif; ?>
<?php exit ?>
Когда вы запустите этот кусок кода данные будут в следующем формате
• Registry['original_include_path'] = (string) .:/Applications/MAMP/bin/php5/lib/php
• Registry['_singleton/core/resource'] = (object) Mage_Core_Model_Resource
Я думаю, этого достаточно, чтобы вы поняли, какими возможностями обладает реестр Magento. Мне бы очень хотелось узнать о вашем опыте работы с реестром Magento. Пожалуйста, оставляйте свои комментарии. Подпишитесь на нашу RSS для получения последних обновлений Magento.