Получите список всех блоков с их названиями


Я пытаюсь найти способ получить список всех блоков 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;
        }
Author: Fabian Schmengler, 2017-06-21

2 answers

Вы можете найти их в два этапа:

  1. Найти все псевдонимы модулей:

    $aliases = Mage::getConfig()->getNode('global/blocks');
    

    Используя n98-magerun dev:console, я получаю вывод следующим образом:

    screenshot

  2. Для каждого псевдонима модуля найдите все классы. Для перезаписей это легко, потому что доступно полное сопоставление (например, core/profiler => 'Aoe_Profiler_Block_Profiler'. Для всех остальных вам придется выполнить поиск в файловой системе. Для каждой записи:

    1. преобразуйте значение class в путь (Mage_Page_Block => Mage/Page/Block)
    2. поиск для всех файлов в app/code/*/$path/**. Вы можете использовать glob() для этого.
    3. Для псевдонима класса объедините псевдоним модуля (например, page) и последнюю часть пути к файлу, заменив / на _ и в нижнем регистре (например, Html/Head.php, преобразованный в html_head)
    4. Для имени класса либо проанализируйте файл, либо объедините значение class (Mage_Page_Block) и последнюю часть пути к файлу, заменив / на _ (Html_Head)
 2
Author: Fabian Schmengler, 2017-06-22 07:42:09

Вы можете попробовать этот фрагмент кода.

<?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)

 1
Author: Rajeev K Tomy, 2017-06-21 11:28:31