Cum se configurează smartphone-uri și PC-uri. Portal informativ
  • Acasă
  • Programe
  • Secțiunea chatty php. Crearea de funcții cu un număr variabil de argumente

Secțiunea chatty php. Crearea de funcții cu un număr variabil de argumente

Un articol care discută despre HTML element de secțiune din categoria secţionare.

Scopul elementului de secțiune

Elementul secțiune este folosit pentru a crea o secțiune într-un document care grupează un conținut de actualitate. Pentru fiecare secțiune din document, trebuie indicat titlul (subiectul). Acest lucru se face de obicei cu titluri (elemente h1 - h6).

Titlul secțiunii

Conținutul secțiunii...

elementele de secțiune sunt utilizate de obicei în următoarele cazuri:

  • pentru a marca secțiunile dintr-o secțiune. De exemplu, pentru a marca capitole dintr-un articol, file dintr-o casetă de dialog, secțiuni dintr-o disertație etc.
  • pentru a grupa mai multe secțiuni într-una singură grup tematic. De exemplu, a grupa cele mai recente știri pe site, comentarii la articol etc.

Astfel, elementul secțiune ar trebui folosit doar pentru un anumit conținut dacă are un titlu și face parte din altceva.

Aplicarea elementului de secțiune

De exemplu, luați în considerare un fragment de cod de pagină care conține un articol cu ​​comentarii. Fiecare dintre comentariile lăsate de utilizator pe pagină conține un conținut completat și, prin urmare, poate fi considerat un element de articol. Dar, în același timp, toate comentariile reprezintă un grup de subiecte și, prin urmare, pot fi plasate în elementul de secțiune, i.e. element dat va grupa toate acele comentarii de pe pagină împreună.

Titlul articolului

Comentarii

Titlul comentariului

Textul comentariului...

Titlul comentariului

Textul comentariului...

Titlul articolului Comentarii Titlul comentariului Titlul comentariului

De exemplu, luați în considerare utilizarea elementelor de secțiune pentru a crea secțiuni în cadrul unui element articol:

Numele cărții

Primul capitol

Al doilea capitol

Al treilea capitol

anexa a

Anexa B

Exemplul de mai sus ar avea următoarea structură (contur):

Titlul cărții Primul capitol al doilea capitol al treilea capitol Anexa A Anexa B

Restricții la utilizarea elementului de secțiune

Elementul de secțiune din HTML 5 nu este un element generic pentru gruparea conținutului; nu ar trebui să fie folosit pentru a include orice conținut care vă place. Scopul său principal este de a adăuga semantică documentului și de a crea structura acestuia (contur).

Când un autor trebuie să grupeze conținut doar pentru a-l stila sau pentru a lucra cu el în JavaScript, cel mai bun lucru de făcut este să folosească elementul div. Elementul div, spre deosebire de elementul section, nu adaugă semantică documentului și nu participă la crearea structurii acestuia (contur).

Diferența dintre elementele de secțiune și de articol

Elementele de secțiune și articol, deși par foarte asemănătoare, au semnificații semantice diferite. Elementul articol este pentru gruparea conținutului care este complet, independent și poate fi considerat separat de restul conținutului paginii. Iar elementul de secțiune are o semnificație semantică diferită, este destinat să grupeze conținut care este parte integrantă a altceva.

Dar de unde știe un autor ce este conținutul unei pagini? Să ne uităm la asta folosind un exemplu de fragment de articol. Un fragment face parte dintr-un articol și, prin urmare, elementul de secțiune trebuie utilizat pentru gruparea conținutului acestuia. Dar același fragment, deja lăsat ca comentariu, va fi ceva întreg, complet. Prin urmare, în acest context, elementul articol poate fi folosit pentru a-l grupa. Dar, desigur, se poate argumenta și contrariul. Prin urmare, ce element să folosești pentru a grupa conținutul în cele mai multe cazuri depinde de opinia ta subiectivă ca autor. Dar cel mai important lucru în această abordare este menținerea poziției alese. Prin urmare, cu cât autorul este mai consecvent în crearea structurii, cu atât va putea să dea mai mult sens în ea.

Șabloanele din Bitrix pot fi împărțite în mai multe tipuri:
  • Șabloane de componente comune și complexe 2.0
  • Șabloane de site
  • Șabloane pentru alte entități (e-mailuri, lansări de buletine informative, formulare web, generatoare de export și multe altele)

Șabloanele de componente au chiar și capacitatea de a utiliza motoare de șabloane. În principiu, puteți conecta orice motor șablon, dar nu există instrumente auxiliare din cutie. Dacă cineva are nevoie de el, am câteva link-uri către extensii pentru crenguță și lamă, care funcționează și sunt destul de folosite în producție. Dar chiar și aici Bitrixoids au pervertit. Motorul de șablon poate fi utilizat numai cu componente. Conectarea motorului de șablon la redarea șablonului site-ului sau la alte entități nu va funcționa, deoarece. acolo nu există un renderer.

