Ramp bewerken catalogus php. Beheer van inbegrepen gebieden. Maak en bewerk een insluitgebied

De inhoud van include-gebieden wordt opgeslagen in afzonderlijke PHP- of HTML-bestanden. Gebieden voor pagina's of secties worden met een achtervoegsel opgeslagen. De meegeleverde productbestanden gebruiken bijvoorbeeld het achtervoegsel _inc(Bijvoorbeeld, index_inc.php), en het invoeggebied voor de sitesectie wordt opgeslagen in een bestand met de naam sekte en er een achtervoegsel aan toevoegen (bijvoorbeeld sect_inc.php).

Belangrijk! Het include-gebiedbestand moet worden opgeslagen in dezelfde map als de pagina waarvoor het is gemaakt. Het invoeggebied voor een sectie bevindt zich in de map van die sectie.

Het verbinden van gebieden in een website-ontwerpsjabloon gebeurt met behulp van de component Een insluitgebied invoegen of gebruik de functie .

Het achtervoegsel dat wordt gebruikt om opgenomen gebieden aan te duiden, wordt bepaald door de optie met dezelfde naam in de componentinstellingen Een insluitgebied invoegen. De component kan niet alleen in de ontwerpsjabloon worden geplaatst, maar ook op sitepagina's, op voorwaarde dat het bestandsachtervoegsel anders is ingesteld dan het achtervoegsel dat in de sjabloon wordt gebruikt.

Eén component kan worden geconfigureerd voor slechts één van de hierboven beschreven weergaveopties. Bovendien kunnen ze worden weergegeven op de pagina's van de site in overeenstemming met eventuele andere voorwaarden. Bijvoorbeeld alleen op de hoofdpagina van de site of alleen voor geautoriseerde bezoekers, enz.

Opmerking: bepaald door optie Toon het opgenomen gebied.

Als de component in een website-ontwerpsjabloon wordt geplaatst, wordt de informatie uit bestand zal op de hele site worden weergegeven. Het instellen van de parameter is alleen beschikbaar voor een gebruiker met rechten edit_php.

Plaatsing van het insluitgebied

Ga als volgt te werk om een ​​insluitgebied te plaatsen:

  • Open de sitesjabloon of pagina in de visuele editor om deze te bewerken.
  • Voeg een onderdeel toe Een insluitgebied invoegen (bitrix:main.include) naar de sitesjabloon (of paginatekst) en configureer de instellingen ervan.

Er is een beperking aan het gebruik van include-gebieden bij het integreren in een ontwerp. Het houdt verband met de grootte die is toegewezen aan de cel waarin de component zich bevindt. Als de ingevoerde tekst, afbeelding of iets anders groter is dan de ruimte die voor het onderdeel is toegewezen, zal het ontwerp "gaan", dat wil zeggen vervormd.

Door gebruik te maken van invoeggebieden kunt u meer dan alleen tekst beheren. U kunt in dit gebied een afbeelding plaatsen in plaats van tekst (of een component Willekeurige foto) en krijg een individueel beeld van elke sectie. In dit geval zal individualiteit ‘dynamisch’ en veranderlijk zijn.

Maak en bewerk een insluitgebied

Het maken van insluitgebieden kan als volgt:


U kunt op dezelfde manier doorgaan met het bewerken van de opgenomen gebieden:


Aandacht! Als u de optie als inbegrepen gebied gebruikt uit bestand, dan moet u controleren of het bestand is verbonden vanaf het systeem en niet rechtstreeks wordt aangeroepen. Dit gebeurt met behulp van de volgende regel:
.

Voorbeeld van opgenomen bestandsinhoud:

Wereldboek
Alle boeken ter wereld


Voeg gebiedssjablonen toe

Opnamegebieden worden gemaakt op basis van sjablonen die zijn opgeslagen in mappen met de naam /page_templates/ :

  • /bitrix/templates/.default/page_templates/ - als deze sjabloon voor het opgenomen gebied wordt gebruikt voor alle siteontwerpsjablonen;
  • /bitrix/sjablonen/<идентификатор шаблона>/page_templates/ - als afzonderlijke sjablonen voor opnamegebieden worden gebruikt voor de sitesjabloon.

