Prestashop 1.7 在自定义模块的 tpl 上提交表单

Prestashop 1.7 Submit a form on custom module's tpl

我创建了自己的模块 cus_avatar,用于上传客户头像。我制作了一个 tpl 文件 "uploader.tpl",其中包含我需要提交的表格,挂在客户的个人资料页面中。 我如何post这个表格?

这是我的代码:

root/modules/cus_avatar/cus_avatar.php:

<?php

if (!defined('_PS_VERSION_')) {
    exit;
}

class Cus_Avatar extends Module
{
    public function __construct()
    {
        // the module's details and construct codes here
    }

    public function install()
    {
        return parent::install()
            && $this->registerHook('header')
            && $this->registerHook('displayEpAvatar')
            && $this->registerHook('displayEpAvatarSidebar')
            && $this->installDb();
    }

    public function uninstall()
    {
        return parent::uninstall() && $this->uninstallDb();
    }

    protected function installDb(){

        $alterDb = "CREATE TABLE mydb."._DB_PREFIX_."avatar (
                        avatar_id INT NOT NULL AUTO_INCREMENT,
                        id_customer INT NULL,
                        avatar_path VARCHAR(255) NULL,
                        PRIMARY KEY (avatar_id)
                    ) ENGINE = MyISAM";

        return Db::getInstance()->execute($alterDb);
    }

    protected function uninstallDb(){
        $revertDb = "DROP TABLE "._DB_PREFIX_."avatar";
        return Db::getInstance()->execute($revertDb);
    }

    public function hookHeader($params)
    {
        $this->context->controller->addCss($this->_path.'assets/css/style.css', 'all');
        $this->context->controller->addJS($this->_path.'assets/js/script.js');
    }

    public function hookDisplayEpAvatar($params)
    {
        if(isset($_POST['submit_avatar']))
        {
            // THIS CODE DOESNT SEEM TO WORK
            var_dump("HELLO WORLD!");
            die();
        }

        return $this->display(__FILE__, 'views/templates/hook/uploader.tpl');
    }

    public function hookDisplayEpAvatarSideBar($params)
    {
    }
}

root/modules/cus_avatar/views/templates/hook/uploader.tpl:

<form name="form_avatar" method="post">
    <div class="row">
        <div class="col-xs-12 plr30">
            <label class="mt20">PROFILE AVATAR</label>
        </div>
        <div class="col-xs-12 col-md-4 col-lg-3 plr30">
            <div class="avatar-container">
                <label class="avatar">
                    <input type="file" accept="image/*">
                </label>
            </div>
            <button type="submit" name="submit-btn">SUBMIT</button>
        </div>
        <div class="col-xs-12 col-md-8 col-lg-9">
            <small class="text-warning">Avatar is updated seperately from the rest of the form.</small>
        </div>
    </div>
</form>

//忽略这些文字,这些只是为了使描述足够长以供提交。敏捷的棕色狐狸在河岸附近跳过懒狗。

所以我找到了一个方法,如果有人有更好的方法也请告诉我。

我在 root/modules/cus_avatar/controllers/front/ 中创建了一个名为 "default.php" 的控制器。此控制器将处理 post 进程,因此我必须 link 使用 getModuleLink 向此控制器发送表单操作。

在我的 root/modules/cus_avatar/views/templates/hook/uploader.tpl:

//first parameter is the module name, second is the controller name.
<form action="$link->getModuleLink('cus_avatar', 'default')" method="post">

在我的 root/modules/cus_avatar/controllers/front/default.php:

include_once(dirname(__FILE__).'../../../cus_avatar.php');

class cus_avatarDefaultModuleFrontController extends ModuleFrontController
{
    public function __construct()
    {
        parent::__construct();

        $this->context = Context::getContext();
    }

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

        if(isset($_POST['submit-btn']))
        {
//HANDLE THE POST/UPLOAD PROCESS HERE

        }
// after handling the post process imidiately kill the page to reduce further loaading and then redirect the page back to the page where you originally is, in my case it's index.php?controller=identity.
        die(Tools::redirect('index.php?controller=identity'));
    }
}

然后在我的 cus_avatar.php 上删除了这部分:

    public function hookDisplayEpAvatar($params)
    {
// remove the if condition now since it has no use. 
            if(isset($_POST['submit_avatar']))
            {
                // THIS CODE DOESNT SEEM TO WORK
                var_dump("HELLO WORLD!");
                die();
            }

            return $this->display(__FILE__, 'views/templates/hook/uploader.tpl');
    }