Adesea apare o situație în care este necesară extinderea funcționalității metodei emarket basket(), care este responsabilă pentru adăugarea mărfurilor în coș. În versiunea de sistem 2.8.4.3 și mai mică în metodă coş Evenimentul pentru personalizarea acestei acțiuni nu a fost încă înregistrat, așa că pentru a rezolva problema din exemplul nostru, vom muta metoda coș într-un fișier personalizat.

Sarcină: La adăugarea unui produs în coș, este necesar să se permită cumpărătorului să lase un mic comentariu asupra produsului pe care îl va adăuga în coș; acest comentariu trebuie văzut și în partea administrativă la vizualizarea parametrilor comenzii. De asemenea, vom adăuga funcționalități noii noastre metode care vă vor permite să creșteți sau să micșorați cantitatea oricărui element de comandă cu unul.

Soluţie: Să copiem codul metodei coș din fișier __cumpărare.php, la dosar clase/module/emarket/__custom.phpși redenumiți metoda în coș_personalizat. În noua metodă, linia:

$comanda = self::getBasketOrder(! in_array($mod, array("pune", "elimina")));

trebuie schimbat in:

$comanda = $this -> getBasketOrder (! in_array ($mod , array ( "put" , "remove" )));

După linie:

if ($itemType == „element” ) (

$orderItem -> dop_info = htmlspecialchars(getRequest("dop_info" ));

acest cod va adăuga valoarea transmisă din câmp la elementul de comandă dop_info.

Pentru a configura funcționalitatea de creștere sau scădere a cantității oricărui element de comandă, trebuie să:

dupa linie:

$options = getRequest("opțiuni");

adăuga:

$mode_change = (int) getRequest("schimbare_articol");

și, de asemenea, după rând:

$amount = $amount ? $amount : ($orderItem -> getAmount() + 1 );

adăuga:

if ($mode_change ) $amount = ($mode_change == 1 ) ? $orderItem -> getAmount () + 1 : $orderItem -> getAmount () - 1 ;

Dacă folosim exemplul motorului de șablon TPL, atunci când este utilizat într-un șablon tpls/emarket/default.tpl, în bloc articol_comandă, linkuri:

+ -

la care puteți atașa butoane, puteți crește sau micșora cantitatea oricărui articol de comandă cu unul.

array("cos_personalizat" )); ?>

În șabloanele de site, trebuie creat un formular pentru adăugarea unui produs în coș, o acțiune de formular, standard, cu excepția faptului că în locul metodei coș trebuie să specificați basket_custom. De asemenea, trebuie să adăugați intrare în formularul în sine:

< input name = "dop_info" style = "width: 100px;" type = "text" />

În partea administrativă, în modul Șabloane de date trebuie să deschideți tipul de date pentru editare Ordin, obțineți reprezentarea sa xml adăugând la sfârșitul barei de adrese a browserului: .xml

Datele primite vor conține aproximativ următorul bloc:

„Nume de comandă” field-type-id= "12" visible= "vizibil" ghid-id= "73" > „Lista derulantă cu opțiuni multiple” tip-date= „relație” multiplu= „multiplu” />

in care ghid-id="73", apoi deschideți tipul de date cu type_id = 73 pentru editare, folosind linkul /admin/data/type_edit/73/. În grupul „Proprietăți nume”, adăugați un alt câmp de tip String, cu un identificator de șir dop_info. Pentru a afișa valoarea salvată, la vizualizarea în detaliu a comenzii, vom realoca unele șabloane din fișier \styles\skins\mac\data\modules\emarket\order-edit.xsl, pentru a fi mai precis, vom adăuga la numele elementului de comandă, ieșind valoarea din câmpul dop_info. Pentru a implementa această parte a comenzii, adăugați fișierul: \styles\skins\mac\data\modules\emarket\form.modify.custom.xsl cu urmatorul continut:

„http://www.w3.org/1999/XSL/Transform” xmlns:xlink= "http://www.w3.org/TR/xlink" >
"obiect" mode= "nume-articol-comanda" > „($lang-prefix)/admin/catalog/edit/(//property/value/page/@id)/”>
„//proprietate[@name = „dop_info”]/value” />

După finalizarea tuturor acțiunilor descrise, atunci când cumpărătorul adaugă un articol de comandă, poate indica un scurt comentariu asupra produsului adăugat, iar administratorul magazinului, la vizualizarea în detaliu a comenzii, va putea citi acest comentariu.

De fapt, întrebarea este despre implementarea magazinului și cum îl voi evalua.

În primul rând, să ne uităm la un magazin real, cum funcționează, ce funcții sunt implementate acolo și costul acestuia.

Și astfel un magazin online pe Bitrix poate fi implementat în 2 ediții: afaceri mici și afaceri.

Care este principala diferență pentru magazin?

1. Nu există modul de publicitate - fezabilitatea acestui modul poate fi pusă la îndoială, poate fi implementat pe blocuri de informații și va funcționa rapid și bine, iar modulul în sine este greu, în unele cazuri nu este deloc recomandabil

2. Modulul magazin online în sine este diferit prin faptul că în afaceri nu există restricții privind numărul de prețuri pentru mărfuri și nu există seturi sau kituri; într-o afacere mică există un singur depozit, nu există afiliați (întrebarea este discutabil dacă este necesar în cele mai multe cazuri) și nu poți vinde conținut electronic, în rest funcționează la fel în redacțiile magazinelor.

Ce avem, Bitrix este complet integrat cu 1C, afacerile mici sunt bune dacă nu există depozite și prețuri diferite, de exemplu, en-gros și pentru mărfuri. Business este un magazin cu dinți de monstru care este gata pentru orice întreprindere.

Iar prețul: 9.000 și 19.000 este o diferență notabilă.

Începutul costă 1.400 i.e. de fapt, adăugările rămase sunt 7.600, respectiv 17.600.

În medie, la bursa de muncă, munca unui programator PHP este de 5-10 USD pe oră, adică. 130 UAH - 260 UAH. 58 și, respectiv, 29 de ore, adică cu program normal de lucru pe zi 4-7 zile. Este real?

Să ne dăm seama ce trebuie implementat mai întâi.

1. Catalog de produse

2. Cărucior

2.1. Reduceri

3. Plasarea unei comenzi

3.1. Metode de plata

3.2. metode de livrare

Ei bine, să simplificăm mai întâi:

Bitrix începe

Orice dezvoltare adecvată în Bitrix începe cu un modul separat în care totul va fi stocat și nu va interfera cu orice altceva.

Dezvoltarea unui modul de magazin online începe cu un „modul gol” standard

creați un folder localîn rădăcina site-ului și creați un folder în el module/NAMESPACE in cazul meu va fi asta binliz.sale pentru ca Bitrix să determine că acesta este un modul, trebuie să creați câteva foldere și fișiere, toate acestea sunt scrise în cursul Bitrix, dar voi scrie exact ceea ce fac

creați un folder instalare, fișiere install/index.php, include.php, options.php

/** * Utilizator: binliz */ folosește Bitrix\Main\Localization\Loc; Loc::loadMessages(__FILE__); if (class_exists("binliz_sale")) ( return; ) clasa binliz_sale extinde CModule ( public $MODULE_ID = "binliz.sale"; public $MODULE_VERSION = "0.1"; public $MODULE_VERSION_DATE = "2016-09-19"; public $ MODULE_NAME = "Modul de vânzare binliz"; public $MODULE_DESCRIPTION = "Modul magazin, utilizat pentru conectarea automată a claselor. Utilizează motorul D7."; public $MODULE_GROUP_RIGHTS = "N"; public $PARTNER_NAME = "binliz"; public $PARTNER_URI = "http: //site"; funcție publică DoInstall() ( global $APPLICATION; RegisterModule($this->MODULE_ID); ) funcție publică DoUninstall() ( global $APPLICATION; UnRegisterModule($this->MODULE_ID); ) )

Gata, hai sa mergem la Desktop > Piață > Soluții instalateși instalați modulul nostru, vom face acest lucru des, instalându-l și instalându-l astfel încât să știm cu siguranță că modulul nostru se va implementa din cutie.

Primul lucru pe care trebuie să-l facem este să organizăm capacitatea de a crea un director în panoul de administrare; pentru comoditate, o vom face în același mod ca și cu Bitrix, adică. Fără a inventa o nouă structură, vom adăuga propriile file cu catalogul comercial la elementele blocului de informații.

Cum să organizezi asta? Să încercăm mai întâi să creăm un tabel în care ne vom stoca blocurile de informații care vor deveni cataloage.

CREATE TABLE `b_binliz_sale_catalog` (`ID` int(11) NU NULL, `IBLOCK_ID` int(11) NU NULL, `OFFER_IBLOCK_ID` int(11) NU NULL, `IS_CATALOG` int(1) NU NULL, `IS_OFFERS` int (1) NOT NULL) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; ALTER TABLE `b_binliz_sale_catalog` ADĂUGAȚI CHEIA PRIMARĂ (`ID`), ADĂUGĂ CHEIA UNICA `IBLOCK_ID` (`IBLOCK_ID`), ADAUGĂ CHEIA UNICA `OFFER_IBLOCK_ID` (`OFFER_IBLOCK_ID`); ALTER TABLE `b_binliz_sale_catalog` MODIFY `ID` int(11) NOT NULL AUTO_INCREMENT;

Să creăm o reprezentare a acestui tabel în ORM, să creăm un folder lib și să punem fișierul în el salecatalog.php

Spațiu de nume Binliz\Sale; utilizați Bitrix\Main, Bitrix\Main\Localization\Loc; Loc::loadMessages(__FILE__); /** * Clasa SaleCatalogTable * * @pachet Binliz\Sale **/ clasa SaleCatalogTable extinde Main\Entity\DataManager ( /** * Returnează numele tabelului DB pentru entitate. * * @return string */ public static function getTableName() ( return "b_binliz_sale_catalog"; ) /** * Returnează definiția hărții entității. * * @return array */ funcție publică statică getMap() ( return array("ID" => array("data_type" => "intger", "primar" " => true, "autocomplete" => true, "title" => Loc::getMessage("SALE_CATALOG_ENTITY_ID_FIELD"), "IBLOCK_ID" => array("data_type" => "integer", "required" => true, "title" => Loc::getMessage("SALE_CATALOG_ENTITY_IBLOCK_ID_FIELD"), "OFFER_IBLOCK_ID" => array("data_type" => "integer", "required" => true, "title" => Loc:: getMessage("SALE_CATALOG_ENTITY_OFFER_IBLOCK_ID_FIELD"), "IS_CATALOG" => array("data_type" => "integer", "required" => true, "title" => Loc::getMessage("SALE_CATALOG_ENTITY_IS_CATALOG_FIELD"),", " IS_OFFERS" => array("data_type" => "intger", "required" => true, "title" => Loc::getMessage ("SALE_CATALOG_ENTITY_IS_OFFERS_FIELD"),),); ) )

Și puteți, în principiu, să puneți localizare lang/ru/lib/salediscount.php

$MESS["SALE_CATALOG_ENTITY_ID_FIELD"] = ""; $MESS["SALE_CATALOG_ENTITY_IBLOCK_ID_FIELD"] = ""; $MESS["SALE_CATALOG_ENTITY_OFFER_IBLOCK_ID_FIELD"] = ""; $MESS["SALE_CATALOG_ENTITY_IS_CATALOG_FIELD"] = ""; $MESS["SALE_CATALOG_ENTITY_IS_OFFERS_FIELD"] = "";

pana acum nu am redefinit nimic, doar am pus fisierul, placa este creata, e timpul sa creez o fila si sa ii dam metode de lucru cu el, de cand avem Bitrix, are un sistem de evenimente, cel mai bun si corect modalitatea este să organizăm cursuri care vor fi atașate chiar acestor evenimente și să ne rezolvăm problemele, pentru asta am preferat să mă ghidez după principiul unei clase, a unei singure soluții și a constructorului însuși care definește de ce ne agățăm. În primul rând, vom rezolva problema identificării directoarelor. Pentru a face acest lucru, trebuie să creăm o filă în secțiunea de editare a blocului de informații în care va fi bifa noastră că acesta este un catalog și deocamdată acest lucru va fi suficient, nu ne vom deranja cu ofertele comerciale până când nu vom putea face acest lucru. asta mai tarziu. Să creăm o clasă abstractă pentru evenimente în care vom crea o matrice care transmite următoarele date:

modulul de care ne agățăm, evenimentul și metoda clasei care este responsabilă pentru acesta. Pentru a face acest lucru, creați un folder de evenimente în folderul lib și puneți acolo evenimentele noastre. Și așa o clasă abstractă.

Spațiul de nume Binliz\Sale\Events; clasă abstractă Base (protejat $eventlist = ; funcția finală publică __construct())( $eventManager = \Bitrix\Main\EventManager::getInstance(); foreach($this->eventlist ca $event)( $eventMethods = get_called_class() . "::".$event["metodă"]; $eventManager->addEventHandler($event["modul"],$event["eveniment"],$eventMethods); ) ) )

Și o clasă pentru lucrul cu infoblocul:

Spațiul de nume Binliz\Sale\Events; clasa SaleCatalogIblockEdit extinde Base( protected $eventlist = [ ["module"=>"main","event"=>"onAdminTabControlBegin","method"=>"onAdminTabControlBegin"], ["module"=>"iblock"," eveniment"=>"onAfterIblockAdd","metoda"=>"onAdminIblock"], ["module"=>"iblock","event"=>"onAfterIblockUpdate","metoda"=>"onAdminIblock"], ["modul "=>"iblock","event"=>"OnIBlockDelete","metoda"=>"onAdminIblockDelete"], ]; funcție publică statică getApp())( $application = \Bitrix\Main\Application::getInstance() ; $context = $application->getContext(); $request = $context->getRequest(); $uri = $request->getRequestedPage(); return array("application"=>$application,"context"=> $ context,"request"=>$request,"uri"=>$uri); ) funcție publică onAdminTabControlBegin(&$form)( $ells = self::getApp(); if($ells["uri"] = = "/bitrix/admin/iblock_edit.php") ( if($ells["request"]->getQuery("ID")>0) $results = \Binliz\Sale\SaleCatalogTable::GetByIblock($ells[" cerere "]->getQuery("ID")); ob_start(); include(__DIR__."/templates/iblock_edit.php"); $str = ob_get_contents(); ob_end_clean(); $form->tabs = array("DIV" => "BINLIZ_SALE_CATALOG", "TAB" => "Catalog comercial Binliz.Sale", "ICON" => "main_user_edit", "TITLE" => "Catalog de setări", " CONȚINUT" =>$str); ) ) funcția publică onAdminIblock($arFields)( $ells = self::getApp(); file_put_contents(__DIR__."/fields.txt",var_export(array($arFields,$ells["request"]->getPostList()) ,$ells["request"]->getPost("IS_BINLIZ_CATALOG")),1)); if($arFields["RESULT"]!=false)( $ID = $arFields["ID"]; $fields = ["IBLOCK_ID"=> $ID,"IS_CATALOG"=>$ells["request"]->getPost("IS_BINLIZ_CATALOG")=="Y"?1:0]; \Binliz\Sale\SaleCatalogTable::AddByIblock( $ID,$fields); ) ) funcția publică onAdminIblockDelete($ID)( \Binliz\Sale\SaleCatalogTable::DeleteByIblock($ID); ) )