În șabloanele componente, un alt punct cu plasarea lor este enervant. Componenta este conectată folosind un design simplu
$APPLICATION->IncludeComponent("bitrix:catalog.section", "nume_șablon", );
Al doilea parametru este numele șablonului componentei. Deci, în funcție de diverse conditii, locația acestui șablon poate fi în cele mai neașteptate locuri:

  • bitrix/components/bitrix/catalog.section/templates/template_name
  • local/components/bitrix/catalog.section/templates/template_name
  • bitrix/templates/.default/components/bitrix/catalog.section/template_name
  • bitrix/templates/site_template/components/bitrix/catalog.section/template_name
  • local/templates/.default/components/bitrix/catalog.section/template_name
  • local/templates/site_template/components/bitrix/catalog.section/template_name
  • bitrix/components/bitrix/catalog/templates/.default/bitrix/catalog.section/template_name
  • local/templates/site_template/components/bitrix/catalog/.default/bitrix/catalog.section/template_name
Și încă nu am enumerat toate opțiunile...

Un șablon de site poate fi vizualizat ca un set de fișiere: header.php, footer.php (da, site-ul trebuie să le aibă), description.php ( descrierea sistemuluișablon de site), template_styles.css (stiluri de șabloane de site), un director cu șabloane componente și un grup de fișiere mai puțin importante. Și asta e tot. Și nu există nicio modalitate de a o influența, nimic de-a face cu ea. Nu se poate conecta motorul de șablon.

Nu este nimic de spus despre alte șabloane. Ele fie sunt pur și simplu stocate în baza de date sub formă de aspect cu includerea unor date „variabile” în ea, fie este o prostie fișier php, care face toată munca, de la preluarea parametrilor din baza de date până la afișarea informațiilor. De exemplu, vă puteți uita la generatorul de fișiere YML pentru piață. Nu are rost să-l postezi aici, pur și simplu pentru că este destul de mare, cam de 2k de linii. Cine are nevoie, caută pe google, se află în /bitrix/modules/catalog/load/yandex_run.php

Natura fișierului

După cum a devenit clar mai sus, totul nu este foarte bine în Bitrix cu arhitectură. Dar Bitrix are și un alt aspect important al arhitecturii.
Bitrix este un CMS cu jumătate de fișier. Multe lucruri sunt controlate folosind un fel de fișiere:

  • Aveți nevoie de o pagină - creați un fișier
  • Aveți nevoie de un set de pagini - creați un fișier și conectați acolo o componentă care funcționează cu infoblocuri
  • Trebuie să setați un titlu pentru pagină - editați fișierul
  • Trebuie să setați un titlu pentru toate paginile secțiunii - creați un fișier special .section.php în rădăcina acestei secțiuni
  • Trebuie să editați drepturile - editați fișierul .access.php
  • Setări înainte de inițializarea sistemului - în fișierele dbconn.php, .settings.php și .settings_extra.php
  • result_modifier.php, component_epilog.php, init.php, .parameters.php, .description.php ....

Și există o mulțime de astfel de fișiere speciale împrăștiate în jurul Bitrix. Pe de o parte, acest lucru oferă o anumită flexibilitate atunci când lucrați cu sistemul. Pe de altă parte, se poate transforma într-un chin atât pentru dezvoltator, cât și pentru managerul site-ului. Fișierele de pagină se transformă uneori într-o mizerie de cod php, aspect și pluginuri. Ca rezultat editor vizual poate analiza incorect acest fișier și, atunci când îl editați, poate scăpa cu ușurință de etichetele php în unele locuri, ceea ce va duce la nefuncționarea paginii. Spuneți - nu scrieți cod php în astfel de fișiere? Da, stiu. Dar Bitrix foarte des și fără forțe alternative pentru a face acest lucru.
Da, și trebuie să țineți cont în mod constant de informații despre ce fel de fișiere sunt și ce date pot conține. ÎN fișiere diferite ar trebui să conțină date diferite structură diferită, și trebuie să-l amintiți pentru fiecare opțiune. Să-l cauți în documentație de fiecare dată este o muncă grea.

Pe lângă cele de mai sus

Vă puteți plânge la nesfârșit de cât de prost este totul aranjat în Bitrix. În opinia mea, toate aceste plângeri pot fi caracterizate printr-o singură expresie - „cumva nu complet”. Și într-adevăr, dacă Bitrixoids anunță brusc un fel de caracteristică, atunci nu o eliberează cumva complet, nu o termină, nu o aduc în minte. Exemple - masa:

  • implementat ORM - nefinalizat, nu îl puteți folosi la maximum
  • făcut un autoloader, funcționează doar în module, și nu după standarde
  • a făcut posibilă conectarea unui motor de șablon, dar nu poate fi folosit peste tot și nu complet
  • etc. etc.

Pe scurt, voi încerca să caracterizez restul problemelor cu care trebuie să mă confrunt zilnic.

admin

Dacă cineva a lucrat cu panoul de administrare, și-a creat paginile în partea administrativă așa cum sugerează Bitrix, mă va înțelege. E doar iadul. Pentru cei care nu cunosc, Bitrix sugerează să folosească un fișier cu tăiței pentru fiecare pagină. De exemplu, pagina de vizualizare a detaliilor comenzii din zona de administrare a dezvoltatorilor Bitrix preia 4k de linii. IDE-ul meu începe să încetinească la vizualizarea conținutului acestui fișier. Acolo aveți php, js și html. Ei bine, măcar au scăpat de SQL, deși sunt sigur că e pe alte pagini administrative.
Și ce a împiedicat paginile administrative să facă lucrul folosind aceleași componente nu este clar. Pur și simplu nu există nicio modalitate de a personaliza majoritatea paginilor administrative. În cazul componentelor, acest lucru se poate face într-o clipă.
Apropo, oameni buni a realizat un modul care vă va ajuta să construiți pagini administrative

