Kako podesiti pametne telefone i računare. Informativni portal

Besplatna sekcija php. Razlika između elemenata odjeljka i članka

Bez obzira koliko koristimo PHP, i dalje se pojavljuju neke funkcije za koje nikada nismo ni čuli. Neki od njih bi nam bili veoma korisni. Napravio sam malu listu korisne funkcije, koji bi trebao biti u arsenalu svakog PHP programera.

1. Kreiranje funkcija s promjenjivim brojem argumenata

Najvjerovatnije već znate da nam PHP omogućava kreiranje funkcija s opcionim argumentima. Sada ću pokazati funkciju u kojoj broj argumenata može varirati od slučaja do slučaja.

Ali prvo, sjetimo se kako kreiramo funkcije na uobičajeni način:

// funkcija sa dva opciona parametra function foo($arg1 = "", $arg2 = "") ( echo "arg1: $arg1\n"; echo "arg2: $arg2\n"; ) foo("zdravo", "svijet"); /* će ispisati: arg1: zdravo arg2: world */ foo(); /* će ispisati: arg1: arg2: */

Pogledajmo sada kako možete napisati funkciju s neograničenim brojem argumenata. Za ovo će se koristiti metoda func_get_args():

// ne specificiraj argumente funkciju foo() ( // vraća niz proslijeđenih argumenata $args = func_get_args(); foreach ($args kao $k => $v) ( echo "arg".($k+1) ." : $v\n" ) ) foo(); /* neće dati ništa */ foo("hello"); /* će ispisati arg1: hello */ foo("zdravo", "svet", "ponovo"); /* će ispisati arg1: zdravo arg2: svijet arg3: ponovo */

2. Koristite Glob() za traženje datoteka

Često nazivi funkcija govore sami za sebe. Isto se ne može reći za funkciju glob().

Ne ulazeći previše u detalje, njegova funkcionalnost je slična metodi scandir(). Omogućava vam da pronađete potreban fajl prema šablonu:

// pronaći sve php fajl s $files = glob("*.php"); print_r($files); /* će ispisati: Niz ( => phptest.php => pi.php => post_output.php => test.php) */

Da biste pronašli fajlove nekoliko tipova potrebno je da napišete ovako:

// pronaći sve php i txt datoteke $files = glob("*.(php,txt)", GLOB_BRACE); print_r($files); /* izlaz: Niz ( => phptest.php => pi.php => post_output.php => test.php => log.txt => test.txt) */

Također možete odrediti putanju u predlošku:

$files = glob("../images/a*.jpg"); print_r($files); /* izlaz: Niz ( => ../images/apple.jpg => ../images/art.jpg) */

Da biste dobili punu putanju do dokumenta, koristite metodu realpath():

$files = glob("../images/a*.jpg"); // Primijeni funkciju "realpath" na svaki element niza $files = array_map("realpath",$files); print_r($files); /* će ispisati: Niz ( => C:\wamp\www\images\apple.jpg => C:\wamp\www\images\art.jpg) */

3. Informacije o korištenoj memoriji

Ako pratite količinu memorije koju troše vaše skripte, vjerovatno ćete ih češće optimizirati.

U PHP-u postoji moćan alat praćenje upotrebe memorije. IN različitim dijelovima skripta za učitavanje može biti drugačija. Da biste dobili vrijednost iskorištene memorije ovog trenutka, trebali bismo koristiti metodu memory_get_usage(). Za fiksiranje maksimalna količina iskorištena memorija upotreba memory_get_peak_usage()

Echo "Inicijalno: ".memory_get_usage()." bajtova \n"; /* Početno: 361400 bajtova */ // daje malo opterećenje za ($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. Informacije o procesoru

Da biste to učinili, trebate koristiti metodu getrusage(). Ali imajte na umu da ova funkcija neće raditi na Windowsu.

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

Gore navedena slika bit će jasna onima koji imaju iskustva u tome sistemska administracija. Za sve ostale nudimo transkript:

  • ru_oublock: broj operacija pisanja bloka
  • ru_inblock: broj operacija čitanja bloka
  • ru_msgsnd: broj poslanih poruka
  • ru_msgrcv: broj primljenih poruka
  • ru_maxrss: maksimalna veličina set bez stranica
  • ru_ixrss: ukupna količina dijeljene memorije
  • ru_idrss: ukupna količina nedijeljenih podataka
  • ru_minflt: broj korištenih memorijskih stranica
  • ru_majflt: broj stranica koje nedostaju
  • ru_nsignals: broj primljenih signala
  • ru_nvcsw: broj promjena konteksta od strane procesa
  • ru_nivcsw: broj prisilnih prebacivanja konteksta
  • ru_nswap: broj pristupa disku prilikom stranica
  • ru_utime.tv_usec: radno vrijeme u korisnički način rada(mikrosekunde)
  • ru_utime.tv_sec: vrijeme rada u korisničkom modu (sekunde)
  • ru_stime.tv_usec: vrijeme rada u privilegovanom načinu rada (mikrosekunde)
  • ru_stime.tv_sec: vrijeme rada u privilegovanom modu (sekunde)

