De mulți ani, dezvoltatorii au cerut posibilitatea de a sorta după preț atunci când sunt folosite mai multe monede. La urma urmei, sistemul vă permite să stocați unele prețuri pentru mărfuri în ruble, altele în euro etc. Acest lucru este convenabil, având în vedere că mulți furnizori dau prețuri în valută străină, este mai ușor să le salvați imediat în valută și apoi să-i dați. înapoi în ruble la cursul de schimb curent.
Și apoi s-a întâmplat un miracol, după 4-5 ani de cârje lungi și solicitări pe site-ul dezvoltatorului, capacitatea de a sorta în funcție de monedă a fost adăugată la API.
Utilizarea sortării prețurilor cu moneda în 1C-Bitrix versiunea 16.0.3 și mai veche
Pentru a utiliza această funcție, trebuie să vedeți în sistemul dvs. ce tip de preț este cel de bază, pentru aceasta mergem la Magazin → Setări → Tipuri de preț
„ELEMENT_SORT_FIELD” => „CATALOG_PRICE_SCALE_1”, „ELEMENT_SORT_ORDER” => „desc”,
Sau ascendent:
„ELEMENT_SORT_FIELD” => „CATALOG_PRICE_SCALE_1”, „ELEMENT_SORT_ORDER” => „asc”,
De asemenea, puteți adăuga 2 parametri de sortare cu cheia ELEMENT_SORT_FIELD2 și ELEMENT_SORT_ORDER2.
Dar cum rămâne cu cei care au o versiune Bitrix mai mică de 16.0.3?
Există diferite moduri de a face acest lucru, am decis să folosesc o proprietate suplimentară, în care scriu prețul în ruble (conversie) și sortez deja după el. Acum o voi descrie în detaliu.
În primul rând, trebuie să creăm o proprietate: PRICE_SORT, în numele am scris „Prețul în ruble pentru sortare”, tastați: număr.
Funcția update_catalog_price_sort()( $număr = 0; încercați( $arFilter = Array("IBLOCK_ID" => 2); $res = CIBlockElement::GetList(Array(), $arFilter, false, false, Array("ID", "PROPERTY_PRICE_SORT", "CATALOG_GROUP_1")); while($row = $res->GetNext()) ( $price = $row["CATALOG_PRICE_1"]; echo "Începe actualizarea ($row["ID"]): ( $preț) ($row["CATALOG_CURRENCY_1"]) la "; dacă ($row["CATALOG_CURRENCY_1"] != "RUB")( $preț = CCurrencyRates::ConvertCurrency($price, $row["CATALOG_CURRENCY_1"], "RUB"); ) if ($preț != $row["PROPERTY_PRICE_SORT_VALUE"])( CIBlockElement::SetPropertyValuesEx($row["ID"], 2, array("PRICE_SORT" => $preț)); echo " ($preț) (RUB) - TERMINAT \n"; $număr++; sleep(0.2); ) else ( echo "($preț) (RUB) - NU NECESITA UPDATE \n"; ) ) ) catch(Excepție $ex) ( smail("Începe actualizarea sortării prețurilor", "Eșuează - actualizări:" . $ex->getMessage()); ) return $count; )
Mai întâi solicităm toate produsele din sistem, am aproximativ 120k. Din cerere obținem:
- ID - identificator de produs
- CATALOG_PRICE_1 - prețul articolului. Vă rugăm să rețineți că, dacă aveți un alt tip de preț de bază (vezi mai sus unde puteți verifica), atunci numărul de la sfârșitul cheii va fi diferit. În orice caz, puteți oricând să faceți print_r($row) și să aflați dacă ID-ul prețului de bază este corect.
- CATALOG_CURRENCY_1 — în ce monedă este salvat prețul. La fel ca și în cazul prețului, este important să luați în considerare ID-ul de la sfârșitul cheii
$price = CCurrencyRates::ConvertCurrency($price, $row["CATALOG_CURRENCY_1"], "RUB");
și apoi comparăm prețul primit cu ceea ce am stocat în PRICE_SORT (cheia din matrice: PROPERTY_PRICE_SORT_VALUE), dacă prețurile diferă, îl actualizăm.
Pentru depanare, folosesc ieșirea informațiilor și prind excepția, cu o notificare către e-mail. Apoi, trebuie să plasăm funcția update_catalog_price_sort() în agentul care va actualiza prețurile. L-am adăugat la agentul de actualizare valutară. Îl fac să ruleze o dată pe zi, când serverul are o încărcare minimă.
Rețineți un punct important! Aceasta este o sarcină intensivă în resurse, așa că agenții trebuie executați pe cron.
Și cel mai important, scriem câmpul nostru PRICE_SORT în apelul de componentă:
„ELEMENT_SORT_FIELD” => „PROPERTY_PRICE_SORT”,
Sper că acest articol vă va fi de folos, dacă găsiți erori sau greșeli de scriere, scrieți în comentarii.
Și, așadar, să descriem mai întâi ce avem și ce vom face. Avem instalată ca exemplu o soluție tipică de magazin online Bitrix. Acolo, în mod implicit, produse demo care au oferte comerciale. In comert. Ofertele au blocat prețul bunurilor.
Pentru a putea sorta produsul după preț, trebuie să afișăm inițial proprietatea în produs cu prețul minim. Socrul, pe viitor, vom scrie un cod pentru ca Bitrix să facă toate astea pentru noi, pune min. Preț. din ofertele de negociere pe care ne vom pune la punct sortarea. Sper că este clar, dacă nu, iată un alt exemplu de ce facem asta. Este în esență un singur produs, ei bine, să fie, papuci pentru bărbați, acești papuci au dimensiuni diferite 39, 40, 41, 42 și așa mai departe. și fiecare dimensiune poate avea propriul preț de 100r, 200r, 300r etc. În consecință, aici se pune întrebarea, produsul este unul și are o mulțime de prețuri, iar sarcina noastră este să sortăm, tocmai după prețul produsului.
Să creăm acum aceeași proprietate pentru min. prețul mărfurilor. Mergem la setările blocului de informații (Infoblock) din catalogul nostru, fila de proprietate și creăm o proprietate nouă aici, numele este „Preț minim”, tipul este „Număr”, codul este „PRIT_MINIM”
Avem o proprietate excelentă pregătită, acum hai să ne uităm sub capotă și să punem totul acolo sus. Deschide editorul nostru de cod și conectează-te la site-ul nostru. Întregul proces va avea loc în folderul local. Deschideți local/php_interface/init.php, dacă nu aveți aceste foldere în structura proiectului, trebuie să le creați. Deschideți fișierul init.php și introduceți acest cod în el:
Nu voi descrie fiecare linie de cod și ce este responsabil pentru ce. Cred ca cineva din subiect va intelege, dar daca nu esti in subiect, cauta pe cineva care sa fie in el.clasa ElementSever
Array("catalog_PRICE_1" => "ASC"),
„PROPERTY_CML2_LINK” => $arFields[„ID”],
„IBLOCK_ID” => $skuIblock
array("nTopCount" => "1"),
$artSku = matrice();
while ($element = $res->Fetch()) (
$artSku = $element;
\CIBlockElement::SetPropertyValuesEx($arFields["ID"], $arFields["IBLOCK_ID"], array("MINIMUM_PRICE" =>
În autoload_register (Autoload classs) care în partea de sus am indicat că clasele noastre se vor încurca în folderul local / lib / ..., în care ne vom continua munca. Să ne creăm folderele locale/lib/ și în folderul lib voi crea un alt folder și îl voi numi AB (AbraXabra))) este nevoie pentru ca clasele noastre, dacă au aceleași nume, să nu fie confundate. Și astfel, aceasta este calea din folderele pe care le-am primit local / lib / AB în folderul AB, creăm propria noastră clasă și o numim ElementSever.php și aruncăm acest cod în ea:
Acest fișier descrie toată logica aplicației noastre. Ne salvăm fișierul și mergem mai departe.clasa ElementSever
funcția publică statică setPrise(&$arFields)
dacă ($arFields["IBLOCK_ID"] == 2) (
$res = \CIBlockElement::GetList(
Array("catalog_PRICE_1" => "ASC"),
„PROPERTY_CML2_LINK” => $arFields[„ID”],
„IBLOCK_ID” => $skuIblock
array("nTopCount" => "1"),
array ("ID", "IBLOCK_ID", "CATALOG_GROUP_1")
$artSku = matrice();
while ($element = $res->Fetch()) (
$artSku = $element;
\CIBlockElement::SetPropertyValuesEx($arFields["ID"], $arFields["IBLOCK_ID"], array("MINIMUM_PRICE" => intval($artSku["CATALOG_PRICE_1"])));
Deschidem folderul în care se află componenta noastră de catalog, sau mai bine zis, avem nevoie de fișierul section.php pentru șabloane vechi, pentru cele noi, fie section_horizontal.php, fie section_vertical.php, în funcție de locația de pe site. Căutăm unde se află componenta noastră catalog.section și trebuie să inserăm următorul cod în fața acesteia:
Această bucată de cod este responsabilă pentru sortarea de la cel mai mare la cel mai mic sau invers.dacă ($request->get("PROPERTY_MINIMUM_PRICE")) (
$arParams["ELEMENT_SORT_FIELD"] = "PROPERTY_MINIMUM_PRICE";
$arParams["ELEMENT_SORT_ORDER"] = $request->get("PROPERTY_MINIMUM_PRICE");
Mai mult, din moment ce lucrăm cu soluție standard Bitrix în designul șablonului nu există un buton de sortare după prețuri, sugerez să îl faceți. De asemenea, înainte de ieșirea componentei catalog.section, voi arunca un link pe care vom face clic pe viitor pentru a sorta mărfurile după preț.
/** @var \Bitrix\Main\HttpRequest $request */
$cerere = \Bitrix\Main\Context::getCurrent()->getRequest();
utilizați Bitrix\Main\Web;
$Uri = nou Web\Uri($request->getRequestUri());
$Uri->addParams(["PROPERTY_MINIMUM_PRICE" => "ASC"]);
if ($request->get("PROPERTY_MINIMUM_PRICE") == "ASC") (
$Uri->addParams(["PROPERTY_MINIMUM_PRICE" => "DESC"]);
După ce adresa noastră URL este gata, lipiți-o în butonul:
getUri()?>">Sortați după preț
Asta e tot! Putem merge pe site în orice secțiune a catalogului și putem verifica cum funcționează totul. Vă mulțumesc tuturor pentru atenție, noapte bună))
Pentru a efectua sortarea pe o componentă știri.listă sau sectiunea de catalog componenta trebuie să treacă parametrii ELEMENT_SORT_FIELD și ELEMENT_SORT_ORDER.
Sortarea se poate face pe câmpuri standard, pentru care puteți folosi lista de mai jos:
- id- ID element;
- fel- indice de sortare;
- timestamp_x- Data modificării;
- Nume- Nume;
- activ_din sau data_active_de la- începutul perioadei elementului;
- activ_to sau data_active_to- sfârşitul perioadei elementului;
- stare- codul de stare al elementului din fluxul de lucru;
- cod- codul mnemonic al elementului;
- iblock_id- codul numeric al blocului informativ;
- modificat de- codul ultimului utilizator modificat;
- activ- semn de activitate a elementului;
- show_counter- numărul de afișări ale elementului (luat în considerare de funcție CIBlockElement::CounterInc);
- show_counter_start- ora primei afișare a elementului (luat în considerare de funcție CIBlockElement::CounterInc);
- spectacole- numărul mediu de afișări (număr de afișări/durata de afișare);
- rand- ordine aleatorie;
- xml_id sau extern_id- cod extern;
- Etichete- Etichete;
- creată- timpul creației;
- data creata- data creării excluzând ora;
- cnt- numărul de elemente (numai cu o grupare dată).
Notă: Câmpuri activ_dinȘi activ_to- învechit.
De asemenea, puteți sorta după proprietățile elementului de bloc de informații pe care le-ați creat:
- proprietate_
- după valoarea proprietății cu un cod numeric sau mnemonic PROPERTY_CODE(de exemplu, PROPERTY_123 sau PROPERTY_NEWS_SOURCE). - propertysort_
- după indicele de sortare al variantei de valoare a proprietății. Doar pentru proprietăți de tip Listă. - catalog_
_ - pe teren CAMPUL_CATALOG(poate fi PRET - pret sau CURRENCY - valuta) din pretul cu tipul PRICE_TYPE(de exemplu, catalog_PRICE_1 sau CATALOG_CURRENCY_3). Sortarea ar trebui să fie în formatul: CATALOG_(PRICE sau CURRENCY)_price-type-ID.- catalog_QUANTITY- sortarea dupa cantitate.
- PROPRIETATE_
. - prin valoarea câmpului elementului specificat ca legare. PROPERTY_CODE- cod mnemonic sau simbolic de proprietate de tip legarea de elemente. CAMP poate lua valori:
- TIMESTAMP_X
- MODIFICAT DE
- CREATĂ
- DATA CREATA
- CREAT DE
- IBLOCK_ID
- ACTIV
- ACTIVE_FROM
- ACTIVE_TO
- SHOW_COUNTER
- SHOW_COUNTER_START
- XML_ID
- STARE
- PROPRIETATE_
PROPRIETATE_ - prin valoarea proprietatii elementului specificat ca legatura. PROPERTY_CODE- cod mnemonic sau simbolic al proprietății tipului de legare la elemente. PROPERTY_CODE2- codul de proprietate al elementelor conexe.- HAS_PREVIEW_PICTUREȘi HAS_DETAIL_PICTURE- sortarea după prezența și absența imaginilor.
Notă: Proprietăţi catalog_*** disponibil numai cu modul Catalog comercial.
Tipul de sortare este specificat în conformitate cu lista:
- asc- Crescent;
- nule, asc- crescător cu valori goale la începutul probei;
- asc, nule- crescător cu valori goale la finalul probei;
- desc- Descendentă;
- nule,desc- descreștere cu valori goale la începutul probei;
- desc, nule- coborând cu valori goale la sfârșitul selecției.
Cea mai simplă modalitate de a transmite noi opțiuni de sortare unei componente este utilizarea $_GET interogați și transmiteți variabilele corespunzătoare.
De asemenea, puteți utiliza $_SESSIONși scrieți variabilele în tabloul de variabile de sesiune. Să presupunem că trebuie să facem linkuri sau butoane (nume, preț, bestseller, data primirii) pentru sortarea mărfurilor în secțiunea de catalog (folosim o componentă complexă catalog). După ce am copiat șablonul, trebuie să deschidem fișierul secțiunea.phpși efectuați următoarele modificări înainte de a conecta componenta bitrix:catalog.section:
<?if ($_GET["sortare"] == "nume" || $_GET["sortare"] == "preț_catalog_3" || $_GET["sortare"] == "tip_produs_proprietate" || $_GET[" sort"] == "timestamp_x")( $arParams["ELEMENT_SORT_FIELD"] = $_GET["sortare"]; $arParams["ELEMENT_SORT_ORDER"] = $_GET["metodă"]; )else()?>
Acest cod este necesar pentru a modifica opțiunile de sortare din componentă. Apoi, deschideți fișierul template.php componentă sectiunea de catalogși adăugați legături de control de sortare:
Triere: class="activ"href="=$arResult["SECTION_PAGE_URL"]?>?sort=name&method=asc">nume class="activ"href="=$arResult["SECTION_PAGE_URL"]?>?sort=catalog_PRICE_3&method=asc">pret class="activ"href="=$arResult["SECTION_PAGE_URL"]?>?sort=property_PRODUCT_TYPE&method=desc">cel mai bine vândut class="activ"href="=$arResult["SECTION_PAGE_URL"]?>?sort=timestamp_x&method=desc">data primirii
Acest sortare se poate face fără a reîncărca pagina folosind jQuery sau Cadrul Bitrix.
Dacă găsiți o inexactitate în text, o explicație de neînțeles, vă rugăm să ne anunțați în comentarii.
Din punct de vedere istoric, componenta complexă 1C-Bitrix nu permite utilizatorului să sorteze produsele în partea publică, cel puțin după preț, dată, nume și, de asemenea, să aleagă câte produse de pe pagină să aleagă. Dar niciunul dintre magazinele online nu se poate lipsi de o astfel de funcționalitate, care, apropo, este inclusă în aproape toate șabloanele de magazine online gata făcute din Marketplace. Dar implementarea blocurilor „Sort by: ...” și „Show by: ...” este destul de simplă. Trebuie doar să utilizați matricea $_REQUEST și metoda API 1C-Bitrix GetCurPageParam() pentru a transfera date în această matrice.
Să începem!
Mai întâi, să definim ce vor de la noi:Să mergem în ordine și să începem prin a afișa alegerea utilizatorului a numărului de produse propus pe pagină.
- Afișează blocul „Afișează după: 18 36 54 72” din dreapta deasupra listei de produse. (Valoarea implicită este 9).
- În stânga deasupra listei de mărfuri, afișați caseta „Sortați după: preț, nume, dată”.
- Făcând clic din nou pe o opțiune de sortare deja selectată, comută direcția de sortare.
- Data - data modificării, preț - prețul afișat al articolului.
Parametrul PAGE_ELEMENT_COUNT este responsabil pentru afișarea numărului de produse pe pagină. Îi vom transmite suma selectată de utilizator folosind $_REQUEST și GetCurPageParam() .
Pentru început, vom crea variabila corespunzătoare și îi vom atribui implicit valoarea specificată în parametrii componentei. Și apoi, când utilizatorul face clic pe numărul de elemente de care are nevoie, îl vom modifica.
Următorul cod este sugerat să fie plasat înainte de a include componenta catalog.section. Dacă se folosește componenta de catalog complex, atunci în fișierul în care este numită componenta catalog.section, care afișează produsele pe pagina dorită.
Arată de for($i = 18; $i <= 72; $i+=18) : ?> class="current" endif; ?>href="= $APPLICATION->GetCurPageParam("showBy=".$i, array("showBy", "mode")) ?>" >= $i ?> endfor; ?>
Și acum trecem valoarea primită componentului:IncludeComponent("bitrix:catalog.section", ... "PAGE_ELEMENT_COUNT" => $pageElementCount, ... ?>
Acum să ne ocupăm de sortare. Nu este mult mai complicat, cu excepția faptului că trebuie să verificăm direcția curentă și să o schimbăm. Pentru a face acest lucru, în metoda GetCurPageParam(), vom trece doi parametri sortBy și orderBy . Și apoi, în variabilele corespunzătoare, treceți-le parametrilor componente „ELEMENT_SORT_FIELD” și respectiv „ELEMENT_SORT_ORDER”. În mod implicit, sortarea ar trebui să se facă folosind câmpul intern de sortare 1C-Bitrix - sort .Verificați direcția de sortare și modificați dacă este necesar:
Afișăm link-uri pentru sortare:
Filtrează după: class="sortare curentă" endif; ?>href="= $APPLICATION->GetCurPageParam("sortBy=price&orderBy=".$orderBy, array("sortBy", "orderBy")) ?>" > Preț class="sortare curentă" endif; ?>href="= $APPLICATION->GetCurPageParam("sortBy=name&orderBy=".$orderBy, array("sortBy", "orderBy")) ?>" > Nume class="sortare curentă" endif; ?>href="= $APPLICATION->GetCurPageParam("sortBy=date&orderBy=".$orderBy, array("sortBy", "orderBy")) ?>" > Data
Parametrul nume este acceptat de câmpul „ELEMENT_SORT_FIELD” pentru sortarea după denumirea produsului fără intervenție suplimentară, dar pentru dată și preț, trebuie să clarificăm la care dintre parametrii elementului infoblock ne referim.Pentru dată, avem nevoie de valoarea câmpului „timestamp_x”, care este responsabil pentru data modificării. Pentru preț, trebuie să aflăm numele tipului de preț, care este afișat din câmpul elementului infoblock. Pentru a face acest lucru, trebuie să imprimați matricea $arItem în șablonul de componentă (catalog.section în cazul meu) sau folosind var_dump($arItem); , sau ecou „”; print_r($arItem); ecou " "; . Găsiți câmpul matrice responsabil pentru afișarea prețului și copiați numele acestuia, în cazul meu s-a dovedit a fi CATALOG_PRICE_1 . Este de remarcat faptul că, în cazul prețului, trebuie să utilizați numele câmpului care conține valoarea prețului fără monedă.
Și transmiteți datele primite variabilei $sortBy:
Și transmiteți valorile parametrilor componentei:IncludeComponent("bitrix:catalog.section", ... "ELEMENT_SORT_FIELD" => $sortBy, "ELEMENT_SORT_ORDER" => $orderBy, ... ?>
Asta e de fapt tot. Aceasta va avea ca rezultat o linie ca aceasta:Acum utilizatorul poate sorta produse și poate alege câte produse dorește să vadă pe pagină și, bineînțeles, poate trece prin pagini și filtra produsele fără a pierde nimic.