js framework

Bitrix are o componentă js care acționează ca un fel de cadru client. Niciunul dintre dezvoltatori nu-i place din mai multe motive:
  • este aproape nedocumentat
  • el este un monstru
  • dublează în mare măsură jquery familiar pentru mulți

Bitrix îl folosește foarte des în componentele sale, provocând astfel și mai multă furie în rândul dezvoltatorilor. Nucleul acestei biblioteci într-o formă redusă este de 85 kb, ceea ce nu este mult. Nu va fi posibil să evitați conectarea acestuia dacă doriți să utilizați toate caracteristicile Bitrix (compozit, asset-management).

spirit copy-paste

ÎN În ultima vreme din ce în ce mai puțin, dar totuși destul de des, Bitrix face ceva copy-paste. Dacă doriți să modificați funcționarea unei componente - copiați-lipiți. Dacă doriți să vă creați propriul șablon de încărcare, copiați-lipiți cel de sistem și finalizați-l. Dacă doriți să faceți aproape același șablon pe care îl aveți - copiați-lipiți și schimbați-l puțin. Și chiar vorbesc despre asta în cursurile pentru dezvoltatori începători. Nu am cuvinte.

Gestionarea activelor și CDN

Îmi place foarte mult modul de a gestiona resursele în Bitrix. În principiu, este posibilă înregistrarea unui set de anumite „biblioteci”. Fiecare bibliotecă este un set de fișiere css/js care pot depinde de alte biblioteci. Dacă includeți o bibliotecă pe pagină, atunci înainte de a o conecta, toate dependențele vor fi rezolvate și toate bibliotecile dependente vor fi inserate în pagină. Totul pare să fie în regulă, doar fiecare resursă va fi inserată în formular dosar separatîntr-un script sau etichetă de link. Și datorită acestui lucru, există site-uri care au 30-50 de scripturi conectate și același număr de fișiere de stil.
Rahat-întrebare, au spus ei în Bitrix și au făcut o bifă magică care combină toate aceste fișiere într-unul singur. Și au apărut site-uri unde în loc de 50 de scripturi erau 2, fiecare de 300-500kb. În urmă cu ceva timp, acest sindicat a lucrat cu erori și a combinat de mai multe ori aceleași resurse, dar acum pare să fi fost reparat.
Și apoi Bitrixoids au ieșit - au distrus capacitatea de a încărca toate resursele pe serverul CDN. care cade mereu...
Apoi a apărut Google Pagespeed Insights, care a recomandat reducerea tuturor resurselor partea inferioară pagini. Și în Bitrix au făcut din nou o bifă magică, care scade prostește toate resursele din corp, dacă nu sunt marcate cu un atribut special.
Ei distribuie, de asemenea, versiuni reduse ale scripturilor lor împreună cu caseta, care sunt conectate atunci când folosesc o altă bifă magică în panoul de administrare.
În general, fără scss pentru tine, fără TypeScript. Dacă doriți să gestionați cu competență resursele - nu utilizați sistemul Bitrix încorporat, utilizați webpack, cu care vă puteți împrieteni cu ușurință cu Bitrix.

Multisite / multilingv

Aceasta este probabil cea mai mare durere de cap pentru dezvoltatori care a avut loc de la începutul produsului. Nu poți să-l iei și să creezi un site multilingv. Și dacă aveți nevoie de un catalog multilingv cu preturi diferiteși valute - apoi se transformă în făină, pentru care trebuie să plătiți și o sumă ordonată (va trebui să plătiți pentru achiziționarea unei licențe suplimentare pentru următoarea versiune lingvistică a site-ului).
Dacă creați un site multilingv și multivalută, atunci fiți pregătiți pentru faptul că Bitrix va rezista foarte agresiv. Setările multisite sunt descentralizate în panoul de administrare. Fiecare entitate din panoul de administrare are propria sa dependență de versiunea lingvistică a site-ului. Este posibil ca unele entități să nu accepte deloc dependențe de site/limbă, iar unele au doar o legătură clară cu limba, așa că această entitate va trebui să fie duplicată și apoi acceptată.
ÎN versiunea de bază pentru ca un infoblock să funcționeze în mai multe limbi, va trebui să creați o copie a acestui infoblock. Dar, în practică, nimeni nu face acest lucru și încearcă să vină cu propriile modalități de stocare centrală a unei entități, răspândindu-și atributele dependente de limbă în alte magazine.
Nu puteți seta limba implicită la localizare. Dacă aveți o variabilă de limbă care descrie o expresie în rusă, iar această variabilă de limbă nu este disponibilă în engleză, atunci site-ul în limba engleză va afișa linie goală, iar acest lucru nu poate fi influențat în niciun fel (în multe cazuri, s-ar putea lăsa expresia rusă pentru a nu exista goluri).

Mecanism de gestionare a drepturilor

Foarte zamudili cu acest subsistem. Este adesea dificil să vă dați seama de ce ați acordat drepturile de vizualizare a unei entități, iar utilizatorul nu le poate folosi. De exemplu, pentru a acorda dreptul de a edita un infoblock, trebuie să acordați acces la directorul /bitrix/admin, să acordați permisiuni pentru un anumit infoblock și să acordați permisiuni în modulul principal. Trebuie făcute prea multe operațiuni pentru a emite drepturi pentru o entitate. Și dacă nu există suficiente drepturi, atunci fără a alege codurile sursă nu va fi posibil să înțelegem de ce.

