Crearea propriilor gestionatori de servicii de livrare automate. Crearea propriilor operatori automati pentru serviciile de livrare Ce este acest handler automat

Indiferent cât de mult ai hrăni lupul, porcul va avea un gust mai bun

Bitrix: crearea unui handler de servicii de livrare automată

Bitrix are două tipuri de servicii de livrare: personalizate și automate. Acest articol va descrie cum să creați un administrator de servicii de livrare automată.

Ce este acest handler automat?

Toate handlerele preinstalate se află în folderul /bitrix/modules/sale/lang/ru/delivery/. Managerii dvs. ar trebui să fie localizați în folderul /bitrix/php_interface/include/sale_delivery/ (această cale poate fi schimbată în proprietățile modulului magazinului online).

Handler-ul este o clasă a unei structuri specifice cu un șir de conexiune pentru handler-ul de livrare a evenimentelor onSaleDeliveryHandlersBuildList.

Clasa de gestionare a livrării trebuie să aibă un număr de metode, ale căror tipuri de acțiuni sunt descrise în metoda Init a clasei.

1. Init - câmpurile principale sunt inițializate.

2. DBGETSETTINGS - metoda de citire a valorilor parametrilor.

3. DBSETSETTINGS - metoda de setare a valorilor parametrilor.

4. GETCONFIG - definirea configurației setărilor (acestea pot fi împărțite în file).

5. COMPATIBILITATE - verificarea compatibilității profilurilor procesorului cu comanda.

6. CALCULATOR - calculul costurilor de livrare.

1. SID - Identificatorul unic de șir al handlerului.
2. NUME — Numele handlerului.
3. DESCRIERE - Descriere text a handlerului
4. DESCRIPTION_INNER — Descrierea internă a handler-ului, afișată la configurarea handler-ului în Panoul de control.
5. BASE_CURRENCY — Identificatorul monedei de bază a operatorului
6. HANDLER — Calea către fișierul handler. Necesar pentru copierea automată corectă a handler-ului (nu este încă implementat). În marea majoritate a cazurilor, valoarea __FILE__ este suficientă

Trebuie specificat și cel puțin unul profilul de livrare.

"Plain", // Identificatorul serviciului de livrare "NAME" => "Curier Krasnaya Presnya", "DESCRIPTION" => "Descriere pentru clienții site-ului", "DESCRIPTION_INNER" => "Descriere pentru administratorii site-ului", "BASE_CURRENCY" = > "RUR", "HANDLER" => __FILE__, /* Definirea metodelor */ "DBGETSETTINGS" => array("CDeliveryPlain", "GetSettings"), "DBSETSETTINGS" => array("CDeliveryPlain", "SetSettings"), " GETCONFIG" => array("CDeliveryPlain", "GetConfig"), "COMPABILITY" => array ("CDeliveryPlain", "Compability"), "CALCULATOR" => array ("CDeliveryPlain", "Calculate"), /* Listează profiluri */ "PROFILES" => array("all" => array("TITLE" => "Fără restricții", "DESCRIPTION" => "Profil de livrare fără restricții", "RESTRICTIONS_WEIGHT" => matrice (0 ) , "RESTRICTIONS_SUM" => matrice(0),),)); ) /* Setarea parametrilor */ funcția SetSettings($arSettings) ( foreach ($arSettings ca $key => $value) ( ​​​​if (strlen($value) > 0) $arSettings[$key] = doubleval($value) ); else unset($arSettings[$key]); return serialize($arSettings) /* Solicitați setări */ function GetSettings($strSettings) ( return unserialize($strSettings); ) /* Solicitați configurarea serviciului de livrare */ GetConfig() ( $arConfig = array("CONFIG_GROUPS" => array("all" => "Parametri",), "CONFIG" => array("DELIVERY_PRICE" => array(// "TYPE" => "STRING ", // "DEFAULT" => "200", // "TITLE" => "Cost de livrare", // "GROUP" => "toate",)),); return $arConfig; ) /* Verificare conformitate profil de livrare a comenzii */ function Compability($arOrder, $arConfig) ( return array("toate"); ) /* Calcul cost de livrare*/ function Calculate($profil, $arConfig, $arOrder, $STEP, $TEMP = false ) ( // obține costul coșului // Afișează coșul curent pentru utilizatorul curent $arBasketItems = array(); $dbBasketItems = CSaleBasket::GetList(array("NAME" => "ASC", "ID" => "ASC"), array("FUSER_ID" => CSaleBasket::GetBasketUserID(), "LID" => SITE_ID, „ORDER_ID” => „NULL”), fals, false, array(„ID”, „CALLBACK_FUNC”, „MODULE”, „PRODUCT_ID”, „QUANTITY”, „DELAY”, „CAN_BUY”, „PRICE”, „QUANTITY” " ")); while ($arItems = $dbBasketItems->Fetch()) ( dacă (strlen($arItems["CALLBACK_FUNC"]) > 0) ( CSaleBasket::UpdatePrice($arItems["ID"], $arItems["CALLBACK_FUNC"] , $arItems["MODULE"], $arItems["PRODUCT_ID"], $arItems["QUANTITY"]); $arItems = CSaleBasket::GetByID($arItems["ID"] ) $arBasketItems = $arItems; / Imprimați o matrice care conține coșul curent pentru fiecare ($arBasketItems ca $num => $item) ( $TotalSumArr = $item["PRICE"]*$item["QUANTITY"]; ) // suma tuturor produselor ținând cont cantitatea $TotalSum = array_sum($TotalSumArr); // în funcție de sumă, faceți un markup pentru livrare // de la 1500 la 5000 de livrare 750 de ruble dacă($TotalSum >= 1500 && $TotalSum<= 5000) $DeliveryCost = 750; elseif($TotalSum >= 5000) $DeliveryCost = 0; return array("RESULT" => "OK", "VALUE" => $_SESSION["ORDER_DELIVERY_PRICE"], "VALUE" => $DeliveryCost); ) ) AddEventHandler("vânzare", "onSaleDeliveryHandlersBuildList", array("CDeliveryPlain", "Init")); ?>

