我一直在搜索有关此问题的文档。但没有找到合适的人。
我知道如何使用管理员控制器加载管理模板。 我用
创建了一个表单<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
我的管理控制器代码:
<?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;
和我的pushnotificationform.tpl代码:
<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;
答案 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注入。