Det oppstår ofte en situasjon at det er nødvendig å utvide funksjonaliteten til emarket basket ()-metoden, som er ansvarlig for å legge en vare til kurven. I systemversjon 2.8.4.3 og nedenfor, i metoden kurv hendelsen for å tilpasse denne handlingen er ennå ikke registrert, derfor, for å løse problemet fra vårt eksempel, flytter vi kurvmetoden til en tilpasset fil.

Oppgave: det er nødvendig, når du legger en vare til handlekurven, å gi kjøperen en liten kommentar til varen han vil legge i handlekurven; denne kommentaren må også sees i den administrative delen når du ser på bestillingsparametrene. I vår nye metode vil vi også legge til funksjonalitet som vil tillate oss å øke eller redusere mengden av en vare i bestillingen med én.

Løsning: La oss kopiere koden til kurvmetoden fra filen __innkjøp.php, å lagre klasser / moduler / emarket / __ custom.php og gi nytt navn til metoden til basket_custom... I den nye metoden er linjen:

$ order = self :: getBasketOrder (! in_array ($-modus, array ("sett", "fjern")));

må endres til:

$ ordre = $ denne -> getBasketOrder (! in_array ($-modus, array ("sett", "fjern")));

Etter linjen:

if ($ itemType == "element") (

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

denne koden vil legge til den beståtte verdien fra feltet til ordreelementet dop_info.

For å konfigurere funksjonaliteten for å øke eller redusere antallet av en vare i bestillingen, må du:

etter linjen:

$ options = getRequest ("alternativer");

Legg til:

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

og også etter linjen:

$ beløp = $ beløp? $ beløp: ($ orderItem -> getAmount () + 1);

Legg til:

hvis ($ mode_change) $ beløp = ($ mode_change == 1)? $ orderItem -> getAmount () + 1: $ orderItem -> getAmount () - 1;

Bruke TPL-malmotoren som et eksempel, når den brukes i en mal tpls / emarket / default.tpl, i blokken ordre_vare, lenker:

+ -

som du kan feste knapper til, kan du øke eller redusere antall varer i bestillingen med én.

array ("basket_custom")); ?>

I sidemalene må det opprettes et skjema for å legge til et produkt i kurven, handlingen til skjemaet, standard, bortsett fra at i stedet for kurvmetoden må du skrive basket_custom. Du må også legge til inndata i selve skjemaet:

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

I den administrative delen, i modulen Datamaler du må åpne datatypen for redigering Rekkefølge, få xml-representasjonen ved å legge til på slutten av nettleserens adresselinje: .xml

I de mottatte dataene vil det være omtrent følgende blokk:

"Bestillingsnavn" field-type-id = "12" visible = "synlig" guide-id = "73"> "Flere valg rullegardinliste" data-type = "relasjon" multiple = "flere" />

i hvilken guide-id = "73", åpne deretter datatypen med type_id = 73 for redigering, følg koblingen / admin / data / type_edit / 73 /... Legg til ett felt til av typen streng i gruppen "Navneegenskaper", med en strengidentifikator dop_info... For å vise den lagrede verdien, når vi ser bestillingen i detalj, vil vi tilordne noen maler fra filen på nytt \ stiler \ skinn \ mac \ data \ moduler \ emarket \ order-edit.xsl, for å være mer presis, legger vi til navnet på bestillingsvaren, utdata av verdien fra dop_info-feltet. For å implementere denne delen av bestillingen, legg til filen: \ stiler \ skinn \ mac \ data \ moduler \ emarket \ form.modify.custom.xsl med følgende innhold:

"http://www.w3.org/1999/XSL/Transform" xmlns: xlink = "http://www.w3.org/TR/xlink">
"gjenstand" mode = "ordre-item-name"> "($ lang-prefiks) / admin / katalog / rediger / (// eiendom / verdi / side / @ id) /">
"// eiendom [@navn =" dop_info "] / verdi" />

Etter å ha fullført alle de beskrevne handlingene, når kjøperen legger til et bestillingselement, kan han indikere en kort kommentar til det tilførte produktet, og butikkadministratoren, når han ser bestillingen i detalj, vil kunne lese denne kommentaren.

Egentlig er spørsmålet om implementeringen av butikken og hvordan jeg vil vurdere den.