Da biste saznali koje resurse vašeg procesora koristi skripta, potrebna vam je vrijednost 'user time' (korisničko vrijeme) i 'system time' (vrijeme u privilegovanom režimu). Rezultat možete dobiti u sekundama i mikrosekundama. Za pretvaranje ukupnog broja sekundi u decimalni broj, trebate podijeliti vrijednost mikrosekundi sa 1 milion i dodati vrijednosti sekundi.

Malo je zbunjujuće. Evo primjera:

// odmor od 3 sekunde sleep(3); $data = getrusage(); echo "Vrijeme korisnika: ". ($data["ru_utime.tv_sec"] + $data["ru_utime.tv_usec"] / 1000000); echo "Sistemsko vrijeme: ". ($data["ru_stime.tv_sec"] + $data["ru_stime.tv_usec"] / 1000000); /* ispisuje Korisničko vrijeme: 0.011552 Sistemsko vrijeme: 0 */

Iako je skripti trebalo oko 3 sekunde da se izvrši, procesor nije bio jako opterećen. Činjenica je da kada se pozove (sleep), skripta praktično ne troši resurse procesora. Općenito, postoji mnogo zadataka koji oduzimaju značajno vrijeme, ali ne koriste procesor. Na primjer, čekanje na operacije vezane za disk. Dakle, ne koristite uvijek CPU vrijeme u svojim skriptama.

Evo još jednog primjera:

// hodati 10 miliona puta for($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 je trebalo 1,4 sekunde CPU vremena. U ovom slučaju, vremena sistemskog poziva su općenito niska.

Vrijeme privilegovanog načina rada (System Time) je vrijeme koje procesor troši na izvršavanje sistemskih zahtjeva prema kernelu u ime programa. primjer:

$start = mikrovrijeme(true); // pozivanje mikrovremena svake 3 sekunde while(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 */

Sada je sistemsko vrijeme potrošeno mnogo više nego u prethodnom primjeru. Sve zahvaljujući metodi microtime(), koja koristi sistemske resurse.

Međutim, treba imati na umu da prikazano vrijeme možda nije tačno jer U određenom trenutku resurse procesora koriste i drugi programi, što može dovesti do male greške.

5. Magične konstante

Postoji mnogo magičnih konstanti u PHP-u, kao što je broj trenutne linije (__LINE__), putanja datoteke (__FILE__), putanja direktorijuma (__DIR__), naziv funkcije (__FUNCTION__), naziv klase (__CLASS__), naziv metode (__METHOD__) i prostori imena ( __NAMESPACE__).

Nećemo ih sve razmatrati. Pogledajmo samo par:

// ova skripta ovisi o trenutnoj lokaciji datoteke i // može uzrokovati probleme ako se koristi iz različitih direktorija require_once("config/database.php"); // ova skripta neće uzrokovati probleme require_once(dirname(__FILE__) . "/config/database.php");

Koristite __LINE__ kada otklanjate greške u skriptama:

// kod // ... my_debug("neka poruka za otklanjanje grešaka", __LINE__); /* će prikazati red 4: neka poruka za otklanjanje grešaka */ // više koda // ... my_debug("još jedna poruka za otklanjanje grešaka", __LINE__); /* će ispisati red 11: druga poruka za otklanjanje grešaka */ funkcija my_debug($msg, $line) ( echo "Linija $line: $msg\n"; )

6. Generisanje jedinstvenih ID-ova

Postoje slučajevi kada trebate generirati jedinstveni niz. Vidio sam mnogo puta da se funkcija md5() koristi za rješavanje ovog problema:

// generira nasumični string echo md5(time() . mt_rand(1.1000000));

Ali u stvari, PHP ima posebnu funkciju uniqid() za ove svrhe

// generiše nasumični niz echo uniqid(); /* će ispisati 4bd67c947233e */ // još jednom echo uniqid(); /* će ispisati 4bd67c9472340 */

Golim okom možete vidjeti da su prvi simboli, najblaže rečeno, slični... To je zbog činjenice da ova metoda koristi vrijeme servera za generiranje simbola. Ovo je čak i korisno, jer... Sve generirane vrijednosti dobivaju se po abecednom redu, što omogućava njihovo brzo sortiranje.

Kako bismo smanjili šanse za dobijanje duplikata, možemo dodati prefiks ili koristiti drugi parametar (povećava broj znakova):

// sa prefiksom echo uniqid("foo_"); /* će ispisati foo_4bd67d6cd8b8f */ // sa drugim parametrom echo uniqid("",true); /* će ispisati 4bd67d6cd8b926.12135106 */ // oba echo uniqid("bar_",true); /* će ispisati bar_4bd67da367b650.43684647 */

Ova metoda generiše nizove manje od md5, čime se štedi prostor.

7. Serijalizacija

Da li ste ikada morali da skladištite složene podatke u bazu podataka ili fajl? Da bi se objekat pretvorio u string, PHP obezbeđuje posebnu funkciju.

Uopšteno govoreći, postoje 2 od ovih metoda: serialize() i unserialize()

// složeni niz $myvar = array("hello", 42, array(1,"two"), "apple"); // pretvoriti u string $string = serialize($myvar); echo $string; /* će ispisati a:4:(i:0;s:5:"zdravo";i:1;i:42;i:2;a:2:(i:0;i:1;i:1; s :3:"dva";)i:3;s:5:"apple";) */ // dobijemo originalnu vrijednost $newvar = unserialize($string); print_r($newvar); /* će ispisati niz ( => zdravo => 42 => niz ( => 1 => dva) => jabuka) */

