Si të konfiguroni telefonat inteligjentë dhe PC. Portali informativ

Seksioni falas php. Dallimi midis elementeve të seksionit dhe artikullit

Pavarësisht se sa shumë PHP përdorim, shfaqen disa veçori për të cilat as nuk kemi dëgjuar. Disa prej tyre do të ishin shumë të dobishme për ne. Kam krijuar një listë të vogël funksione të dobishme i cili duhet të jetë në arsenalin e çdo programuesi PHP.

1. Krijimi i funksioneve me një numër të ndryshueshëm argumentesh

Ju ndoshta e dini tashmë se PHP na lejon të krijojmë funksione me argumente opsionale. Tani do të tregoj një funksion në të cilin numri i argumenteve mund të ndryshojë nga rasti në rast.

Por së pari, le të kujtojmë se si i krijojmë funksionet në mënyrën e zakonshme:

// funksion me dy parametra opsionalë funksion foo ($ arg1 = "", $ arg2 = "") (echo "arg1: $ arg1 \ n"; echo "arg2: $ arg2 \ n";) foo ("përshëndetje", "botë"); / * do të dalë: arg1: përshëndetje arg2: botë * / foo (); / * do të nxjerrë: arg1: arg2: * /

Tani le të shohim se si mund të shkruani një funksion me një numër të pakufizuar argumentesh. Metoda func_get_args () do të përdoret për këtë:

// mos specifikoni asnjë argument funksioni foo () (// kthen një grup argumentesh të kaluar $ args = func_get_args (); foreach ($ args si $ k => $ v) (jehonë "arg". ($ k + 1). " : $ v \ n ";)) foo (); / * nuk do të printojë asgjë * / foo ("përshëndetje"); / * printon arg1: hello * / foo ("përshëndetje", "botë", "përsëri"); / * printon arg1: përshëndetje arg2: bota arg3: përsëri * /

2. Përdorimi i Glob () për të gjetur skedarë

Emrat e funksioneve shpesh janë vetë-shpjegues. Nuk mund të thuhet e njëjta gjë për funksionin glob ().

Pa hyrë në detaje, funksionaliteti i tij është i ngjashëm me metodën scandir (). Kjo ju lejon të gjeni skedari i kërkuar sipas modelit:

// gjeni të gjitha php skedar s skedarë $ = glob ("*. php"); print_r ($ skedarë); / * do të nxjerrë: Array (=> phptest.php => pi.php => post_output.php => test.php) * /

Për të gjetur skedarë të disa llojeve, duhet të shkruani kështu:

// gjeni të gjithë skedarët php dhe txt $ files = glob ("*. (php, txt)", GLOB_BRACE); print_r ($ skedarë); / * dalje: Array (=> phptest.php => pi.php => post_output.php => test.php => log.txt => test.txt) * /

Ju gjithashtu mund të specifikoni rrugën në shabllon:

$ skedarë = glob ("../ imazhe / a * .jpg"); print_r ($ skedarë); / * prodhimi: Array (=> ../images/apple.jpg => ../images/art.jpg) * /

Për të marrë shtegun e plotë drejt dokumentit, përdorni metodën realpath ():

$ skedarë = glob ("../ imazhe / a * .jpg"); // Aplikoni funksionin "realpath" në secilin element të grupit $ files = array_map ("realpath", $ files); print_r ($ skedarë); / * do të nxjerrë: Array (=> C: \ wamp \ www \ images \ apple.jpg => C: \ wamp \ www \ images \ art.jpg) * /

3. Informacion rreth memories së përdorur

Nëse mbani gjurmët e sasisë së memories që konsumohet për punën e skripteve tuaja, atëherë, me siguri, do t'i optimizoni ato më shpesh.

Në PHP ka mjet i fuqishëm gjurmimi i memories së përdorur. V pjesë të ndryshme Ngarkesat e skriptit mund të jenë të ndryshme. Për të marrë vlerën e memories së përdorur ky moment, duhet të përdorim metodën memory_get_usage (). Për fiksim numri maksimal memoria e përdorur përdor memory_get_peak_usage ()

Echo "Initial:" .memory_get_usage (). "Bajt \ n"; / * Fillestar: 361400 bajt * / // le të japim një ngarkesë të vogël për ($ i = 0; $ i< 100000; $i++) { $array = md5($i); } // и ещё for ($i = 0; $i < 100000; $i++) { unset($array[$i]); } echo "Final: ".memory_get_usage()." bytes \n"; /* Final: 885912 bytes */ echo "Peak: ".memory_get_peak_usage()." bytes \n"; /* Peak: 13687072 bytes */

4. Informacion rreth procesorit

Për ta bërë këtë, duhet të përdorni metodën getrusage (). Vini re, megjithatë, se kjo veçori nuk do të funksionojë në Windows.

Print_r (gjetje ()); / * printon Array (=> 0 => 0 => 2 => 3 => 12692 => 764 => 3864 => 94 => 0 => 1 => 67 => 4 => 0 => 0 => 0 => 6269 => 0) * /

Fotografia e përshkruar më sipër do të jetë e kuptueshme për ata që kanë përvojë administrimi i sistemit... Për të gjithë të tjerët, ne ofrojmë një deshifrim:

  • ru_oublock: numri i operacioneve të shkrimit të bllokut
  • ru_inblock: numri i operacioneve të leximit të bllokut
  • ru_msgsnd: numri i mesazheve të dërguara
  • ru_msgrcv: numri i mesazheve të marra
  • ru_maxrss: madhësia maksimale grup pa faqe
  • ru_ixrss: kujtesa totale e përbashkët
  • ru_idrss: sasia totale e të dhënave të pashpërndara
  • ru_minflt: numri i faqeve të memories së përdorur
  • ru_majflt: numri i gabimeve të faqes që mungojnë
  • ru_nsignals: numri i sinjaleve të marra
  • ru_nvcsw: numri i ndërruesve të kontekstit të procesit
  • ru_nivcsw: numri i ndërruesve të kontekstit të detyruar
  • ru_nswap: numri i akseseve të diskut gjatë faqes
  • ru_utime.tv_usec: orët e punës në modaliteti i përdoruesit(mikrosekonda)
  • ru_utime.tv_sec: koha e kaluar në modalitetin e përdoruesit (sekonda)
  • ru_stime.tv_usec: koha e privilegjuar e modalitetit (mikrosekonda)
  • ru_stime.tv_sec: koha e punës në modalitetin e privilegjuar (sekonda)