Configurare

Bitrix nu are un hub centralizat care să vă permită să gestionați setările sistemului. Setările sunt din nou descentralizate în întregul sistem. Există opțiuni în setările modulului, în setările componentelor, în COption (fără a fi plasate în panoul de administrare). În panoul de administrare, opțiunile unui modul pot fi distanțate la 3-4 metri pagini diferite care se află în locuri complet diferite. urlrewrite poate fi editat prin panoul de administrare! Acum și .settings și .settings_extra. Uneori nu este deloc clar care dintre ele are mai multă prioritate, de foarte multe ori nu există suficiente explicații pentru opțiuni, relațiile nu sunt clare. Nu există o modalitate nativă de a partaja configurația între dezvoltatori.
Setările sunt foarte ilogice. Uneori se ajunge la absurd... uită-te la componenta bigdata - poate o persoană nepregătită să o configureze?

Integrare cu 1C

Acesta este elementul de pe lista de caracteristici Bitrix care este suficient pentru a mușca un numar mare de Clienți. Bitrix promite să configureze integrarea bidirecțională a site-ului cu 1C în 2 clicuri, care va livra instantaneu conținut și documente de la un sistem la altul.
Da, chiar este, dar cu câteva avertismente.
În primul rând, pentru a face integrarea „din cutie” fără eforturi suplimentare, trebuie să faceți totul exact așa cum este scris în documentația Bitrix - construiți un catalog pe site conform regulilor pe care le oferă Bitrix și construiți un catalog în 1C pe care îl cere Bitrix. În mod ideal, creați totul de la zero și apoi poate totul va funcționa pentru dvs. din cutie.
În al doilea rând, Bitrix nu este prietenos cu toate configurațiile 1C din cutie. Merită verificat mai întâi
În al treilea rând, lume ideală nu poate fi. De obicei, un client care își dorește un site web are deja o afacere cu amănuntul, ceea ce înseamnă că are deja 1C, care este un coș de gunoi uriaș. Și acest gunoi trebuie aruncat pe șantier. Și pentru ca site-ul să nu primească același gunoi, este necesar să se îmbunătățească semnificativ mecanismul de schimb.
De foarte multe ori, cerințele clientului diferă foarte mult de viziunea produsului care a fost format de echipa Bitrix, iar atunci modificarea mecanismului de schimb poate fi destul de costisitoare, din punct de vedere al intensității muncii comparabilă cu dezvoltarea unui modul de schimb unic pentru un caz anume.
Prin urmare, nu este nevoie să vă faceți iluzii cu privire la faptul că veți putea integra cu ușurință site-ul cu 1C. Acestea sunt toate mașinațiunile marketerilor.

Rafinarea schimbului cu 1C este, de asemenea, o problemă separată. Clasa \CIBlockCMLImport este responsabilă de organizarea schimbului de catalog - 5.7k linii. Una dintre metodele principale care trebuie extinsă cel mai adesea este \CIBlockCMLImport::ImportElement, care conține mai mult de 1k linii. Este suficient să-l moșteniți o dată, să actualizați produsul de câteva ori pentru o lungă perioadă de timp și puteți obține un schimb nefuncțional cu 1C. Prin urmare, dezvoltatorii de multe ori nu urcă în această clasă și încearcă să intre cumva în procesul de import folosind handlere de evenimente. Lucrul cu handlere de evenimente în Bitrix, în special în modulul infoblock, nu este nicio experiență foarte plăcută, fie și doar pentru că evenimentele de același tip nu sunt aranjate uniform, iar unele evenimente pur și simplu nu sunt suficiente.
În general, lucrurile sunt la fel de triste ca înainte.

Incoerență

Uneori mi se pare că dezvoltatorii module diferite nu prea comunică între ei. Studiind codul sursă al nucleului, dați peste soluții foarte eterogene care ar putea fi implementate pe un singur motor, dar din anumite motive sunt implementate diferit.
De exemplu, putem lua proprietățile elementelor infoblock și UserFields. Ambele aceste entități sunt, de fapt, câmp suplimentar pentru o altă entitate. Are un tip, o valoare și o descriere. Valoarea este stocată într-un tabel(e) separat(e) din baza de date, acestea având aproximativ aceeași interfață de acces la date. Deci, de ce să nu le faceți aceeași interfață?
La sfârșitul lunii martie, modulul de vânzare a fost actualizat la ultima versiune, și au promis de asemenea proprietăți personalizate pentru comenzi. Există acum o nouă, a treia interfață pentru lucrul cu proprietăți extinse ale entității?

Bitrix24

Acesta este, în general, un subiect separat de discuție. Există adesea confuzie cu privire la acest sistem. Există 2 versiuni de B24 - SaaS și Standlone. Există o piață pentru B24, dar conține aplicații doar pentru versiunea SaaS! Daca ai o versiune in cutie achizitionata pentru 200 de bucati, nu vei putea pune asta aplicații de top, ca constructor de documente și, în general, nu veți putea instala nicio aplicație de pe piață pentru Bitrix24 pe Bitrix24. Iată un astfel de paradox.
În schimb, o piață de la versiune obisnuita. Există multe mai multe soluții, dar ele se concentrează în principal pe Site Management, nu pe B24.