Ovako funkcioniraju ove funkcije. Međutim, zbog brzog rasta popularnosti JSON-a, 2 metode json_encode() i json_decode() dodane su u PHP 5.2. Njihov rad je sličan serialize():

// složeni niz $myvar = array("hello", 42, array(1,"two"), "apple"); // pretvoriti u string $string = json_encode($myvar); echo $string; /* će ispisati ["hello",42,,"apple"] */ // vratiti originalnu vrijednost $newvar = json_decode($string); print_r($newvar); /* ispisuje niz ( => zdravo => 42 => niz ( => 1 => dva) => jabuka) */

Ova opcija je kompaktnija i kompatibilnija s drugim jezicima kao što je JavaScript. Međutim, kada radite s vrlo složenim objektima, može doći do gubitka podataka.

8. String compression

Kada govorimo o kompresiji, ono što nam odmah pada na pamet je arhivske datoteke V ZIP format. PHP pruža mogućnost komprimiranja dugih stringova bez ikakvih datoteka.

IN sljedeći primjer Hajde da pokažemo kako funkcioniraju funkcije 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 ultriciesquim elit, non ultriciesquim e , consectetur adipiscing quis iaculis. $compressed = gzcompress($string); echo "Originalna veličina: ". strlen($string)."\n"; /* će ispisati Originalna veličina: 800 */ echo "Kompresovana veličina: ". strlen($komprimirano)."\n"; /* će ispisati komprimiranu veličinu: 418 */ // vraćanje $original = gzuncompress($compressed);

Možemo smanjiti volumen teksta za 50%. Za iste svrhe možete koristiti metode gzencode() i gzdecode(), koje koriste drugačiji algoritam kompresije.

9. Izvršite prije izlaska

PHP ima funkciju register_shutdown_function() koja će vam omogućiti da izvršite neki kod prije isključivanja skripte.

Recimo da želite saznati neke informacije... Vrijeme izvođenja skripte:

// dobijemo vrijeme početka $start_time = microtime(true); // neke operacije // ... // prikaz vremena rada echo "izvršenje je trajalo: ". (mikrovrijeme(true) - $start_time). "sekunde.";

Na prvi pogled ovo može izgledati kao trivijalan zadatak. U ove svrhe, možete postaviti kod na kraj datoteke. Međutim, ako se funkcija exit() pokrene negdje prije ovoga, ovaj kod nikada neće raditi. Takođe, neće raditi ako postoji greška na stranici ili korisnik prekine učitavanje stranice (klikom na odgovarajuće dugme u svom pretraživaču);

Kada koristite metodu register_shutdown_function(), kod će se u svakom slučaju izvršiti:

$start_time = microtime(true); register_shutdown_function("my_shutdown"); funkcija my_shutdown() ( globalno $start_time; echo "izvršenje je trajalo: ". (microtime(true) - $start_time). " sekundi."; )

Zaključak

PHP je čitava planeta koja ne prestaje da nas oduševljava svojim sadržajem. Šta mislite o ovim funkcijama?

Članak koji ispituje HTML element odjeljka iz kategorije sekcije.

Svrha elementa sekcije

Element odjeljka se koristi za kreiranje odjeljka u dokumentu koji zajedno grupiše neki tematski sadržaj. Za svaki odjeljak u dokumentu treba navesti njegov naziv (temu). Ovo se obično radi pomoću naslova (elementi h1 - h6).

Naslov odjeljka

Sadržaj odjeljka...

Elementi presjeka se obično koriste u sljedećim slučajevima:

  • da označite sekcije unutar sekcije. Na primjer, da biste označili poglavlja u članku, kartice u dijaloškom okviru, odjeljke u disertaciji itd.
  • grupirati nekoliko sekcija u jednu tematska grupa. Na primjer, za grupisanje Najnovije vijesti na web stranici, komentari na članak itd.

Dakle, element odjeljka treba koristiti samo za neki sadržaj ako ima naslov i dio je nečeg drugog.

Korištenje elementa sekcije

Na primjer, razmotrite fragment koda stranice koji sadrži članak s komentarima. Svaki komentar koji je korisnik ostavio na stranici sadrži kompletan sadržaj i stoga se može smatrati elementom članka. Ali, istovremeno, svi komentari predstavljaju određenu tematsku grupu, pa se stoga mogu smjestiti u element odjeljka, tj. ovaj element grupiraće sve ove komentare na stranici zajedno.

Naslov članka

Komentari

Naslov komentara

Tekst komentara...

Naslov komentara

Tekst komentara...

Naslov članka Komentari Naslov komentara Naslov komentara

Na primjer, razmislite o korištenju elemenata odjeljka za kreiranje odjeljaka unutar elementa članka:

Naslov knjige

Prvo poglavlje

Poglavlje drugo

Treće poglavlje

Dodatak A

Dodatak B

Gornji primjer će imati sljedeći nacrt:

Naslov knjige Prvo poglavlje Drugo poglavlje Treće poglavlje Dodatak A Dodatak B

Ograničenja pri korištenju elementa sekcije