Për të zbuluar se cilat burime të procesorit tuaj përdoren nga një skript, ju nevojiten vlerat "koha e përdoruesit" dhe "koha e sistemit" (koha e modalitetit të privilegjuar). Ju mund ta merrni rezultatin si në sekonda ashtu edhe në mikrosekonda. Për ta kthyer numrin total të sekondave në numër dhjetor, duhet të ndani vlerën e mikrosekondave me 1 milion dhe të shtoni sekonda në vlerë.

I hutuar disi. Ja një shembull:

// pushoni për 3 sekonda gjumë (3); $ të dhëna = getrusage (); jehonë "Koha e përdoruesit:". ($ të dhëna ["ru_utime.tv_sec"] + $ të dhëna ["ru_utime.tv_usec"] / 1000000); jehonë "Koha e sistemit:". ($ të dhëna ["ru_stime.tv_sec"] + $ të dhëna ["ru_stime.tv_usec"] / 1000000); / * daljet Koha e përdoruesit: 0.011552 Koha e sistemit: 0 * /

Megjithëse skenari mori rreth 3 sekonda për t'u ekzekutuar, procesori nuk ishte shumë i ngarkuar. Fakti është se kur thirret (gjumi), skripti praktikisht nuk konsumon burimet e procesorit. Në përgjithësi, ka shumë detyra që kërkojnë një kohë të konsiderueshme pa përdorur procesorin. Për shembull, duke pritur për operacione të lidhura me diskun. Pra, nuk e përdorni gjithmonë kohën e CPU-së në skriptet tuaja.

Ja një shembull tjetër:

// qark 10 milionë herë për ($ i = 0; $ i<10000000;$i++) { } $data = getrusage(); echo "User time: ". ($data["ru_utime.tv_sec"] + $data["ru_utime.tv_usec"] / 1000000); echo "System time: ". ($data["ru_stime.tv_sec"] + $data["ru_stime.tv_usec"] / 1000000); /* выводит User time: 1.424592 System time: 0.004204 */

Skripti mori 1,4 sekonda nga koha e CPU-së. Në këtë rast, kohët e thirrjeve të sistemit janë përgjithësisht të ulëta.

Koha e Sistemit është koha që procesori shpenzon duke ekzekutuar kërkesat e sistemit në kernel në emër të programit. Shembull:

$ fillim = mikrokohë (e vërtetë); // telefononi microtime çdo 3 sekonda ndërsa (microtime (e vërtetë) - $ start< 3) { } $data = getrusage(); echo "User time: ". ($data["ru_utime.tv_sec"] + $data["ru_utime.tv_usec"] / 1000000); echo "System time: ". ($data["ru_stime.tv_sec"] + $data["ru_stime.tv_usec"] / 1000000); /* выводит User time: 1.088171 System time: 1.675315 */

Koha e sistemit tani harxhohet shumë më tepër se në shembullin e mëparshëm. E gjithë kjo falë metodës microtime (), e cila përdor burimet e sistemit.

Megjithatë, duhet theksuar se koha e shfaqur mund të mos jetë e saktë sepse në këtë moment në kohë, burimet e procesorit përdoren edhe nga programe të tjera, gjë që mund të rezultojë në një gabim të vogël.

5. Konstantet magjike

Ka shumë konstante magjike në PHP si numri aktual i linjës (__LINE__), shtegu i skedarit (__FILE__), shtegu i drejtorisë (__DIR__), emri i funksionit (__FUNCTION__), emri i klasës (__CLASS__), emri i metodës (__METHOD__) dhe hapësirat e emrave (__NAMESPACE__) .

Nuk do t'i konsiderojmë të gjithë. Le të shohim vetëm një çift:

// ky skript varet nga vendndodhja aktuale e skedarit dhe // mund të shkaktojë probleme nëse përdoret nga direktori të ndryshme require_once ("config / database.php"); // ky skript nuk do të shkaktojë probleme kërkoj_once (dirname (__ FILE__). "/config/database.php");

Përdorni __LINE__ kur korrigjoni skriptet:

// kodi // ... my_debug ("disa mesazh korrigjimi", __LINE__); / * printon rreshtin 4: disa mesazhe korrigjimi * / // më shumë kod // ... my_debug ("një tjetër mesazh korrigjimi", __LINE__); / * printon rreshtin 11: një mesazh tjetër korrigjimi * / funksioni my_debug ($ msg, $ line) (jehonë "Linja $: $ msg \ n";)

6. Gjenerimi i ID-ve unike

Ka raste kur ju duhet të krijoni një varg unik. Unë kam parë shumë herë që ata përdorin funksionin md5 () për të zgjidhur këtë problem:

// gjeneron një varg të rastësishëm echo md5 (koha (). mt_rand (1,1000000));

Por në fakt, PHP ka një funksion të veçantë uniqid () për këtë qëllim.

// gjeneron një varg të rastësishëm echo uniqid (); / * printon 4bd67c947233e * / // edhe një herë echo uniqid (); / * do të printojë 4bd67c9472340 * /

Me sy të lirë, ju mund të shihni se personazhet e parë janë të ngjashëm për ta thënë më butë ... Kjo për faktin se kjo metodë përdor kohën e serverit për të gjeneruar karaktere. Madje është e dobishme sepse të gjitha vlerat e gjeneruara merren sipas rendit alfabetik, gjë që bën të mundur renditjen e shpejtë të tyre.

Për të zvogëluar shanset për të marrë një dublikatë, mund të shtojmë një parashtesë ose të përdorim një parametër të dytë (do të rrisë numrin e karaktereve):

// parashtesa me echo uniqid ("foo_"); / * do të printojë foo_4bd67d6cd8b8f * / // me parametrin e dytë echo uniqid ("", true); / * printon 4bd67d6cd8b926.12135106 * / // të dyja echo uniqid ("bar _", e vërtetë); / * printon bar_4bd67da367b650.43684647 * /

Kjo metodë gjeneron linja më të vogla se md5, duke kursyer kështu hapësirë.

7. Serializimi

A ju është dashur ndonjëherë të ruani të dhëna komplekse në një bazë të dhënash ose në një skedar? Për të kthyer një objekt në një varg, PHP ofron një funksion të veçantë.

Në përgjithësi, ekzistojnë 2 nga këto metoda: serializimi () dhe unserializimi ()