Handler-ul contine un cod care calculeaza continutul cosului si, in functie de pret, ofera diferite costuri de transport.

Am analizat procesul de instalare a unei noi componente de comandă. A testat proiectul timp de câteva zile și a venit timpul să profite de oportunitățile pentru care a meritat trecerea la noua platformă 1C-Bitrix.

Înlocuire automată implicită a orașului

Acest exemplu va fi util atât pentru micile magazine regionale, cât și pentru proiectele mari.

Regiunea de livrare este primul dintre elementele principale ale procesului de comandă. Să presupunem că trebuie să folosim înlocuirea automată a numelui „Kaliningrad” pentru a crește conversia și a reduce problemele cu plasarea comenzilor.

Acum, când vă conectați pentru prima dată, arată astfel:

Clienții, desigur, pot face clic pe butonul „Kaliningrad”, după care câmpul va fi completat, dar mulți pur și simplu omit acest pas, rezultând o eroare:

Această problemă a fost identificată de Metrica Webvisor. Desigur, după aceasta clientul completează totul corect, dar rămâne un reziduu, în ciuda faptului că în multe magazine, ridicarea este un criteriu important (până la 80% din comenzi), iar în acest caz, umplerea corectă a orașului numele nu este critic.

Să setăm orașul implicit și să vedem dacă înlocuirea funcționează. Să mergem la secțiunea administrativă a magazinului și apoi la setările proprietății:

Și setați locația implicită:

Acum să plasăm o comandă pentru a verifica:

Grozav, locația este completată și clientul trebuie doar să facă clic pe „Următorul”. Acum comanda va fi plasată cu inconveniente minime pentru client și vom maximiza conversia. În ceea ce privește magazinele mari, acestea pot colecta statistici privind frecvența comenzilor din anumite orașe și pot face butoane de selecție rapidă, ca în captura de ecran: „Kaliningrad”, „Zelenogradsk”, „Svetlogorsk”.

Puteți seta cel mai popular oraș în mod implicit, pentru că întotdeauna este mai ușor să îl schimbați sau să îl clarificați prin telefon decât să pierdeți un client.

Restricții suplimentare de plată

Următorul pas în plasarea unei comenzi este blocarea plății. Un tip de restricție poate fi interzicerea plății în numerar la livrarea prin curier. Acest lucru poate fi util în cazurile în care femeile lucrează în cariere și a căror sănătate nu vor să riște atunci când transportă sume mari.

Vom introduce o restricție legată de anumite servicii de livrare și de suma maximă a cecului. Pentru a face acest lucru, accesați interfața administrativă în fila „Restricții”, pentru o anumită metodă de plată:

În acest caz, va trebui să efectuați două sisteme de plată în numerar:

  • într-una vom limita utilizarea pentru punctul de ridicare, dar fără restricții de preț,
  • iar in al doilea ne vom limita la servicii de curierat si adaugam o limita la suma.
Mai întâi, să stabilim o limită de preț:

Acum restricții de livrare:

Ca rezultat, obținem următoarele:

Să verificăm executarea unei comenzi cu mărfuri în valoare mai mică de 10.000 de ruble și livrarea prin curier:

Totul este în regulă, plata necesară este acolo, comanda poate fi plasată.

Să verificăm cu mărfuri în valoare de peste 10.000 de ruble:

Super, nu exista plata cash, puteti plasa o comanda cu plata in alte moduri, fara a risca curieri si bani.

Când sunt introduse restricții, clienții nu văd metode de plată „interzise” și, prin urmare, nu se vor certa cu operatorii, care altfel ar trebui să explice constant de ce compania dumneavoastră nu va livra comanda plasată.

Servicii suplimentare de livrare

Ni s-a cerut adesea să oferim posibilitatea de a crea serviciile necesare în livrări. Acest lucru a fost implementat în noua platformă. Beneficiul serviciilor suplimentare este de a crește factura medie a comenzii.

Accesați setările de livrare:

În interfață a apărut o filă separată cu servicii suplimentare care vor fi afișate în blocul de livrare. Sunt acceptate trei tipuri de servicii:

  • Lista serviciilor. Clientului i se cere să selecteze un articol dintr-o listă de servicii. În mod implicit, primul articol este selectat, deci dacă nu trebuie să creșteți prețul, atunci primul serviciu din listă ar trebui să fie cu un preț zero.

Serviciu cantitativ. Se creează un serviciu cu un preț pe unitate, iar clientul poate specifica câtă cantitate are nevoie.

Serviciu unic. Un serviciu independent, afișat ca casetă de selectare. Valoarea implicită nu este aplicată clientul trebuie să o selecteze în mod independent pe cea de care are nevoie.

Să vedem cum sunt configurate aceste reguli:

Setările pentru toate tipurile de servicii sunt foarte asemănătoare: există două blocuri care controlează elementele principale. În primul rând, trebuie să setați numele și descrierea serviciului. Apoi specificați cine poate folosi serviciul:

  • Manager - serviciul va fi afișat în interfața administrativă.
  • Client - serviciul va fi afișat în timpul comenzii în partea publică a site-ului.
Iată cum arată adăugarea unui serviciu în interfața administrativă atunci când creați o comandă sau faceți modificări:

„Introducere de date cu caracter personal” dinamic

