message

Configurarea e-mailurilor automate din magazinul dvs. Drupal Commerce poate ajunge să fie puțin mai complicată decât ne-ar plăcea. În acest tutorial, vă voi explica cum să faceți următoarele:

  1. Configurați e-mailuri automate după ce o comandă a fost plasată (datorită modulului Commerce Message).
  2. Personalizați e-mailul automat care este trimis clientului pentru a include articolele pe care le-a cumpărat (conținutul coșului de cumpărături)
  3. Configurați un e-mail automatizat care să ajungă la administratorul magazinului atunci când cineva a efectuat un check-out
  4. Depanați toate acestea datorită modulelor Devel și Maillog, astfel încât să nu fie nevoie să aveți configurat e-mailul sau plata

În primul rând, o mare mulțumire lui Nick Vahalik (alias nvahalik pe drupal.org) pentru câteva sugestii foarte utile privind configurarea mesajului de comerț și pentru întreaga idee de a folosi Devel și Maillog pentru a rezolva această problemă. 

Descărcați și activați următoarele module:

  • Maillog - vom folosi acest lucru pentru a accelera dezvoltarea, astfel încât să nu trebuie să ne facem griji cu privire la trimiterea/primirea de e-mailuri sau plasarea de comenzi pentru a ne testa munca
  • Devel - din nou, folosit pentru a ne ajuta să înțelegem ce se întâmplă, nu este necesar în ceea ce privește rularea acestui lucru
  • Token - oferă jetoane suplimentare care nu sunt suportate de nucleu (mai ales câmpuri), precum și o interfață de utilizare pentru navigarea jetoanelor
  • Commerce Message - include tipuri de mesaje specifice comenzilor ("comandă plătită", "produs adăugat în coș", "comentariu al administratorului", "comentariu al utilizatorului", "confirmare a comenzii") care sunt trimise prin intermediul Rules. Dacă utilizați drush, drush dl commerce_message și drush en commerce_message vor descărca și instala acest modul și toate dependențele sale (enumerate mai jos).
  • Message - permite înregistrarea și afișarea evenimentelor de sistem într-o serie de cazuri de utilizare diferite
  • Message Notify - oferă o metodă de trimitere a unui mesaj prin intermediul unui plugin notificator. Message Notify vine cu plugin-uri pentru e-mail și SMS și poate fi extins la alte mecanisme de transport, după cum este necesar.
  • EntityReference - oferă un tip de câmp care poate face referire la entități arbitrare

1. Activați Commerce Message și vedeți ce se întâmplă cu acest modul

În scopul acestui tutorial, voi folosi un site Drupal Commerce vanilla creat de Commerce Kickstart (1.x-1.42). După ce ați activat Commerce Message, dacă navigați la Structure -> Message Types veți vedea mesajele care vin din fabrică datorită Commerce Message.

drupal commerce message types ​

Pentru acest exemplu, ne vom uita la ultimul mesaj, Commerce Order: confirmarea comenzii. Modificați acest mesaj pentru a vă face o idee despre ce se întâmplă aici. Veți vedea că există o zonă Text mesaj, unde puteți modifica subiectul și corpul unei notificări.

drupal commerce message subject and body ​

Există, de asemenea, opțiunea de a introduce simboluri în aceste câmpuri. Deschideți token-urile pentru Message->Order și veți vedea o adevărată pleiadă de token-uri.

drupal commerce tokens ​

Cum sunt trimise aceste mesaje? Mergeți la Reguli (Configurație->Flux de lucru->Reguli) pentru a verifica. Haideți să verificăm regula care vine preconfigurată ca parte a mesajului Commerce Message cu tipul de mesaj pe care tocmai l-am analizat - acesta este Commerce order message: order notification e-mail. Editați regula. Nu voi intra în detaliile modului în care funcționează, dar elementele de bază sunt că, atunci când se finalizează finalizarea comenzii, Commerce Message creează un nou tip de mesaj, Commerce Order: confirmare comandă, care este apoi trimis prin Message notify (ultima acțiune). În această ultimă acțiune, puteți seta cui este trimis mesajul, dar dacă veți utiliza modulul Maillog, așa cum fac eu, nu trebuie să vă faceți griji cu privire la configurarea adresei de e-mail a destinatarului.