// grup kompleks $ myvar = grup ("përshëndetje", 42, grup (1, "dy"), "mollë"); // konverto në varg $ string = serialize ($ myvar); jehonë $ string; / * do të nxjerrë një: 4: (i: 0; s: 5: "përshëndetje"; i: 1; i: 42; i: 2; a: 2: (i: 0; i: 1; i: 1; s : 3: "dy";) i: 3; s: 5: "mollë";) * / // merrni vlerën origjinale $ newvar = unserialize ($ string); print_r ($ newvar); / * do të printojë Array (=> përshëndetje => 42 => Array (=> 1 => dy) => mollë) * /

Kështu funksionojnë këto funksione. Sidoqoftë, për shkak të rritjes shpërthyese të popullaritetit të JSON, PHP 5.2 shtoi 2 metoda json_encode () dhe json_decode (). Puna e tyre është e ngjashme me serializimin ():

// grup kompleks $ myvar = grup ("përshëndetje", 42, grup (1, "dy"), "mollë"); // konverto në varg $ string = json_encode ($ myvar); jehonë $ string; / * do të printojë ["hello", 42 ,, "apple"] * / // do të rivendosë vlerën origjinale $ newvar = json_decode ($ string); print_r ($ newvar); / * printon Array (=> përshëndetje => 42 => Array (=> 1 => dy) => mollë) * /

Ky opsion është më kompakt dhe i pajtueshëm me gjuhë të tjera si JavaScript. Megjithatë, humbja e të dhënave mund të ndodhë kur punoni me objekte shumë të sofistikuara.

8. Ngjeshja e vargjeve

Kur flasim për kompresim, atëherë menjëherë na vjen në mendje skedarët e arkivit v format ZIP... PHP ofron mundësinë për të kompresuar vargjet e gjata pa asnjë skedar.

V shembullin e mëposhtëm Le të demonstrojmë se si funksionojnë funksionet gzcompress () dhe gzuncompress ():

$ string = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc ut elit id mi ultricies adipiscing. Nulla facilisi. Praesent pulvinar, sapien vel feugiat vestibulum, nulla dui pretium orci, non ultricies elittelitsing adipiscing. Aliquam pretium ullamcorper urna quis iaculis. Etiam ac massa sed turpis tempor luctus. Curabitur sed nibh eu elit mollis congue. ornare në mollis në, mollis sed nunc. Etiam at justo in leo congue mollis. Nullam në neque eget metus hendrerit scelerisque eu non enim. Ut malesuada lacus eu nullesism bibodna id eoda uru . "; $ i ngjeshur = gzcompress ($ varg); echo "Madhësia origjinale:". strlen ($ string). "\ n"; / * do të printojë Madhësia origjinale: 800 * / jehonë "Madhësia e ngjeshur:". strlen ($ e ngjeshur). "\ n"; / * do të printojë Madhësia e ngjeshur: 418 * / // kthen $ origjinal = gzuncompress ($ e ngjeshur);

Është në fuqinë tonë të zvogëlojmë vëllimin e tekstit me 50%. Për të njëjtin qëllim, mund të përdorni metodat gzencode () dhe gzdecode (), të cilat përdorin një algoritëm të ndryshëm kompresimi.

9. Ekzekutoni përpara përfundimit

PHP ka një funksion register_shutdown_function () që do t'ju lejojë të ekzekutoni disa kode përpara se skripti të dalë.

Le të themi se dëshironi të dini disa informacione ... Koha e ekzekutimit të skriptit:

// merrni kohën e fillimit $ start_time = microtime (e vërtetë); // disa operacione // ... // printoni jehonën e kohës së ekzekutimit "ekzekutimi u krye:". (microtime (e vërtetë) - $ start_time). "sekonda.";

Në pamje të parë, kjo mund të duket si një detyrë e parëndësishme. Për këto qëllime, ju mund të vendosni kodin në fund të skedarit. Sidoqoftë, nëse funksioni i daljes () aktivizohet diku më parë, ky kod nuk do të funksionojë kurrë. Gjithashtu, nuk do të funksionojë nëse ka një gabim në faqe ose përdoruesi ndërpret ngarkimin e faqes (duke klikuar në butonin përkatës në shfletuesin e tij);

Kur përdorni metodën register_shutdown_function (), kodi do të ekzekutohet gjithsesi:

$ start_time = microtime (e vërtetë); register_shutdown_function ("my_shutdown"); funksioni my_shutdown () (global $ start_time; jehona "ekzekutimi u desh:". (microtime (e vërtetë) - $ start_time). "sekonda.";)

konkluzioni

PHP është një planet i tërë që nuk pushon së na mahnitur me përmbajtjen e tij. Çfarë mendoni për këto funksione?

Një artikull që eksploron elementin e seksionit HTML nga kategoria e seksioneve.

Qëllimi i elementit të seksionit

Elementi i seksionit përdoret për të krijuar një seksion në një dokument që grupon disa përmbajtje lëndore së bashku. Për çdo seksion në dokument, duhet të tregohet emri i tij (tema). Kjo zakonisht bëhet me kokë (elemente h1-h6).

Titulli i seksionit

Përmbajtja e seksionit...

Elementet e seksionit përdoren zakonisht në situatat e mëposhtme:

  • për të shënuar seksione brenda një seksioni. Për shembull, për të shënuar kapituj në një artikull, skeda në një kuti dialogu, seksione në një disertacion, etj.
  • për të grupuar disa seksione në një grup tematik... Për shembull, për grupim lajmet e fundit në faqen e internetit, komentet mbi artikullin, etj.

Kështu, elementi i seksionit duhet të përdoret vetëm për disa përmbajtje nëse ka një titull dhe është pjesë e diçkaje tjetër.

Përdorimi i elementit seksion

Për shembull, merrni parasysh një pjesë të kodit të faqes që përmban një artikull me komente. Secili nga komentet e postuara nga përdoruesi në faqe përmban një përmbajtje të plotë dhe për këtë arsye mund të konsiderohet një element artikulli. Por, në të njëjtën kohë, të gjitha komentet paraqesin një grup tematik të caktuar, dhe për këtë arsye ato mund të vendosen në elementin e seksionit, d.m.th. elementi i dhënë do të grupojë të gjitha këto komente në faqe së bashku.

Titulli i artikullit

Komentet (1)

Kreu i komentit

Teksti i komentit...

Kreu i komentit

Teksti i komentit...

Titulli i artikullit Komentet Komenti Titulli Titulli i komentit

Për shembull, merrni parasysh përdorimin e elementeve të seksionit për të krijuar seksione brenda një elementi artikulli:

Emri i librit

Kapitulli i parë

Kapitulli i dytë

Kapitulli i tretë