Element sekcije u HTML 5 nije univerzalni element za grupisanje sadržaja, tj. ne bi se trebao koristiti za umotavanje bilo kojeg sadržaja koji vam se sviđa. Njegova glavna svrha je dodati semantiku dokumentu i kreirati njegovu strukturu (okviru).

Kada autor treba da grupiše sadržaj samo da bi ga stilizovao ili njime manipulisao u JavaScript-u, element div je njegov najbolji izbor. Element div, za razliku od elementa sekcije, ne dodaje semantiku dokumentu i ne učestvuje u kreiranju njegove strukture (okviru).

Razlika između elemenata odjeljka i članka

Elementi odjeljka i članka, iako na prvi pogled izgledaju vrlo slični, imaju različita semantička značenja. Element članak namijenjen je grupiranju sadržaja koji je potpun, samostalan i koji se može gledati odvojeno od ostatka sadržaja stranice. Element odeljka ima drugačije semantičko značenje; on je namenjen grupisanju sadržaja koji je deo nečeg drugog.

Ali kako autor zna šta je neki sadržaj na stranici? Pogledajmo ovo koristeći primjer iz fragmenta članka. Fragment je dio članka i stoga zahtijeva element odjeljka da grupiše njegov sadržaj. Ali ovaj isti fragment, već ostavljen kao komentar, predstavljat će nešto cjelovito, cjelovito. Stoga, u ovom kontekstu, možete koristiti element članka da ga grupišete. Ali, naravno, može se raspravljati i obrnuto. Stoga, koji element koristiti za grupisanje sadržaja u većini slučajeva ovisi o vašem subjektivnom mišljenju kao autora. Ali najvažnija stvar u ovom pristupu je zadržati odabranu poziciju. Dakle, što je autor dosljedniji u kreiranju strukture, to će više značenja moći u nju da unese.

Predlošci u Bitrix-u se mogu podijeliti u nekoliko tipova:
  • Regularni i složeni 2.0 predlošci komponenti
  • Website templates
  • Predlošci za druge entitete (poštanske poruke, bilteni, web obrasci, generatori izvoza i još mnogo toga)

Predlošci komponenti čak imaju mogućnost korištenja predložaka. U principu, možete povezati bilo koji šablonski mehanizam, ali nema pomoćnih alata iz kutije. Ako nekome treba, imam par linkova za nastavke za grančicu i oštricu, koji rade i dosta se koriste u proizvodnji. Ali čak i ovdje bitriksoidi su postali izopačeni. Predložak se može koristiti samo s komponentama. Neće biti moguće povezati predložak sa rendererom predložaka web stranice ili drugim entitetima, jer tamo nema renderera.

Još jedna neugodna stvar u vezi sa šablonima komponenti je njihovo postavljanje. Komponenta je povezana pomoću jednostavnog dizajna
$APPLICATION->IncludeComponent("bitrix:catalog.section", "template_name", );
Drugi parametar je naziv predloška komponente. Dakle, u zavisnosti od toga raznim uslovima, lokacija ovog predloška može biti na najneočekivanijim mjestima:

  • 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 još nisam naveo sve opcije...

Predložak web stranice se može smatrati skupom datoteka: header.php, footer.php (da, stranica ih mora imati), description.php ( opis sistema predložak stranice), template_styles.css (stilovi predložaka stranice), direktorij sa predlošcima komponenti i grupom manje značajnih datoteka. To je sve. I na to ne možete uticati ni na koji način, ne možete ništa učiniti povodom toga. Nemoguće je pokupiti predložak.

O drugim šablonima nema šta da se kaže. Oni su ili jednostavno pohranjeni u bazi podataka u obliku izgleda sa nekim „promjenjivim“ podacima uključenim u njega, ili je to glupa PHP datoteka koja obavlja sav posao, od preuzimanja parametara iz baze podataka do prikazivanja informacija. Na primjer, možete pogledati generator YML datoteka za tržište. Nema smisla postavljati ga ovdje, jednostavno zato što je prilično velik, oko 2k redaka. Kome treba može proguglati, nalazi se u /bitrix/modules/catalog/load/yandex_run.php

Priroda datoteke

Kao što je gore postalo jasno, u Bitrixu arhitektura nije baš dobra. Ali Bitrix ima još jedan važan aspekt svoje arhitekture.
Bitrix je CMS sa pola datoteke. Mnoge stvari se kontrolišu pomoću nekih fajlova:

  • Treba vam stranica - kreirajte datoteku
  • Potreban vam je skup stranica - kreirajte datoteku i tamo povežite komponentu koja radi sa infoblokovima
  • Morate postaviti naslov za stranicu - uredite datoteku
  • Morate postaviti naslov za sve stranice odjeljka - kreirajte poseban file.section.php u korijenu ovog odjeljka
  • Morate urediti prava - uredite datoteku .access.php
  • Postavke prije inicijalizacije sistema - u datoteci dbconn.php, .settings.php i .settings_extra.php
  • result_modifier.php, component_epilog.php, init.php, .parameters.php, .description.php ....

