11

我想在不使用 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 的情况下创建功能性自定义页面?

4

4 回答 4

29

只需使用您想要的页面名称创建一个控制器,并将其放入 /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。

于 2013-01-15T11:57:48.337 回答
8

除了“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;
    }

}
于 2014-06-17T09:04:37.567 回答
2
  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>
    

在 prestashop 中创建自定义首页

于 2015-10-25T06:27:11.443 回答
0

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

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

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

工具::displayFileAsDeprecated();

包括(目录名(文件)。'/header.php');

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

包括(目录名(文件)。'/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 & URLs 并添加新的 url

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

或者

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

于 2018-02-02T16:12:03.700 回答