Shtojca A

Shtojca B

Shembulli i mësipërm do të ketë skicën e mëposhtme:

Titulli i librit Kapitulli i parë Kapitulli i dytë Kapitulli i tretë Shtojca A Shtojca B

Kufizimet e përdorimit të elementit të seksionit

Elementi i seksionit në HTML 5 nuk është një element i përgjithshëm për grupimin e përmbajtjes, d.m.th. nuk duhet të përdoret për të mbështjellë ndonjë përmbajtje që ju pëlqen. Qëllimi i tij kryesor është të shtojë semantikën në dokument dhe të krijojë skicën e tij.

Kur një autor duhet të grupojë përmbajtjen vetëm për ta stiluar ose manipuluar atë në JavaScript, vendi më i mirë është që ata të përdorin elementin div. Elementi div, ndryshe nga elementi i seksionit, nuk shton semantikë në dokument dhe nuk merr pjesë në krijimin e skicës (skicës) së tij.

Dallimi midis elementeve të seksionit dhe artikullit

Elementet e seksionit dhe artikullit, ndonëse në pamje të parë duken shumë të ngjashme, kanë kuptime të ndryshme semantike. Elementi i artikullit synon të grupojë përmbajtjen që është e plotë, e pavarur dhe që mund të shihet veçmas nga pjesa tjetër e përmbajtjes së faqes. Dhe elementi i seksionit mbart një kuptim tjetër semantik, ai synon të grupojë përmbajtjen që është pjesë përbërëse e diçkaje tjetër.

Por si mund ta dijë një autor se çfarë është disa përmbajtje në një faqe? Le ta shohim këtë duke përdorur një shembull të një fragmenti të një artikulli. Një fragment është pjesë e një artikulli dhe për këtë arsye një element seksioni duhet të përdoret për të grupuar përmbajtjen e tij. Por i njëjti fragment, tashmë i lënë si koment, do të përfaqësojë diçka të plotë, të plotë. Prandaj, në këtë kontekst, elementi artikull mund të përdoret për ta grupuar atë. Por, sigurisht, mund të arsyetohet, dhe anasjelltas. Prandaj, cili element të përdoret për të grupuar përmbajtjen në shumicën e rasteve varet nga mendimi juaj subjektiv si autor. Por gjëja më e rëndësishme në këtë qasje është ruajtja e pozicionit të zgjedhur. Prandaj, sa më konsistent të jetë autori në krijimin e strukturës, aq më shumë kuptim mund të vendosë në të.

Modelet Bitrix mund të ndahen në disa lloje:
  • Modelet e komponentëve të zakonshëm dhe kompleksë 2.0
  • Modelet e faqeve të internetit
  • Modele të tjera të entiteteve (postimet, çështjet e buletineve, formularët në ueb, gjeneruesit e eksportit dhe shumë më tepër)

Modelet e komponentëve madje kanë aftësinë të përdorin motorë shabllonesh. Në parim, ju mund të lidhni çdo motor shabllon, por nuk ka mjete ndihmëse jashtë kutisë. Nëse dikush ka nevojë për të, unë kam disa lidhje me shtesat për degëz dhe teh që funksionojnë dhe përdoren mjaft për veten e tyre në prodhim. Por edhe këtu Bitrixoidët kanë çoroditur. Motori i shabllonit mund të përdoret vetëm me komponentë. Nuk do të funksionojë të lidhni motorin e shabllonit me interpretuesin e shabllonit të faqes, ose entitete të tjera, sepse atje nuk ka renderer.

Në shabllonet e komponentëve, ka një moment tjetër të bezdisshëm me vendosjen e tyre. Komponenti është i lidhur duke përdorur një ndërtim të thjeshtë
$ APPLICATION-> IncludeComponent ("bitrix: catalog.section", "emri_template",);
Parametri i dytë është emri i shabllonit të komponentit. Pra në varësi të kushte të ndryshme, vendndodhja e këtij shablloni mund të jetë në vendet më të papritura:

  • bitrix / komponentët / bitrix / katalog.seksioni / shabllonet / emri_shabllon
  • lokale / komponentët / bitrix / katalog.seksioni / shabllonet / emri_shabllon
  • bitrix / templates / .default / components / bitrix / catalog.section / template_emri
  • bitrix / shabllone / site_template / komponentë / bitrix / katalog.seksioni / emri_shabllon
  • lokale / shabllone / .default / komponentë / bitrix / katalog.seksioni / emri_shabllon
  • lokale / shabllone / shabllon_siti / komponentë / bitrix / katalog.seksioni / emri_shabllon
  • bitrix / komponentë / bitrix / katalog / shabllone / .default / bitrix / katalog.seksioni / emri_shabllon
  • lokale / shabllone / shabllon_siti / komponentë / bitrix / katalog / .default / bitrix / katalog.seksioni / emri_shabllon
Dhe nuk i kam renditur të gjitha opsionet ...