2. Rezolvarea problemelor folosind Devel și Maillog, astfel încât să nu fie nevoie să aveți e-mailuri sau plăți configurate

Pentru ca personalizarea acestui mesaj să fie mai ușor de depanat, aici vom folosi modulele Devel împreună cu Maillog. Este o adevărată pacoste să trebuiască să adăugați un produs în coș, să faceți checkout și să vă verificați e-mailul pentru a vedea dacă modificările pe care le-ați făcut fac ceea ce doriți. De asemenea, ar trebui să configurați mail-ul, precum și un fel de sistem de plată sandbox.  Să nu ne facem griji cu toate acestea deocamdată și să folosim în schimb Devel și Maillog pentru a ne face viața mai ușoară. 

Sub Structure->Blocks activați blocul Execute PHP furnizat de Devel și puneți-l undeva vizibil (eu l-am lipit în regiunea blocului Content). De asemenea, asigurați-vă că Maillog este configurat pentru a afișa e-mailurile pe pagină, accesând Configuration->Development->Maillog Settings.

Acum să ne asigurăm mai întâi că Maillog și Devel ne vor arăta informațiile de care avem nevoie pentru a ne apuca de treabă. Adăugați un produs în coș, vizualizați coșul și apoi faceți clic pe checkout. Acest lucru vă va oferi numărul de comandă - se află în calea după /checkout/[order-number]. În cazul meu, este pur și simplu "1", deoarece este prima dată când am adăugat ceva în coș pe acest site de comerț kickstart. 

drupal commerce get cart id ​

Iată încă o mulțumire lui Nick - consultați Gistul său la https://gist.github.com/nvahalik/1862eefa43ff3a6f3d22. În primul rând, vom prelua message_id folosind următorul cod - pentru cazul dvs., veți dori să înlocuiți 1 din commerce_order_load() cu numărul comenzii dvs. 

$type = 'commerce_order_order_confirmation'; $order = commerce_order_load(1); $message = message_create($type); $wrapper = entity_metadata_wrapper('message', $message); $wrapper->message_commerce_order->set($order); $wrapper->save(); dpm($wrapper->value());

Lipiți acest lucru în blocul Execute PHP Code (Executarea codului PHP) și apăsați execute. Devel ar trebui să scoată obiectul Message care conține mijlocul dorit (ID-ul mesajului).

get message id - execute php code ​devel dpm mid ​

Acum, luați acel mijloc (în cazul meu, 4), lipiți-l în Execute PHP Code cu a doua parte din gistul lui Nick și apăsați butonul de execuție. 

$message = message_load(4); message_notify_send_message($message);

Devel va dpm acum e-mailul mulțumită lui Maillog care ar fi fost trimis dacă ați fi trecut prin procesul de plată și ați fi avut totul configurat (sandbox de plată, poștă, etc.). Ura pentru că nu trebuie să ne facem griji pentru toate acestea în timp ce dezvoltăm local. 

dpm email message via maillog ​

3. Adăugați conținutul coșului de cumpărături la e-mailul clientului folosind !order-summary

În primul rând, majoritatea oamenilor ar dori ca conținutul coșului să fie inclus în e-mailul trimis clientului. Din fericire, acest lucru ne este oferit de Commerce Message datorită argumentului order-summary. Consultați funcția commerce_message_message_presave() din commerce_message.module, linia 59. Pentru a adăuga un rezumat al comenzii în e-mailul nostru, editați mesajul de confirmare a comenzii furnizat de modulul Commerce Message la admin/structure/messages/manage/commerce_order_order_confirmation și adăugați !order-summary unde este cazul - iată unde l-am pus eu:

drupal commerce message !order-summary argument ​

Acum mergeți înapoi și apăsați din nou Execute în blocul Execute PHP pentru a vedea ce spune acum e-mailul.
drupal commerce message !order-summary argument ​

Urât, da. Dar asta este pentru un alt articol pe blog. Cel puțin deocamdată avem informația din e-mail.

4. Trimiteți e-mailuri către administratorul magazinului

Acum, probabil că doriți să trimiteți un e-mail similar administratorului magazinului dvs. pentru a-l anunța că cineva a plasat o comandă. Întoarceți-vă la tipurile de mesaje Commerce Message la admin/structure/messages și clonați mesajul Commerce Order: order confirmation. Să-l numim commerce_order_admin_notification și să îi dăm o descriere frumoasă, ceva de genul Notifică administratorul magazinului că a fost plasată o comandă. Salvați tipul de mesaj. Acum ar trebui să aveți cele 2 tipuri de mesaje:

drupal commerce message types ​

Dacă doriți, de asemenea, ca acest e-mail să fie trimis în mod real la o dată viitoare, veți dori, de asemenea, să clonați regula Commerce order message: order notification e-mail rule de la admin/config/workflow/rules, iar pentru prima acțiune a regulii clonate (creați o nouă entitate), selectați noul tip de mesaj (în acest exemplu, Notificați administratorul magazinului că a fost plasată o comandă).

notify store admin  ​. 

Dar nu trebuie să ne facem griji pentru asta acum, deoarece folosim Maillog pentru a vizualiza e-mailurile. Să rulăm din nou codul nostru PHP pentru a obține ID-ul mesajului, dar de data aceasta asigurați-vă că schimbați $type în noul nostru tip de mesaj, commerce_order_admin_notification.

$type = 'commerce_order_admin_notification'; $order = commerce_order_load(1); $message = message_create($type); $wrapper = entity_metadata_wrapper('message', $message); $wrapper->message_commerce_order->set($order); $wrapper->save(); dpm($wrapper->value());

Acum vedem că mijlocul nostru este 5, așa că putem lua acest nou mijloc și să tipărim mesajul cu următoarele:

$message = message_load(5); message_notify_send_message($message);

Să ne uităm la ceea ce este tipărit acum de devel și Maillog:

maillog admin message ​

5. Obținerea argumentului !order-summary pentru mesajele clonate de comerț

La naiba. De ce nu se tipărește !order-summary? Am căutat pe Google până la această postare de pe forum care explică - !order-summary while cloning a commerce message. !order-summary nu este un token, ci este injectat de modulul Commerce Message în următoarea funcție:

function commerce_message_message_presave($message) { if (!empty($message->mid) || $message->type != 'commerce_order_order_confirmation') { return; } $message->arguments['!order-summary'] = array( 'callback' => 'commerce_message_order_summary', 'pass message' => TRUE, ); }; }

Vedem aici că tipul de mesaj este commerce_order_order_confirmation. Deoarece am clonat acest tip de mesaj și i-am dat un nume nou (commerce_order_admin_notification), acest hook_message_presave nu este invocat. Haideți să rezolvăm acest lucru cu un modul personalizat rapid al nostru. Pentru acest exemplu, voi numi modulul meu personalizat dc_message_demo - faceți fișierele .info și .module necesare și activați modulul. Apoi adăugați următoarele la modulul dvs. - înlocuiți $message->type cu numele pe care l-ați dat tipului de mesaj clonat. Acum, tipul de mesaj personalizat va ști despre argumentul !order-summary. 

/** * Implementează hook_message_presave(). * adaugă !order-summary la tipul de mesaj personalizat */ function dc_message_demo_message_presave($message){ if($message->type == 'commerce_order_admin_notification') { $message->arguments['!order-summary'] = array( 'callback' => 'commerce_message_order_summary', 'pass message' => TRUE, ); }; } }

Să ne asigurăm că acest lucru funcționează. Ștergeți memoria cache și apoi va trebui să obținem noul ID al mesajului. ID-ul mesajului s-a schimbat acum că am implementat cârligul nostru hook_message_preave. Executați codul PHP prin intermediul blocului de developare pentru a obține mijlocul. 

$type = 'commerce_order_admin_notification'; $order = commerce_order_load(1); $message = message_create($type); $wrapper = entity_metadata_wrapper('message', $message); $wrapper->message_commerce_order->set($order); $wrapper->save(); dpm($wrapper->value());

Acum vedem că ID-ul mesajului nostru este 6. Deci, executați ultima parte a codului pentru a încărca mesajul:

$message = message_load(6); message_notify_send_message($message);

Huzzah! Acum se tipărește !order-summary prin Maillog.

drupal commerce message !order-summary argument ​

De unde vine acest !order-summary pe care îl întrebați acum? Vine de la o vizualizare sumară a coșului de cumpărături de la admin/structure/views/view/commerce_cart_summary/edit - dacă doriți să adăugați ceva la acest argument !order-summary, o puteți face acolo. 

Drupal-ing fericit!

Drupal Commerce
25/03/2022