在Prestashop 1.5.3中创建自定义页面

在Prestashop 1.5.3中创建自定义页面,prestashop,Prestashop,我想在Prestashop 1.5.3中创建一个自定义页面,而不使用CMS 不幸的是,我找不到任何适用于1.5.3的教程 到目前为止,我已经在shops根目录中创建了一个test.php文件,其中包含以下内容: <?php include(dirname(__FILE__).'/config/config.inc.php'); include(dirname(__FILE__).'/header.php'); $smarty->display(_PS_THEME_DIR_.'tes

我想在Prestashop 1.5.3中创建一个自定义页面,而不使用CMS

不幸的是,我找不到任何适用于1.5.3的教程

到目前为止,我已经在shops根目录中创建了一个test.php文件,其中包含以下内容:

<?php
include(dirname(__FILE__).'/config/config.inc.php');
include(dirname(__FILE__).'/header.php');

$smarty->display(_PS_THEME_DIR_.'test.tpl');
?>

我将相应的test.tpl放在我的文件夹中。它只包含“hello world”

我更改了blockmenu.php并创建了指向我的页面的自定义链接:

$this->_menu .= '<li><a href="test.php">TEST</a></li>'.PHP_EOL;
$this->\u菜单。='
  • '.PHP\u EOL;
    如果我点击链接,页面会显示出来,但是html有点损坏。页面的主体id设置为pagenotfound,并生成左侧列,但未显示。有没有办法为我的自定义页面设置$page_名称,这样我就可以检查我的自定义页面是否已加载,并禁止生成左右列


    有没有其他方法可以创建没有CMS的功能性自定义页面?

    只需创建一个具有页面名称的控制器,并将其放入/overrides/controllers/front/。 控制器的名称必须为NameyouwantforthepageController.php

    下面是一个基本类:

    class MyPageController extends FrontController {
    
    /**
     *  Initialize controller
     *  @see FrontController::init()
     */
    public function init() {
        parent::init();
    }
    
    /**
     *  Assign template vars related to page content
     *  @see FrontController::initContent()
     */
    public function initContent() {
        parent::initContent();
    
        $this->setTemplate(_PS_THEME_DIR_.'my-page.tpl');
    }
    
    }
    
    查看FrontController,了解需要覆盖哪些方法来添加功能性,例如
    setMedia()
    来添加CSS/JS文件


    然后,您将能够在SEO面板的后台添加一个漂亮的url。

    除了“public$php_self='mypage'”之外,其他都可以正常工作

    如果将文件放在覆盖目录中(良好做法),SEO菜单上不会显示标识符“mypage”。 但是,如果您将控制器文件放在主目录中,它就可以工作了

    classes/Meta.php不扫描覆盖目录,只扫描根目录(可以在Meta.php的第56行看到)

    使用此代码重写Meta.php类允许PrestaShop扫描重写目录并添加页面:

    class Meta extends MetaCore
    {
    
    
        public static function getPages($exclude_filled = false, $add_page = false)
        {
                    $selected_pages = parent::getPages($exclude_filled, $add_page);
    
    
            if (!$files = Tools::scandir(_PS_CORE_DIR_.DIRECTORY_SEPARATOR.'override'.DIRECTORY_SEPARATOR.'controllers'.DIRECTORY_SEPARATOR.'front'.DIRECTORY_SEPARATOR, 'php', '', true))
                die(Tools::displayError('Cannot scan override directory'));
    
            $exlude_pages = array(
                'category', 'changecurrency', 'cms', 'footer', 'header',
                'pagination', 'product', 'product-sort', 'statistics'
            );
    
            foreach ($files as $file)
            {
                if ($file != 'index.php' && !in_array(strtolower(str_replace('Controller.php', '', $file)), $exlude_pages))
                {
                    $class_name = str_replace('.php', '', $file);
                    $reflection = class_exists($class_name) ? new ReflectionClass(str_replace('.php', '', $file)) : false;
                    $properties = $reflection ? $reflection->getDefaultProperties() : array();
                    if (isset($properties['php_self']))
                        $selected_pages[$properties['php_self']] = $properties['php_self'];
                    elseif (preg_match('/^[a-z0-9_.-]*\.php$/i', $file))
                        $selected_pages[strtolower(str_replace('Controller.php', '', $file))] = strtolower(str_replace('Controller.php', '', $file));
                    elseif (preg_match('/^([a-z0-9_.-]*\/)?[a-z0-9_.-]*\.php$/i', $file))
                        $selected_pages[strtolower(sprintf(Tools::displayError('%2$s (in %1$s)'), dirname($file), str_replace('Controller.php', '', basename($file))))] = strtolower(str_replace('Controller.php', '', basename($file)));
                }   
            }
    
            return $selected_pages;
        }
    
    }
    
  • 在override目录-override/controllers/front/CustompageController.php中创建自定义页面控制器
  • 新自定义页面的模板-themes/site current theme/custom-page.tpl

    <h3>{$company_name}</h3>
    <p><strong>{l s='Expert In'}</strong></p>
    <ul>
        {foreach from=$expert_in item=skill}
        <li>{$skill}</li>
        {/foreach}
    </ul>
    
    {$company\u name}
    {l s='Expert In'}

      {foreach from=$expert_in item=skill}
    • {$skill}
    • {/foreach}

  • Hello geys此解决方案也能完美地与覆盖一起工作

    1/在文件夹/override create page manufacturer-detail.php中,输入以下代码:

    包括(dirname(文件)。/config/config.inc.php'); 控制器::getController('ManufacturerDetailController')->run()

    工具::displayFileAsDeprecated()

    包括(dirname(文件)./header.php')

    $smarty->display(_PS_THEME_DIR_'manufacturer-detail.tpl')

    包括(dirname(文件)./footer.php')

    2/在/override/controllers/front create page manufacturerDetailController.php文件夹中,输入以下代码:

    类ManufacturerDetailController扩展了FrontController{

    /*public $php_self = 'manufacturer-detail';  */  /* optional */
    
    public function init(){ 
        parent::init(); 
    } 
    
    public function initContent(){ 
        parent::initContent(); 
        $this->setTemplate(_PS_THEME_DIR_.'manufacturer-detail.tpl'); 
    } 
    
     /*  The following code portion is optional.
    
    *删除双斜线以激活该部分 *如果您想为页面使用外部样式表和JavaScript。 *在主题的CSS和JS目录中创建相应的CSS和JS文件 */

    }

    3/在文件夹/themes/您的默认主题创建页面manufacturer-detail.php中,并放置以下代码:

    你好,世界 4/您可以在后台转到SEO和url并添加新的url

    您可以访问您的页面


    别忘了设置class属性
    public$php_self='mypage'
    可以选择SEO和URL菜单中的相关页面。您好,谢谢您的回复,但是我如何访问我的网页,我必须使用哪个URL?@FabienPapet您可以使用
    www.yoursite.com/index.php?controller=nameOfYourController
    访问页面。但是最好的方法是在后面的SEO面板中添加一个urloffice@romainberger.嗯,我想你应该把这个答案从
    /controllers/front/
    编辑成
    /overrides/controllers/front/
    。你同意我的意见吗???@Whiteletsandblank是的,绝对同意。编辑了我的答案。感谢您的建议为什么我仍然看到一个空白页面而不是我的视图?请通过编辑/config/defines.inc.phpWhy启用错误模式,在1.6中设置自定义url ind SEO&url后,我被重定向回“丑陋”链接?当我转到它时,我又回到了编辑状态:我发现它很奇怪,但在创建了一个url之后,我能够选择另一个控制器,然后它工作了。
    /*public $php_self = 'manufacturer-detail';  */  /* optional */
    
    public function init(){ 
        parent::init(); 
    } 
    
    public function initContent(){ 
        parent::initContent(); 
        $this->setTemplate(_PS_THEME_DIR_.'manufacturer-detail.tpl'); 
    } 
    
     /*  The following code portion is optional.
    
    //public function setMedia(){
      //parent::setMedia();
      //$this->addCSS(_THEME_CSS_DIR_.'custom-page.css');
      //$this->addJS(_THEME_JS_DIR_.'custom-page.js');
    //}