Modeli i sajtit mund të shihet si një grup skedarësh: header.php, footer.php (po, faqja duhet t'i ketë ato), description.php ( përshkrimi i sistemit shablloni i faqes), template_styles.css (stilet e shablloneve të faqes), një direktori me shabllone përbërësish dhe një mori skedarësh më pak të rëndësishëm. Dhe kjo eshte e gjitha. Dhe mos e ndikoni në asnjë mënyrë, mos bëni asgjë për të. Nuk mund të marr motorin e shabllonit.

Nuk ka asgjë për të thënë për shabllonet e tjera. Ato ose thjesht ruhen në bazën e të dhënave në formën e një paraqitjeje me përfshirjen e disa të dhënave "të ndryshueshme", ose është një skedar budalla php që bën të gjithë punën, nga marrja e parametrave nga baza e të dhënave deri te shfaqja e informacionit. Për shembull, mund të shikoni gjeneratorin e skedarëve YML për treg. Nuk ka kuptim ta vendosim këtu, thjesht sepse është mjaft i madh, rreth 2 mijë rreshta. Kush ka nevoje do ta kerkoje ne google, ai gjendet ne /bitrix/modules/catalog/load/yandex_run.php

Natyra e skedarit

Siç u bë e qartë më lart, në arkitekturën Bitrix gjithçka nuk është shumë mirë. Por Bitrix ka gjithashtu një aspekt më të rëndësishëm të arkitekturës.
Bitrix është gjysma e një skedari CMS. Shumë gjëra kontrollohen nga disa lloj skedarësh:

  • Keni nevojë për një faqe - krijoni një skedar
  • Ju duhet një grup faqesh - krijoni një skedar dhe futni një komponent që funksionon me infoblocks
  • Ju duhet të vendosni një titull për faqen - modifikoni skedarin
  • Ju duhet të vendosni një titull për të gjitha faqet e seksionit - krijoni një skedar të veçantë file.section.php në rrënjë të këtij seksioni
  • Ju duhet të redaktoni të drejtat - modifikoni file.access.php
  • Cilësimet përpara fillimit të sistemit - në skedarët dbconn.php, .settings.php dhe .settings_extra.php
  • result_modifier.php, komponent_epilog.php, init.php, .parameters.php, .description.php ....

Dhe ka shumë skedarë të tillë të veçantë të shpërndarë nëpër Bitrix. Nga njëra anë, kjo jep një fleksibilitet të caktuar kur punoni me sistemin. Nga ana tjetër, mund të kthehet në agoni si për zhvilluesin ashtu edhe për menaxherin e faqes. Skedarët e faqeve ndonjëherë shndërrohen në një rrëmujë të kodit php, paraqitjes dhe përbërësve shtesë. Si rezultat redaktues vizual mund të analizojë gabimisht këtë skedar dhe kur e redakton atë, mund t'i shpëtojë lehtësisht etiketave php në disa vende, gjë që do të shkaktojë keqfunksionimin e faqes. Ju thoni - nuk keni nevojë të shkruani kodin php në skedarë të tillë? Po e di. Por Bitrix shumë shpesh dhe nuk ka alternativë ju detyron ta bëni këtë.
Dhe në kokë ju duhet të mbani vazhdimisht informacione se çfarë lloj skedarësh janë dhe çfarë të dhënash mund të përmbajnë. V skedarë të ndryshëm duhet të përmbajë të dhëna të ndryshme me strukturë të ndryshme, dhe ju duhet ta mbani mend atë për çdo opsion. Është punë e vështirë ta kërkosh çdo herë në dokumentacion.

Përveç sa më sipër

Mund të ankoheni pafundësisht se sa keq është rregulluar gjithçka në Bitrix. Sipas mendimit tim, të gjitha këto ankesa mund të karakterizohen nga një frazë - "disi jo deri në fund". Dhe me të vërtetë, nëse papritmas Bitrixoids shpallin ndonjë veçori, atëherë ata në një farë mënyre nuk do ta lëshojnë plotësisht, mos e mbarojnë, mos e sjellin në mendje. Ka shumë shembuj:

  • ORM e zbatuar - nuk e keni përfunduar, nuk mund ta përdorni plotësisht
  • bëri një ngarkues automatik, funksionon vetëm në module, dhe jo sipas standardeve
  • bëri të mundur lidhjen e motorit të shabllonit, por nuk mund ta përdorni kudo, dhe jo plotësisht
  • etj. etj.

Me pak fjalë, do të përpiqem të karakterizoj pjesën tjetër të problemeve me të cilat duhet të përballemi çdo ditë.

Paneli i administratorit

Nëse dikush ka punuar me panelin e administratorit, ka krijuar faqet e tij në pjesën administrative siç sugjeron Bitrix, ai do të më kuptojë. Është vetëm ferr. Për ata që nuk janë në dijeni, Bitrix sugjeron përdorimin e një skedari noodle për çdo faqe. Për shembull, faqja për shikimin e detajuar të porosive në panelin e administratorit të kryer nga zhvilluesit e Bitrix merr mbi 4k linja. IDE ime fillon të ngadalësohet kur shikon përmbajtjen e këtij skedari. Aty keni php, js dhe html. Epo, të paktën kemi hequr qafe SQL, megjithëse jam i sigurt se është në faqet e tjera të administratorit.
Dhe çfarë i pengoi faqet administrative të punonin me të njëjtët komponentë nuk është e qartë. Thjesht nuk ka asnjë mënyrë për të personalizuar shumicën e faqeve të administratorit. Në rastin e komponentëve, kjo mund të bëhet në asnjë kohë.
Meqe ra fjala, njerez te mire bëri një modul që do t'ju ndihmojë të ndërtoni faqe administrative

js kornizë

Bitrix ka një komponent js që vepron si një lloj kornize klienti. Asnjë nga zhvilluesit nuk e pëlqen atë për disa arsye:
  • është pothuajse pa dokumente
  • ai është monstruoz
  • ai kopjon kryesisht jquery, i cili është i njohur për shumë njerëz

Bitrix e përdor atë shumë shpesh në komponentët e tij, duke shkaktuar kështu edhe më shumë zemërim tek zhvilluesit. Bërthama e kësaj biblioteke në formë të minuar është 85 kb, që është shumë e madhe. Nuk do të mund ta shmangni lidhjen e tij nëse dëshironi të përdorni të gjitha aftësitë e Bitrix (përbërë, menaxhimi i aseteve).

Spirit copy-paste

V Kohët e fundit gjithnjë e më pak, por ende mjaft shpesh, Bitrix bën diçka për të kopjuar dhe ngjitur. Nëse dëshironi të modifikoni punën e një komponenti - copy-paste. Nëse dëshironi të krijoni shabllonin tuaj të shkarkimit, kopjoni kopjen e sistemit dhe përfundoni. Nëse dëshironi të bëni pothuajse të njëjtin shabllon që keni - kopjoni dhe ngjisni dhe ndryshoni pak. Dhe për këtë flitet edhe në kurse për zhvilluesit fillestarë. Nuk kam fjale.

Menaxhimi i aseteve dhe CDN

Më pëlqen shumë mënyra e menaxhimit të burimeve në Bitrix. Në parim, është e mundur të regjistrohet një grup "bibliotekash" specifike. Çdo bibliotekë është një grup skedarësh css / js, të cilat mund të varen nga disa biblioteka të tjera. Nëse lidhni një bibliotekë me faqen, atëherë përpara se ta lidhni atë, të gjitha varësitë do të zgjidhen dhe të gjitha bibliotekat e varura do të futen në faqe. Gjithçka duket se është në rregull, vetëm çdo burim do të futet në formë një skedar të veçantë në një etiketë skripti ose lidhjeje. Dhe falë kësaj, ka sajte që kanë 30-50 skripta dhe të njëjtin numër skedarësh stili të lidhur.
Pyetje mut, thanë ata në Bitrix, dhe bënë një shenjë magjike që i bashkon të gjitha këto skedarë në një. Dhe kishte faqe ku në vend të 50 skripteve kishte 2, secili prej 300-500 kb. Kohë më parë, ky bashkim funksionoi me gabime dhe shkriu disa herë të njëjtat burime, por tani duket se është rregulluar.
Dhe më pas Bitrixoids doli - ata bënë të mundur ngarkimin e të gjitha burimeve në një server CDN. Që bie përgjithmonë...
Pastaj u shfaq Google Pagespeed Insights, i cili rekomandoi të hiqeshin të gjitha burimet në pjesa e poshtme faqet. Dhe në Bitrix, ata përsëri bënë një tik-tak magjik, i cili në mënyrë budallaqe lë të gjitha burimet në trup, nëse ato nuk janë të shënuara me një atribut të veçantë.
Dhe ata gjithashtu shpërndajnë versione të minuara të skripteve të tyre së bashku me kutinë, të cilat lidhen kur përdorin një kuti tjetër magjike në panelin e administratorit.
Në përgjithësi, nuk ka scss për ju, pa TypeScript. Nëse dëshironi të menaxhoni siç duhet burimet - mos përdorni sistemin e integruar Bitrix, përdorni paketën e internetit, të cilën mund ta bëni lehtësisht miq me Bitrix.

Shumë faqe / shumëgjuhëshe

Kjo është ndoshta dhimbja më e keqe e zhvilluesve që ka ndodhur që nga fillimi i produktit. Nuk mund ta marrësh thjesht dhe të krijosh një faqe interneti shumëgjuhëshe. Dhe nëse keni nevojë për një drejtori shumëgjuhëshe me çmime të ndryshme dhe monedhat - shndërrohet në miell, për të cilin gjithashtu duhet të paguani një shumë të rregullt (do të duhet të paguani për të blerë një licencë shtesë për versionin tjetër të gjuhës së faqes).
Nëse po krijoni një faqe shumëgjuhëshe dhe me shumë monedha, atëherë përgatituni për faktin se Bitrix do t'i rezistojë shumë agresivisht kësaj. Cilësimet e shumë faqeve janë të decentralizuara në të gjithë zonën e administratorit. Çdo entitet në panelin e administratorit ka varësinë e tij nga versioni gjuhësor i faqes. Disa entitete mund të mos mbështesin fare varësitë e sajtit/gjuhës, dhe disa kanë vetëm një lidhje të paqartë me gjuhën, kështu që do t'ju duhet ta kopjoni këtë ent dhe më pas ta mbështesni atë.
V versioni bazë Për ta bërë infobllokun të funksionojë në disa gjuhë, do t'ju duhet të krijoni një dublikatë të këtij infoblloku. Por në praktikë, askush nuk e bën këtë dhe përpiqet të gjejë mënyrat e veta për ruajtjen e një entiteti në qendër, duke përhapur atributet e tij të varura nga gjuha në depo të tjera.
Nuk mund të vendosni gjuhën e paracaktuar për lokalizim. Nëse keni një variabël gjuhësor që përshkruan një frazë në rusisht dhe kjo variabël gjuhësore nuk është në anglisht, atëherë faqja në anglisht do të tregojë vijë bosh, dhe nuk mund të ndikohet në asnjë mënyrë (në shumë raste do të ishte e mundur të lihej fraza ruse në mënyrë që të mos kishte boshllëqe).

Mekanizmi i menaxhimit të të drejtave

Ne jemi shumë të ndërlikuar me këtë nënsistem. Shpesh është e vështirë të kuptosh pse i ke dhënë të drejtat për të parë një entitet, por përdoruesi nuk mund t'i përdorë ato. Për shembull, për të dhënë të drejtën për të redaktuar një infobllok, duhet të jepni akses në drejtorinë / bitrix / admin, të jepni të drejta për një infobllok specifik dhe të drejtat e dhënies në modulin kryesor. Duhet të kryhen shumë operacione për të dhënë leje për një subjekt. Dhe nëse nuk ka të drejta të mjaftueshme, atëherë pa u futur në kodin burimor, nuk do të jeni në gjendje të kuptoni pse.

Konfigurimi

Bitrix nuk ka një qendër të centralizuar që do t'ju lejojë të menaxhoni cilësimet e sistemit. Cilësimet janë përsëri të decentralizuara në të gjithë sistemin. Opsionet janë të disponueshme në cilësimet e modulit, në cilësimet e komponentëve, në COption (nuk zhvendoset në panelin e administratorit). Në panelin e administratorit, opsionet për një modul mund të ndahen 3-4 m faqe të ndryshme që janë në vende krejtësisht të ndryshme. urlrewrite mund të modifikohet përmes panelit të administratorit! Tani edhe .settings dhe.settings_extra. Ndonjëherë është plotësisht e paqartë se cilat prej tyre kanë përparësi më të lartë, shumë shpesh nuk ka shpjegim të mjaftueshëm për opsionet, marrëdhënia nuk është e qartë. Nuk ka asnjë mënyrë origjinale për të ndarë konfigurimin midis zhvilluesve.
Cilësimet mund të jenë shumë të palogjikshme. Ndonjëherë ajo arrin deri në pikën e absurditetit ... shikoni komponentin bigdata - a mundet një person i papërgatitur ta personalizojë atë?

Integrimi me 1C

Ky është artikulli në listën e veçorive të Bitrix që mjafton nje numer i madh i klientët. Bitrix premton të krijojë një integrim të dyanshëm të faqes me 1C me 2 klikime, i cili do të japë menjëherë përmbajtje dhe dokumente nga një sistem në tjetrin.
Po, me të vërtetë është, por me disa paralajmërime.
Së pari, për të bërë integrimin "jashtë kutisë" pa përpjekje shtesë, duhet të bëni gjithçka saktësisht siç është shkruar në dokumentacionin e Bitrix - të ndërtoni një drejtori në sit sipas rregullave që ofron Bitrix dhe të ndërtoni një katalog në 1C. që kërkon Bitrix. Idealisht, krijoni gjithçka nga e para, dhe më pas ndoshta gjithçka do të funksionojë për ju jashtë kutisë.
Së dyti, Bitrix nuk është miqësor me të gjitha konfigurimet 1C jashtë kutisë. Ja vlen ta lexoni paraprakisht
Së treti, botë ideale nuk mund të jetë. Zakonisht një klient që dëshiron një faqe interneti ka tashmë një biznes me pakicë, që do të thotë se ai tashmë ka 1C, që është një kosh i madh plehrash. Dhe këto plehra mund të hidhen në vend. Dhe në mënyrë që faqja të mos marrë të njëjtin kosh plehrash, kërkohet të modifikohet ndjeshëm mekanizmi i shkëmbimit.
Shumë shpesh, kërkesat e klientit ndryshojnë fuqimisht nga vizioni i produktit që është formuar nga ekipi Bitrix, dhe më pas modifikimi i mekanizmit të shkëmbimit mund të jetë mjaft i shtrenjtë, për sa i përket intensitetit të punës, i krahasueshëm me zhvillimin e një moduli unik shkëmbimi për një rast specifik.
Prandaj, nuk ka nevojë të provoni iluzionin se do të jeni në gjendje të integroni lehtësisht faqen me 1C. Këto janë të gjitha intrigat e tregtarëve.

Përmirësimi i shkëmbimit me 1C është gjithashtu një temë më vete. Klasa \ CIBlockCMLImport është përgjegjëse për organizimin e shkëmbimit të drejtorisë - 5.7k rreshta. Një nga metodat kryesore, e cila më së shpeshti kërkon zgjerim - \ CIBlockCMLImport :: ImportElement, përmban më shumë se 1k rreshta. Mjafton ta trashëgoni një herë, ta përditësoni produktin disa herë për një kohë të gjatë dhe mund të merrni një shkëmbim jo funksional me 1C. Prandaj, zhvilluesit shpesh nuk hyjnë në këtë klasë dhe përpiqen të futen disi në procesin e importimit duke përdorur mbajtësit e ngjarjeve. Puna me mbajtës të ngjarjeve në Bitrix, veçanërisht në modulin e infoblocks, nuk është gjithashtu një përvojë shumë e këndshme, vetëm për shkak të faktit se ngjarjet e të njëjtit lloj nuk janë rregulluar në mënyrë uniforme, dhe disa ngjarje thjesht nuk janë të mjaftueshme.
Në përgjithësi, kjo situatë është aq e trishtuar si më parë.

Mospërputhje

Ndonjëherë më duket se zhvilluesit module të ndryshme ata nuk komunikojnë realisht me njëri-tjetrin. Duke studiuar kodin burimor të kernelit, hasni në zgjidhje shumë heterogjene që mund të ekzekutohen në të njëjtin motor, por për disa arsye ato zbatohen në mënyra të ndryshme.
Për shembull, mund të merrni vetitë e elementeve të infoblocks dhe UserFields. Si njëri ashtu edhe entiteti tjetër është në fakt fushë shtesë për një subjekt tjetër. Ai ka një lloj, një kuptim dhe një përshkrim. Vlera ruhet në një tabelë (ta) të veçanta të bazës së të dhënave, ato kanë një ndërfaqe afërsisht të ngjashme të aksesit të të dhënave. Pra, pse të mos i bëni ato të njëjtën ndërfaqe?
Në fund të marsit, moduli i shitjes u përditësua në Versioni i fundit, dhe ata premtuan edhe atje vetitë arbitrare për porositë. A ka një ndërfaqe të re, të tretë për të punuar me vetitë e zgjeruara të një entiteti tani?

Bitrix24

Kjo është përgjithësisht një temë e veçantë për bisedë. Konfuzioni shpesh lind në bazë të këtij sistemi. Ekzistojnë 2 versione të B24 - SaaS dhe Standlone. Ekziston një treg për B24, por ai përmban vetëm aplikacione për versionin SaaS! Nëse keni një version në kuti, të blerë për 200 copë, nuk do të jeni në gjendje ta dorëzoni këtë aplikacionet më të njohura, si një ndërtues dokumentesh, dhe në përgjithësi nuk mund të instaloni asnjë aplikacion nga tregu Bitrix24 në Bitrix24 tuaj. Këtu është një paradoks.
Në vend të kësaj, një treg nga version i rregullt... Ka shumë më tepër zgjidhje atje, por ato janë të përqendruara kryesisht rreth Menaxhimit të Sitit, dhe jo B24.

Bitrix24, siç më thanë në departament mbeshtetje teknike, është një sistem i plotë. Nëse ju ndërhyni në punë komponentët standardë sistemet, atëherë përgatituni që ky funksionalitet të prishet me përditësimet e mëvonshme. Bitrix nuk do të llogarisë tek ju për të finalizuar komponentët e portalit, pavarësisht faktit se ata zyrtarisht i dërgojnë klientët e tyre te partnerët

Nga rruga, për të rafinuar komponentët në version në kuti B24 është një problem tjetër. Komponentët që gjenerojnë kodin js që përdor ajax për të hyrë kodi php e cila gjeneron html + js si përgjigje. Kjo është një përzierje djallëzore në të cilën vërtet nuk dëshironi të zhyteni.

Dokumentacioni

Dokumentacioni Bitrix mbetet prapa zhvillimit të produktit me 1-1,5 vjet. Kodi mbulohet shumë dobët nga phpDoc "s, dhe shpesh komenti para klasës është vetëm" për shfaqje ", duke u gjeneruar automatikisht në IDE.
Vetë stili i paraqitjes së dokumentacionit në burimet zyrtare është shpesh shumë "falas", dhe përmbajtja e disa artikujve në dokumentacion mund të mos ketë asnjë lidhje me vetë Bitrix.
Kursi i zhvilluesit ka shumë informacion, por formati në të cilin zhvilluesi njihet me aftësitë e sistemit nuk ofron nivelin e perceptimit që kërkohet. Nëse shkoni te libri i gatimit Symfony, atëherë gjithçka është vendosur në raftet, të gjitha aspektet e nevojshme përshkruhen në varësi të versionit. Ndërsa në Bitrix, kursi i trajnimit të zhvilluesit përmban, nuk është e qartë se mbi çfarë baze informacion të strukturuar në bërthamën e vjetër dhe të re, e cila fillimisht ushqehet veçmas, dhe më pas përzihet, nga e cila fillestarët kanë dhimbje koke.

Organizimi i procesit të zhvillimit

Për shkak të specifikës së sistemit, nuk është aq e lehtë të organizohet proces i përshtatshëm zhvillimin. Jo më së shumti version i freskët edicioni Business (i cili ishte pranë) pasi instalimi merr, mendoni për të, pothuajse 530 megabajt
$ du -s * | rendit -nr | prerë -f 2- | ndërsa lexohet a; bëj du -hs $ a; kryer 523M bitrix 204K Ngarkimi 64K bitrixsetup.php 56K desktop_app 20K readme.html 20K licencë.html 4.0K ueb . konfigurim 4.0K urlrewrite.php 4.0K readme.php 4.0K licencë.php 4.0K install.config 4.0K index.php
Gjysma e mirë e këtij vëllimi janë binare dhe instalues, të cilët, në përgjithësi, nuk nevojiten për kontrollin e versionit. Në përgjithësi, është zakon të mos versiononi kernelin bitrix. Zhvilluesit e Bitrix, si të thuash, garantojnë vetë integritetin e kernelit, menaxhojnë varësitë e versioneve të moduleve të ndryshme gjatë përditësimeve. Por kjo mbart menjëherë të paktën një pengesë të madhe - është e pamundur të vendosësh një projekt plotësisht funksional me një komandë nga kontrolli i versionit, duhet ta montoni atë në pjesë: merrni burimin e kernelit nga rezervimi bitrix dhe burimin e zhvilluesve nga git. .
Baza gjithashtu nuk është në rregull. Nëse ju vetë mund të përdorni migrimet gjatë zhvillimit, atëherë Bitrix sjell përditësime në bazën e të dhënave duke përdorur skriptet e zakonshme që nuk mund t'i kontrolloni. Prandaj, gjatë përditësimeve, do t'ju duhet ende të transferoni kopje rezervë të bazës së të dhënave nga hosti qendror i zhvillimit te zhvilluesit e tjerë.
Njerëzit e sjellshëm, përsëri, panë mjetet që ndihmojnë për të organizuar gjithë këtë, por për fat të keq, ende nuk është e mundur të detyrosh Bitrix të ndjekë këto rregulla.
Zyrtarisht, Bitrix ju lejon të keni 2 kopje të një komplete shpërndarjeje. Njëra është për prodhim, tjetra është për zhvillim. Nëse keni disa zhvillues në një projekt, atëherë jeni, si të thuash, jashtë ligjit) Në fakt, mjafton të ndërpritni lidhjet hyrëse dhe dalëse nga / në www.bitrixsoft.com për makinën Bitrix, dhe më pas ju mund të mbledhin sa më shumë kopje të zhvillimit që dëshironi, ata thjesht nuk do të jenë në gjendje të përditësohen vetë.

