Trường hợp trợ giúp bí danh của một số mô-đun cốt lõi được xác định?


7

Điều này làm tôi bối rối một chút. Tôi tự hỏi tại sao tôi không nhận thấy nó trước đây. Khi tôi tìm định nghĩa của trình trợ giúp của Mage_Salesmô-đun lõi, điều đó làm tôi ngạc nhiên rằng, tôi không thể tìm thấy định nghĩa của trình trợ giúp ở đó. Điều này làm tôi bối rối rất nhiều. Do đó tôi đã thử mã này

print_r(get_class(Mage::helper('sales')));

và nó đã cho tôi kết quả này

Mage_Sales_Helper_Data

Sau đó, salesbí danh cho Mage_Sales_Helper_Datađược xác định trong magento. Nói cách khác, tôi nên tìm đoạn mã này ở đâu?

<global>
    <helpers>
         <sales>
             <class>Mage_Sales_Helper</class>
         </sales>
    </helpers>
</global>

Tôi cũng đã kiểm tra tất cả các tệp xml có sẵn cho Mage_Salesmô-đun vv. Không ai trong số họ giữ định nghĩa người trợ giúp. Vì vậy, làm thế nào magento gán salesbí danh cho lớp người trợ giúp Mage_Sales_Helper_Data.

Hãy soi sáng cho tôi với những suy nghĩ có giá trị của bạn

Câu trả lời:


9

Câu trả lời sắp xếp là nó không được xác định ở bất cứ đâu. Nếu bạn theo dõi lại cách Mage::helperbạn làm việc với chức năngMage_Core_Model_Config::getGroupedClassName

Điều này sẽ cố gắng tải bất kỳ ghi lại trước tiên, sau đó định nghĩa trực tiếp từ cấu hình và cuối cùng chỉ giả sử nó bắt đầu với mage_

if (empty($className)) {
    if (!empty($config)) {
        $className = $config->getClassName();
    }
    if (empty($className)) {
        $className = 'mage_'.$group.'_'.$groupType;
    }
    if (!empty($class)) {
        $className .= '_'.$class;
    }

    $className = uc_words($className);
}

Vì vậy, cuối cùng tên lớp sẽ là Mage_Sales_Helper_Data, đây là lý do tại sao khi tạo tiện ích mở rộng của riêng bạn, bạn sẽ bỏ qua trình trợ giúp hoặc các định nghĩa khác mà bạn gặp phải lỗi mà nó đang cố gắng tìm kiếmMage_Your_Module_Something


Awasome .. @David .... upvote từ tôi
Amit Bera

Tôi đã đào vào getGroupedClassName(). Bây giờ tôi nhận ra .. Tôi đã rất gần với câu trả lời !!. Điều này hoàn toàn xóa sạch nghi ngờ của tôi. Bây giờ tôi có thể ngủ với một tâm trí bình tĩnh. Vì vậy, +1 để làm cho tâm trí của tôi sạch sẽ :)
Rajeev K Tomy

Như @benmark đã dạy tôi, đó chỉ là một loạt các thao tác chuỗi để xây dựng các tên lớp được tự động tải.
pspahn

2

Với sự giúp đỡ của David trên câu trả lời, Hy vọng David sẽ không phiền.

Tôi đang cố gắng giải thích chi tiết hơn

bắt đầu với Mage.php và đi đến chức năng trợ giúp

public static function helper($name)
{
    $registryKey = '_helper/' . $name;
    if (!self::registry($registryKey)) {
        $helperClass = self::getConfig()->getHelperClassName($name);
        self::register($registryKey, new $helperClass);
    }
    return self::registry($registryKey);
}

a) $registryKey = '_helper/' . $name;

kết quả: $registryKey = _helper/sales

b) check now registry key exits ot not,if not then set a registrybiến

 if (!self::registry($registryKey)) {

nó trở thành true when system is first timescho một phiên:

c) $helperClass = self::getConfig()->getHelperClassName($name); có nghĩa là

$ name = sales gửi đến Mage_Core_Model_Config chức năng lớp getHelperClassName để nhận lớp người trợ giúp gửi param

d) Sau đó thiết lập lớp name is registry variablee

 self::register($registryKey, new $helperClass);

Kết quả: may be proper class name Mage_Sales_Helper_Data

Bây giờ hãy chuyển đến hàm getHelperClassName của lớp Mage_Core_Model_Config

a) Hàm này Lấy chuỗi tên của trình trợ giúp $ chuỗi tên

public function getHelperClassName($helperName)
{
    if (strpos($helperName, '/') === false) {
        $helperName .= '/data';
    }
    return $this->getGroupedClassName('helper', $helperName);
}