Først, la oss ta en titt på en ekte butikk, hvordan den fungerer, hvilke funksjoner som er implementert der og kostnadene.

Og så en nettbutikk på Bitrix kan implementeres på 2 utgaver, dette er en liten bedrift og en bedrift.

Hva er hovedforskjellen for en butikk?

1. Det er ingen reklamemodul - det kan stilles spørsmål ved hensiktsmessigheten til denne modulen; den kan implementeres på infoblokker og den vil fungere raskt og bra, og selve modulen er tung, i noen tilfeller er den ikke i det hele tatt hensiktsmessig

2. Nettbutikkmodulen i seg selv er forskjellig ved at i virksomheten er det ingen begrensninger på antall priser for et produkt, og det er ingen sett og sett, i en liten bedrift er det bare ett lager, det er ingen tilknyttede selskaper (en kontroversiell spørsmål om det er nødvendig i de fleste tilfeller) og resten av elektronisk innhold kan ikke selges verk i butikkenes redaksjoner på samme måte.

Det vi har, Bitrix er fullt integrert med 1C, småbedrifter er bra hvis det ikke er varehus og forskjellige priser, for eksempel engros og for varer. Business er en monstrøs butikk som er klar for enhver bedrift.

Og prisen: 9000 og 19000, forskjellen er til å ta og føle på.

Starten koster 1 400,- dvs. sobsvenno andre tillegg 7.600 og 17.600 hhv.

I gjennomsnitt, på arbeidsbørsen, er arbeidet til en programmerer i php $ 5-10 per time, dvs. 130 UAH - 260 UAH henholdsvis 58 og 29 timer, dvs. med normal arbeidstid i døgnet 4-7 dager. Er det ekte?

La oss finne ut hva som må implementeres først.

1. Produktkatalog

2. Kurv

2.1. Rabatter

3. Kasse

3.1. betalingsmetoder

3.2. Leveringsmetoder

Vel, la oss forenkle for en start:

Bitrix start

Enhver riktig utvikling i Bitrix begynner med en egen modul der alt blir lagret og ikke forstyrrer alt annet.

Utviklingen av en nettbutikkmodul begynner med en standard "tom modul"

opprette en mappe lokale i roten til nettstedet og opprett en mappe i den moduler / NAVNEROM i mitt tilfelle vil det være det binliz.salg for at Bitrix skal finne ut at dette er en modul, må du lage et par daddies og filer, alt dette er skrevet i Bitrix-kurset, men jeg skal skrive nøyaktig hva jeg gjør

opprette en mappe installere, filer install / index.php, include.php, options.php

/ ** * Bruker: binliz * / bruk Bitrix \ Main \ Localization \ Loc; Loc :: loadMessages (__ FILE__); if (class_exists ("binliz_sale")) (retur;) class binliz_sale utvider CModule (public $ MODULE_ID = "binliz.sale"; offentlig $ MODULE_VERSION = "0.1"; offentlig $ MODULE_VERSION_DATE = "2016-09-19"; offentlig $ MODULE_NAME = "Modul binliz salg"; offentlig $ MODULE_DESCRIPTION = "Butikkmodulen brukes for automatisk tilkobling av klasser. Bruker D7-motoren."; Offentlig $ MODULE_GROUP_RIGHTS = "N"; offentlig $ PARTNER_NAME = "binliz"; offentlig $ PARTNER_URI = "http: // site "; offentlig funksjon DoInstall () (global $ APPLICATION; RegisterModule ($ this-> MODULE_ID);) offentlig funksjon DoUninstall () (global $ APPLICATION; UnRegisterModule ($ this-> MODULE_ID);))

Det er alt, la oss gå til Desktop> Markedsplass> Installerte løsninger og installere vår modul, vil vi ofte installere og installere denne for å være sikker på at vår modul vil utfolde seg ut av esken.

Det første vi trenger å organisere er muligheten til å lage en katalog i administrasjonspanelet, for enkelhets skyld vil vi gjøre det til det samme som for Bitrix, dvs. uten å finne opp en ny struktur - vi vil legge til våre egne faner med handelskatalogen til infoblokkelementene.

Hvordan organiserer du dette? La oss først prøve å lage en tabell der vi lagrer infoblokkene våre, som vil bli kataloger.