I postoji ogroman broj takvih specijalnih datoteka razbacanih po cijelom Bitrixu. S jedne strane, to daje određenu fleksibilnost pri radu sa sistemom. S druge strane, ovo se može pretvoriti u muku i za programera i za upravitelja stranice. Fajlovi stranica se ponekad pretvaraju u zbrku PHP koda, rasporeda i komponenti dodataka. Kao rezultat vizuelni urednik može pogrešno raščlaniti ovu datoteku, a prilikom uređivanja može lako izbjeći PHP oznake na nekim mjestima, što će dovesti do toga da stranica ne radi. Kažete - nema potrebe pisati PHP kod u takve datoteke? Da, znam. Ali Bitrix vas vrlo često i bez ikakve alternative prisiljava na to.
I morate stalno držati informacije u svojoj glavi o tome kakve su to datoteke i koje podatke mogu sadržavati. IN različite datoteke mora sadržavati različite podatke sa drugačija struktura, i morate ga zapamtiti za svaku opciju. Traženje ovoga u dokumentaciji svaki put je težak posao.

Pored navedenog

Možete se beskrajno žaliti kako sve loše funkcionira u Bitrixu. Po mom mišljenju, sve ove pritužbe mogu se okarakterizirati jednom frazom - "nekako ne u potpunosti". I zaista, ako Bitrixoids iznenada najavi neku funkciju, onda je nekako ne puštaju u potpunosti, ne dovršavaju, ne dovode je na pamet. Ima dosta primjera:

  • implementiran ORM - još nije završen, ne može se u potpunosti koristiti
  • Napravili smo autoloader, radi samo u modulima, a ne po standardima
  • omogućio je povezivanje šablona, ​​ali ga ne možete koristiti svuda, a ne u potpunosti
  • itd. i tako dalje.

Ukratko, pokušaću da okarakterišem preostale probleme sa kojima se svakodnevno suočavam.

Admin

Ako je neko radio sa admin panelom, kreirao svoje stranice u administrativnom delu na način na koji Bitrix predlaže da to uradi, razumeće me. To je samo pakao. Za one koji nisu upoznati, Bitrix predlaže korištenje nudle datoteke za svaku stranicu. Na primjer, stranica za detaljan pregled narudžbe u admin panelu koju su napravili Bitrix programeri zauzima 4k redaka. Moj IDE počinje da usporava kada gledam sadržaj ove datoteke. Tu imate php, js i html. Dobro je što su se riješili SQL-a, iako sam siguran da je na drugim administrativnim stranicama.
A šta je spriječilo administrativne stranice da rade koristeći iste komponente nije jasno. Jednostavno ne postoji način da prilagodite većinu administrativnih stranica. U slučaju komponenti, to bi se moglo učiniti za kratko vrijeme.
Između ostalog, dobri ljudi Napravili smo modul koji će vam pomoći da napravite administrativne stranice

js framework

Bitrix ima js komponentu koja djeluje kao neka vrsta klijentskog okvira. Niko od programera to ne voli iz nekoliko razloga:
  • gotovo da nije dokumentovano
  • on je monstruozan
  • u velikoj mjeri duplira jquery poznat mnogima

Bitrix ga vrlo često koristi u svojim komponentama, izazivajući time još veći bijes među programerima. Jezgro ove biblioteke u minimiziranom obliku je 85 kb, što nije malo. Ne možete izbjeći njegovo povezivanje ako želite koristiti sve mogućnosti Bitrixa (kompozit, upravljanje imovinom).

Copy-paste duh

IN U poslednje vreme sve manje i manje, ali i dalje prilično često, Bitrix vas prisiljava da nešto kopirate i zalijepite. Ako želite izmijeniti rad komponente, kopirajte je i zalijepite. Ako želite da kreirate sopstveni šablon za otpremanje, kopirajte i zalijepite sistemski i završite ga. Ako želite napraviti skoro isti predložak koji imate, kopirajte ga i zalijepite ga i malo promijenite. O tome čak govore i na kursevima za programere početnike. Nemam riječi.

Upravljanje imovinom i CDN

Zaista mi se sviđa način na koji Bitrix upravlja resursima. U principu, moguće je registrovati skup određenih "biblioteka". Svaka biblioteka je skup css/js fajlova, koji mogu zavisiti od nekih drugih biblioteka. Ako povežete biblioteku sa stranicom, tada će prije povezivanja sve ovisnosti biti riješene i sve zavisne biblioteke će biti umetnute u stranicu. Čini se da je sve u redu, samo će svaki resurs biti umetnut u obrazac zaseban fajl u skripti ili oznaci veze. I zahvaljujući tome, postoje stranice koje imaju 30-50 skripti i isto toliko povezanih stilskih datoteka.
To je usrano pitanje, rekli su u Bitrixu, i napravili magičnu kvačicu koja kombinuje sve ove fajlove u jedan. I pojavile su se stranice gdje su umjesto 50 skripti bile 2, svaka po 300-500 kb. Prije nekog vremena ovo spajanje je radilo s greškama i spajalo je nekoliko puta iste resurse, ali sada se čini da je popravljeno.
A onda su im se Bitrixoidi sklonili s puta – dodali su mogućnost upload-ovanja svih resursa na CDN server. Koji uvek padne...
Zatim se pojavio Google Pagespeed Insights, koji je preporučio spuštanje svih resursa donji dio stranice. A u Bitrixu su opet napravili magični checkbox koji glupo izostavlja sve resurse u tijelu ako nisu označeni posebnim atributom.
Oni također distribuiraju minimizirane verzije svojih skripti zajedno sa kutijom, koja se povezuje kada koristite drugi čarobni okvir za potvrdu na admin panelu.
Općenito, nema scss-a za vas, nema TypeScript-a. Ako želite kompetentno upravljati resursima, nemojte koristiti ugrađeni Bitrix sistem, već koristite webpack koji se lako može upariti s Bitrixom.

