当前位置: 首页 > 知识库问答 >
问题:

Prestashop 1.7自定义模块前控制器不工作

薄哲
2023-03-14

尝试使用$链接创建具有奇怪行为的前控制器模块-

如果我通过添加手动更改url

该模块具有以下脚本:

<?php

class vPages extends Module
{
    private $html = '';
    private $postErrors = array();
    
    public function __construct()
    {
        $this->name = 'vpages';
        $this->tab = 'others';
        $this->version = '1.0';
        $this->author = 'Rosu Andrei Mihai';
        $this->is_eu_compatible = 1;
        $this->need_instance = 1;
        $this->bootstrap = true;
        $this->controllers = array('dpage');

        $this->displayName = $this->l('vPages');
        $this->description = $this->l('Virtual dynamic pages');
        $this->ps_versions_compliancy = array('min' => '1.6', 'max' => _PS_VERSION_);
        $this->confirmUninstall = $this->l('Are you sure you want to delete all saved details?');
        $this->secure_key = Tools::encrypt($this->name);
        
        parent::__construct();
    }

    public function install()
    {
        return parent::install() && $this->registerHook('moduleRoutes');
    }

    public function hookModuleRoutes($params){
        $my_link = array(
            'module-vpages-dpage' => array(
                'controller' => 'dpage',
                'rule' => '{id_country:-}flower-delivery{-:country}{-:city}.html',
                'keywords' => array(
                    'id_country' => array('regexp' => '[0-9]+', 'param' => 'id_country'),
                    'setCountry' => array('regexp' => '[0-9]+', 'param' => 'setCountry'),
                    'country' => array('regexp' => '[_a-zA-Z0-9\pL\pS]+', 'param' => 'country'),
                    'city' => array('regexp' => '[_a-zA-Z0-9\w\pL\pS-]*', 'param' => 'city'),
                    'module_action' => array('regexp' => '[\w]+', 'param' => 'module_action')
                ),
                'params' => array(
                    'fc' => 'module',
                    'module' => 'vpages'
                )
                )
            );
        return $my_link;
    }

    
    public function uninstall()
    {
        if (!parent::uninstall()) {
            return false;
        }
        return true;
    }
}

前端控制器具有以下脚本:

<?php

class vpagesdpageModuleFrontController extends ModuleFrontController
{
    public $errors = array();
    public $display_column_left = false;
    public $display_column_right = false;
    public $ssl = true;
    public $php_self = 'dpage'; 

        
    public function __construct()
    {
        parent::__construct();
        $this->page_name = 'dpage';
        $this->context = Context::getContext();
    }

    public function initContent()
    {
        parent::initContent();
        
        $this->context->cookie->__set('productbycountry_id',Tools::getValue('id_country')); 
        $sql     = "SELECT DISTINCT ps_country_lang.id_country, ps_country_lang.name as country, city FROM ps_cms_target_world
                    LEFT JOIN ps_country_lang ON ps_cms_target_world.id_country = ps_country_lang.id_country
                    WHERE ps_country_lang.id_country=" . Tools::getValue('id_country') . "
                    ORDER BY country ASC";
        //die($sql);
        $cPages  = Db::getInstance()->ExecuteS($sql);                
        
        $get_url  = Db::getInstance()->ExecuteS('SELECT domain,physical_uri FROM '._DB_PREFIX_.'shop_url ');
        $protocol = (isset($_SERVER['HTTPS']) ? "https" : "http") ;
        $site_url = "$protocol://".$get_url[0]['domain'].$get_url[0]['physical_uri']."modules";

        $controller_url = $this->context->link->getModuleLink('vpages', 'vPagesController', array(), true);
        $this->context->smarty->assign(array(
            'link' => $this->context->link,
            'controller_url' => $controller_url,
            'cPages' => $cPages,
            'SITEURL' => $site_url
        ));
        
        $country = urldecode(Tools::getValue('country'));        
        $city = urldecode(Tools::getValue('city'));
        if(isset($city) && !empty($city)) $title = " - " . $city; 
        
        $this->context->smarty->assign('meta_title', 'Flower delivery to ' . $country . $title);
        
        $this->setTemplate('module:vpages/views/templates/front/dPage.tpl');
    }


}

在tpl文件中,我使用以下脚本生成友好url:

{foreach $vPages as $page}
    <div class="country_content col-xs-4 col-sm-3 col-md-2 center-block text-center">
        <p>
        {assign var=params value=[
            'module_action' => 'list',
            'id_country'=> $page.id_country,
            'setCountry'=> $page.id_country,
            'country'=> urlencode($page.country),
            'city' => null
        ]}
        {assign var="meta_title" value="Flowers to {$page.country}"}
        
            <a style="color:normal" href="{$link->getModuleLink('vpages', 'dpage', $params)|escape:'html':'UTF-8'}" title="{$meta_title|escape:'html':'UTF-8'}">
                <img width="98" height="70" src="{$SITEURL}/vpages/flags/{$page.country}.png" style="padding-right: 3px; margin=bottom: 5px;" />
                <br />
                <p>{$page.country|escape:'html':'UTF-8'}</p>
            </a>
        </p>
    </div>
{/foreach}

我不明白代码中有什么错误,在PS1.6中,代码在PS1.7中运行得非常完美。有人能告诉我错误吗?

谢谢!


共有1个答案

毕黎昕
2023-03-14

链接应该在模块的类中创建,而不是在tpl中创建,tpl只是用于布局。在类中使用此$this-

 类似资料:
  • 需要 10.2.0+ 您可以在*.vue文件中定义自定义语言块。 自定义块的内容将由在vue-loader'选项的loaders对象中指定的加载器处理,然后由组件模块require。 配置类似于[先进的Loader配置](../ configurations / advanced.md)中描述的配置,除了匹配使用标记名称而不是lang`属性。 如果找到一个自定义块的匹配加载器,它将被处理; 否则将

  • 控制器定义 ThinkCMF5的控制器完全按 TP5的控制器用法来,但 CMF 封装了几个重要控制器基类,为了更方便开发者,我们建议如果没有特殊需求,自己创建的控制器请最好继承一个基类控制器; 用于 WEB 项目的基类控制器有四个,分别是:BaseController,HomeBaseController,UserBaseController,AdminBaseController 继承关系 th

  • 控制器定义 ThinkCMF6.0的控制器完全按 TP6.0的控制器用法来,但 CMF 封装了几个重要控制器基类,为了更方便开发者,我们建议如果没有特殊需求,自己创建的控制器请最好继承一个基类控制器; 用于 WEB 项目的基类控制器有四个,分别是:BaseController,HomeBaseController,UserBaseController,AdminBaseController, Re

  • 控制器定义 控制器文件通常放在application/module/controller下面,类名和文件名保持大小写一致,并采用驼峰命名(首字母大写)。 一个典型的控制器类定义如下: <?php namespace app\index\controller; use think\Controller; class Index extends Controller { public fu

  • 主要内容:自定义模块编写说明文档到目前为止,读者已经掌握了导入 Python 标准库并使用其成员(主要是函数)的方法,接下来要解决的问题是,怎样自定义一个模块呢? 前面章节中讲过,Python 模块就是 Python 程序,换句话说,只要是 Python 程序,都可以作为模块导入。例如,下面定义了一个简单的模块(编写在 demo.py 文件中): 可以看到,我们在 demo.py 文件中放置了变量(name 和 add)、函数(

  • 这是我的项目结构 父级是客户端、控制器、服务和存储库的父项目。 现在我想在controller中添加service的依赖关系,所以在controller pom.xml中添加了相同的内容 添加componentscan注释后 请帮忙