Bitrix24, așa cum mi s-a spus în departament suport tehnic, este un sistem complet. Dacă te amesteci cu munca componente standard sistem, apoi fiți pregătit că această funcționalitate se va întrerupe cu actualizările ulterioare. Bitrix nu va conta pe finalizarea componentelor portalului, și asta în ciuda faptului că își trimit oficial clienții către parteneri.

Apropo, modificați componentele în versiunea cutie B24 este o altă problemă. Componente care generează cod js care accesează prin ajax cod php, care generează html+js ca răspuns. Este un amestec al naibii în care chiar nu vrei să te scufunzi.

Documentație

Documentația Bitrix rămâne în urmă cu 1-1,5 ani în urma dezvoltării produsului. Codul este foarte slab acoperit de phpDocs, iar de multe ori comentariul dinaintea clasei este doar pentru show, fiind generat automat în IDE.
Însuși stilul de prezentare a documentației în sursele oficiale este adesea prea „liber”, iar conținutul unor articole din documentație poate să nu aibă nicio legătură cu Bitrix în sine.
Cursul pentru dezvoltatori are o mulțime de informații, dar formatul în care dezvoltatorul este introdus în capacitățile sistemului nu oferă nivelul de înțelegere necesar. Dacă mergi la Symfony Cookbook, atunci totul este rezolvat acolo, toate aspectele necesare sunt descrise în funcție de versiune. În timp ce în Bitrix, cursul de pregătire al dezvoltatorului conține de neînțeles după ce principiu informatii structurate după miezul vechi și nou, care se servește mai întâi separat, apoi amestecat, de la care începătorii au dureri de cap.

Organizarea procesului de dezvoltare

Din cauza specificului sistemului, nu este atât de ușor de organizat proces convenabil dezvoltare. Nu cel mai mult versiune proaspătă Ediția Business (ce era la îndemână) după instalare ia, gândiți-vă, aproape 530 de megaocteți
$ du -s *|sort -nr|cut -f 2-|în timp ce citiți a;do du -hs $a;terminat 523M bitrix 204K încărcare 64K bitrixsetup.php 56K desktop_app 20K readme.html 20K license.html 4.0K web . config 4.0K urlrewrite.php 4.0K readme.php 4.0K licență.php 4.0K install.config 4.0K index.php
Din acest volum, o jumătate bună sunt binare și programe de instalare, care, în general, nu sunt necesare pentru controlul versiunilor. În general, se obișnuiește să nu se versioneze kernel-ul Bitrix. Dezvoltatorii Bitrix, parcă, garantează ei înșiși integritatea nucleului, gestionează dependențele versiunilor diferitelor module în timpul actualizărilor. Dar acest lucru are imediat cel puțin un mare minus - este imposibil să implementați un proiect complet funcțional cu o singură comandă din controlul versiunii, trebuie să îl construiți în părți: obțineți sursele kernelului din backup-ul bitrix și sursele dezvoltatorilor din git .
Nici baza nu este buna. Dacă tu însuți poți folosi migrarea în timpul dezvoltării, atunci Bitrix introduce actualizări în baza de date folosind scripturi obișnuite pe care nu le poți controla. Prin urmare, atunci când actualizați, mai trebuie să transferați copiile de siguranță ale bazei de date de la gazda centrală de dezvoltare la alți dezvoltatori.
Oameni amabili, din nou, fac instrumente care ajută la organizarea totul, dar, din păcate, încă nu este posibil să forțezi Bitrix să respecte aceste reguli.
Oficial, Bitrix vă permite să aveți 2 copii ale unei distribuții. Unul este pentru producție, iar celălalt este pentru dezvoltare. Dacă aveți mai mulți dezvoltatori într-un singur proiect, atunci sunteți, parcă, interzis) De fapt, este suficient să întrerupeți conexiunile de intrare și de ieșire de la/la www.bitrixsoft.com la mașina Bitrix și apoi puteți nitui câte copii ale dezvoltării doriți, pur și simplu nu se pot actualiza singuri.

Colegi

Și ultima întrebare pe care aș vrea să o abordez.
Datorită faptului că Bitrix are un prag de intrare scăzut, printre companiile care prestează servicii pe această piață există foarte mult personal necalificat. Am avut șansa să văd multe proiecte diferite de-a lungul carierei mele (mai mult de o sută în total) finalizate pe 1C-Bitrix. Pot spune cu încredere că 95% dintre ei au făcut „bluff”. Era foarte rar să existe proiecte pentru dezvoltarea cărora s-a simțit o abordare, dar acestea au fost puține. Totul este foarte trist.

concluzii

Desigur, toate minusurile nu pot fi luate în considerare în cadrul unui articol. În fiecare zi întâlniți niște lucruri mici care interferează cu munca în fiecare zi. Dar a lua în considerare toate astfel de fleacuri este pur și simplu imposibil și probabil inutil.

Ce concluzii se pot trage aici. Bitrix este un sistem extrem de complex datorită faptului că are o arhitectură prost concepută, multe defecte care continuă să trăiască în produs mult timp. Pe de altă parte, Bitrix este suficient sistem simplu, care necesită un nivel de calificare mult mai scăzut pentru a începe, spre deosebire de cadre.
Suportul pentru acest produs este o sarcină foarte ingrată, în comparație cu produse precum Symfony, Laravel, Yii. Produsul iubește foarte mult să pună spițe în roțile dezvoltatorilor atât neexperimentați, cât și cu experiență, ceea ce, la rândul său, poate afecta costul serviciilor dezvoltatorilor experimentați pentru Bitrix.