Više stranica/višejezično

Ovo je vjerovatno najgora glavobolja za programera, koja traje od samog početka proizvoda. Ne možete jednostavno nastaviti i kreirati višejezičnu web stranicu. A ako vam je potreban višejezični katalog sa po različitim cijenama i valute - onda se pretvara u brašno, za koje također trebate izdvojiti urednu svotu (morat ćete izdvojiti za kupovinu dodatne licence za sljedeću jezičnu verziju stranice).
Ako kreirate višejezičnu i viševalutnu web stranicu, budite spremni na činjenicu da će se Bitrix tome vrlo agresivno oduprijeti. Postavke za više lokacija su decentralizirane na cijelom administrativnom panelu. Svaki entitet u admin panelu ima svoju zavisnost od jezičke verzije sajta. Neki entiteti možda uopće ne podržavaju ovisnosti o mjestu/jeziku, dok drugi imaju samo nedvosmislenu vezu s jezikom, tako da će ovaj entitet morati biti dupliciran, a zatim podržan.
IN osnovna verzija Da bi blok informacija radio na nekoliko jezika, morat ćete kreirati duplikat ovog informacijskog bloka. Ali u praksi to niko ne radi i pokušava da smisli sopstvene načine za centralno skladištenje jednog entiteta, distribuirajući njegove atribute zavisne od jezika drugim objektima za skladištenje.
Ne možete postaviti podrazumevani jezik tokom lokalizacije. Ako imate jezičku varijablu koja opisuje frazu na ruskom, a ova jezička varijabla nije dostupna na engleskom, tada će biti prikazana na engleskoj stranici prazan red, a na to se ni na koji način ne može utjecati (u mnogim slučajevima bilo bi moguće ostaviti rusku frazu kako ne bi bilo praznina).

Mehanizam upravljanja pravima

Bili su veoma pametni sa ovim podsistemom. Često je teško shvatiti zašto ste nekom entitetu dodijelili prava gledanja, ali ih korisnik ne može koristiti. Na primjer, da biste dali pravo na uređivanje informacijskog bloka, morate dati pristup direktoriju /bitrix/admin, dodijeliti prava za određeni blok informacija i dodijeliti prava u glavnom modulu. Potrebno je uraditi previše operacija da bi se izdala prava za jedan entitet. A ako nema dovoljno prava, onda bez brčkanja po izvornom kodu nema načina da se shvati zašto.

Konfiguracija

Bitrix nema centralizovano čvorište koje bi vam omogućilo upravljanje sistemskim postavkama. Postavke su ponovo decentralizirane u cijelom sistemu. Opcije su dostupne u postavkama modula, u postavkama komponenti, u COption-u (ne postavljaju se u admin panel). U admin panelu opcije za jedan modul mogu biti razdvojene za 3-4 metra različite stranice, koji se nalaze na potpuno različitim mjestima. urlrewrite se može uređivati ​​preko admin panela! Sada i .settings i .settings_extra. Ponekad uopće nije jasno koji od njih ima veći prioritet, vrlo često nema dovoljno objašnjenja za opcije, a odnosi su nejasni. Ne postoji izvorni način za dijeljenje konfiguracije između programera.
Postavke mogu biti vrlo nelogične. Ponekad dođe do apsurda... pogledajte komponentu bigdata - može li neobučena osoba to postaviti?

Integracija sa 1C

Ovo je stavka na listi Bitrix funkcija koja privlači dovoljno pažnje veliki broj kupaca. Bitrix obećava da će postaviti dvosmjernu integraciju stranice sa 1C u 2 klika, koja će trenutno isporučiti sadržaj i dokumente iz jednog sistema u drugi.
Da, zaista jeste, ali uz nekoliko upozorenja.
Prvo, da biste izvršili integraciju "iz kutije" bez dodatnog napora, morate učiniti sve točno kako je napisano u Bitrix dokumentaciji - izgraditi katalog na web stranici prema pravilima koja Bitrix nudi i izgraditi katalog u 1C koje Bitrix zahtijeva. U idealnom slučaju, kreirajte sve od nule, a onda će vam možda sve raditi iz kutije.
Drugo, Bitrix nije kompatibilan sa svim 1C konfiguracijama iz kutije. Vrijedi prvo provjeriti
treće, idealan svet ne može biti. Tipično, kupac koji želi web stranicu već ima maloprodajni biznis, što znači da već ima 1C, što je ogromna deponija smeća. I ovo smeće se mora baciti na lokaciju. A kako se stranica ne bi pokazala kao isto smeće, potrebno je značajno poboljšati mehanizam razmjene.
Vrlo često se zahtjevi kupaca uvelike razlikuju od vizije proizvoda koju je formirao Bitrix tim, a zatim usavršavanje mehanizma zamjene može biti prilično skupo, uporedivo po intenzitetu rada sa razvojem jedinstvenog modula za razmjenu za konkretan slučaj.
Stoga, ne morate gajiti iluzije da ćete moći lako integrirati svoju stranicu sa 1C. Sve su to mahinacije marketinških stručnjaka.