Om in de visuele editor een sjabloon te kunnen selecteren op basis waarvan een bewerkbaar gebied wordt aangemaakt, moet een lijst met sjablonen voor bewerkbare gebieden aan het bestand worden toegevoegd .inhoud.php.

Bestand .inhoud.php wordt opgeslagen in de map /page_templates/ in de map van de overeenkomstige sitesjabloon.

Voorbeeldbestandsinhoud:

GetMessage("standaard"), "sort"=>1); $TEMPLATE["page_inc.php"] = Array("name"=>GetMessage("page_inc"), "sort"=>2); $TEMPLATE["sect_inc.php"] = Array("name"=>GetMessage("sect_inc"), "sort"=>3); ?>

Houd er rekening mee dat de sjabloonnaam kan worden doorgegeven als parameter bij het verbinden van een bewerkbaar gebied in de sitesjabloon ("TEMPLATE"=>"page_inc.php" in het onderstaande voorbeeld).


Als het verbinden van bewerkbare gebieden wordt gedaan met behulp van de PHP-functie InclusiefBestand(), op de juiste plaatsen in het ontwerpsjabloon geplaatst, dan kan de code er als volgt uitzien:

$APPLICATION->IncludeFile(substr($APPLICATION->GetCurPage(),
0, strlen($APPLICATION->GetCurPage())-4).."_inc.php", Array(),
Array("MODE"=>"html", "NAME"=>GetMessage("PAGE_INC"), "TEMPLATE"=>"page_inc.php" ));
?>
$TOEPASSING->
IncludeFile($APPLICATION->GetCurDir().."sect_inc.php", Array(), Array("MODE"=>"html",
"NAME"=>GetMessage("SECT_INC"), "TEMPLATE"=>"sect_inc.php" ));
?>

Vaak doet zich een situatie voor dat het nodig is om de functionaliteit van de emarket basket()-methode, die verantwoordelijk is voor het toevoegen van goederen aan het mandje, uit te breiden. In systeemversie 2.8.4.3 en lager in de methode mand De gebeurtenis voor het aanpassen van deze actie is nog niet geregistreerd, dus om het probleem uit ons voorbeeld op te lossen, zullen we de winkelwagenmethode naar een aangepast bestand verplaatsen.

Taak: Bij het toevoegen van een product aan de winkelwagen is het noodzakelijk dat de koper een kleine opmerking kan achterlaten over het product dat hij aan de winkelwagen zal toevoegen; deze opmerking moet ook zichtbaar zijn in het administratieve gedeelte bij het bekijken van de bestelparameters. We zullen ook functionaliteit toevoegen aan onze nieuwe methode waarmee u de hoeveelheid van elk bestelelement met één kunt verhogen of verlagen.

Oplossing: Laten we de mandmethodecode uit het bestand kopiëren __aankoop.php, om te archiveren klassen/modules/emarket/__custom.php en hernoem de methode naar mand_aangepast. In de nieuwe methode is de regel:

$order = self::getBasketOrder(! in_array($mode, array("put", "remove")));

moet worden gewijzigd in:

$order = $this -> getBasketOrder (! in_array ($mode , array ("put" , "remove" )));

Na de regel:

if ($itemType == "element" ) (

$orderItem -> dop_info = htmlspecialchars(getRequest("dop_info" ));

deze code voegt de doorgegeven waarde uit het veld toe aan het orderelement dop_info.

Om de functionaliteit voor het verhogen of verlagen van de hoeveelheid van een orderelement te configureren, moet u:

na de regel:

$options = getRequest("opties");

toevoegen:

$mode_change = (int) getRequest("change_item");

en ook na de regel:

$bedrag = $bedrag?

toevoegen:

$amount: ($orderItem -> getAmount() + 1);

if ($mode_change ) $amount = ($mode_change == 1 ) ? $orderItem -> getAmount () + 1 : $orderItem -> getAmount () - 1 ; Als we het voorbeeld van de TPL-sjabloonengine gebruiken, dan bij gebruik in een sjabloon tpls/emarket/default.tpl, in het blok

+ -

bestel_item

, koppelingen:

waaraan u knoppen kunt koppelen, kunt u het aantal van elk bestelitem met één verhogen of verlagen.

< input name = "dop_info" style = "width: 100px;" type = "text" />

array("mand_aangepast" )); ?> In de sitesjablonen moet een formulier worden aangemaakt om een ​​product aan de winkelwagen toe te voegen. De formulieractie is standaard, behalve dat in plaats van de winkelwagenmethode basket_custom moet worden opgegeven. U moet ook invoer toevoegen aan het formulier zelf: In het administratieve gedeelte, in de module Gegevenssjablonen