Livrările au fost finalizate, acum puteți trece la unul dintre cele mai importante elemente în plasarea unei comenzi - solicitarea datelor de la utilizator pentru livrare sau expediere. În componenta anterioară, clientului i s-a solicitat același set de câmpuri. A trebuit să aleagă ce câmpuri să completeze, ceea ce era oarecum incomod.

Noua componentă de plată poate solicita diferite seturi de câmpuri. De cele mai multe ori, proprietarii magazinelor reduc cantitatea de informații care trebuie introduse în timpul ridicării. Poate că în acest caz va fi suficient să știm:

  • Telefon.
  • E-mail. Acest articol poate fi, de asemenea, eliminat, dar uneori doriți să „răsfățați” clientul cu buletine informative despre produse noi.
Să mergem la secțiunea administrativă „Proprietăți de comandă” -> „Lista de proprietăți” și să selectăm proprietatea adresei de schimbat:

Vom lega doar acele „Servicii de livrare” care ar trebui să afișeze acest câmp. Apoi mergem la secțiunea publică și încercăm să plasăm o comandă. Alegem ridicarea si vedem ca magazinul nu ne cere adresa de livrare.

Aceasta este o funcționalitate utilă și binevenită. La urma urmei, trebuie să recunoști că nu este foarte plăcut să răspunzi la întrebările clienților: „De ce ai nevoie de adresa mea dacă voi ridica singur comanda?” Acum nu trebuie să faci asta.

Punct de ridicare a comenzii

În cele din urmă, aș dori să vorbesc despre modificările din blocul de selecție „Puncte de ridicare a comenzilor”. În versiunea anterioară, principalele plângeri au fost probleme cu afișarea unui număr mare de puncte de preluare, a unei hărți mici și lipsa selecției automate a unui punct de preluare (dacă era doar unul, de exemplu).

Noua versiune a componentei are setări adăugate pentru afișarea punctului de preluare a comenzii. Dacă este singurul din orice oraș, atunci arătăm imediat blocul prăbușit și afișăm toate datele sale cu o imagine sau arătăm blocul extins. În primul caz, pentru a afișa harta va trebui să intri în bloc, iar în al doilea, harta va fi afișată imediat.

Rezolvarea problemei ieșirii servicii de livrare automată ale magazinului online Bitrix v14 atunci când plasați o comandă pe Yandex.Market.

Despre asta vorbim, dar se dovedește că nu s-a făcut, funcționează doar serviciile personalizate, o reparăm astăzi.
Aici testez plasarea unei comenzi în panoul Yandex.Market; cumpărătorului i se va afișa același lucru atunci când plasează o comandă pe Yandex.Market.

Selectarea serviciilor automatizate

Mai întâi trebuie să adăugăm servicii de livrare automată la setările modulului Magazin onlineÎn capitolul Cumpărături pe piață

Deoarece implicit nu sunt acolo si nu vom mai putea actualiza modulul magazinului online, editez direct in modul, pentru ca... în cazul meu, dacă actualizați magazinul, atunci totul va înceta să funcționeze pentru client, ceea ce în cazul dvs. nu știu ce să fac, gândiți-vă, în noul magazin Bitrix v16 poate nici asta nu va funcționa.

Setările sunt specificate în pagina administrativă din fișier
/bitrix/modules/sale/admin/ymarket.php

Serviciile personalizate sunt disponibile Ridica, iar mai jos am afisat servicii de livrare automata, toate au o valoare de exemplu Poștă, in cazul meu a fost nevoie doar de mail, daca ai nevoie de altceva nu va fi greu de modificat, pentru ca principiul va fi clar unde și ce trebuie făcut, dar toate serviciile automate vor fi afișate, poate că vor funcționa, pur și simplu nu l-am verificat.

Așadar, găsim unde în fișier se formează matricea de servicii personalizate $arDeliveryList și îi adăugăm altele automate

$arDeliveryFilter = matrice(
„LID” => $arTab[„SITE_ID”],
„ACTIV” => „D”
);

//LIVRARE STATICĂ
$dbDeliveryList = CSaleDelivery::GetList(
array("NAME" => "ASC"),
$arDeliveryFilter,
fals,
fals,
matrice ("ID", "NUME")
);

$arDeliveryList=array();
while ($arDelivery = $dbDeliveryList->Fetch())
$arDeliveryList[$arDelivery["ID"]] = $arDelivery["NAME"];

//LIVRARE AUTOMATĂ
$dbRes = CSaleDeliveryHandler::GetList(
array("NAME" => "ASC"),
$arDeliveryFilter
);
while($livrare = $dbRes->Fetch())
{
$deliveryId = ($livrare[„ID”] ? $delivery[„ID”] : $livrare[„SID”]);
$arDeliveryList[ $deliveryId ] = $delivery["NUME"];
}


Apoi, găsim blocul de ieșire de livrare și adăugăm o opțiune pentru e-mail la listă, în cazul meu, a fost comentat, cel mai probabil veți avea același lucru.

Așa arată selecția finală, care afișează serviciile de livrare în panoul de administrare

$deliveryName):
$selected = isset($siteSetts[„LIVRĂRI”][$deliveryId]) ? $siteSetts[„LIVRĂRI”][$deliveryId] : „”;
?>


Totul se face cu setările, nu mai rămâne decât să finalizezi scriptul la care ajung solicitări de la Yandex.Market, el spune pieței ce livrări să arate cumpărătorului atunci când plasați o comandă pe Yandex.Market.

Solicitări Yandex.Market

Toate solicitările de la Yandex.Market către Bitrix vin mai întâi la acest fișier, acesta conține doar conexiunea unui alt fișier
/bitrix/services/ymarket/index.php