Rafiniranje razmjene sa 1C također je posebna tema. Klasa \CIBlockCMLImport je odgovorna za organiziranje razmjene kataloga - 5,7k redaka. Jedna od glavnih metoda koja najčešće zahtijeva proširenje je \CIBlockCMLImport::ImportElement, koja sadrži više od 1k linija. Dovoljno je da ga jednom naslijedite, nekoliko puta ažurirate proizvod u dužem vremenskom periodu i možete dobiti neradnu razmjenu sa 1C. Stoga se programeri često ne zamaraju ovom klasom i pokušavaju nekako ući u proces uvoza koristeći rukovaoce događajima. Rad sa obrađivačima događaja u Bitrixu, posebno u modulu infoblokova, također nije baš ugodno iskustvo, makar samo zato što događaji istog tipa nisu jednolično raspoređeni, a neki događaji jednostavno nisu dovoljni.
Generalno, stvari su tužne kao i ranije.

Nedosljednost

Ponekad mi se čini da su programeri različiti moduli Oni zapravo ne komuniciraju jedni s drugima. Kada proučavate izvore kernela, nailazite na vrlo heterogena rješenja koja bi se mogla implementirati na jednom motoru, ali se iz nekog razloga različito implementiraju.
Na primjer, možete uzeti svojstva elemenata informacijskog bloka i korisničkih polja. U stvari, oba entiteta jesu dodatno polje za drugi entitet. Ima vrstu, značenje i opis. Vrijednost je pohranjena u zasebnoj tablici baze podataka; oni imaju približno sličan interfejs za pristup podacima. Pa zašto ne napraviti isti interfejs za njih?
Krajem marta, modul prodaje je ažuriran na najnoviju verziju, a takođe su obećali proizvoljna svojstva za narudžbine. Postoji li zaista novi, treći interfejs za rad sa proširenim svojstvima entiteta?

Bitrix24

Ovo je generalno posebna tema za diskusiju. Zbog ovog sistema često nastaje zabuna. Postoje 2 opcije za B24 - SaaS i Standlone. Postoji tržište za B24, ali sadrži aplikacije samo za SaaS verziju! Ako imate verziju u kutiji, kupljenu za 200 hiljada, nećete moći da instalirate ovu najpopularnije aplikacije, kao dizajner dokumenata, i općenito nećete moći instalirati nijednu aplikaciju sa tržišta za Bitrix24 na svoj Bitrix24. Ovo je takav paradoks.
Umjesto toga, tržište iz regularna verzija. Postoji mnogo više rješenja, ali su koncentrisana uglavnom oko upravljanja web stranicama, a ne B24.

Bitrix24, kako su mi rekli u odeljenju tehnička podrška, ovo je kompletan sistem. Ako ometate rad standardne komponente sistema, onda budite spremni da se ova funkcionalnost prekine s narednim ažuriranjima. Bitrix neće računati na vas da finalizirate komponente portala, i to uprkos činjenici da službeno šalju svoje klijente partnerima

Usput, modificiranje komponenti u verzija u kutiji B24 je pravi izazov. Komponente koje generiraju js kod kojem pristupa, koristeći ajax php kod, koji generira html+js kao odgovor. Ovo je paklena mješavina u koju zaista ne želite da ronite.

Dokumentacija

Bitrix dokumentacija zaostaje za razvojem proizvoda 1-1,5 godina. Kod je veoma slabo pokriven phpDocs-om, i često je komentar ispred klase samo za prikaz, automatski generisan u IDE-u.
Sam stil prezentacije dokumentacije u zvaničnim izvorima često je previše „slobodan“, a sadržaj nekih članaka u dokumentaciji možda nema nikakve veze sa samim Bitrixom.
Kurs za programere ima mnogo informacija, ali format u kojem se programer upoznaje sa mogućnostima sistema ne pruža nivo percepcije koji je potreban. Ako odete na Symfony Cookbook, tamo je sve izloženo, svi potrebni aspekti su opisani ovisno o verziji. Dok u Bitrix-u kurs obuke za programere sadrži nejasan princip strukturirane informacije po starim i novim jezgrima, koje se prvo serviraju odvojeno pa pomiješane, što početnicima zadaje glavobolju.

Organizacija procesa razvoja