u moet het gegevenstype openen om te bewerken

Volgorde, verkrijg de xml-weergave door aan het einde van de adresbalk van de browser het volgende toe te voegen: .xml De ontvangen gegevens zullen ongeveer het volgende blok bevatten:"Bestelnamen"

field-type-id= "12" zichtbaar= "zichtbaar" guide-id= "73" > "Dropdown lijst met meerkeuzevragen" data-type= "relatie" multiple= "meerdere" /> waarin. Voeg in de groep "Naameigenschappen" nog een veld van het type String toe, met een string-ID dop_info. Om de opgeslagen waarde weer te geven, zullen we bij het gedetailleerd bekijken van de bestelling enkele sjablonen uit het bestand opnieuw toewijzen \styles\skins\mac\data\modules\emarket\order-edit.xsl Om preciezer te zijn, zullen we de naam van het orderelement toevoegen en de waarde uit het dop_info-veld uitvoeren. Om dit deel van de bestelling uit te voeren, voegt u het bestand toe: \styles\skins\mac\data\modules\emarket\form.modify.custom.xsl met de volgende inhoud:

"http://www.w3.org/1999/XSL/Transform" xmlns:xlink= "http://www.w3.org/TR/xlink" >
"voorwerp" mode= "order-item-naam" > "($lang-prefix)/admin/catalog/edit/(//property/value/page/@id)/">
"//eigenschap[@name = "dop_info"]/waarde" />

Na het voltooien van alle beschreven acties, kan de koper, wanneer hij een bestelitem toevoegt, een korte opmerking over het toegevoegde product aangeven, en de winkelbeheerder kan, wanneer hij de bestelling in detail bekijkt, deze opmerking lezen.

Eigenlijk gaat de vraag over de implementatie van de winkel en hoe ik deze ga evalueren.

Laten we eerst eens kijken naar een echte winkel, hoe deze werkt, welke functies daar worden geïmplementeerd en wat de kosten zijn.

En zo kan een online winkel op Bitrix in 2 edities worden geïmplementeerd: klein bedrijf en zakelijk.

Wat is het belangrijkste verschil voor de winkel?

1. Er is geen advertentiemodule - de haalbaarheid van deze module kan in twijfel worden getrokken; hij kan worden geïmplementeerd op informatieblokken en hij zal snel en goed werken, en de module zelf is zwaar, in sommige gevallen is het helemaal niet aan te raden.

2. De online winkelmodule zelf is anders doordat er in het bedrijfsleven geen beperkingen zijn op het aantal prijzen voor goederen, en er zijn geen sets of kits; in een klein bedrijf is er maar één magazijn, er zijn geen aangesloten bedrijven (de vraag het is de vraag of het in de meeste gevallen nodig is) en je kunt geen elektronische inhoud verkopen, voor de rest werkt het op dezelfde manier in winkelredacties.

Wat we hebben, Bitrix is ​​volledig geïntegreerd met 1C, kleine bedrijven zijn goed als er geen magazijnen en verschillende prijzen zijn, bijvoorbeeld groothandel en voor goederen. Business is een winkel met monstertanden die klaar is voor elke onderneming.

En de prijs: 9.000 en 19.000 is een merkbaar verschil.

Startkosten 1.400 d.w.z. Eigenlijk zijn de resterende toevoegingen respectievelijk 7.600 en 17.600.