Regret că am petrecut atât de mult timp lucrând cu acest sistem? Mai degrabă da decât nu. Ar fi mai înțelept să petrec acest timp studiind ceva mai corect și mai logic (ceea ce încerc în mod activ să fac acum). Dar s-a întâmplat că nu era nimeni care să mă îndrume în direcția corectă la începutul călătoriei mele.

Daca tu - php începător dezvoltator, apoi preferă Bitrix să studieze cadre precum Symfony, Laravel, Yii, ZendFramework. Crede-mă, în viitor va fi mai mult decât răsplătită. După ce stăpâniți oricare dintre aceste cadre, nu vă va fi dificil să dezvoltați ceva pentru Bitrix în viitor. Dacă nu ai de ales, atunci studiază Bitrix, dar în timp liber este mai bine să încerci să te arunci în lumea cadrelor pentru a-ți pune creierul la loc.

Dacă sunteți un dezvoltator cu experiență în Bitrix, dar fără experiență în alte cadre, atunci asigurați-vă că vă plonjați într-o altă lume, veți descoperi o mulțime de cunoștințe noi și utile care vă vor ajuta să scrieți soluții mult mai bune pentru 1C-Bitrix. Încercați să utilizați soluții din alte cadre în proiectele dvs., deoarece nu este deloc dificil să faceți acest lucru datorită abordării componente a acestuia din urmă și a compozitorului.

Dacă sunteți client, atunci nu aveți încredere în marketerii Bitrix. Nimic nu va fi atât de ușor pe cât se spune în prezentările Bitrix. Și nu da vina pe dezvoltatorii tăi pentru asta, nu au nimic de-a face cu asta. Dacă doriți să creați un magazin online mare și complex de nivel Eldorado/mvideo/sportmaster, atunci Bitrix poate să nu fie cea mai bună alegere.

UPD. Se vede că angajații Bitrix au citit articolul. La secțiunea despre Marketing am scris că la secțiunea Arhitectură în cursul dezvoltatorului Bitrix s-au scris apeluri de marketing. Acum nu sunt acolo. Chiar și l-au sigilat, aparent grăbiți.

Mulțumesc lui Nook pentru că a fost atent și atent :)

Etichete:

Adaugă etichete

Indiferent cât de mult folosim PHP, apar încă unele funcții despre care nici nu am auzit. Unele dintre ele ne-ar fi foarte utile. Am creat o listă mică caracteristici utile, care ar trebui să fie în arsenalul fiecărui programator PHP.

1. Crearea de funcții cu un număr variabil de argumente

Probabil știți deja că PHP ne permite să creăm funcții cu argumente opționale. Acum voi arăta o funcție în care numărul de argumente se poate schimba de la caz la caz.

Dar mai întâi, să ne amintim cum creăm funcții în mod obișnuit:

// funcția cu doi parametri opționali function foo($arg1 = "", $arg2 = "") ( echo "arg1: $arg1\n"; echo "arg2: $arg2\n"; ) foo("bună", "lume"); /* ieșire: arg1: salut arg2: lume */ foo(); /* ieșire: arg1: arg2: */

Acum să vedem cum puteți scrie o funcție cu un număr nelimitat de argumente. Pentru aceasta, se va folosi metoda func_get_args():

// nu specifica argumente function foo() ( // returneaza o matrice de argumente trecute $args = func_get_args(); foreach ($args ca $k => $v) ( echo "arg".($k+1) ." : $v\n"; ) ) foo(); /* nu scoate nimic */ foo("bună ziua"); /* ieșire arg1: salut */ foo("bună", "lume", "din nou"); /* ieșire arg1: salut arg2: lume arg3: din nou */

2. Folosiți Glob() pentru a găsi fișiere

Adesea, numele funcțiilor vorbesc de la sine. Nu același lucru se poate spune despre funcția glob().

Fără a intra în detalii, funcționalitatea sa este similară cu metoda scandir(). Vă permite să găsiți fișierul necesar după șablon:

// găsiți toate fișierele php $fișiere = glob("*.php"); print_r($fisiere); /* ieșire: Array ( => phptest.php => pi.php => post_output.php => test.php) */

Pentru a găsi fișiere de mai multe tipuri, trebuie să scrieți astfel:

// găsiți toate fișierele php și txt $fișiere = glob("*.(php,txt)", GLOB_BRACE); print_r($fisiere); /* ieșire: Array ( => phptest.php => pi.php => post_output.php => test.php => log.txt => test.txt) */

De asemenea, puteți specifica calea în șablon:

$fișiere = glob("../images/a*.jpg"); print_r($fisiere); /* ieșire: Array ( => ../images/apple.jpg => ../images/art.jpg) */

Pentru a obține calea completă către un document, utilizați metoda realpath():

$fișiere = glob("../images/a*.jpg"); // Aplică funcția „realpath” fiecărui element al matricei $fișiere = array_map(„realpath”,$fișiere); print_r($fisiere); /* ieșire: Array ( => C:\wamp\www\images\apple.jpg => C:\wamp\www\images\art.jpg) */

3. Informații despre memoria utilizată

Dacă ține evidența cantității de memorie consumată de scripturile tale, atunci probabil că le vei optimiza mai des.

