Durante muchos años, los desarrolladores han estado solicitando la posibilidad de ordenar por precio cuando se utilizan varias monedas. Después de todo, el sistema le permite almacenar algunos precios de bienes en rublos, otros en euros, etc. Esto es conveniente, dado que muchos proveedores dan precios en moneda extranjera, es más fácil guardarlos inmediatamente en moneda extranjera y luego darles en rublos al tipo de cambio actual.
Y luego sucedió un milagro, después de 4-5 años de muletas largas y solicitudes en el sitio web del desarrollador, se agregó a la API la capacidad de ordenar según la moneda.
Uso de clasificación de precios con moneda en 1C-Bitrix versión 16.0.3 y anteriores
Para poder utilizar esta característica, es necesario que veas en tu sistema qué tipo de precio es el base, para ello vamos a Tienda → Configuración → Tipos de precios
"ELEMENT_SORT_FIELD" => "CATALOG_PRICE_SCALE_1", "ELEMENT_SORT_ORDER" => "desc",
O ascendente:
"ELEMENT_SORT_FIELD" => "CATALOG_PRICE_SCALE_1", "ELEMENT_SORT_ORDER" => "asc",
Además, puede agregar 2 parámetros de clasificación con la clave ELEMENT_SORT_FIELD2 y ELEMENT_SORT_ORDER2.
Pero, ¿qué pasa con aquellos que tienen una versión de Bitrix anterior a la 16.0.3?
Hay diferentes formas de hacer esto, decidí usar una propiedad adicional, en la que escribo el precio en rublos (convertir) y ya lo ordeno. Ahora lo describiré en detalle.
Primero, necesitamos crear una propiedad: PRICE_SORT, en el nombre escribí "Precio en rublos para clasificar", escriba: número.
Función update_catalog_price_sort()( $recuento = 0; try($arFilter = Array("IBLOCK_ID" => 2); $res = CIBlockElement::GetList(Array(), $arFilter, false, false, Array("ID", "PROPERTY_PRICE_SORT", "CATALOG_GROUP_1")); while($fila = $res->GetNext()) ( $precio = $fila["CATALOG_PRICE_1"]; echo "Iniciar actualización ($fila["ID"]): ( $precio) ($fila["CATALOG_CURRENCY_1"]) a "; if ($fila["CATALOG_CURRENCY_1"] != "RUB"))( $precio = CCurrencyRates::ConvertCurrency($precio, $fila["CATALOG_CURRENCY_1"], "RUB"); ) if ($precio != $fila["PROPERTY_PRICE_SORT_VALUE"])( CIBlockElement::SetPropertyValuesEx($fila["ID"], 2, array("PRICE_SORT" => $precio)); echo " ($precio) (RUB) - HECHO \n"; $conteo++; dormir(0.2); ) else ( echo "($precio) (RUB) - NO NECESITA ACTUALIZAR \n"; ) ) ) catch(Excepción $ex) ( smail("Iniciar actualización de ordenación de precios", "Error - actualizaciones:". $ex->getMessage()); ) return $count; )
Primero solicitamos todos los productos del sistema, tengo unos 120k, de la solicitud obtenemos:
- ID - identificador del producto
- CATALOG_PRICE_1 - precio del artículo. Tenga en cuenta que si tiene un tipo de precio base diferente (vea arriba donde puede verificar), entonces el número al final de la clave será diferente. En cualquier caso, siempre puedes hacer print_r($row) y averiguar si el ID del precio base es correcto.
- CATALOG_CURRENCY_1: en qué moneda se guarda el precio. Al igual que con el precio, es importante considerar la identificación al final de la clave.
$precio = CCurrencyRates::ConvertCurrency($precio, $fila["CATALOG_CURRENCY_1"], "RUB");
y luego comparamos el precio recibido con lo que tenemos almacenado en PRICE_SORT (la clave en el arreglo: PROPERTY_PRICE_SORT_VALUE), si los precios difieren, lo actualizamos.
Para la depuración, utilizo la salida de información y la captura de la excepción, con una notificación al correo. A continuación, debemos colocar la función update_catalog_price_sort() en el agente que actualizará los precios. Lo agregué al agente de actualización de moneda. Lo hago ejecutar una vez al día, cuando el servidor tiene una carga mínima.
Tenga en cuenta un punto importante! Esta es una tarea que consume muchos recursos, por lo que los agentes deben ejecutarse en cron.
Y lo más importante, escribimos nuestro campo PRICE_SORT en la llamada del componente:
"ELEMENT_SORT_FIELD" => "PROPIEDAD_PRICE_SORT",
Espero que este artículo te sea útil, si encuentras errores o errores tipográficos, escribe en los comentarios.
Entonces, primero describamos lo que tenemos y lo que haremos. Tenemos una solución de tienda en línea típica de Bitrix instalada como ejemplo. Allí, por defecto, los productos de demostración que tienen ofertas comerciales. En comercio. Las ofertas obstruyeron el precio de los bienes.
Para que podamos ordenar el producto por precio, necesitamos mostrar inicialmente la propiedad en el producto con el precio mínimo. Suegro, en el futuro, escribiremos un código para que Bitrix haga todo esto por nosotros, escriba min. precio. de las ofertas de negociación en las que estableceremos nuestra clasificación. Espero que quede claro, si no, aquí hay otro ejemplo de por qué estamos haciendo esto. Es esencialmente un producto, bueno, déjalo ser, pantuflas de hombre, estas pantuflas tienen diferentes tamaños 39, 40, 41, 42, etc. y cada tamaño puede tener su propio precio de 100r, 200r, 300r, etc. En consecuencia, aquí surge la pregunta, el producto es uno y tiene muchos precios, y nuestra tarea es ordenar, precisamente por el precio del producto.
Ahora creemos la misma propiedad para min. precio de la mercancía Vamos a la configuración del bloque de información (Infoblock) de nuestro catálogo, la pestaña de propiedades y creamos una nueva propiedad aquí, el nombre es “Precio mínimo”, el tipo es “Número”, el código es “MINIMUM_PRICE”
Tenemos una excelente propiedad lista, ahora miremos debajo del capó y configuremos todo allí. Abra nuestro editor de código y conéctese a nuestro sitio. Todo el proceso se llevará a cabo en la carpeta local. Abra local/php_interface/init.php, si no tiene estas carpetas en la estructura de su proyecto, debe crearlas. Abra el archivo init.php y coloque este código en él:
No describiré cada línea de código y qué es responsable de qué. Creo que alguien en el tema lo entenderá, pero si no estás en el tema, busca a alguien que esté en él.clase ElementSever
Array("catalog_PRICE_1" => "ASC"),
"PROPIEDAD_CML2_LINK" => $arFields["ID"],
"IBLOCK_ID" => $skuIblock
array("nCuentaSuperiores" => "1"),
$artSku = array();
while ($elemento = $res->Fetch()) (
$artSku = $elemento;
\CIBlockElement::SetPropertyValuesEx($arFields["ID"], $arFields["IBLOCK_ID"], array("MINIMUM_PRICE" =>
En el autoload_register (Clases de carga automática) que en la parte superior indicamos que nuestras clases se desordenarán en la carpeta local / lib / ..., en la que continuaremos nuestro trabajo. Vamos a crear nuestras carpetas locales/lib/ y en la carpeta lib crearé otra carpeta y la llamaré AB (AbraXabra))) es necesaria para que nuestras clases, si tienen los mismos nombres, no se confundan. Y esta es la ruta de las carpetas que obtuve local / lib / AB en la carpeta AB, creamos nuestra propia clase y la llamamos ElementSever.php y le lanzamos este código:
Este archivo describe toda la lógica de nuestra aplicación. Guardamos nuestro archivo y seguimos adelante.clase ElementSever
función estática pública setPrise(&$arFields)
if ($arFields["IBLOCK_ID"] == 2) (
$res = \CIBlockElement::GetList(
Array("catalog_PRICE_1" => "ASC"),
"PROPIEDAD_CML2_LINK" => $arFields["ID"],
"IBLOCK_ID" => $skuIblock
array("nCuentaSuperiores" => "1"),
matriz("ID", "IBLOCK_ID", "CATALOG_GROUP_1")
$artSku = array();
while ($elemento = $res->Fetch()) (
$artSku = $elemento;
\CIBlockElement::SetPropertyValuesEx($arFields["ID"], $arFields["IBLOCK_ID"], array("MINIMUM_PRICE" => intval($artSku["CATALOG_PRICE_1"])));
Abrimos la carpeta donde se encuentra nuestro componente de directorio, o mejor dicho, necesitamos el archivo section.php para las plantillas antiguas, para las nuevas, ya sea section_horizontal.php o section_vertical.php, dependiendo de la ubicación en el sitio. Estamos buscando dónde se encuentra nuestro componente catalog.section y necesitamos insertar el siguiente código delante de él:
Esta pieza de código es responsable de ordenar de mayor a menor o viceversa.if ($solicitud->get("PROPIEDAD_MINIMUM_PRICE")) (
$arParams["ELEMENT_SORT_FIELD"] = "PROPIEDAD_MINIMUM_PRICE";
$arParams["ELEMENT_SORT_ORDER"] = $request->get("PROPERTY_MINIMUM_PRICE");
Además, dado que estamos trabajando con solucion estandar Bitrix en el diseño de la plantilla no hay botón de clasificación por precios, sugiero hacerlo. Además, antes de la salida del componente catalog.section, lanzaré un enlace en el que haremos clic en el futuro para ordenar los productos por precio.
/** @var \Bitrix\Main\HttpRequest $solicitud */
$solicitud = \Bitrix\Main\Context::getCurrent()->getRequest();
use Bitrix\Main\Web;
$Uri = new Web\Uri($solicitud->getRequestUri());
$Uri->addParams(["PROPERTY_MINIMUM_PRICE" => "ASC"]);
if ($solicitud->get("PROPIEDAD_MINIMUM_PRICE") == "ASC") (
$Uri->addParams(["PROPERTY_MINIMUM_PRICE" => "DESC"]);
Después de que nuestra URL esté lista, péguela en el botón:
getUri()?>">Ordenar por precio
¡Eso es todo! Podemos ir al sitio en cualquier sección del catálogo y comprobar cómo funciona todo. Gracias a todos por su atención, buenas noches))
Para realizar la ordenación en un componente noticias.lista o sección del catálogo el componente necesita pasar los parámetros ELEMENT_SORT_FIELD y ELEMENT_SORT_ORDER.
La clasificación se puede realizar por campos estándar, para lo cual puede utilizar la siguiente lista:
- identificación- identificación del elemento;
- clasificar- índice de clasificación;
- fecha y hora_x- Fecha de cambio;
- nombre- título;
- activo_desde o fecha_activo_desde- el comienzo del período del elemento;
- active_to o date_active_to- fin del período del elemento;
- estado- código de estado del elemento en el flujo de trabajo;
- código- código mnemotécnico del elemento;
- iblock_id- código numérico del bloque de información;
- modificado por- código del último usuario modificado;
- activo- signo de actividad del elemento;
- mostrar_contador- número de impresiones del elemento (tomado en cuenta por la función CIBlockElement::ContadorInc);
- show_counter_start- el tiempo de la primera visualización del elemento (tomado en cuenta por la función CIBlockElement::ContadorInc);
- espectáculos- número medio de impresiones (número de impresiones/duración de visualización);
- rand- Orden aleatorio;
- xml_id o id_externo- código externo;
- etiquetas- etiquetas;
- creado- tiempo de creación;
- Fecha de creación- fecha de creación excluyendo el tiempo;
- centavo- el número de elementos (solo con una agrupación dada).
Nota: Los campos activo_desde y active_to- obsoleto.
También puede ordenar por las propiedades del elemento del bloque de información que creó:
- propiedad_
- por valor de propiedad con un código numérico o mnemotécnico CÓDIGO_PROPIEDAD(por ejemplo, PROPIEDAD_123 o PROPIEDAD_NOTICIAS_FUENTE). - ordenar_propiedad_
- por el índice de clasificación de la variante de valor de propiedad. Solo para propiedades de tipo Lista. - catalogar_
_ - en el campo CAMPO_CATALOGO(puede ser PRECIO - precio o MONEDA - moneda) del precio con el tipo PRECIO_TIPO(por ejemplo, catalog_PRICE_1 o CATALOG_CURRENCY_3). La clasificación debe tener el formato: CATALOG_(PRICE o CURRENCY)_price-type-ID.- catálogo_CANTIDAD- Clasificación por cantidad.
- PROPIEDAD_
. - por el valor del campo del elemento especificado como enlace. CÓDIGO_PROPIEDAD- código mnemotécnico o simbólico de tipo propiedad unión a elementos. CAMPO puede tomar valores:
- TIMESTAMP_X
- MODIFICADO POR
- CREADO
- FECHA DE CREACIÓN
- CREADO POR
- IBLOCK_ID
- ACTIVO
- ACTIVO_DE
- ACTIVO_TO
- MOSTRAR_CONTADOR
- SHOW_COUNTER_START
- ID_XML
- ESTADO
- PROPIEDAD_
PROPIEDAD_ - por el valor de la propiedad del elemento especificado como enlace. CÓDIGO_PROPIEDAD- código mnemotécnico o simbólico de la propiedad del tipo vinculante a los elementos. PROPIEDAD_CODIGO2- código de propiedad de los elementos relacionados.- HAS_PREVIEW_PICTURE y TIENE_DETALLE_IMAGEN- ordenar por la presencia y ausencia de imágenes.
Nota: Propiedades catalogar_*** solo disponible con módulo Catálogo comercial.
El tipo de clasificación se especifica de acuerdo con la lista:
- asc- Ascendente;
- nulos, asc- ascendente con valores vacíos al comienzo de la muestra;
- asc, nulos- ascendente con valores vacíos al final de la muestra;
- descripción- descendiendo;
- nulos, descripción- descendiendo con valores vacíos al comienzo de la muestra;
- descripción, nulos- descendente con valores vacíos al final de la selección.
La forma más fácil de pasar nuevas opciones de clasificación a un componente es usar $_GET consulta y pasa las variables apropiadas.
También puedes usar $_SESIÓN y escriba las variables en la matriz de variables de sesión. Supongamos que necesitamos hacer enlaces o botones (nombre, precio, éxito de ventas, fecha de recepción) para clasificar los productos en la sección del catálogo (utilizamos un componente complejo catalogar). Después de haber copiado la plantilla, necesitamos abrir el archivo. sección.php y realice las siguientes modificaciones antes de conectar el componente bitrix:catálogo.sección:
<?if ($_GET["clasificar"] == "nombre" || $_GET["clasificar"] == "PRECIO_catálogo_3" || $_GET["clasificar"] == "propiedad_TIPO_PRODUCTO" || $_GET[" sort"] == "timestamp_x"))( $arParams["ELEMENT_SORT_FIELD"] = $_GET["sort"]; $arParams["ELEMENT_SORT_ORDER"] = $_GET["method"]; )else()?>
Este código es necesario para cambiar las opciones de clasificación en el componente. A continuación, abra el archivo plantilla.php componente sección del catálogo y agregue enlaces de control de clasificación:
Clasificación: clase = "activo"href="=$arResult["SECTION_PAGE_URL"]?>?sort=nombre&método=asc">nombre clase = "activo"href="=$arResult["SECTION_PAGE_URL"]?>?sort=catalog_PRICE_3&method=asc">precio clase = "activo"href="=$arResult["SECTION_PAGE_URL"]?>?sort=property_PRODUCT_TYPE&method=desc">superventas clase = "activo"href="=$arResult["SECTION_PAGE_URL"]?>?sort=timestamp_x&method=desc">fecha de recepción
Este tipo se puede hacer sin recargar la página usando jQuery o Marco Bitrix.
Si encuentra una inexactitud en el texto, una explicación incomprensible, háganoslo saber en los comentarios.
Históricamente, el componente complejo 1C-Bitrix no permite que el usuario clasifique los productos en la parte pública, al menos por precio, fecha, nombre y también elija cuántos productos en la página elegir. Pero ninguna de las tiendas en línea puede prescindir de dicha funcionalidad, que, por cierto, está incluida en casi todas las plantillas de tiendas en línea listas para usar en Marketplace. Pero implementar los bloques "Ordenar por: ..." y "Mostrar por: ..." es bastante simple. Solo necesita usar la matriz $_REQUEST y el método API 1C-Bitrix GetCurPageParam() para transferir datos a esta matriz.
¡Empecemos!
Primero, definamos qué quieren de nosotros:Vayamos en orden y comencemos mostrando la elección del usuario de la cantidad propuesta de productos en la página.
- Muestre el bloque "Mostrar por: 18 36 54 72" a la derecha arriba de la lista de productos. (El valor predeterminado es 9).
- A la izquierda, arriba de la lista de productos, muestre el bloque "Ordenar por: precio, nombre, fecha".
- Al hacer clic nuevamente en una opción de clasificación ya seleccionada, se cambia la dirección de clasificación.
- Fecha - fecha de cambio, precio - precio mostrado del artículo.
El parámetro PAGE_ELEMENT_COUNT es responsable de mostrar la cantidad de productos en la página. Le pasaremos la cantidad seleccionada por el usuario usando $_REQUEST y GetCurPageParam() .
Para empezar, crearemos la variable correspondiente y por defecto le asignaremos el valor especificado en los parámetros del componente. Y luego, cuando el usuario haga clic en la cantidad de elementos que necesita, lo modificaremos.
Se sugiere colocar el siguiente código antes de incluir el componente catalog.section. Si se usa el componente de catálogo complejo, entonces en el archivo en el que se llama al componente catalog.section, que muestra los productos en la página deseada.
Mostrar por for($i = 18; $i <= 72; $i+=18) : ?> clase = "actual" endif; ?>href="= $APPLICATION->GetCurPageParam("showBy=".$i, array("showBy", "modo")) ?>" >= $i ?> endfor; ?>
Y ahora le pasamos el valor recibido al componente:IncluirComponent("bitrix:catalog.section", ... "PAGE_ELEMENT_COUNT" => $pageElementCount, ... ?>
Ahora vamos a tratar con la clasificación. No es mucho más complicado, excepto que necesitamos verificar la dirección actual y cambiarla. Para ello, en el método GetCurPageParam(), pasaremos dos parámetros sortBy y orderBy. Y luego, en las variables apropiadas, páselas a los parámetros del componente "ELEMENT_SORT_FIELD" y "ELEMENT_SORT_ORDER", respectivamente. De forma predeterminada, la clasificación debe realizarse utilizando el campo de clasificación interno 1C-Bitrix: sort .Compruebe la dirección de clasificación y cámbiela si es necesario:
Mostramos enlaces para ordenar:
Ordenar por: class="clasificación-actual" endif; ?>href="= $APPLICATION->GetCurPageParam("sortBy=price&orderBy=".$orderBy, array("sortBy", "orderBy")) ?>" > precio class="clasificación-actual" endif; ?>href="= $APPLICATION->GetCurPageParam("sortBy=name&orderBy=".$orderBy, array("sortBy", "orderBy")) ?>" > nombre class="clasificación-actual" endif; ?>href="= $APPLICATION->GetCurPageParam("sortBy=date&orderBy=".$orderBy, array("sortBy", "orderBy")) ?>" > fecha
El parámetro de nombre es aceptado por el campo "ELEMENT_SORT_FIELD" para ordenar por nombre de producto sin intervención adicional, pero para la fecha y el precio, debemos aclarar a cuál de los parámetros del elemento infoblock nos referimos.Para la fecha, necesitamos el valor del campo "timestamp_x", que es responsable de la fecha del cambio. Para el precio, necesitamos averiguar el nombre del tipo de precio, que se muestra en el campo del elemento del bloque de información. Para hacer esto, debe imprimir la matriz $arItem en la plantilla del componente (catalog.section en mi caso) o usar var_dump($arItem); , o eco ""; print_r($arItem); eco " "; . Encuentre el campo de matriz responsable de mostrar el precio y copie su nombre, en mi caso resultó ser CATALOG_PRICE_1 . Vale la pena señalar que en el caso del precio, debe usar el nombre del campo que contiene el valor del precio sin moneda.
Y pase los datos recibidos a la variable $sortBy:
Y pasar los valores a los parámetros del componente:IncludeComponent("bitrix:catalog.section", ... "ELEMENT_SORT_FIELD" => $sortBy, "ELEMENT_SORT_ORDER" => $orderBy, ... ?>
Eso es todo. Esto dará como resultado una línea como esta:Ahora el usuario puede ordenar los productos y elegir cuántos productos quiere ver en la página y, por supuesto, moverse por las páginas y filtrar productos sin perder nada.