Gemiddeld kost het werk van een PHP-programmeur op de arbeidsbeurs $ 5-10 per uur, d.w.z. 130 UAH - 260 UAH. respectievelijk 58 en 29 uur, d.w.z. met normale werkuren per dag 4-7 dagen. Is het echt?

Laten we eerst uitzoeken wat er moet worden geïmplementeerd.

1. Productcatalogus

2. Winkelwagen

2.1. Kortingen

3. Een bestelling plaatsen

3.1. Betaalmethoden

3.2. Leveringsmethoden

Laten we het eerst vereenvoudigen:

Bitrix-start

Elke goede ontwikkeling in Bitrix begint met een aparte module waarin alles wordt opgeslagen en niet met al het andere interfereert.

De ontwikkeling van een webwinkelmodule begint met een standaard “lege module”

maak een map lokaal in de hoofdmap van de site en maak er een map in modules/NAMESPACE in mijn geval zal het dit zijn binliz.verkoop Om Bitrix te laten bepalen dat dit een module is, moet je een paar mappen en bestanden aanmaken, dit staat allemaal geschreven in de Bitrix-cursus, maar ik zal precies schrijven wat ik doe

maak een map installeren, bestanden install/index.php, include.php, opties.php

/** * Gebruiker: binliz */ gebruik Bitrix\Main\Localization\Loc; Loc::loadMessages(__FILE__); if (class_exists("binliz_sale")) ( return; ) klasse binliz_sale breidt CModule uit ( public $MODULE_ID = "binliz.sale"; public $MODULE_VERSION = "0.1"; public $MODULE_VERSION_DATE = "2016-09-19"; public $ MODULE_NAME = "Module binliz verkoop"; public $MODULE_DESCRIPTION = "Winkelmodule, gebruikt voor automatische verbinding van klassen. Gebruikt de D7-engine."; public $MODULE_GROUP_RIGHTS = "N" public $PARTNER_NAME = "binliz"; = "http: //site"; publieke functie DoInstall() ( globaal $APPLICATION; RegisterModule($this->MODULE_ID); ) publieke functie DoUninstall() ( globaal $APPLICATION; UnRegisterModule($this->MODULE_ID); ) )

Dat is alles, laten we naar toe gaan Desktop > Marktplaats > Geïnstalleerde oplossingen en onze module installeren, zullen we dit vaak installeren en installeren om zeker te weten dat onze module out-of-the-box zal worden ingezet.

Het eerste dat we moeten doen is de mogelijkheid organiseren om een ​​map aan te maken in het beheerderspaneel; we zullen het op dezelfde manier doen als bij Bitrix, d.w.z. Zonder een nieuwe structuur te bedenken, zullen we onze eigen tabbladen met de handelscatalogus toevoegen aan de informatieblokelementen.

Hoe dit te organiseren? Laten we eerst proberen een tabel te maken waarin we onze informatieblokken opslaan die catalogi zullen worden.

MAAK TABEL `b_binliz_sale_catalog` (`ID` int(11) NIET NULL, `IBLOCK_ID` int(11) NIET NULL, `OFFER_IBLOCK_ID` int(11) NIET NULL, `IS_CATALOG` int(1) NIET NULL, `IS_OFFERS` int (1) NIET NULL) ENGINE=InnoDB STANDAARD CHARSET=utf8 COLLATE=utf8_unicode_ci; ALTER TABEL `b_binliz_sale_catalog` PRIMARY SLEUTEL TOEVOEGEN (`ID`), UNIEKE SLEUTEL `IBLOCK_ID` (`IBLOCK_ID`) TOEVOEGEN, UNIEKE SLEUTEL `OFFER_IBLOCK_ID` TOEVOEGEN (`OFFER_IBLOCK_ID`); WIJZIG TABEL `b_binliz_sale_catalog` WIJZIG `ID` int(11) NIET NULL AUTO_INCREMENT;

Laten we een representatie van deze tabel maken in ORM, een lib-map maken en het bestand daarin plaatsen verkoopcatalogus.php