În PHP există Unealtă puternică urmărirea utilizării memoriei. ÎN părți diferite scriptul de încărcare poate fi diferit. Pentru a obține valoarea memoriei utilizate în acest moment, ar trebui să folosim metoda memory_get_usage(). Pentru fixare număr maxim memorie folosită use memory_get_peak_usage()

echo „Inițial: „.memory_get_usage().” octeți \n”; /* Inițial: 361400 octeți */ // oferă o încărcare mică pentru ($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. Informații despre procesor

Pentru a face acest lucru, trebuie să utilizați metoda getrusage(). Dar rețineți că această caracteristică nu va funcționa pe Windows.

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

Imaginea prezentată mai sus va fi clară pentru cei care au experiență în acest domeniu administrarea sistemului. Pentru toți ceilalți, oferim o decriptare:

  • ru_oubloc: numărul de scrieri în bloc
  • ru_inblock: numărul de citiri de bloc
  • ru_msgsnd: numărul de mesaje trimise
  • ru_msgrcv: numărul de mesaje primite
  • en_maxrss: dimensiune maximă set nepaginabil
  • ru_ixrss: memorie totală partajată
  • ru_idrss: cantitatea totală de date nepartajate
  • ru_minflt: numărul de pagini de memorie utilizate
  • ru_majflt: numărul de erori de pagină
  • ru_nsignals: numărul de semnale primite
  • ru_nvcsw: numărul de comutări de context în funcție de proces
  • ru_nivcsw: numărul de comutări de context forțate
  • ru_nswap: numărul de accesări la disc în timpul paginii
  • ru_utime.tv_usec: timp de lucru în modul personalizat(microsecunde)
  • ru_utime.tv_sec: timpul petrecut în modul utilizator (secunde)
  • ru_stime.tv_usec: timp în modul privilegiat (microsecunde)
  • ru_stime.tv_sec: timp în modul privilegiat (secunde)

Pentru a afla ce resurse ale procesorului dumneavoastră sunt folosite de script, aveți nevoie de valoarea „user time” (timp în modul utilizator) și „system time” (timpul în modul privilegiat). Puteți obține rezultatul atât în ​​secunde, cât și în microsecunde. Pentru a converti numărul total de secunde în numar decimal, trebuie să împărțiți valoarea microsecundelor la 1 milion și să adăugați secunde la valoare.

Cumva confuz. Iată un exemplu:

// odihnă 3 secunde somn(3); $date = getrusage(); echo „Timp utilizator:”. ($date["ru_utime.tv_sec"] + $data["ru_utime.tv_usec"] / 1000000); echo „Ora sistemului: „. ($date["ru_stime.tv_sec"] + $date["ru_stime.tv_usec"] / 1000000); /* imprimă Ora utilizator: 0,011552 Ora sistem: 0 */

Deși scriptul a durat aproximativ 3 secunde, procesorul nu a fost încărcat foarte mult. Problema este că la un apel (sleep) scriptul practic nu consumă resurse ale procesorului. În general, există multe sarcini care necesită o perioadă semnificativă de timp, dar nu folosesc procesorul. De exemplu, așteptarea operațiunilor legate de disc. Deci nu folosiți întotdeauna timpul CPU în scripturile dvs.

Iată un alt exemplu:

// mers de 10 milioane de ori pentru($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 */

Scriptul a durat 1,4 secunde de timp CPU. În acest caz, timpii apelurilor de sistem sunt în general mici.

Timpul modului privilegiat (System Time) este timpul pe care procesorul îl petrece executând cereri de sistem către nucleu în numele programului. Exemplu:

$start = microtime(true); // apel microtime la fiecare 3 secunde în timp ce(microtime(true) - $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 */

Acum, timpul sistemului a fost cheltuit mult mai mult decât în ​​exemplul anterior. Totul datorită metodei microtime (), care utilizează resurse de sistem.

Cu toate acestea, trebuie remarcat faptul că ora afișată poate să nu fie exactă, deoarece. la un moment dat, resursele procesorului sunt folosite și de alte programe, ceea ce poate duce la o mică eroare.

5. Constante magice

Există multe constante magice în PHP, cum ar fi numărul de linie curent (__LINE__), calea fișierului (__FILE__), calea directorului (__DIR__), numele funcției (__FUNCTION__), numele clasei (__CLASS__), numele metodei (__METHOD__) și spațiile de nume (__NAMESPACE__) .

Nu le vom lua în considerare pe toate. Să ne uităm doar la câteva:

// acest script depinde de locația curentă a fișierului și // poate cauza probleme dacă este folosit din directoare diferite require_once("config/database.php"); // acest script nu va cauza probleme require_once(dirname(__FILE__) . "/config/database.php");

Utilizați __LINE__ când depanați scripturile:

// cod // ... my_debug("un mesaj de depanare", __LINE__); /* ieșire Linia 4: un mesaj de depanare */ // mai mult cod // ... my_debug("un alt mesaj de depanare", __LINE__); /* ieșire Linia 11: un alt mesaj de depanare */ function my_debug($msg, $line) ( echo "Line $line: $msg\n"; )

6. Generarea de ID-uri unice

Există momente când trebuie să generați un șir unic. De multe ori am văzut că funcția md5() este folosită pentru a rezolva această problemă:

// generează un șir aleatoriu echo md5(time() . mt_rand(1,1000000));

Dar, de fapt, PHP are o funcție specială uniqid() în acest scop.

