3

ファイルには、メニュー、検索などを含むすべてのヘッダー部分を含むHeader.tplフックがあります...このURLで確認できます{$HOOK_TOP}

FrontControllerit shows...では、'HOOK_TOP' => Hook::exec('displayTop')Hook ページに という関数があることを意味しますexec()exec()しかし、通話でコードを正しく理解できません。

指定されたフックのモジュールを実行するように指示します。「 displayTop 」で検索すると、というモジュール名が出てきましたblocktopmenu.php

実行は 2 つの関数のみを通過します。

    public function hookDisplayTop($param)
    {
        $this->user_groups =  ($this->context->customer->isLogged() ? $this->context->customer->getGroups() : array(Configuration::get('PS_UNIDENTIFIED_GROUP')));
        $this->page_name = Dispatcher::getInstance()->getController();
        if (!$this->isCached('blocktopmenu.tpl', $this->getCacheId()))
        {
            $this->makeMenu();
            $this->smarty->assign('MENU_SEARCH', Configuration::get('MOD_BLOCKTOPMENU_SEARCH'));
            $this->smarty->assign('MENU', $this->_menu);
            $this->smarty->assign('this_path', $this->_path);
        }

        $this->context->controller->addJS($this->_path.'js/hoverIntent.js');
        $this->context->controller->addJS($this->_path.'js/superfish-modified.js');
        $this->context->controller->addCSS($this->_path.'css/superfish-modified.css');

        $html = $this->display(__FILE__, 'blocktopmenu.tpl', $this->getCacheId());
        //print_r($html);//exit;
        return $html;
    }

protected function getCacheId($name = null)
{//echo"asdasdsad";exit;
    parent::getCacheId($name);
    $page_name = in_array($this->page_name, array('category', 'supplier', 'manufacturer', 'cms', 'product')) ? $this->page_name : 'index';
    return 'blocktopmenu|'.(int)Tools::usingSecureMode().'|'.$page_name.'|'.(int)$this->context->shop->id.'|'.implode(', ',$this->user_groups).'|'.(int)$this->context->language->id.'|'.(int)Tools::getValue('id_category').'|'.(int)Tools::getValue('id_manufacturer').'|'.(int)Tools::getValue('id_supplier').'|'.(int)Tools::getValue('id_cms').'|'.(int)Tools::getValue('id_product');
}

ただし、このパブリック関数hookDisplayTop($param)はフォルダー全体で呼び出されることはありません。検索しましたが、どのファイルにも見つかりませんでした。

exec()関数を以下に示します

public static function exec($hook_name, $hook_args = array(), $id_module = null, $array_return = false, $check_exceptions = true)
    {

        // Check arguments validity
        if (($id_module && !is_numeric($id_module)) || !Validate::isHookName($hook_name))
            throw new PrestaShopException('Invalid id_module or hook_name');

        // If no modules associated to hook_name or recompatible hook name, we stop the function

        if (!$module_list = Hook::getHookModuleExecList($hook_name))
            return '';

        // Check if hook exists
        if (!$id_hook = Hook::getIdByName($hook_name))
            return false;

        // Store list of executed hooks on this page

        Hook::$executed_hooks[$id_hook] = $hook_name;
    //  print_r(Hook::$executed_hooks);exit;

        $live_edit = false;
        $context = Context::getContext();
        if (!isset($hook_args['cookie']) || !$hook_args['cookie'])
            $hook_args['cookie'] = $context->cookie;
        if (!isset($hook_args['cart']) || !$hook_args['cart'])
            $hook_args['cart'] = $context->cart;

        $retro_hook_name = Hook::getRetroHookName($hook_name);
//print_r($hook_name);exit;
        // Look on modules list
        $altern = 0;
        $output = '';
        foreach ($module_list as $array)
        {
            // Check errors
            if ($id_module && $id_module != $array['id_module'])
                continue;
            if (!($moduleInstance = Module::getInstanceByName($array['module'])))
                continue;

            // Check permissions
            if ($check_exceptions)
            {
                $exceptions = $moduleInstance->getExceptions($array['id_hook']);
                $controller = Dispatcher::getInstance()->getController();

                if (in_array($controller, $exceptions))
                    continue;

                //retro compat of controller names
                $matching_name = array(
                    'authentication' => 'auth',
                    'compare' => 'products-comparison',
                    );
                if (isset($matching_name[$controller]) && in_array($matching_name[$controller], $exceptions))
                    continue;
                if (Validate::isLoadedObject($context->employee) && !$moduleInstance->getPermission('view', $context->employee))
                    continue;
            }

            // Check which / if method is callable
            $hook_callable = is_callable(array($moduleInstance, 'hook'.$hook_name));
            $hook_retro_callable = is_callable(array($moduleInstance, 'hook'.$retro_hook_name));
            if (($hook_callable || $hook_retro_callable) && Module::preCall($moduleInstance->name))
            {
                $hook_args['altern'] = ++$altern;

                // Call hook method
                if ($hook_callable)
                    $display = $moduleInstance->{'hook'.$hook_name}($hook_args);
                else if ($hook_retro_callable)
                    $display = $moduleInstance->{'hook'.$retro_hook_name}($hook_args);
                // Live edit
                if (!$array_return && $array['live_edit'] && Tools::isSubmit('live_edit') && Tools::getValue('ad') && Tools::getValue('liveToken') == Tools::getAdminToken('AdminModulesPositions'.(int)Tab::getIdFromClassName('AdminModulesPositions').(int)Tools::getValue('id_employee')))
                {
                    $live_edit = true;
                    $output .= self::wrapLiveEdit($display, $moduleInstance, $array['id_hook']);
                }
                else if ($array_return)
                    $output[] = $display;
                else
                    $output .= $display;
            }
        }
        if ($array_return)
            return $output;
        else
            return ($live_edit ? '<script type="text/javascript">hooks_list.push(\''.$hook_name.'\'); </script>
                <div id="'.$hook_name.'" class="dndHook" style="min-height:50px">' : '').$output.($live_edit ? '</div>' : '');// Return html string
    }
4

2 に答える 2

4

ここではコードを 1 行ずつ説明するつもりはありませんが、exec static メンバーが何をするかを説明します。

あなたが電話するたびに

Hook::exec("HookName"); 

次のプロセスを実行します。

1) まず、フックが使用可能かどうかをチェックしますか? 利用できない場合は false を返します。

2) 次に、データベースからそのフックのモジュール リストを取得します。また、現在のページのフックのモジュールの例外でリストを絞り込みます。

3) 現在ロードされている (または呼び出されたページ) ページに対して呼び出されたフックのすべてのモジュールを取得した後、モジュール内のフック関数を呼び出します。特定のフックのモジュールをチェックすると、そのフックのパブリック関数が見つかります。トップフックを考えてみましょう。モジュールには、次のようなパブリック関数があります

public function hookTop // or public function hookDisplayTop for compatibility reasons

PS はそこでも他の操作を実行することに注意してください。

上記の詳細は、フックとモジュールが PS でどのように機能するかを示しているだけです。また、上記の理論を取り入れて、自分のプロジェクト用に Codeigniter と Zend Framework で同じ操作を実装しましたが、魅力的に機能します ;) .

他にご不明な点がございましたら、お気軽にお問い合わせください。できる限り詳しくご説明いたします。

ありがとうございました

于 2013-05-17T12:50:46.003 に答える