Получите список всех блоков с их названиями
Я пытаюсь найти способ получить список всех блоков magento 1.9 с их именами программно.
Т.е.:
$blocks= [
'core/text_tag_css_admin' => 'Mage_Core_Block_Text_Tag_Css_Admin',
'core/text_list_item' => 'Mage_Core_Block_Text_List_Item',
'core/text_list_link' => 'Mage_Core_Block_Text_List_Link',
]
Я искал, но не нашел ничего о том, как подойти к этой проблеме.
Вот код, который у меня есть до сих пор, на случай, если он поможет кому-то другому.
public function toOptionArray()
{
/**
* @var $blocks Mage_Core_Model_Config_Element
*/
$blocks = Mage::getConfig()->getNode('global/blocks')->asArray();
$classes = [];
$options = [];
$realClasses = [];
foreach ($blocks as $key => $value) {
$classes[$key] = $value['class'];
}
foreach ($classes as $key => $class) {
$classKeys = explode('_', $class);
$moduleDir = Mage::getModuleDir('', $classKeys[0] . '_' . $classKeys[1]);
$moduleDir = $moduleDir . DS . $classKeys[2];
if (empty($moduleDir))
continue;
$files = [];
$files = $this->listFIles($moduleDir);
$relativeClasses = $this->getRelativeClasses($files, $moduleDir);
foreach ($relativeClasses as $relativeClass) {
$realClass = $class . $relativeClass;
$realClasses[] = $realClass;
}
}
$result = [];
sort($realClasses);
//TODO: Eliminate abstract classes
foreach ($realClasses as $realClass) {
try {
//throws fatal error so can't be caught
$r = new ReflectionClass($realClass);
} catch (Exception $e) {
}
if (isset($r) && !$r->isAbstract())
$result[] = array('value' => $realClass, 'label' => $realClass);
}
return $result;
}
protected function getRelativeClasses($files, $moduleDir)
{
if (empty($files) || !file_exists($moduleDir))
return [];
$classes = [];
foreach ($files as $file) {
$filePath = $file->getPathname();
$relativeClassPath = str_replace($moduleDir, '', $filePath);
$relativeClassPath = str_replace('.php', '', $relativeClassPath);
$relativeClassPath = str_replace(DS, '_', $relativeClassPath);
$classes[] = $relativeClassPath;
}
return $classes;
}
protected function listFIles($dir)
{
if (!file_exists($dir))
return [];
$files = [];
$di = new RecursiveDirectoryIterator($dir, RecursiveDirectoryIterator::SKIP_DOTS);
$it = new RecursiveIteratorIterator($di);
foreach ($it as $file) {
if (pathinfo($file, PATHINFO_EXTENSION) == "php") {
$files[] = $file;
}
}
return $files;
}
2 answers
Вы можете найти их в два этапа:
-
Найти все псевдонимы модулей:
$aliases = Mage::getConfig()->getNode('global/blocks');
Используя
n98-magerun dev:console
, я получаю вывод следующим образом: -
Для каждого псевдонима модуля найдите все классы. Для перезаписей это легко, потому что доступно полное сопоставление (например,
core/profiler => 'Aoe_Profiler_Block_Profiler'
. Для всех остальных вам придется выполнить поиск в файловой системе. Для каждой записи:- преобразуйте значение
class
в путь (Mage_Page_Block
=>Mage/Page/Block
) - поиск для всех файлов в
app/code/*/$path/**
. Вы можете использоватьglob()
для этого. - Для псевдонима класса объедините псевдоним модуля (например,
page
) и последнюю часть пути к файлу, заменив/
на_
и в нижнем регистре (например,Html/Head.php
, преобразованный вhtml_head
) - Для имени класса либо проанализируйте файл, либо объедините значение
class
(Mage_Page_Block
) и последнюю часть пути к файлу, заменив/
на_
(Html_Head
)
- преобразуйте значение
Вы можете попробовать этот фрагмент кода.
<?php
define('MAGENTO_ROOT', getcwd());
$mageFilename = MAGENTO_ROOT . '/app/Mage.php';
require_once $mageFilename;
ini_set('display_errors', 1);
Mage::app();
echo "<pre>";
/**
* Collect blocks from given layout element.
*
* @param Mage_Core_Model_Layout_Element $layoutElements
* @param array $blocks
* @return array $blocks
*/
function collectBlocks(Mage_Core_Model_Layout_Element $layoutElements,
array $blocks)
{
foreach ($layoutElements as $layoutElemKey => $layoutElement) {
if ($layoutElemKey == 'block') {
$blockType = (string) $layoutElement['type'];
$blockClass = (string) Mage::getConfig()->getBlockClassName($blockType);
$blocks[$blockType] = $blockClass;
if ($layoutElement->block) {
$blocks = collectBlocks($layoutElement->block, $blocks);
}
}
}
return $blocks;
}
//specifiy pacakge/theme
$area = 'frontend';
$package = 'base';
$theme = 'default';
$blocks = array();
//generate layout update xml
$layout = Mage::getModel('core/layout');
$layoutUpdateXml = $layout->getUpdate()
->getFileLayoutUpdatesXml($area, $package, $theme);
//go through update xml file and collects blocks
foreach ($layoutUpdateXml as $layoutElements) {
$blocks = collectBlocks($layoutElements, $blocks);
}
print_r($blocks);
Поместите этот образец кода в корневую папку и загрузите файл в браузер. Вы увидите все блоки, которые используются пакетом/темой.
Если вы хотите, чтобы это было в вашем приложении, используйте ту же логику в соответствии с вашими потребностями.
Ниже я предоставляю вам выходные данные, которые предоставляет этот скрипт:
Массив ( [ядро/шаблон] => Шаблон Mage_Core_Block_Template [страница/html] =>Mage_Page_Block_Html [страница/html] =>Mage_Page_Block_Html [страница/html_head] => Mage_Page_Block_Html_Head [страница/js_cookie] =>mage_page_block_js_cookie___страничный [core/text_list] =>Mage_Core_Block_Text_List [основной/текстовый список] =>Mage_Core_Block_Text_List [страница/html_notices] =>Mage_Page_Block_Html_Notices [страница/html_notices] =>Mage_Page_Block_Html_Notices [страница/html_header] =>Заголовок Mage_Page_Block_Html_Header [страница/ссылки на шаблоны] =>Ссылки на Mage_Page_Block_Template_Links [страница/переключатель] =>Переключатель Mage_Page_Block_Switch [страница/html_topmenu] => Mage_Page_Block_Html_Topmenu [страница/html_wrapper] =>mage_page_block_html_wrapper__страница [страница/html_welcome] => Mage_Page_Block_Html_Welcome [страница/html_breadcrumbs] =>Mage_Page_Block_Html_Breadcrumbs [страница/html_breadcrumbs] =>Mage_Page_Block_Html_Breadcrumbs [ядро/сообщения] =>Сообщения Mage_Core_Block_Messages [страница/html_footer] =>Mage_Page_Block_Html_Footer [страница/html_footer] =>Mage_Page_Block_Html_Footer [страница/html_cookienotice] =>Mage_Page_Block_Html_CookieNotice [страница/html_cookienotice] =>Mage_Page_Block_Html_CookieNotice [ядро/профилировщик] =>Mage_Core_Block_Профилер [каталог/product_price_template] => каталог_каталог_блок_продукта_price_template [sales/order_email_items] =>Mage_Sales_Block_Order_Email_Items [продажи/заказы] =>Mage_Sales_Block_Order_Email_Items [продажи/заказы_тоталы] =>Mage_Sales_Block_Order_Totals [продажи/заказы_тоталы] =>Mage_Sales_Block_Order_Totals [tax/sales_order_tax] =>Mage_Tax_Block_Sales_Order_Tax [налог/налог с продаж] =>Mage_Tax_Block_Sales_Order_Tax [продажи/заказ_эмайл_инвоице_элементы] =>mage_sales_block_order_email_инвоице_элементы [продажи/заказ_инвойственные_тоталы] =>Mage_Sales_Block_Order_Invoice_Totals /продажи/заказ_инвойственные_тоталы [продажи/заказы на отправку_почты] =>mage_sales_блок_заказ_почты_почты [продажи/заказ_эмайл_кредитмемо_элементы] =>mage_sales_block_order_email_кредитмемо_элементы [продажи/заказ_кредитмемо_тоталы] =>Mage_Sales_Block_Order_Creditmemo_Totals маг_салес_блок_заказ_кредитмемо_тоталы [проверка/onepage_progress] =>mage_checkout_блок_онепаге_прогресс [оформить заказ/onepage_payment_info] =>mage_checkout_блок_онепаге_паймент_инфо [оформить заказ/onepage_payment_methods] =>mage_checkout_блок_онепаге_паймента_методы [заказ/onepage_shipping_method_available] => Mage_Checkout_Block_Onepage_Shipping_method_available [оформление заказа/onepage_shipping_method_additional] => mage_checkout_block_onepage_shipping_метод_аддитивный [проверка/onepage_review_info] =>mage_checkout_блок_онепаге_ревью_инфо [оформить заказ/cart_totals] =>Fingent_Commitbuy_Block_Cart_Totals=>Итоговые данные [оформление заказа/соглашения] =>mage_checkout_block_агрегаты [paypal/express_review_details] =>mage_paypal_block_экспресс_ревью_детали [через PayPal/payflow_link_iframe] => Mage_Paypal_Block_Payflow_Link_Iframe [paypal/payflow_advanced_ифраме] => mage_paypal_block_payflow_ усовершенствованный фрейм [через PayPal/hosted_pro_iframe] => Mage_Paypal_Block_Hosted_Pro_Iframe [rss/список] =>mage_rss_блок_лист [rss/список желаний] =>Список желаний Mage_Rss_Block_Wishlist [rss/catalog_new] =>mage_rss_блок_каталог_нов [rss/каталог_специальный] =>mage_rss_block_каталог_специальный [rss/catalog_salesrule] =>маг_рсс_блок_каталог_салесрул [rss/catalog_tag] =>маг_рсс_блок_каталог_таг [rss/catalog_notifystock] => Mage_Rss_Block_Catalog_NotifyStock [rss/catalog_review] =>маг_рсс_блок_каталог_review [rss/catalog_category] => Mage_Rss_Блок_кАталог_кАтегории [rss/order_new] =>Mage_Rss_Block_Order_New/Новый порядок [rss/order_status] =>маг_рсс_блок_ордер_статус [centinel/authentication_start] =>mage_centinel_block_авторизация_старта [centinel/authentication_complete] =>Mage_Centinel_Block_Authentication_Complete)