Kolegët

Dhe pyetja e fundit që do të doja të prekja.
Për faktin se Bitrix ka një prag të ulët hyrjeje, ka shumë personel të pakualifikuar në mesin e kompanive që ofrojnë shërbime në këtë treg. Më ka ndodhur të shoh shumë projekte të ndryshme gjatë karrierës sime (më shumë se njëqind në total), të ekzekutuara në 1C-Bitrix. Mund të them me bindje se 95% e tyre janë bërë “derr-gafë”. Shumë rrallë kishte projekte, për zhvillimin e të cilave ndjehej një qasje, por këto ishin vetëm disa. E gjithë kjo është shumë e trishtueshme.

konkluzionet

Sigurisht, të gjitha disavantazhet në një artikull nuk mund të merren parasysh. Çdo ditë hasni në disa gjëra të vogla që ju pengojnë në punën tuaj çdo ditë. Por është thjesht e pamundur të merren parasysh të gjitha vogëlsitë e tilla, dhe ndoshta jo për asgjë.

Çfarë përfundimesh mund të nxirren këtu. Bitrix është një sistem jashtëzakonisht kompleks për faktin se ka një arkitekturë të konceptuar keq, shumë të meta që vazhdojnë të jetojnë në produkt për një kohë të gjatë. Nga ana tjetër, Bitrix është i mjaftueshëm sistem i thjeshtë, e cila kërkon një nivel shumë më të ulët aftësish për të filluar, ndryshe nga kornizat.
Mbështetja e këtij produkti është një detyrë shumë e pafalshme në krahasim me produkte të tilla si Symfony, Laravel, Yii. Produkti pëlqen shumë të vendosë një fole në rrotat e zhvilluesve të papërvojë dhe me përvojë, gjë që, nga ana tjetër, mund të ndikojë në koston e shërbimeve të zhvilluesve me përvojë për Bitrix.