giải thích về chức năng:

 $helperName is sales 

Hợp lý:

 if (strpos($helperName, '/') === false) {

trở thành true as $helperName=sales then set $helperName=sales/data

b) return $this->getGroupedClassName('helper', $helperName);

Chi tiết:

call function getGroupedClassName with params 'helper','sales/data' 
and getGroupedClassName return    class name of helper class

Bây giờ chức năng goto getGroupedClassName('helper','sales/data',null)

public function getGroupedClassName($groupType, $classId, $groupRootNode=null)
{
    if (empty($groupRootNode)) {
        $groupRootNode = 'global/'.$groupType.'s';
    }

    $classArr = explode('/', trim($classId));
    $group = $classArr[0];
    $class = !empty($classArr[1]) ? $classArr[1] : null;

    if (isset($this->_classNameCache[$groupRootNode][$group][$class])) {
        return $this->_classNameCache[$groupRootNode][$group][$class];
    }

    $config = $this->_xml->global->{$groupType.'s'}->{$group};

    // First - check maybe the entity class was rewritten
    $className = null;
    if (isset($config->rewrite->$class)) {
        $className = (string)$config->rewrite->$class;
    } else {
        /**
         * Backwards compatibility for pre-MMDB extensions.
         * In MMDB release resource nodes <..._mysql4> were renamed to <..._resource>. So <deprecatedNode> is left
         * to keep name of previously used nodes, that still may be used by non-updated extensions.
         */
        if ($config->deprecatedNode) {
            $deprecatedNode = $config->deprecatedNode;
            $configOld = $this->_xml->global->{$groupType.'s'}->$deprecatedNode;
            if (isset($configOld->rewrite->$class)) {
                $className = (string) $configOld->rewrite->$class;
            }
        }
    }

    // Second - if entity is not rewritten then use class prefix to form class name
    if (empty($className)) {
        if (!empty($config)) {
            $className = $config->getClassName();
        }
        if (empty($className)) {
            $className = 'mage_'.$group.'_'.$groupType;
        }
        if (!empty($class)) {
            $className .= '_'.$class;
        }
        $className = uc_words($className);
    }

    $this->_classNameCache[$groupRootNode][$group][$class] = $className;
    return $className;
}

** nhiệm vụ chức năng này **

retrieve class name by class group
param   string $groupType currently supported helper
param   string $classId slash separated class identifier, ex. group/class
param   string $groupRootNode optional config path for group config
return  string

a)$classArr = explode('/', trim($classId));

kết quả:explode helper name(sales/data by /) for getting classs name in array $classArr

b)$class = !empty($classArr[1]) ? $classArr[1] : null;

Kết quả:as $classArr[1] is data then value of $class is data

c) $config = $this->_xml->global->{$groupType.'s'}->{$group};

chi tiết:get config setting then $config = $this->_xml->global->helpers->sales;

d)$className = null;

Chi tiết :set $className null .

e) check rewrite class exits in config.xml files, check if class is rewrite then you can easly get mã: if (isset ($ config-> viết lại -> $ class)) {result:if (isset($config->rewrite->data)) {

f)for default magento ,it false to goto else

bỏ qua if ($ config-> deprecatedNode) {

 as deprecatedNode is for model($grouptype) and ,it only used for _mysql4

g) if (empty($className)) {

kết quả:

if sales helper not rewrite then if (empty($className)) { becomes true

h)if (!empty($config)) {

Kết quả

:false

if (!empty($config)) {  becomes false;`

i) if (empty($className)) { Kết quả:as $className is till null then this code is true

j) tạo kết quả lớp học $className = 'mage_'.$group.'_'.$groupType;
:

$group=sales
$groupTyp=helper
$className =  'mage_sales_helper';

k)

if (!empty($class)) {
                $className .= '_'.$class;
            }

kết quả:

as $class = data the this condition  is true and $className =  'mage_sales_helper_data';

l) ** thực hiện bằng chữ in hoa $className = uc_words($className); Bây giờ trả về lớp trả về $ className; đó là Mage_Sales_Helper_Data **

Nhờ vào

Cách cư xử của David và Rajeev K Tomy


Mặc dù tôi đã phân tích toàn bộ điều này thông qua tâm trí, nó dễ hiểu và hữu ích hơn khi nó có vẻ như là câu trả lời chi tiết này. một lời cảm ơn lớn cho Amit, người đã dành rất nhiều thời gian để chuẩn bị câu trả lời này cho tôi và cho toàn bộ cộng đồng. Tôn trọng :)
Rajeev K Tomy
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.