OPPRETT TABELL `b_binliz_sale_catalog` (` ID` int (11) NOT NULL, `IBLOCK_ID` int (11) NOT NULL,` OFFER_IBLOCK_ID` int (11) NOT NULL, `IS_CATALOG` int (1) NOT NULL,` IS_OFFERS` int (1) IKKE NULL) ENGINE = InnoDB DEFAULT CHARSET = utf8 COLLATE = utf8_unicode_ci; ALTER TABLE `b_binliz_sale_catalog` ADD PRIMARY KEY (` ID`), ADD UNIQUE KEY `IBLOCK_ID` (` IBLOCK_ID`), ADD UNIQUE KEY `OFFER_IBLOCK_ID` (` OFFER_IBLOCK_ID`); ALTER TABLE `b_binliz_sale_catalog` MODIFY` ID` int (11) IKKE NULL AUTO_INCREMENT;

La oss lage en visning av denne tabellen i ORM, lage en lib-mappe og legge filen i den salgskatalog.php

Navneområde Binliz \ Salg; bruk Bitrix \ Main, Bitrix \ Main \ Localization \ Loc; Loc :: loadMessages (__ FILE__); / ** * Class SaleCatalogTable * * @package Binliz \ Sale ** / class SaleCatalogTable utvider Main \ Entity \ DataManager (/ ** * Returnerer DB-tabellnavn for entitet. * * @Return string * / offentlig statisk funksjon getTableName () ( return "b_binliz_sale_catalog";) / ** * Returnerer entitetskartdefinisjon. * * @return array * / public static function getMap () (retur array ("ID" => array ("data_type" => "heltall", "primær) "=> true," autocomplete "=> true," title "=> Loc :: getMessage (" SALE_CATALOG_ENTITY_ID_FIELD "),)," IBLOCK_ID "=> array (" data_type "=>" heltall "," påkrevd "=> true, "title" => Loc :: getMessage ("SALE_CATALOG_ENTITY_IBLOCK_ID_FIELD"), "OFFER_IBLOCK_ID" => array ("data_type" => "heltall", "required" => true, "title" => Loc :: getMessage ("SALE_CATALOG_ENTITY_OFFER_IBLOCK_ID_FIELD"), "IS_CATALOG" => array ("data_type" => "heltall", "required" => true, "title" => Loc :: getMessage ("SALE_CATALOG_ENTITY_ISEL_CATALOG "=> IS_OFFERS) (" data_type "=>" heltall r "," required "=> true," title "=> Loc :: getMessage (" SALE_CATALOG_ENTITY_IS_OFFERS_FIELD "),),); ))

Og du kan sette inn prinitsy og lokalisering 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"] = "";

inntil jeg redefinerte noe, bare legg filen, platen ble opprettet, det er på tide å lage en fane og angi metoder for å jobbe med den, siden vi har Bitrix, den har et arrangementssystem, den beste og riktige måten er å organisere klasser som vil bli hengt opp i nettopp disse hendelsene og løse problemene våre, for dette foretrakk jeg å bli styrt av prinsippet om én klasse, én løsning og konstruktøren selv definisjonen av hva vi henger på. Det første trinnet er å løse problemet med å definere kataloger. For å gjøre dette, må vi opprette en fane i redigeringsseksjonen for informasjonsblokk der det vil være hake for at dette er en katalog, og selv om dette er nok vil vi ikke bry oss før vi kan gjøre det senere med handelstilbud. La oss lage en abstrakt klasse for hendelser der vi lager en matrise som sender følgende data:

modulen vi henger på, arrangementet, og klassemetoden som er ansvarlig for dette. For å gjøre dette, i lib-mappen, opprett hendelsesmappen og legg hendelsene våre der. Og det samme er den abstrakte klassen.

Navneområde Binliz \ Salg \ Events; abstrakt klasse Base (beskyttet $ eventlist =; offentlig endelig funksjon __construct () ($ eventManager = \ Bitrix \ Main \ EventManager :: getInstance (); foreach ($ this-> eventlist som $ event) ($ eventMethods = get_called_class (). "::". $ event ["metode"]; $ eventManager-> addEventHandler ($ event ["module"], $ event ["event"], $ eventMethods);)))

Og en klasse for å jobbe med en infoblokk:

Navneområde Binliz \ Salg \ Events; klasse SaleCatalogIblockEdit utvider Base (beskyttet $ eventlist = [["module" => "main", "event" => "onAdminTabControlBegin", "method" => "onAdminTabControlBegin"], ["module" => "iblock", " hendelse "=>" onAfterIblockAdd "," metode "=>" onAdminIblock "], [" modul "=>" iblock "," event "=>" on AfterIblockUpdate "," metode "=>" påAdminIblock "], [" modul "=>" iblock "," event "=>" OnIBlockDelete "," method "=>" onAdminIblockDelete "],]; statisk offentlig funksjon 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);) offentlig funksjon påAdminTabControlBegin (& $ form) ($ ells = self :: getApp (); if ($ ells ["uri"] == "/bitrix/admin/iblock_edit.php") (if ($ ells ["request"] -> getQuery ("ID")> 0) $ results = \ Binliz \ Sale \ SaleCatalogTable :: GetByIblock ($ ells ["request) "] -> getQuery (" ID ")); ob_start (); include (__ DIR __." / temp lates / iblock_edit.php "); $ str = ob_get_contents (); ob_end_clean (); $ form-> tabs = array ("DIV" => "BINLIZ_SALE_CATALOG", "TAB" => "Handelskatalog Binliz.Sale", "ICON" => "main_user_edit", "TITLE" => "Innstillingskatalog", " INNHOLD "=> $ str); )) public function 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 ["RESULTAT"]! = usant) ($ ID = $ arFields ["ID"]; $ fields = ["IBLOCK_ID" => $ ID, "IS_CATALOG" => $ ells ["request"] -> getPost ("IS_BINLIZ_CATALOG") == "Y"? 1: 0]; \ Binliz \ Sale \ SaleCatalogTable :: AddByIblock ( $ ID, $ fields);)) offentlig funksjon påAdminIblockDelete ($ ID) (\ Binliz \ Sale \ SaleCatalogTable :: DeleteByIblock ($ ID);))