// generează un șir aleatoriu echo uniqid(); /* scoate 4bd67c947233e */ // încă o dată echo uniqid(); /* imprimă 4bd67c9472340 */

Cu ochiul liber, puteți vedea că primele caractere sunt cel puțin asemănătoare... Acest lucru se datorează faptului că această metodă folosește timpul serverului pentru a genera caractere. Este chiar util, pentru că. toate valorile generate sunt obținute în ordine alfabetică, ceea ce face posibilă sortarea rapidă a acestora.

Pentru a reduce șansele de a obține un duplicat, putem adăuga un prefix sau folosim un al doilea parametru (mărește numărul de caractere):

// prefixat cu echo uniqid("foo_"); /* ieșire foo_4bd67d6cd8b8f */ // cu al doilea parametru echo uniqid("",true); /* iese 4bd67d6cd8b926.12135106 */ // ambele echo uniqid("bar_",true); /* printează bar_4bd67da367b650.43684647 */

Această metodă generează linii mai mici decât md5, astfel încât să puteți economisi spațiu.

7. Serializare

Ați fost nevoit vreodată să stocați date complexe într-o bază de date sau într-un fișier? Pentru a converti un obiect într-un șir, PHP oferă o funcție specială.

În general, aceste metode sunt 2: serialize() și unserialize()

// matrice complexă $myvar = array("bună ziua", 42, matrice(1,"două"), "măr"); // convertesc în șir $șir = serialize($myvar); echo $șir; /* ieșire a:4:(i:0;s:5:"bună ziua";i:1;i:42;i:2;a:2:(i:0;i:1;i:1;s :3:"două";)i:3;s:5:"măr";) */ // obține valoarea inițială $newvar = unserialize($string); print_r($newvar); /* imprimă Array ( => salut => 42 => Array ( => 1 => doi) => Apple) */

Așa funcționează aceste funcții. Cu toate acestea, datorită creșterii rapide a popularității JSON, 2 metode json_encode() și json_decode() au fost adăugate în PHP 5.2. Munca lor este similară cu serialize():

// matrice complexă $myvar = array("bună ziua", 42, matrice(1,"două"), "măr"); // convertește în șir $șir = json_encode($myvar); echo $șir; /* afișează ["hello",42,,"apple"] */ // restabilește valoarea originală $newvar = json_decode($string); print_r($newvar); /* imprimă Array ( => salut => 42 => Array ( => 1 => doi) => Apple) */

Această opțiune este mai compactă și compatibilă cu alte limbi, cum ar fi JavaScript. Cu toate acestea, atunci când lucrați cu obiecte foarte sofisticate, poate apărea pierderea de date.

8. Compresia șirurilor

Când vorbim despre compresie, ne vine imediat în minte fișiere de arhivăîn Format ZIP. PHP oferă capacitatea de a comprima șiruri lungi fără fișiere.

ÎN următorul exemplu Să demonstrăm cum funcționează funcțiile gzcompress() și 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 elit lacus quis ante. Lorem ipsum dolor sit amet , consectetur adipiscing elit. Aliquam pretium ullamcorper urna quis iaculis. Etiam ac massa sed turpis tempor luctus. Curabitur sed nibh eu elit mollis congue. Praesent ipsum diam, consectetur vitae ornare a, aliquam a nunc. In id magnare pellentes seded non mipis pos magnaere seded non metus, at lacinia augue. Sed magna nisi, ornare in mollis in, mollis sed nunc. Etiam at justo in leo congue mollis. Nullam in neque eget metus hendrerit scelerisque eu non enim. Ut malesuada lacus eu nulla bibendum id euismod urna sodales ." ; $comprimat = gzcompress($șir); echo „Dimensiune originală:”. strlen($șir)."\n"; /* imprimă Dimensiunea originală: 800 */ echo "Dimensiune comprimată: ". strlen($comprimat)."\n"; /* ieșire Dimensiune comprimată: 418 */ // return $original = gzuncompress($compressed);

Putem reduce cantitatea de text cu 50%. În același scop, puteți utiliza metodele gzencode() și gzdecode(), care folosesc un alt algoritm de compresie.

9. Rulați înainte de finalizare

PHP are o funcție register_shutdown_function() care vă va permite să executați un anumit cod înainte ca scriptul să se încheie.

Să presupunem că doriți să aflați câteva informații... Timpul de rulare a scriptului:

// obține ora de începere $start_time = microtime(true); // unele operații // ... // imprimă timpul de rulare echo "execuția a durat: ". (microtime(true) - $start_time). „secunde.”;

La prima vedere, aceasta poate părea o sarcină banală. În aceste scopuri, puteți pune codul la sfârșitul fișierului. Cu toate acestea, dacă funcția exit() este executată undeva înainte, acest cod nu va funcționa niciodată. De asemenea, nu va funcționa dacă există o eroare pe pagină sau utilizatorul întrerupe încărcarea paginii (făcând clic pe butonul corespunzător din browser);

Când utilizați metoda register_shutdown_function(), codul va fi executat oricum:

$start_time = microtime(true); register_shutdown_function ("închiderea_mea"); funcția my_shutdown() ( global $start_time; ecou "execuția a durat: ". (microtime(true) - $start_time). " secunde."; )

Ieșire

PHP este o întreagă planetă care nu încetează să ne uimească cu conținutul său. Ce părere aveți despre aceste caracteristici?

Top articole similare