A më vjen keq që kam kaluar kaq shumë kohë duke punuar me këtë sistem? Në vend që po se jo. Do të ishte më e mençur ta kalonim këtë kohë duke mësuar diçka më korrekte dhe më logjike (të cilën po përpiqem ta bëj aktivisht tani). Por ndodhi që nuk kishte njeri që të më drejtonte në rrugën e duhur në fillim të udhëtimit tim.

Nëse ti - php fillestar zhvilluesi, më pas zgjidhni Bitrix për të studiuar korniza të tilla si Symfony, Laravel, Yii, ZendFramework. Më besoni, do të shpërblehet me interes në të ardhmen. Pasi të keni zotëruar ndonjë nga këto korniza, nuk do të jetë e vështirë për ju të zhvilloni diçka për Bitrix në të ardhmen. Nëse nuk keni zgjidhje, atëherë studioni Bitrix, por në kohë e lirëështë më mirë të përpiqeni të zhyteni në botën e kornizave në mënyrë që të vendosni trurin në vend.

Nëse jeni një zhvillues me përvojë në Bitrix, por pa përvojë në korniza të tjera, atëherë sigurohuni që të zhyteni në një botë tjetër, do të zbuloni shumë njohuri të reja dhe të dobishme që do t'ju ndihmojnë të shkruani zgjidhje shumë më të mira për 1C-Bitrix. Përpiquni të përdorni zgjidhje nga korniza të tjera në projektet tuaja, pasi nuk është e vështirë ta bëni këtë falë qasjes përbërëse të këtij të fundit dhe kompozitorit.

Nëse jeni klient, atëherë mos u besoni tregtarëve të Bitrix. Asgjë nuk do të jetë aq e lehtë sa thonë në prezantimet e Bitrix. Dhe mos fajësoni zhvilluesit tuaj, ata nuk kanë asnjë lidhje me të. Nëse dëshironi të krijoni një dyqan online të madh dhe kompleks të nivelit eldorado / mvideo / sportmaster, atëherë, ndoshta, Bitrix nuk do të jetë zgjidhja më e mirë.

UPD. Shihet se artikulli është lexuar nga punonjësit e Bitrix. Në seksionin rreth Marketingut, kam shkruar se thirrjet e marketingut janë shkruar në seksionin Arkitekturë të kursit të zhvilluesve Bitrix. Tani ata nuk janë aty. Madje u vulosën, me sa duket, nxitonin.

Faleminderit kënd për vëzhgimin dhe syrin e mprehtë :)

Etiketa:

Shto etiketa

Artikujt kryesorë të lidhur