La oss legge til funksjonene våre til tabellmodellen tilsvarende:

Offentlig funksjon GetByIblock ($ IBLOCK_ID) ($ query = new \ Bitrix \ Main \ Entity \ Query (self :: getEntity ()); $ query-> setSelect (array ("*")); $ query-> setFilter (array) ("= IBLOCK_ID" => $ IBLOCK_ID)); $ resultat = $ query-> exec (); $ ells = $ resultat-> hente (); if (isset ($ ells ["ID")) returner $ ells ; else return false;) offentlig funksjon AddByIblock ($ IBLOCK_ID, $ arFields) ($ query = new \ Bitrix \ Main \ Entity \ Query (self :: getEntity ()); $ query-> setSelect (array ("IBLOCK_ID", "ID")); $ query-> setFilter (array ("= IBLOCK_ID" => $ IBLOCK_ID)); $ resultat = $ query-> exec (); $ ells = $ resultat-> hent (); if (isset ($ ells ["ID")) self :: Oppdater ($ ells ["ID"], $ arFields); else $ res = self :: Legg til ($ arFields);) offentlig funksjon DeleteByIblock ($ IBLOCK_ID) ($ query = new \ Bitrix \ Main \ Entity \ Query (selv :: getEntity ()); $ query-> setSelect (array ("IBLOCK_ID", "OFFER_IBLOCK_ID", "ID", "IS_CATALOG", "IS_OFFERS")); $ query-> setFilter (array ("= IBLOCK_ID" => $ IBLOCK_ID)); $ resultat = $ query-> exec (); $ ells = $ resultat-> hente (); if (isset ($ ells ["ID) "]) && $ ells ["OFFER_IBLOCK_ID"] == null) (selv :: Slett ($ ells ["ID"]); returner sant;))

Og malfilen med et hakemerke som vi sender ut:

Hurra, så vi har en fungerende avmerkingsboks som avgjør om vi har en katalog eller ikke.

Innholdet i include-omfangene lagres i separate PHP- eller HTML-filer. Områder for sider eller seksjoner lagres med et eller annet suffiks. For eksempel bruker de sendte produktfilene suffikset _inc(For eksempel, index_inc.php), og inkluderingsområdet for områdedelen lagres i en fil med navn sekt og legge til et suffiks til det (f.eks. sect_inc.php).

Viktig! Filen med inkluderingsområdet må lagres i samme katalog som siden den ble opprettet for. Inkluderingsområdet for en seksjon er i mappen til den seksjonen.

Koblingen av områder i nettstedsdesignmalen utføres ved hjelp av komponenten Sette inn et inkludere område eller bruke en funksjon.

Suffikset som brukes til å angi de inkluderte områdene bestemmes av alternativet med samme navn i komponentinnstillingene Sette inn et inkludere område... En komponent kan plasseres ikke bare i en designmal, men også på nettstedssider, forutsatt at filsuffikset må være forskjellig fra det som brukes i malen.

Én komponent kan bare konfigureres for ett av visningsalternativene ovenfor. I tillegg kan de vises på sidene på nettstedet i samsvar med andre betingelser. For eksempel bare på hovedsiden til nettstedet eller kun for autoriserte besøkende, etc.

Merk: definert av alternativ Vis inkludere område.

Hvis komponenten er plassert i nettstedets designmal, så informasjonen fra fil vil vises på hele nettstedet. Innstilling av parameteren er kun tilgjengelig for en bruker med rettigheter edit_php.

Plassere et inkludere område

Gjør følgende for å plassere inkluderingsområdet:

  • Åpne nettstedsmalen eller siden for redigering i et visuelt redigeringsprogram.
  • Legg til komponent Sette inn et inkludere område (bitrix: main.include) inn i nettstedsmalen (eller i brødteksten på siden) og konfigurer parameterne.

Bruken av inkludere områder ved integrering i et design har en begrensning. Det er relatert til størrelsen som er reservert for cellen der komponenten er plassert. Hvis den angitte teksten, bildet eller noe annet er større i størrelse enn stedet som er tildelt komponenten, vil designet "gå", det vil si at det vil bli forvrengt.

Ved å bruke include-omfang kan du kontrollere mer enn bare tekst. Du kan legge inn et bilde i dette området i stedet for tekst (eller en komponent Tilfeldig bilde) og få en individuell visning av hver seksjon. I dette tilfellet vil individualiteten være "dynamisk", foranderlig.

Opprett og rediger et inkludere område

Opprettelsen av inkluderende områder kan gjøres:


På samme måte kan du fortsette å redigere de inkluderte områdene:


Merk følgende! Hvis du skal bruke alternativet fra fil, så må du sjekke at filen er koblet fra systemet, og ikke kalles opp direkte. Dette gjøres med følgende linje:
.

Et eksempel på innholdet i include-filen:

Verdensbok
Alle verdens bøker


Inkluder omfangsmaler

Inkluderte omfang er opprettet fra maler som er lagret i mapper kalt / page_templates /:

  • /bitrix/templates/.default/page_templates/ - hvis dette inkluderer område, brukes malen for alle nettstedsdesignmaler;
  • / bitrix / maler /<идентификатор шаблона>/ page_templates / - hvis separate inkluderer områdemaler brukes for nettstedsmalen.

For å kunne velge en mal i den visuelle editoren som en redigerbar region opprettes på grunnlag av, må en liste over maler for redigerbare regioner legges til filen .content.php.

Fil .content.php lagret i mappen / page_templates / i katalogen til den tilsvarende nettstedsmalen.

Eksempel på filinnhold:

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

Vær oppmerksom på at malnavnet kan sendes som en parameter når du kobler til det redigerbare området i sidemalen ("MAL" => "page_inc.php" i eksemplet nedenfor).


Hvis du kobler til redigerbare områder ved hjelp av PHP-funksjonen Inkluder fil () plassert på de riktige stedene i designmalen, så kan koden se slik ut:

$ APPLICATION-> IncludeFile (substr ($ APPLICATION-> GetCurPage (),
0, strlen ($ APPLICATION-> GetCurPage ()) - 4). "_ Inc.php", Array (),
Array ("MODE" => "html", "NAME" => GetMessage ("PAGE_INC"), "MAL" => "page_inc.php"));
?>
$ SØKNAD->
IncludeFile ($ APPLICATION-> GetCurDir (). "Sect_inc.php", Array (), Array ("MODE" => "html",
"NAME" => GetMessage ("SECT_INC"), "MAL" => "sect_inc.php"));
?>