2017-06-05 1 views
1

Dans Prestashop 1.6, à partir d'un FrontController, je dois envoyer un mail à l'administrateur de la boutique.Envoyer un mail à Admin avec un lien BO vers un client spécifique dans Prestashop 1.6

Cette partie fonctionne bien, mais j'ai eu des problèmes pour inclure un lien vers la page d'administration d'un client spécifique.

La seule chose qui me manque est le nom du répertoire d'administration. Je serais capable d'analyser et de concaténer la constante PS_ADMIN_DIR mais elle n'est pas disponible depuis le FrontController.

Je suis coincé ici.

Voici le code:

$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"; 

La sortie je suis arrivé:

http://127.0.0.1:8080/prestashop/index.php?controller=AdminCustomers&id_customer=2&viewcustomer 

La sortie I besoin:

http://127.0.0.1:8080/prestashop/administration/index.php?controller=AdminCustomers&id_customer=2&viewcustomer 

Toute aide sera appréciée.

Répondre

0

Depuis l'utilisation du répertoire d'administration nom de la partie frontale et l'envoi d'un lien vers l'administration par e-mail n'est pas une bonne idée à des fins de sécurité, je choisis de l'implémenter d'une autre manière.

Au lieu d'envoyer le lien de page du client d'administration au webmaster par courrier électronique, je crée un nouveau thread et un nouveau message client. Après cela, j'envoie un e-mail au service client. Ainsi, lorsqu'ils se connectent au Back Office, ils voient une nouvelle notification qui les conduit vers l'utilisateur spécifique.

enter image description here

Voici le code:

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(); 
} 

aide quelqu'un espère que cela dans la même situation.

1

Il n'y a pas de moyen (standard) de connaître le dossier d'administration à partir d'un contrôleur frontal, sinon toute la sécurité va se répandre dans les toilettes :). Ce que vous pouvez faire est de récupérer le dossier d'administration à partir du module 'configuration' ou lorsque vous l'installez, et l'enregistrer quelque part, au moment où je suggère dans la base de données mais peut-être il y a un mode plus sûr.

Quelque chose comme:

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; 
} 

Ensuite, dans votre contrôleur avant le récupérer par:

$adminfolder = Configuration::get('PS_MYMOD_ADMIN_DIR'); 

Cependant j'espère que vous savez que vous créez une violation de la sécurité par e-mail ...

Espérons que cela aide

+0

Merci d'avoir pris le temps de répondre à cette question. Donc, ce n'est pas un moyen sécurisé de le faire? – JazZ

+0

Je viens de le tester et ça va. Cela fonctionne mais le jeton de sécurité n'est pas valide. Certainement parce qu'il n'y a pas d'employé dans le frontController, donc le jeton ne peut pas être généré correctement. – JazZ

+0

Je ne sais pas comment gérer ça. – JazZ