Zbog specifičnosti sistema, nije ga tako lako organizovati pogodan proces razvoj. Nije najbolje najnoviju verziju Urednički posao (koji je bio pri ruci) nakon instalacije zauzima, razmislite, skoro 530 megabajta
$ du -s *|sort -nr|cut -f 2-|dok čita a;do du -hs $a;gotovo 523M bitrix 204K upload 64K bitrixsetup.php 56K desktop_app 20K readme.html 20K licence.html 4.0K web . config 4.0K urlrewrite.php 4.0K readme.php 4.0K licence.php 4.0K install.config 4.0K index.php
Od ovog volumena, dobra polovina su binarni programi i instalateri, koji općenito nisu potrebni za kontrolu verzija. Uopšteno govoreći, uobičajeno je da se ne verzija Bitrix jezgra. Bitrix programeri sami garantuju integritet jezgre i upravljaju zavisnostima verzija različitih modula tokom ažuriranja. Ali ovo odmah nosi barem jedan veliki nedostatak - nemoguće je implementirati potpuno funkcionalan projekat s jednim timom iz kontrole verzija, morate ga sastaviti u dijelovima: nabavite izvore kernela iz rezervne kopije Bitrixa, a izvore programera iz git-a; .
Ni sa bazom stvari ne idu dobro. Ako sami možete koristiti migracije tokom razvoja, tada Bitrix ubacuje ažuriranja u bazu podataka koristeći obične skripte koje ne možete kontrolirati. Stoga, prilikom ažuriranja, i dalje ćete morati prenositi sigurnosne kopije baze podataka sa centralnog razvojnog hosta na druge programere.
Dobri ljudi, opet, režu alate koji pomažu u organizaciji svega ovoga, ali nažalost još uvijek nije moguće natjerati Bitrix da se pridržava ovih pravila.
Zvanično, Bitrix vam omogućava da imate 2 kopije jedne distribucije. Jedan je za proizvodnju, drugi za razvoj. Ako imate nekoliko programera na jednom projektu, onda ste takoreći odmetnik) U stvari, dovoljno je da prekinete mašinu sa Bitrixom dolazne i odlazne veze sa/na www.bitrixsoft.com, a onda mogu prikovati onoliko kopija razvoja koliko želite, oni jednostavno neće moći sami da se ažuriraju.

Kolege

I poslednje pitanje koje bih želeo da se dotaknem.
Zbog činjenice da Bitrix ima nisku barijeru za ulazak, među kompanijama koje pružaju usluge na ovom tržištu ima dosta nekvalifikovanog osoblja. Vidio sam mnogo različitih projekata tokom svoje karijere (ukupno više od sto) završenih na 1C-Bitrixu. Mogu sa sigurnošću da kažem da je 95% njih urađeno na „bugger“ način. Vrlo rijetko smo nailazili na projekte čiji je razvoj imao smisla pristupa, ali to su bili samo neki. Ovo je sve veoma tužno.

zaključci

Naravno, svi nedostaci se ne mogu sagledati u jednom članku. Svakog dana nailazite na neke sitnice koje vam svakodnevno ometaju posao. Ali jednostavno je nemoguće razmotriti sve takve sitnice, a vjerovatno i nema potrebe.

Kakvi se zaključci ovdje mogu izvući? Bitrix je izuzetno složen sistem zbog činjenice da ima loše osmišljenu arhitekturu i mnoge nedostatke koji nastavljaju da žive u proizvodu dugo vremena. S druge strane, Bitrix je dovoljan jednostavan sistem, što zahtijeva mnogo niži nivo kvalifikacija za početak, za razliku od okvira.
Podržavanje ovog proizvoda je veoma nezahvalan zadatak u poređenju sa proizvodima kao što su Symfony, Laravel, Yii. Proizvod zaista voli da stavlja žbicu u kotače i neiskusnih i iskusnih programera, što se, zauzvrat, može odraziti na cijenu usluga iskusnih Bitrix programera.

Da li žalim što sam proveo toliko vremena radeći sa ovim sistemom? Radije da nego ne. Bilo bi mudrije potrošiti ovo vrijeme proučavajući nešto ispravnije i logičnije (što sada aktivno pokušavam). Ali slučajno se dogodilo da na početku mog putovanja nije bilo nikoga da me uputi u pravom smjeru.

Ako ti - početnik php programer, onda radije proučavaju okvire kao što su Symfony, Laravel, Yii, ZendFramework nego Bitrix. Vjerujte mi, to će se više nego isplatiti u budućnosti. Nakon što ste savladali bilo koji od ovih okvira, neće vam biti teško da u budućnosti razvijete nešto za Bitrix. Ako nemate izbora, onda proučite Bitrix, ali slobodno vrijeme Bolje je i dalje pokušati da se uronite u svijet okvira kako biste postavili svoj mozak na mjesto.

Ako ste programer s iskustvom u Bitrixu, ali bez iskustva u drugim okvirima, onda svakako uronite u drugi svijet otkrit ćete puno novih i korisnih znanja koja će vam pomoći da napišete mnogo bolja rješenja za 1C-Bitrix. Pokušajte koristiti rješenja iz drugih okvira u svojim projektima, srećom to nije teško učiniti zahvaljujući komponentnom pristupu potonjeg i kompozitora.

Ako ste kupac, onda ne vjerujte Bitrix trgovcima. Ništa neće biti tako lako kao što kažu u Bitrix prezentacijama. I nemojte kriviti svoje programere za ovo, oni nemaju nikakve veze s tim. Ako želite da napravite veliku i složenu internet prodavnicu nivoa Eldorado/Mvideo/Sportmaster, onda Bitrix možda nije najbolji izbor.

UPD. Jasno je da su članak pročitali zaposlenici Bitrixa. U dijelu o marketingu napisao sam da se u dijelu Arhitektura kursa za programere Bitrixa pišu marketinški apeli. Sada ih nema. Čak su i zapečatili, očigledno im se žurilo.

Hvala kutak na zapažanju i oštrom oku :)

Tagovi:

Dodaj oznake

Najbolji članci na ovu temu