Să adăugăm funcțiile noastre la modelul tabelului în consecință:

Funcția publică GetByIblock($IBLOCK_ID)( $query = new \Bitrix\Main\Entity\Query(self::getEntity()); $query->setSelect(array("*")); $query->setFilter(array ("=IBLOCK_ID" => $IBLOCK_ID)); $result = $query->exec(); $ells = $result->fetch(); if(isset($ells["ID")) return $ells ; altfel returnează false; ) funcție publică AddByIblock($IBLOCK_ID,$arFields)( $interogare = new \Bitrix\Main\Entity\Query(self::getEntity()); $query->setSelect(array("IBLOCK_ID", "ID")); $query->setFilter(array("=IBLOCK_ID" => $IBLOCK_ID)); $result = $query->exec(); $ells = $result->fetch(); if(isset ($ells["ID"])) self::Update($ells["ID"],$arFields); else $res = self::Add($arFields); ) funcție publică DeleteByIblock($IBLOCK_ID)( $ interogare = nou \Bitrix\Main\Entity\Query(self::getEntity()); $query->setSelect(array("IBLOCK_ID","OFFER_IBLOCK_ID","ID","IS_CATALOG","IS_OFFERS")); $query->setFilter(array("=IBLOCK_ID" => $IBLOCK_ID)); $result = $query->exec(); $ells = $result->fetch(); if(isset($ells["ID) "]) && $ells["OFFER_IBLOCK_ID"]==null) (self::Delete($ells["ID"]); returneaza adevarat ;))

Și fișierul șablon cu o bifă pe care îl scoatem:

Ura, acum avem o casetă de selectare care determină dacă avem un director sau nu.

Conținutul zonelor de includere este stocat în fișiere PHP sau HTML separate. Zonele pentru pagini sau secțiuni sunt salvate cu un sufix. De exemplu, fișierele de produs furnizate folosesc sufixul _inc(De exemplu, index_inc.php), iar zona de includere pentru secțiunea site este salvată într-un fișier numit sectăși adăugarea unui sufix la acesta (de exemplu, sec_inc.php).

Important! Fișierul include zona trebuie salvat în același director cu pagina pentru care a fost creat. Zona de includere a unei secțiuni se află în folderul acelei secțiuni.

Conectarea zonelor dintr-un șablon de design de site web se face folosind componenta Inserarea unei regiuni de includere sau folosind funcția .

Sufixul folosit pentru a desemna zonele incluse este determinat de opțiunea cu același nume din setările componente Inserarea unei regiuni de includere. Componenta poate fi plasată nu doar în șablonul de design, ci și pe paginile site-ului, cu condiția ca sufixul fișierului să fie setat diferit de cel folosit în șablon.

O componentă poate fi configurată doar pentru una dintre opțiunile de afișare descrise mai sus. În plus, acestea pot fi afișate pe paginile site-ului în conformitate cu orice alte condiții. De exemplu, doar pe pagina principală a site-ului sau doar pentru vizitatorii autorizați etc.

Notă: determinat de opțiune Arată zona inclusă.

Dacă componenta este plasată într-un șablon de design de site web, atunci informațiile din fisier va fi afișat pe tot site-ul. Setarea parametrului este disponibilă numai pentru un utilizator cu drepturi edit_php.

Amplasarea zonei de includere

Pentru a plasa o zonă de includere, procedați în felul următor:

  • Deschideți un șablon de site sau o pagină în editorul vizual pentru editare.
  • Adăugați o componentă Inserarea unei regiuni de includere (bitrix:main.include) la șablonul de site (sau corpul paginii) și configurați setările acestuia.

Există o limitare a utilizării zonelor de includere la integrarea într-un design. Este legat de dimensiunea alocată celulei în care se află componenta. Dacă textul introdus, imaginea sau altceva este mai mare ca dimensiune decât spațiul alocat pentru componentă, atunci designul va „merge”, adică distorsionat.

Utilizarea zonelor de includere vă permite să controlați mai mult decât textul. Puteți plasa o imagine în această zonă în loc de text (sau o componentă Fotografie aleatorie) și obțineți o vedere individuală a fiecărei secțiuni. În acest caz, individualitatea va fi „dinamică”, schimbătoare.

Creați și editați o zonă de includere

Crearea zonelor includ se poate face:


În mod similar, puteți trece la editarea zonelor incluse:


Atenţie! Dacă utilizați opțiunea ca zonă inclusă din fisier, apoi trebuie să verificați dacă fișierul este conectat de la sistem și nu este apelat direct. Acest lucru se face folosind următoarea linie:
.

Exemplu de conținut al fișierului inclus:

Cartea Lumii
Toate cărțile din lume


Includeți șabloane de zonă

Zonele de includere sunt create din șabloane stocate în folderele numite /page_templates/ :

  • /bitrix/templates/.default/page_templates/ - dacă acest șablon de zonă inclus este utilizat pentru toate șabloanele de design de site;
  • /bitrix/şabloane/<идентификатор шаблона>/page_templates/ - dacă pentru șablonul de site sunt utilizate șabloane separate de zonă de includere.

Pentru a putea selecta un șablon în editorul vizual pe baza căruia este creată o zonă editabilă, la fișier trebuie adăugată o listă de șabloane pentru zone editabile .conținut.php.

Fişier .conținut.php este stocat în folderul /page_templates/ din directorul șablonului de site corespunzător.

Exemplu de conținut de fișier:

GetMessage("standard"), "sortare" => 1); $TEMPLATE["page_inc.php"] = Array("name"=>GetMessage("page_inc"), "sort"=>2); $TEMPLATE["sect_inc.php"] = Array("name"=>GetMessage("sect_inc"), "sort"=>3); ?>

Vă rugăm să rețineți că numele șablonului poate fi transmis ca parametru atunci când conectați o zonă editabilă în șablonul site-ului ("TEMPLATE"=>"page_inc.php" în exemplul de mai jos).


Dacă conectarea zonelor editabile se face folosind funcția PHP IncludeFile(), plasat în locurile adecvate din șablonul de proiectare, atunci codul poate arăta astfel:

$APPLICATION->IncludeFile(substr($APPLICATION->GetCurPage(),
0, strlen($APPLICATION->GetCurPage())-4)."_inc.php", Array(),
Array("MODE"=>"html", "NAME"=>GetMessage("PAGE_INC"), "TEMPLATE"=>"page_inc.php" ));
?>
$APPLICATION->
IncludeFile($APPLICATION->GetCurDir()."sect_inc.php", Array(), Array("MODE"=>"html",
"NAME" => GetMessage ("SECT_INC"), "TEMPLATE" => "sect_inc.php" ));
?>