【问题标题】:Prestashop 1.6 - Create front end page in custom modulePrestashop 1.6 - 在自定义模块中创建前端页面
【发布时间】:2016-09-28 11:02:54
【问题描述】:

我目前致力于为 Prestashop 本地商店定位器添加功能的自定义模块。

为了我的需要,我必须在我的模块(和第二个控制器)中创建第二个自定义页面。

我尝试了一些方法,但没有任何效果。

我在我的目录中覆盖 FrontController 文件 -> /module/override/controllers/front/StorepageController.php

<?php

class StorepageController extends FrontController
{

    public function initContent()
    {
      parent::initContent();

      $this->setTemplate(_PS_MODULE_DIR_.'modulename/views/templates/front/storepage.tpl');
    }

我把我的 .tpl 文件放在这个目录中 -> /module/views/templates/front/storepage.tpl

最后,我删除“class_index.php”并尝试使用此链接查看我的页面:

localhost/prestashop/fr/index.php?controller=storepage

我不明白为什么没有任何效果。

【问题讨论】:

  • 当你说什么都不起作用时,究竟发生了什么?
  • 如果我没记错的话,您在上一个问题中覆盖了默认的 StoresController.php。这个覆盖有效吗?在这里,您正在尝试创建第二个控制器,但您使用的是覆盖语法。我将发布一个创建模块控制器的示例作为答案。
  • 您好,当我尝试访问此自定义控制器时出现错误 404 页面。是的,这是我想要创建的另一个控制器。我的自定义 StoresController 完美运行。在这里,我想创建一个自定义页面,显示我的 StoresController 中的一些信息。

标签: php module overriding prestashop-1.6


【解决方案1】:

在这里,我们将在一个名为 CustomStores 的模块中创建一个名为 myStore 的新控制器。我们会考虑到您已经覆盖了默认的StoresController.php

您的模块如下所示:

/customstores
    /customstores.php
    /config.xml
    /override
        /controllers
            /front
                StoresController.php
    /views
        /templates
            /front
                /stores.tpl

现在你想要一个新的控制器,它不是一个覆盖。我们将通过扩展 ModuleFrontController 来创建这个新的控制器。

您的模块树现在将如下所示:

/customstores
    /customstores.php
    /config.xml
    /override
        /controllers
            /front
                StoresController.php
    /views
        /templates
            /front
                /stores.tpl
                /mystore.tpl
    /controllers
        /front
            /mystore.php
    /classes
        /CustomStore.php

以下是mystore.php代码:

<?php

include_once(_PS_MODULE_DIR_ . 'customstores/classes/CustomStore.php');

/**
 * the name of the class should be [ModuleName][ControllerName]ModuleFrontController
 */
class CustomStoresMyStoreModuleFrontController extends ModuleFrontController
{
    public function __construct()
    {
        parent::__construct();
        $this->context = Context::getContext();
        $this->ssl = false;
    }

    /**
     * @see FrontController::initContent()
     */
    public function initContent()
    {
        parent::initContent();

        // We will consider that your controller possesses a form and an ajax call

        if (Tools::isSubmit('storeAjax'))
        {
            return $this->displayAjax();
        }

        if (Tools::isSubmit('storeForm'))
        {
            return $this->processStoreForm();
        }

        $this->getContent();
    }

    public function getContent($assign = true)
    {
        $content = array('store' => null, 'errors' => $errors);

        if (Tools::getValue('id_store') !== false)
        {
            $content['store'] = new CustomStore((int) Tools::getValue('id_store'));

            if (! Validate::isLoadedObject($content['store']))
            {
                $content['store'] = null;
                $content['errors'][] = "Can't load the store";
            }
        }
        else
        {
            $content['errors'][] = "Not a valid id_store";
        }


        if ($assign)
        {
            $this->context->smarty->assign($content);
        }
        else
        {
            return $content;
        }
    }

    public function displayAjax()
    {
        return Tools::jsonEncode($this->getContent(false));
    }

    public function processStoreForm()
    {
        // Here you get your values from the controller form
        $like = Tools::getValue('like');
        $id_store = (int) Tools::getValue('id_store');
        // And process it...
        $this->context->smarty->assign(array(
            'formResult' = CustomStore::like($id_store, $like)
        ));

        // And finally display the page
        $this->getcontent();
    }
}

我还为你的模块添加了一个自定义类,名为CustomStore.php,我们来看看代码:

<?php

class CustomStore extends ObjectModel
{
    public $id_custom_store;

    public $name;

    public $nb_likes;

    /**
     * @see ObjectModel::$definition
     */
    public static $definition = array(
        'table' => 'customstores_store',
        'primary' => 'id_custom_store',
        'fields' => array(
            'name' =>     array('type' => self::TYPE_STRING, 'validate' => 'isGenericName', 'required' => true, 'size' => 128),
            'nb_likes' => array('type' => self::TYPE_INT, 'validate' => 'isUnsignedId', 'required' => true),
        ),
    );

    public static function like($id_store, $like)
    {
        $store = new CustomStore($id_store);

        if (! Validate::isLoadedObject($store))
        {
            return false;
        }

        if (! ($like == 1 || $like == -1))
        {
            return false;
        }

        $store->nb_likes + (int) $like;
        $store->save();
    }
}

您必须在模块install() 方法中创建customstores_store 表:

DB::getInstance()->execute(
    "CREATE TABLE IF NOT EXISTS `" . _DB_PREFIX_ . "customstores_store` (
      `id_custom_store` varchar(16) NOT NULL,
      `name` varchar(128) NOT NULL,
      `nb_likes` int(10) unsigned NOT NULL DEFAULT '0',
      PRIMARY KEY (`id_custom_store`)
    ) ENGINE=" . _MYSQL_ENGINE_ . " DEFAULT CHARSET=utf8;"
);

此代码未经测试,是一次性编写的,但您需要的所有概念都在这里 ;)。如果您想了解更多信息,我建议您查看其他核心模块代码。玩得开心!

【讨论】:

  • 几分钟前,我找到了让我明白我的错误的文档。你确认了这个错误。您的 CustomStore 只是关于如何在我的模块控制器中调用和使用自定义类的示例?再次感谢您的帮助!
  • 是的。我应该补充一点,您可以使用此 url 访问您的控制器:http://mywebsite.com/index.php?fc=module&amp;module=customstores&amp;controller=mystore&amp;id_store=1 您可以在SEO 部分的后台中定义一个友好的 URL。
  • 我认为我必须操纵和理解 pretashop 核心才能更方便地进行编码。我开始同化并感谢您的大力帮助。
  • 您好 - 我在我的模块中创建了一个自定义页面,并给了它一个友好的 URL。我现在可以通过 myshop.com/module-page-url 访问我的模块页面。你知道我怎么能让这个动态吗?例如:myshop.com/module-page-url/param1?我想使用友好的 URL 将参数传递给模块页面控制器。谢谢
  • 看看this answer
猜你喜欢
  • 2014-12-21
  • 2017-04-04
  • 2012-12-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多