Naamruimte Binliz\Sale; gebruik Bitrix\Main, Bitrix\Main\Localization\Loc; Loc::loadMessages(__FILE__); /** * Class SaleCatalogTable * * @package Binliz\Sale **/ class SaleCatalogTable breidt Main\Entity\DataManager uit ( /** * Retourneert DB-tabelnaam voor entiteit. * * @return string */ public static function getTableName() ( return "b_binliz_sale_catalog" ) /** * Geeft de definitie van de entiteitskaart terug. */ public static function getMap() ( return array("ID" => array("data_type" => "integer", "primary) " => true, "autocomplete" => true, "title" => Loc::getMessage("SALE_CATALOG_ENTITY_ID_FIELD")), "IBLOCK_ID" => array("data_type" => "integer", "required" => true, "title" => Loc::getMessage("SALE_CATALOG_ENTITY_IBLOCK_ID_FIELD"),), "OFFER_IBLOCK_ID" => array("data_type" => "integer", "required" => true, "title" => Loc:: getMessage("SALE_CATALOG_ENTITY_OFFER_IBLOCK_ID_FIELD"), "IS_CATALOG" => array("data_type" => "integer", "required" => true, "title" => Loc::getMessage("SALE_CATALOG_ENTITY_IS_CATALOG_FIELD")," " IS_OFFERS" => array("data_type" => "geheel getal", "vereist" => waar, "title" => Loc::getMessage("SALE_CATALOG_ENTITY_IS_OFFERS_FIELD"),),);

)) En je kunt in principe lokalisatie plaatsen

lang/ru/lib/salediscount.php

$MESS["SALE_CATALOG_ENTITY_ID_FIELD"] = ""; $MESS["SALE_CATALOG_ENTITY_IBLOCK_ID_FIELD"] = ""; $MESS["SALE_CATALOG_ENTITY_OFFER_IBLOCK_ID_FIELD"] = ""; $MESS["SALE_CATALOG_ENTITY_IS_CATALOG_FIELD"] = ""; $MESS["SALE_CATALOG_ENTITY_IS_OFFERS_FIELD"] = "";

de module waar we aan vasthouden, de gebeurtenis en de klassemethode die daarvoor verantwoordelijk is. Om dit te doen, maakt u een evenementenmap in de lib-map en plaatst u onze evenementen daar. En dus een abstracte klasse.

Naamruimte Binliz\Sale\Events;

abstract class Base( beschermd $eventlist = ; publieke eindfunctie __construct())( $eventManager = \Bitrix\Main\EventManager::getInstance(); foreach($this->eventlist as $event)( $eventMethods = get_calld_class() . "::".$event["methode"]; $eventManager->addEventHandler($event["module"],$event["event"],$eventMethods) )

En een klasse voor het werken met het infoblok:

Naamruimte Binliz\Sale\Events;

Publieke functie GetByIblock($IBLOCK_ID)( $query = new \Bitrix\Main\Entity\Query(self::getEntity()); $query->setSelect(array("*")); $query->setFilter(array ("=IBLOCK_ID" => $IBLOCK_ID)); $result = $query->exec(); $ells = $result->fetch(); if(isset($ells["ID"])) retourneert $ells ; else return false ) public function AddByIblock($IBLOCK_ID,$arFields)( $query = new \Bitrix\Main\Entity\Query(self::getEntity()); $query->setSelect(array("IBLOCK_ID", "ID")); $query->setFilter(array("=IBLOCK_ID" => $IBLOCK_ID)); $result = $query->exec(); ["ID"])) self::Update($ells["ID"],$arFields); else $res = self::Add($arFields) publieke functie DeleteByIblock($IBLOCK_ID)( $ query = new \Bitrix \Main\Entity\Query(self::getEntity()); $query->setSelect(array("IBLOCK_ID","OFFER_IBLOCK_ID","ID","IS_CATALOG","IS_OFFERS"); (array("=IBLOCK_ID" => $IBLOCK_ID)); $result = $query->exec(); $ells = $result->fetch(); if(isset($ells["ID "]) && $ ells["OFFER_IBLOCK_ID"]==null) (self::Delete($ells["ID"]); terug waar;))

En het sjabloonbestand met een vinkje dat we uitvoeren:

Hoera, we hebben nu een werkend selectievakje dat bepaalt of we een directory hebben of niet.