În acel fișier, API-ul Bitrix în sine este conectat pentru interacțiunea Yandex.Market cu magazinul dvs. online
/bitrix/modules/sale/services/ymarket/index.php

În acest fișier ne interesează metoda care merge mai departe la fișierul de care avem nevoie pentru modificări, nu modificăm nimic în acest
$rezultat = $YMHandler->processRequest($requestObject, $method, $postData);

Și aici este fișierul nostru, în care toată logica interacțiunii dintre Bitrix și Yandex.Market funcționează cu el
/bitrix/modules/sale/general/ym_handler.php

Nu am scris articolul imediat, funcționalitatea a fost testată de ceva timp și erorile au fost corectate, chiar dacă am uitat să spun ceva, am atașat fișierele, vă puteți da seama.

În general, dacă nu ați făcut nicio modificare la acest fișier pe site-ul dvs. înainte, puteți încerca întreg fișierul meu, cu excepția livrărilor, nimic nu s-a schimbat în el, totul funcționează.

Deci care au fost schimbările?în clasa CSaleYMHandler
1) A fost adăugată o variabilă care va stoca informații complete despre articolele din coș pentru calcularea livrării prin servicii de livrare automată.
protejate $basketItems = array();

2) S-a schimbat metoda care ascultă coșul de pe piață, primește informații despre mărfuri (cos) și returnează servicii de livrare și metode de plată
funcția protejată processCartRequest($arPostData)

3) S-a schimbat metoda care primeste informatii despre marfa aflata in cos de pe piata (id, pret, cantitate, greutate, dimensiuni etc.).
funcția protejată getItemCartInfo($arItem, $currency)

4) S-a schimbat metoda, care primește informații despre locația cumpărătorului, serviciile de livrare disponibile prin filtru, calculează livrarea și o arată cumpărătorului pe piață.
funcția protejată getDeliveryOptions($livrare, $preț, $greutate = 0, $arBasketItems = matrice())

Aici, în această metodă sunt calculate serviciile de livrare Bitrix personalizabile și automatizate.

Fiți atenți aici!

În cazul meu, magazinul este situat în Moscova și pentru Moscova toate serviciile de livrare automată sunt dezactivate, pentru un cumpărător din Moscova nu ar trebui să fie afișate, ridicarea și livrarea prin curier funcționează acolo, această condiție este în cod (pag. 432):
if($locationTo == 2691) continua;

5) Metoda care adaugă o comandă pe site-ul dvs., spune pieței „Totul este în regulă” și returnează numărul lui Yandex.Market a fost schimbat
funcția protejată processOrderAcceptRequest($arPostData)

Mai exact, linia 911, în ea găsim Număr de ordine, este fie Comanda ID, sau Codul de comanda cu numerotarea comenzii activată folosind un șablon
$arResult["order"]["id"] = $this->getOrderNumber($orderID);

6) S-a adăugat o metodă care va returna numărul comenzii de pe site-ul dvs. la Yandex.Market (ID de comandă sau cod de comandă)
funcția protejată getOrderNumber($orderId)

În plus

Mai multe pe site încărcate locații 2.0, am făcut asta în 2015, îmi amintesc că a fost o problemă cu Yandex.Market, Bitrix a căutat locații incorect și Yandex.Market a raportat o eroare, nu-mi amintesc unde am făcut-o, am adăugat fișierul ym_location.php la arhiva în caz că dacă o găsiți, vă rog să-mi spuneți, voi adăuga acest punct la articol.

Concluzie

Când plasați o comandă pe Yandex.Market, cumpărătorul va vedea o listă de livrări în acest formular;

Fișierele folosite în articol sunt toate împărțite în foldere, unde va fi ușor să găsiți ce fișier.

Procesoarele automate pentru servicii de livrare vă permit să implementați în mod programatic o logică arbitrară pentru calcularea costurilor de livrare pe baza parametrilor comenzii și a propriilor setări. Algoritmii de calcul pot fi arbitrari - cost fix, solicitări către servicii web la distanță, calcul pe baza tabelelor de date proprii etc.

Un handler este o clasă sau un set de funcții cu următoarea structură:

Metodă Descriere
Descrierea manipulatorului O funcție care returnează o descriere a handlerului, numele metodelor, o listă de profiluri de handler etc.
Setări de manipulare O funcție care returnează o serie de setări ale handlerului
Setări de procesare Un set de funcții responsabile cu pregătirea setărilor pentru intrarea în baza de date și conversia inversă.
Verificare compatibilitate O metodă care verifică compatibilitatea profilurilor unui anumit procesor cu o comandă.
Funcția de calcul O metodă care calculează costurile de livrare pe baza setărilor procesorului și a parametrilor comenzii.

Deoarece lucrul cu un set de funcții individuale este incomod, se recomandă să le combinați într-o clasă (spațiu de nume). Pe baza acestei recomandări, va urma o descriere ulterioară și va fi implementat exemplul dat. În exemplu, handlerul „Livrare prin curier” este implementat ca o clasă CDeliveryMySimple.

Descrierea manipulatorului

Descrierea handlerului este o metodă care returnează o matrice asociativă cu următoarea structură:

Parametru Descriere
SID Identificatorul unic de șir al handlerului.
NUME Numele handlerului.
DESCRIERE Descrierea text a handlerului
DESCRIPTION_INNER Descrierea internă a handler-ului, afișată la configurarea handler-ului în Panoul de control.
BASE_CURRENCY ID-ul monedei de bază a operatorului
MANIPUL Calea către fișierul handler. Necesar pentru copierea automată corectă a handler-ului (nu este încă implementat). În marea majoritate a cazurilor, valoarea __FILE__ este suficientă
GETCONFIG Numele metodei care returnează o serie de setări ale validatorului. Dacă handler-ul este implementat ca o clasă, valoarea este o matrice ("class_name", "method_name").
DBSETĂRI Numele metodei responsabile pentru verificarea setărilor handlerului și conversia matricei de setări într-un șir pentru salvare. Dacă handler-ul este implementat ca o clasă, valoarea este o matrice ("class_name", "method_name"). Dacă această metodă este absentă, matricea de setări va fi salvată în baza de date în formă serializată.
DBGETSETTINGS Numele metodei responsabile pentru convertirea șirului de setări ale handlerului înapoi într-o matrice. Dacă handler-ul este implementat ca o clasă, valoarea este o matrice ("class_name", "method_name").
COMPATIBILITATE Numele metodei responsabilă pentru verificarea suplimentară a compatibilității profilurilor de procesare cu parametrii de comandă. Dacă metoda lipsește, nu se va efectua nicio verificare suplimentară. Dacă handler-ul este implementat ca o clasă, valoarea este o matrice ("class_name", "method_name").
CALCULATOR Numele metodei care calculează costurile de transport. Dacă handler-ul este implementat ca o clasă, valoarea este o matrice ("class_name", "method_name").
PROFILE Gamă de profiluri de procesare. Trebuie să conțină cel puțin un profil. Vezi mai jos formatul de descriere.

Descrierea profilului este o matrice cu următorul format:

"string_profile_identifier" => matrice ("TITLE" => " Numele profilului", "DESCRIPTION" => " profile_description", // greutățile sunt indicate în grame "RESTRICTIONS_WEIGHT" => matrice( greutate_minimă, Limită de greutate), // sumele sunt indicate în moneda de bază a handler-ului „RESTRICTIONS_SUM” => array( sumă_comandă_minimă, sumă_maximală_comandă));

Dacă matricea RESTRICTIONS_WEIGHT sau RESTRICTIONS_SUM conține un element, atunci acesta este considerat valoarea minimă. Dacă nu sunt necesare restricții, trebuie specificată matricea(0).

Funcția Init() ( return array(/* Descriere de bază */ "SID" => "simplu", "NAME" => "Livrare prin curier", "DESCRIPTION" => "", "DESCRIPTION_INNER" =>
" .", "BASE_CURRENCY" => COption::GetOptionString("sale", "default_currency", "RUB"), "HANDLER" => __FILE__, /* Metode de gestionare */ "DBGETSETTINGS" => array(" CDeliveryMySimple" , "GetSettings"), "DBSETSETTINGS" => array("CDeliveryMySimple", "SetSettings"), "GETCONFIG" => array("CDeliveryMySimple", "GetConfig"), "COMPABILITY" => array("CDeliveryMySimple" , " Compatibilitate"), "CALCULATOR" => array("CDeliveryMySimple", "Calculate"), /* Lista profilurilor de livrare */ "PROFILES" => array("simple" => array("TITLE" => "livrare" , "DESCRIPTION" => "Timp de livrare până la 3 zile", "RESTRICTIONS_WEIGHT" => array(0), "RESTRICTIONS_SUM" => array(0),),));

Parametrii validatorului

Metoda specificată de elementul GETCONFIG trebuie să returneze o matrice de elemente de forma:

Array("CONFIG_GROUPS" => matrice(" grup_id1" => "nume_grup1", "grup_id2" => "nume_grup2", /* ..................... */), "CONFIG" => matrice (" parameter_identifier1" => matrice ("TITLE" => " nume_parametru1", "TYPE" => " tip_parametru1", "DEFAULT" => " valoarea_default a parametrului1", "GROUP" => " parameter_group_identifier1", "VALORI" => matrice(" parametru_valoare1" => "nume_valoare1_parametru1", "valoare2_parametru1" => "nume_valoare2_parametru1", /* ....................... */)), /* ........................ */))

Grupurile de parametri descrise într-un element de matrice cu tasta „CONFIG_GROUPS” sunt afișate ca file separate în formularul pentru editarea parametrilor de gestionare care conțin parametrii alocați acestui grup. Un element de matrice cu tasta „CONFIG” specifică o listă de parametri. Tipul de parametru poate lua una dintre următoarele valori:

  • ŞIR- câmp de introducere a textului
  • PAROLA- câmp de introducere a parolei
  • CASETA DE BIFAT- un element de tip „checkbox” cu valoarea „Y”
  • RADIO
  • SCAPĂ JOS- un set de opțiuni sub forma unei liste derulante
  • SELECTARE MULTIPLA- un set de opțiuni sub forma unei liste cu variante multiple
  • RADIO- un set de opțiuni sub formă de butoane radio

Pentru tipurile de parametri, implicând o alegere dintre mai multe opțiuni de valoare ( SCAPĂ JOS, SELECTARE MULTIPLAȘi RADIO) lista de valori este specificată de un element al matricei descriptive cu cheia „VALORI”. Pentru alte tipuri de parametri, acest element este ignorat.

Funcția GetConfig() ( $arConfig = array("CONFIG_GROUPS" => array("all" => "Costul de livrare",), "CONFIG" => array(),); // parametrii de gestionare în acest caz sunt valori de cost livrare la diferite grupuri de locații // pentru aceasta vom crea o listă de parametri bazată pe lista de grupuri $dbLocationGroups = CSaleLocationGroup::GetList($arLocationGroup = $dbLocationGroups->Fetch()) ( $arConfig[); "CONFIG"][" price_".$arLocationGroup["ID"]] = array("TYPE" => "STRING", "DEFAULT" => "", "TITLE" => "Costul de livrare la grupul "\" " .$arLocationGroup[" NAME "]."\" " .(".COption::GetOptionString("sale", "default_currency", "RUB").")", "GROUP" => "toate",) ) return $arConfig;

Parametrii de procesare

Manipularea parametrilor handler necesită două metode, specificate în descriere prin parametrii DBSETSETTINGS și DBGETSETTINGS. Primul dintre ele primește ca intrare o matrice de valori ale parametrilor de forma „ parameter_identifier" => "valoare_parametru" și ar trebui să returneze reprezentarea șirului lor. Al doilea este de a face conversia inversă. Ambele metode pot efectua și manipulări arbitrare cu valorile parametrilor.

Funcția SetSettings($arSettings) ( // Verificați lista valorilor. Îndepărtați valorile goale din listă. foreach ($arSettings ca $key => $value) ( ​​​​if (strlen($value) > 0) $arSettings[$key] = doubleval($value); else unset($arSettings[$key]) // returnează valorile ca o matrice serializată // în cazul unei liste mai simple de setări pot fi folosite funcția GetSettings($strSettings) ( // returnează matricea deserializată de setări return unserialize($strSettings); )

Verificare compatibilitate

Compatibilitatea profilurilor procesorului cu comanda este verificată folosind metoda specificată în descriere prin parametrul „COMPABILITATE”. Această metodă ia 2 parametri ca intrare - o matrice descriptivă a comenzii și o matrice de setări ale handlerului. Răspunsul metodei așteaptă o matrice care să conțină identificatori ai profilurilor de livrare adecvate pentru o anumită comandă. Verificarea specificată de valorile „RESTRICTIONS_WEIGHT” și „RESTRICTIONS_SUM” din setările profilului este efectuată în afara handlerului și nu este necesară aici. Formatul datelor acceptate ca intrare este următorul:

Primul parametru - informații de comandă - este o matrice cu următoarele chei:

Al doilea parametru este valoarea matricei specificate de elementul cu tasta „CONFIG” din handler, fiecărui element căruia i se adaugă valoarea parametrului cu cheia „VALUE” .

În exemplul pe care îl luăm în considerare, singura condiție de compatibilitate este prezența în setările handlerului a unei valori de cost de livrare pentru cel puțin unul dintre grupurile de locații care include locația transmisă în comandă.

// introduce o metodă de utilitate care definește un grup de locații și returnează costul pentru acel grup. funcția __GetLocationPrice($LOCATION_ID, $arConfig) ( // obține o listă de grupuri pentru locația transmisă $dbLocationGroups = CSaleLocationGroup::GetLocationList(array("LOCATION_ID" => $LOCATION_ID)); while ($arLocationGroup = $dbLocationGroups->Fetch()) { if (array_key_exists("price_".$arLocationGroup["LOCATION_GROUP_ID"], $arConfig) && strlen($arConfig["price_".$arLocationGroup["LOCATION_GROUP_ID"]]["VALUE"] > 0)) { // если есть непустая запись в массиве настроек для данной группы, вернем ее значение return $arConfig["price_".$arLocationGroup["LOCATION_GROUP_ID"]]["VALUE"]; } } // если не найдено подходящих записей, вернем false return false; } // метод проверки совместимости в данном случае практически аналогичен рассчету стоимости function Compability($arOrder, $arConfig) { // проверим наличие стоимости доставки $price = CDeliveryMySimple::__GetLocationPrice($arOrder["LOCATION_TO"], $arConfig); if ($price === false) return array(); // если стоимость не найдено, вернем пустой массив - не подходит ни один профиль else return array("simple"); // в противном случае вернем массив, содержащий идентфиикатор единственного профиля доставки } !}

Handler

Principala metodă de calcul a costurilor de livrare primește următorii parametri de intrare:

  • identificatorul profilului de livrare;
  • matrice de setări de gestionare a livrării;
  • comandă matrice descriptivă;
  • pasul curent de calcul;
  • date temporare transferate de la pasul de calcul anterior.

Ieșirea operatorului ar trebui să fie costul de livrare în moneda specificată în parametri sau o matrice cu următoarea structură:

Cheie Descriere
REZULTAT ID de răspuns. Valori posibile:
  • "Bine" - costul de livrare a fost calculat cu succes;
  • "EROARE" - a apărut o eroare în timpul procesului de calcul;
  • "URMATORUL PAS" - trebuie să treceți la pasul următor pentru a continua calculul.
VALOARE Valoarea costului de livrare în moneda specificată în parametri. (REZULTAT = „OK”)
TRANZIT Durata de livrare în zile (REZULTAT = „OK”). Dacă lipsește, durata nu este afișată.
perioadaDe la Linii de livrare a serviciilor de livrare automate. Din numărul specificat de zile. Necesar pentru transmiterea timpilor de livrare către Yandex.market. Folosit la dezvoltarea propriilor servicii de livrare.
perioadaTo Linii de livrare a serviciilor de livrare automate. Până la numărul specificat de zile. Necesar pentru transmiterea timpilor de livrare către Yandex.market. Folosit la dezvoltarea propriilor servicii de livrare.
TEXT Text de eroare sau text care însoțește tranziția la pasul următor (RESULT = ("EROARE"|"NEXT_STEP")).
TEMP Un șir care conține date intermediare a trecut la pasul următor (RESULT = „NEXT_STEP”).

În exemplul pe care îl descriem, un proces în mai multe etape nu este implicat, prin urmare calculul este simplu.

Funcția Calculate($profil, $arConfig, $arOrder, $STEP, $TEMP = false) ( // metoda de calcul utilitar este definită mai sus, trebuie doar să redirecționăm valoarea pe care o returnează la ieșire. return array("RESULT" => "OK", "VALUE" => CDeliveryMySimple::__GetLocationPrice($arOrder["LOCATION_TO"], $arConfig) )

Integrarea Handler

Calea către fișierele de gestionare conectate automat este setată în setările modulului „Magazin online”. Calea implicită este /bitrix/php_interface/include/sale_delivery/ Astfel de fișiere trebuie să aibă un prefix livrare_, altfel vor fi ignorate. Dacă sistemul detectează un fișier care are același nume cu cel de sistem, acesta va fi conectat în locul celui de sistem. Activarea livrării automate într-un fișier se face prin setarea metodei descriptive ca handler pentru evenimentul onSaleDeliveryHandlersBuildList.

Exemplu

Rezumând toate cele de mai sus, să creăm un simplu handler de livrare. Clasa de gestionare va fi localizată în fișierul /bitrix/php_interface/include/sale_delivery/delivery_mysimple.php

"simple", "NAME" => "Livrare prin curier", "DESCRIPTION" => "", "DESCRIPTION_INNER" => "Un simplu handler pentru livrarea prin curier. Pentru a funcționa, " ." trebuie să fie prezent cel puțin un grup de locații . Când configurați operatorul, trebuie să specificați „ .cost fix de livrare pentru fiecare grup de locații. Pentru a preveni participarea unui „ .grup la procesare, lăsați necompletat câmpul de cost pentru acest grup”. "
" ."„ .Editați grupuri de locații” . .", "BASE_CURRENCY" => COption::GetOptionString("sale", "default_currency", "RUB"), "HANDLER" => __FILE__, /* Metode de gestionare */ "DBGETSETTINGS" => array("CDeliveryMySimple", "GetSettings"), "DBSETSETTINGS" => array("CDeliveryMySimple", "SetSettings"), "GETCONFIG" => array("CDeliveryMySimple", "GetConfig"), "COMPABILITY" => array("CDeliveryMySimple", "Compability" "), "CALCULATOR" => array("CDeliveryMySimple", "Calculate"), /* Lista profilurilor de livrare */ "PROFILES" => array("simple" => array("TITLE" => "livrare", " DESCRIPTION" => "Timp de livrare pana la 3 zile", "RESTRICTIONS_WEIGHT" => array(0), // fara restrictii "RESTRICTIONS_SUM" => array(0), // fara restrictii),) ) //); funcția de setări ale handlerului GetConfig() ( $arConfig = array("CONFIG_GROUPS" => array("all" => "Costul de livrare",), "CONFIG" => array(),); // setările handlerului în acest caz sunt livrarea valorilor de cost către diferite grupuri de locații // pentru aceasta vom crea o listă de setări bazată pe lista de grupuri $dbLocationGroups = CSaleLocationGroup::GetList(); while ($arLocationGroup = $dbLocationGroups->Fetch()) ( $arConfig["CONFIG"]["price_".$arLocationGroup["ID"]] = array("TYPE" => "STRING", "DEFAULT" = > "", "TITLE" => "Costul de livrare către grupul \"" .$arLocationGroup["NAME"].."\" " ."(".COption::GetOptionString("sale", "default_currency", " RUB ").")", "GROUP" => "toate",); ) return $arConfig; ) // pregătirea setărilor pentru intrarea în funcția de bază de date SetSettings($arSettings) ( // Verificați lista valorilor de cost. Eliminați valorile goale din listă. foreach ($arSettings ca $key => $value) ( ​​​​​if (strlen($value) > 0) $arSettings[$key] = doubleval($value else unset($arSettings[$key]) // returnează valorile ca o matrice serializată //; dintr-o listă mai simplă de setări, pot fi utilizate metode mai simple serialize return serialize($arSettings ) // pregătește setările obținute din funcția de bază de date GetSettings($strSettings) ( // returnează matricea deserializată return unserialize($). strSettings); // introduce o metodă de serviciu care determină grupul de locații și returnează valoarea pentru acest grup. funcția __GetLocationPrice($LOCATION_ID, $arConfig) ( // obține o listă de grupuri pentru locația transmisă $dbLocationGroups = CSaleLocationGroup::GetLocationList(array("LOCATION_ID" => $LOCATION_ID)); while ($arLocationGroup = $dbLocationGro) Fetch() ) (dacă (array_key_exists(„preț_”). $arLocationGroup["LOCATION_GROUP_ID"], $arConfig) && strlen($arConfig["price_".$arLocationGroup["LOCATION_GROUP_ID"]]["VALUE"] > 0)) ( // dacă există o intrare nevide în matricea de setări pentru acest grup, returnează valoarea acestuia return $arConfig["price_".$arLocationGroup["LOCATION_GROUP_ID"]]["VALUE"] ) ) // dacă nu sunt găsite înregistrări care se potrivesc, returnează false return false; ) // metoda de verificare a compatibilității în acest caz este aproape similară cu calcularea funcției de cost Compability($arOrder, $arConfig) ( // verificați prezența costurilor de livrare $price = CDeliveryMySimple::__GetLocationPrice($arOrder["LOCATION_TO) "], $arConfig); dacă ($preț === false) returnează matrice(); // dacă prețul nu este găsit, returnează o matrice goală - niciun profil nu se potrivește altfel returnează matrice ("simple"); // în caz contrar , returnează o matrice care conține identificatorul unui singur profil de livrare ) // de fapt, calculând funcția de cost Calculate($profil, $arConfig, $arOrder, $STEP, $TEMP = false) ( // este definită metoda de calcul al utilității. mai sus, trebuie doar să redirecționăm valoarea pe care o returnează la matricea returnată de ieșire(" RESULT" => "OK", "VALUE" => CDeliveryMySimple::__GetLocationPrice($arOrder["LOCATION_TO"], $arConfig)); ) ) // setați metoda CDeliveryMySimple::Init ca un handler de evenimente AddEventHandler("sale" , "onSaleDeliveryHandlersBuildList", array("CDeliveryMySimple", "Init")); ?>

Post factum

Câteva sfaturi finale:

  • Dacă procesorul dvs. utilizează calcule care consumă mult resurse, apeluri la baze de date, solicitări către servere la distanță etc., atunci categoric Este recomandat să folosiți una sau alta opțiune de cache a rezultatelor, implementată în așa fel încât rezultatele să fie memorate cel puțin pentru o comandă cu acești parametri. Acest lucru este necesar din cauza faptului că în timpul procesului de plasare și procesare a unei comenzi, poate apărea de mai multe ori o solicitare către procesator pentru a calcula costul comenzii. Handler-urile furnizate folosesc un mecanism de caching gestionat, configurat ținând cont de specificul algoritmului de calcul al costurilor unui anumit serviciu de livrare.
  • Pentru a personaliza gestionarea sistemului, copiați fișierul acestuia (împreună cu fișierele însoțitoare, aflate de obicei într-un director cu același nume) în directorul /bitrix/php_interface/include/sale_deivery/, păstrând numele. În acest caz se va conecta în loc de sistemică.

Modulul are funcționalitatea de a calcula automat costurile de livrare pe baza datelor despre produs și a adresei de livrare.

Pentru a calcula costul de livrare a trimiterilor poștale, se folosește serviciul postcalc.ru. Vă rugăm să rețineți că în modul gratuit acest serviciu are o limită a numărului de solicitări pe zi. În cazul în care aveți nevoie de mai mult de 500 de solicitări pe zi, trebuie să faceți upgrade la un plan plătit. Puteți obține informații detaliate despre condițiile de utilizare a serviciului postcalc.ru făcând clic pe link.


Pentru a adăuga serviciul de livrare Russian Post pe site-ul dvs. cu posibilitatea de a calcula automat costurile, urmați acești pași:
1. În panoul administrativ al site-ului dvs., accesați Administrare > Magazin > Setări > Servicii de livrare.

2. Pe pagina cu lista serviciilor de livrare, faceți clic pe butonul „Adăugați”. În lista derulantă care apare, selectați tipul - „Serviciul de livrare automată”.

3. În pagina pentru crearea unui nou serviciu de livrare care se deschide, accesați fila „Setări Handler”.
4. În câmpul „Serviciul de livrare”, selectați „Posta Rusă” din lista derulantă și salvați selecția făcând clic pe butonul „Aplicați”.

5. După salvarea serviciului de livrare creat, pe pagina de editare vor apărea file suplimentare:

  • Opțiuni
  • Profiluri
  • Restricții
Fila Opțiuni


Această filă conține următorii parametri:

  • Adaugă la preț - în acest câmp poți specifica cantitatea de markup suplimentar care va fi adăugată la costul de livrare.
  • Rotunjire la 10 - bifați această opțiune pentru a activa rotunjirea costurilor de expediere.
  • Afișează adresa de e-mail - dacă această opțiune este bifată, se va genera adresa oficiului poștal al destinatarului. Pe viitor, poate fi afișat pe pagina de comandă.
  • Afișare numere de telefon de e-mail - dacă opțiunea este activată, se va genera numărul de telefon al oficiului poștal la care va fi livrat articolul.

Când opțiunile „Afișează adresa de e-mail” și „Afișează numere de telefon de e-mail” sunt bifate, va fi generată variabila $arResult["RESULT"]["TEXT"]. Puteți afișa aceste informații în partea publică inserând codul "echo $arResult["RESULT"]["TEXT"];" în șablonul de componentă pe care îl utilizați pentru a afișa informațiile despre costurile de expediere.


Fila Profiluri




Această filă conține profiluri de module preinstalate „Poșta Rusă/EMS - calcul și urmărire”. Aveți acces la întregul set de acțiuni standard privind profilurile serviciului de livrare: Copiere, Editare, Ștergere. Acțiunile sunt disponibile din meniul de acțiuni individuale al intrărilor din lista de profil. Această funcționalitate este standard în sistemul Bitrix. Puteți obține informații mai detaliate pe pagina corespunzătoare a documentației sistemului Bitrix.

Fila „Restricții”.




Această filă conține setări pentru funcționalitatea standard Bitrix, care vă permite să introduceți restricții privind utilizarea unui serviciu de livrare personalizat.

Vă rugăm să rețineți că pentru calcularea corectă a costului transporturilor folosind serviciul postcalc.ru, este necesar să transmiteți date privind greutatea și valoarea estimată a mărfurilor incluse în transport. Asigurați-vă în panoul de administrare al site-ului dvs. că aceste date sunt introduse corect pentru produsele din catalog. De asemenea, pentru calcule, sunt necesare informații despre adresa de livrare a articolului, precum și adresa expeditorului. Informațiile despre expeditor sunt introduse în interfața administrativă a magazinului dvs. la Administrare - Setări - Setări modul - Magazin online. Apoi, pe pagina cu setările magazinului, accesați fila „Adresa magazinului”. Pentru a calcula corect costul transporturilor, completați câmpul „Index”.



Sunt posibile următoarele opțiuni pentru obținerea de informații despre adresa de livrare:

  • Din câmpul „Index” din formularul de înregistrare – opțiunea recomandată.
  • Din proprietatea orașului obținută din câmpul Locație din formularul de finalizare a comenzii
  • Din proprietatea „Cod poștal” obținut din câmpul „Locație” din formularul de finalizare a comenzii - dacă această proprietate este populată pentru locație.

Vă recomandăm să furnizați un câmp separat, obligatoriu „Index” în formularul de comandă. În acest caz, cumpărătorul va trebui să indice în mod explicit codul poștal la care se solicită expedierea, ceea ce va evita eventualele erori la calcularea costului expedierii.