在Prestashop 1.6中,我必须从FrontController向商店管理员发送邮件。
这部分运作良好但我遇到了一个问题,包括指向特定客户管理页面的链接。
我唯一遗漏的是管理目录的名称。我将能够解析和连接PS_ADMIN_DIR
常量,但它不能从FrontController中获得。
我有点被困在这里。
以下是代码:
$admin_customer_link =
_PS_BASE_URL_
.__PS_BASE_URI__
/* Missing the Administration directory name here */
.$this->context->link->getAdminLink('AdminCustomers', false)
."&id_customer=".(int)$customer->id."&viewcustomer";
我得到的输出:
http://127.0.0.1:8080/prestashop/index.php?controller=AdminCustomers&id_customer=2&viewcustomer
我需要的输出:
http://127.0.0.1:8080/prestashop/administration/index.php?controller=AdminCustomers&id_customer=2&viewcustomer
任何帮助将不胜感激。
答案 0 :(得分:1)
没有(标准)方法从前端控制器知道管理文件夹,否则所有安全措施都会冲洗马桶:)。
您可以做的是从模块“配置”中检索管理文件夹,或者在安装时将其保存到某个地方,此时我建议进入数据库但是可能存在更安全的模式。
类似的东西:
public function install()
{
// your stuff
$current_dir = $_SERVER['PHP_SELF']; // this give you the current dir (administration folder included)
$administration_folder = /* Clean your string with a string replace or preg */
Configuration::updateValue('PS_MYMOD_ADMIN_DIR', $administration_folder);
return true;
}
然后在您的前端控制器中通过以下方式检索它:
$adminfolder = Configuration::get('PS_MYMOD_ADMIN_DIR');
但是,我希望您知道您通过电子邮件创建了安全漏洞......
希望有所帮助
答案 1 :(得分:0)
由于使用来自前端的管理目录名称并在电子邮件中发送管理链接不是出于安全目的的好主意,因此我选择以另一种方式实现。
我没有通过电子邮件将管理客户的页面链接发送给网站管理员,而是创建了一个新的客户线程和消息。之后,我发送电子邮件给客户服务。因此,当他们登录后台时,他们会看到一个新的通知,将他们引导给特定用户。
以下是代码:
ModuleFrontController
// Create a new Customer Thread
$ct = new CustomerThread();
if (isset($customer->id)) {
$ct->id_customer = (int)$customer->id;
}
$ct->id_shop = (int)$this->context->shop->id;
$ct->id_contact = $contact->id;
$ct->id_lang = (int)$this->context->language->id;
$ct->email = $customer->email;
$ct->status = 'open';
$ct->token = Tools::passwdGen(12);
$ct->add();
// Add a new message to the Customer Thread
if ($ct->id) {
$cm = new CustomerMessage();
$cm->id_customer_thread = $ct->id;
$cm->message = $message;
$cm->ip_address = (int)ip2long(Tools::getRemoteAddr());
$cm->user_agent = $_SERVER['HTTP_USER_AGENT'];
$cm->add();
}
希望它可以帮助处于相同情况的人。