Prestashop 1.6:如何使用管理员控制器

时间:2016-09-02 10:47:57

标签: prestashop-1.6

我一直在搜索有关此问题的文档。但没有找到合适的人。

我知道如何使用管理员控制器加载管理模板。 我用

创建了一个表单
<form action="{$link->getModuleLink('pushnotification', 'AdminPushNotification', [], true)|escape:'html'}" method="post">

这里&#34;推送通知&#34;是我的模块名称和#34; AdminPushNotification&#34;是我的管理控制器名称。

当我点击提交时,会转到http://example.com/en/module/pushnotification/AdminPushNotification网址,该网址不是有效的网址,因此获得404页面

但我想提交表格并留在同一页面。

我不知道如何在管理员控制器中提交和处理表单提交。

提前致谢

我的模块文件结构: 推送通知     控制器         管理员             AdminPushnotification.php 查看    模板       管理          pushnotificationform.tpl

我的管理控制器代码:

&#13;
&#13;
    <?php

class AdminPushNotificationController extends ModuleAdminControllerCore
{
    public function __construct()   {
        $this->bootstrap = true;
        parent::__construct();
    }

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


        $smarty = $this->context->smarty;
        $this->context->smarty->assign(array(
            'msg' => "",
            'title' => ""
        ));
        $content = $smarty->fetch(_PS_MODULE_DIR_ . 'pushnotification/views/templates/admin/pushnotificationform.tpl');
        $this->context->smarty->assign(array(
            'content' => $this->content . $content
        ));
    }

    public function postProcess()
    {
        if (Tools::isSubmit('sendTokenMessage'))
        {
            $title = Tools::getValue('title');
            $msg = Tools::getValue('message');

            $content = $this->context->smarty->fetch(_PS_MODULE_DIR_ . 'pushnotification/views/templates/admin/pushnotificationform.tpl');
            $this->context->smarty->assign(array(
                'content' => $this->content . $content,
                'msg' => $msg,
                'title' => $title
            ));
        }
    }

    public function sendMessage($title,$msg)
    {

        $sql = " Select Token From Token";

        $result = DB::getInstance()->execute($sql);

        foreach($result as $row) {
            $message = array("title" => $title, "text"=> $msg);
            $message_status = send_notification($row["token"], $message);
        }
        return $message_status;
    }
}
&#13;
&#13;
&#13;

和我的pushnotificationform.tpl代码:

&#13;
&#13;
<div>
    {if $msg!=""}
        <p>{$msg}</p>
    {/if}
</div>
<form action="{$link->getAdminLink('pushnotification', 'AdminPushNotification', [], true)|escape:'html'}" method="post">
    <div style="padding-bottom:10px;" class="form-group">
        <label for="" class="control-label col-lg-6">Title</label>
        <div class="col-lg-6">
            <input class="form-control input-lg" type="text" name="title" />
        </div>
    </div>
    <div class="form-group">
        <label for="" class="control-label col-lg-6">Message</label>
        <div class="col-lg-6">
            <textarea name="message" class="form-control" style="min-width: 100%"></textarea>
        </div>
    </div>
    <input type="submit" name="sendTokenMessage" value="send" class="btn btn-default" />
</form>
&#13;
&#13;
&#13;

1 个答案:

答案 0 :(得分:0)

$link->getModuleLink()检索指向模块前端控制器的链接。

您需要使用$link->getAdminLink('AdminPushNotification')创建指向管理员控制器的链接。

修改

您正在以错误的方式调用$link->getAdminLink()方法。 您需要在表单中执行的操作是:

<form action="{$link->getAdminLink('AdminPushNotification')|escape:'htmlall':'utf-8'}" method="post">

getAdminLink()方法与getModuleLink()不同,因为它只接受一个字符串参数,即管理模块控制器AdminPushNotification的名称。

您可以查看classes/Link.php类以了解各种链接生成方法及其参数。

<强> EDIT2:

您要在postProcess()initContent()中分配两次内容,这会导致错误。

使用postProcess()对输入进行一些后台工作,即。您的send_message($title, $msg)方法或验证。

使用initContent()设置智能变量/模板等。

所以我会像这样重构这两个方法:

protected $msg = "";
protected $title = "";

public function postProcess()
{
    if (Tools::isSubmit('sendTokenMessage'))
    {
        // store inputs to object properties,
        // here they can be validated and reused in initContent()
        $this->title = Tools::getValue('title');
        $this->msg = Tools::getValue('message');

        // perhaps do some inputs validation here

        $this->send_message($this->title, $this->msg);
    }
}

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

    $smarty = $this->context->smarty;
    // msg and title variables must be assigned before fetching template
    // otherwise they are not recognized in template
    $smarty->assign(array(
        'msg' => $this->msg,
        'title' => $this->title
    ));
    $content = $smarty->fetch(_PS_MODULE_DIR_ . 'pushnotification/views/templates/admin/pushnotificationform.tpl');
    $smarty->assign(array(
        'content' => $this->content . $content
    ));
}

当然还要记得在模板中转义$msg$title以防止XSS,并清理字符串以防止SQL注入。