【问题标题】:Create custom page in Prestashop 1.5.3在 Prestashop 1.5.3 中创建自定义页面
【发布时间】:2012-12-29 10:47:18
【问题描述】:

我想在不使用 CMS 的情况下在 Prestashop 1.5.3 中创建自定义页面。

很遗憾,我找不到任何适用于 1.5.3 的教程。

到目前为止,我已经在商店根目录中创建了一个 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;

如果我点击链接,页面会显示,但 html 是某种损坏的。页面的 body-id 设置为 pagenotfound 并生成左侧列但未显示。有什么方法可以为我的自定义页面设置 $page_name 以便我可以检查我的自定义页面是否已加载并禁止生成左右列?

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

【问题讨论】:

标签: prestashop


【解决方案1】:

只需为页面创建一个具有您想要的名称的控制器,并将其放入 /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 & URLs 菜单中选择相关页面。
  • 您好,感谢您的回复,但是我如何才能访问我的网页,我必须使用哪个 URL?
  • @FabienPapet 您可以使用www.yoursite.com/index.php?controller=nameOfYourController 访问该页面。但最好的方法是在后台的 SEO 面板中添加一个 url
  • @romainberger 。好吧,我认为您应该将此答案从/controllers/front/ 编辑为/overrides/controllers/front/。你同意我的观点吗??
  • @whitelettersandblankspaces 是的,当然。编辑了我的答案。感谢您的建议
【解决方案2】:

除了“public $php_self = 'mypage'”之外,一切都运行良好。

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

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;
    }

}

【讨论】:

    【解决方案3】:
    1. 在 override 目录中创建自定义页面控制器 - override/controllers/front/CustompageController.php

    class CustompageController extends FrontController{ 
    
        //add js / css required for the custom page
    
        public function setMedia(){
            $this->context->controller->addJS(_THEME_JS_DIR_.'custom-page.js');
            $this->context->controller->addCSS(_THEME_CSS_DIR_.'custom-page.css');
            parent::setMedia();
        }
    
        public function initContent(){
    
            //preparingdata for passing to the custom page
            $name = 'Gofenice Technologies';
            $expert_in = array('Prestashop Development', 'Prestashop Customization', 'Prestashop Custom Module Development', 'Prestashop Page Speed Optimization');
            $this->context->smarty->assign(array(
                    'company_name' => $name,
                    'expert_in' => $expert_in
                ));
            //data ends-here
    
            //pass data to template file
            $this->setTemplate(_PS_THEME_DIR_.'custom-page.tpl');
    
    
            //show left/ right columns - will be true and shown by default
            $this->display_column_left = false;
            $this->display_column_right = false;
    
            //call parent initcontent - this is for loading the site's default header, footer, left and right columns
            parent::initContent();
        }
    }
    
    1. 我们新的自定义页面的模板 - theme/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>
      

    creating custom front page in prestashop

    【讨论】:

    • 为什么我仍然看到一个空白页面而不是我的视图?
    • 请通过编辑 /config/defines.inc.php 启用错误模式
    【解决方案4】:

    你好,这个解决方案也可以完美地与覆盖一起使用。

    1/ 在文件夹/override 中创建页面manufacturer-detail.php 并放入以下代码:

    include(dirname(FILE).'/config/config.inc.php'); Controller::getController('ManufacturerDetailController')->run();

    工具::displayFileAsDeprecated();

    include(dirname(FILE).'/header.php');

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

    include(dirname(FILE).'/footer.php');

    2/ 在文件夹/override/controllers/front 中创建页面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文件 */

    //public function setMedia(){
      //parent::setMedia();
      //$this->addCSS(_THEME_CSS_DIR_.'custom-page.css');
      //$this->addJS(_THEME_JS_DIR_.'custom-page.js');
    //}
    

    }

    3/ 在文件夹/themes/your-default-theme 中创建页面manufacturer-detail.php 并放入以下代码:

    你好世界

    4/ 您可以在后台访问 SEO 和 URL 并添加新的 url

    您可以访问您的页面http://yourstore.com/index?controller=ManufacturerDetail

    http://yourstore.com/urr-you-have-added-from-back-office

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-09-28
    • 1970-01-01
    • 2019-09-03
    • 1970-01-01
    • 1970-01-01
    • 2017-04-04
    • 2019-02-16
    相关资源
    最近更新 更多