عدم ویرایش کاتالوگ php. گسترش کارکرد روش سبد emarket. ایجاد و ویرایش منطقه شامل

در واقع سوال در مورد اجرای فروشگاه و نحوه ارزیابی آن است.

ابتدا، بیایید به یک فروشگاه واقعی، نحوه عملکرد آن، چه عملکردهایی در آنجا و هزینه آن نگاه کنیم.

و بنابراین یک فروشگاه آنلاین در Bitrix را می توان در 2 نسخه پیاده سازی کرد: تجارت کوچک و تجارت.

تفاوت اصلی برای فروشگاه چیست؟

1. هیچ ماژول تبلیغاتی وجود ندارد - امکان سنجی این ماژول را می توان در بلوک های اطلاعاتی پیاده سازی کرد و به سرعت و به خوبی کار خواهد کرد و خود ماژول سنگین است، در برخی موارد اصلاً توصیه نمی شود.

2. خود ماژول فروشگاه آنلاین از این جهت متفاوت است که در تجارت هیچ محدودیتی در تعداد قیمت کالاها وجود ندارد و در یک تجارت کوچک فقط یک انبار وجود ندارد، هیچ شرکت وابسته ای وجود ندارد قابل بحث است که آیا در بیشتر موارد ضروری است) و شما نمی توانید محتوای الکترونیکی را بفروشید، بقیه موارد در تحریریه فروشگاه ها به همین صورت عمل می کند.

آنچه ما داریم، Bitrix به طور کامل با 1C ادغام شده است، اگر انباری وجود نداشته باشد و قیمت های مختلف، به عنوان مثال، عمده فروشی و برای کالا، تجارت کوچک خوب است. کسب و کار یک فروشگاه دندانه دار هیولا است که برای هر شرکتی آماده است.

و قیمت: 9000 و 19000 تفاوت محسوسی دارد.

هزینه شروع 1400 یعنی در واقع مابقی اضافات به ترتیب 7600 و 17600 است.

به طور متوسط، در بورس کار، کار یک برنامه نویس PHP 5-10 دلار در ساعت است، یعنی. 130 UAH - 260 UAH. به ترتیب 58 و 29 ساعت یعنی. با ساعات کار معمولی در روز 4-7 روز. آیا واقعی است؟

بیایید ابتدا بفهمیم چه چیزی باید اجرا شود.

1. کاتالوگ محصولات

2. سبد خرید

2.1. تخفیف

3. ثبت سفارش

3.1. روش های پرداخت

3.2. روش های تحویل

خوب، ابتدا آن را ساده می کنیم:

شروع Bitrix

هر توسعه مناسب در Bitrix با یک ماژول جداگانه شروع می شود که همه چیز در آن ذخیره می شود و با چیزهای دیگر تداخل نخواهد داشت.

توسعه یک ماژول فروشگاه آنلاین با یک "ماژول خالی" استاندارد آغاز می شود.

یک پوشه ایجاد کنید محلیدر ریشه سایت قرار دهید و یک پوشه در آن ایجاد کنید ماژول ها/NAMESPACEدر مورد من این خواهد بود binliz.saleبرای اینکه Bitrix تشخیص دهد که این یک ماژول است، باید چند پوشه و فایل ایجاد کنید، همه اینها در دوره Bitrix نوشته شده است، اما من دقیقا همان کاری را که انجام می دهم می نویسم.

یک پوشه ایجاد کنید نصب کنید، فایل ها install/index.php، include.php، options.php

/** * کاربر: binliz */ از Bitrix\Main\Localization\Loc استفاده کنید. Loc::loadMessages(__FILE__); if (class_exists("binliz_sale")) (return; ) کلاس binliz_sale CModule را گسترش می دهد ( عمومی $MODULE_ID = "binliz.sale"؛ عمومی $MODULE_VERSION = "0.1"؛ عمومی $MODULE_VERSION_DATE = "2016-09-19" عمومی. MODULE_NAME = "فروش ماژول" $MODULE_DESCRIPTION = "ماژول ذخیره سازی، برای اتصال خودکار کلاس ها استفاده می شود. از موتور D7 استفاده می کند." = "http: //site";

همین، بریم سراغ دسکتاپ > بازار > راه حل های نصب شدهو ماژول خود را نصب کنید، ما این کار را اغلب انجام می دهیم، آن را نصب و نصب می کنیم تا مطمئن شویم که ماژول ما خارج از جعبه مستقر می شود.

اولین کاری که باید انجام دهیم این است که برای راحتی، توانایی ایجاد دایرکتوری را در پنل مدیریتی سازماندهی کنیم، ما این کار را به همان روشی که با Bitrix انجام می دهیم، یعنی. بدون اختراع ساختار جدید، برگه های خود را با کاتالوگ تجارت به عناصر بلوک اطلاعات اضافه می کنیم.

چگونه این را سازماندهی کنیم؟ بیایید ابتدا سعی کنیم جدولی ایجاد کنیم که در آن بلوک های اطلاعاتی خود را که تبدیل به کاتالوگ می شوند ذخیره کنیم.

CREATE TABLE `b_binliz_sale_catalog` (`ID` int(11) NOT NULL, `IBLOCK_ID` int(11) NOT NULL, `OFFER_IBLOCK_ID` int(11) NOT NULL, `IS_CATALOG` int(1) NOT NULL, (1) NOT NULL) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; ALTER TABLE «b_binliz_sale_catalog» افزودن کلید اولیه («ID»)، افزودن کلید منحصر به فرد «IBLOCK_ID» («IBLOCK_ID»)، افزودن کلید منحصر به فرد «OFFER_IBLOCK_ID» («OFFER_IBLOCK_ID»). ALTER TABLE «b_binliz_sale_catalog» تغییر «ID» int(11) NOT NULL AUTO_INCREMENT.

بیایید یک نمایش از این جدول در ORM ایجاد کنیم، یک پوشه lib ایجاد کنیم و فایل را در آن قرار دهیم salecatalog.php

فضای نام Binliz\Sale; از Bitrix\Main، Bitrix\Main\Localization\Loc استفاده کنید. Loc::loadMessages(__FILE__); /** * Class SaleCatalogTable * * @package Binliz\Sale **/ class SaleCatalogTable Main\Entity\DataManager را گسترش می دهد ( /** * نام جدول DB را برای موجودیت برمی گرداند. * * @return رشته */ تابع استاتیک عمومی getTableName() ( return "b_binliz_sale_catalog" ) /** تعریف نقشه موجودیت را برمی گرداند * * @return آرایه */ تابع static public ("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" => آرایه ("data_type" => "integer"، "required" => true، "title" => Loc::getMessage("SALE_CATALOG_ID_ID_FIELD")، "CATALOG_ERS_TAFITY" => آرایه ("نوع_داده" => "عدد صحیح"، "الزامی" => درست، "عنوان" => Loc::getMessage("SALE_CATALOG_ENTITY_IS_OFFERS_FIELD")،)،);

)) و در اصل می توانید محلی سازی را قرار دهید

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"] = "";

ماژولی که روی آن آویزان هستیم، رویداد و متد کلاسی که مسئول آن است. برای این کار یک پوشه event در پوشه lib ایجاد می کنیم و رویدادهای خود را در آنجا قرار می دهیم. و بنابراین یک کلاس انتزاعی.

فضای نام Binliz\Sale\Events;

کلاس انتزاعی Base($eventlist محافظت شده =؛ تابع نهایی عمومی __construct())($eventManager = \Bitrix\Main\EventManager::getInstance(); foreach($this->Eventlist به عنوان $event) ($eventMethods = get_called_class() "::".$event["method"]; $eventManager->addEventHandler($event["module"],$event["event"],$eventMethods)

و یک کلاس برای کار با infoblock:

فضای نام Binliz\Sale\Events;

تابع عمومی 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) if(isset($ells["ID"])); ; else return false; "ID") ; ["ID"])) self::Update($ells["ID"],$arFields else $res = self::Add($arFields) function public DeleteByIblock($IBLOCK_ID)($ query = new \Bitrix); \Main\Entity\Query(self::getEntity()); (Array("=IBLOCK_ID" => $IBLOCK_ID) $result = $query->exec($ells) if(isset($ells["ID"]); ells["OFFER_IBLOCK_ID"]==null) (self::Delete($ells["ID"]); بازگشت واقعی ;))

و فایل قالب با یک علامت چک که ما خروجی می دهیم:

هورای، ما اکنون یک چک باکس کار داریم که تعیین می کند آیا دایرکتوری داریم یا نه.

محتویات مناطق شامل در PHP یا به طور جداگانه ذخیره می شود فایل های HTML. نواحی صفحات یا بخش ها با پسوندی ذخیره می شوند. به عنوان مثال، فایل های محصول ارائه شده از پسوند استفاده می کنند _inc(مثلاً index_inc.php)، و قسمت include برای بخش سایت در فایلی به نام ذخیره می شود فرقهو اضافه کردن یک پسوند به آن (مثلاً sect_inc.php).

مهم!فایل شامل ناحیه باید در همان دایرکتوری صفحه ای که برای آن ایجاد شده است ذخیره شود. ناحیه شامل یک بخش در پوشه آن بخش است.

اتصال مناطق در قالب طراحی وب سایت با استفاده از کامپوننت انجام می شود درج منطقه شاملیا با استفاده از تابع

پسوند مورد استفاده برای تعیین مناطق شامل شده توسط گزینه ای به همین نام در تنظیمات مؤلفه تعیین می شود درج منطقه شامل. کامپوننت را می توان نه تنها در قالب طراحی، بلکه در صفحات سایت قرار داد، مشروط بر اینکه پسوند فایل باید متفاوت از پسوند استفاده شده در قالب تنظیم شود.

یک جزء را می توان تنها برای یکی از گزینه های نمایشی که در بالا توضیح داده شد پیکربندی کرد. علاوه بر این، ممکن است مطابق با هر شرایط دیگری در صفحات سایت نمایش داده شوند. مثلا فقط در صفحه اصلی سایت یا فقط برای بازدیدکنندگان مجاز و غیره.

توجه:توسط گزینه تعیین می شود نمایش منطقه شامل.

اگر کامپوننت در قالب طراحی وب سایت قرار داده شده باشد، اطلاعات از فایلدر سراسر سایت نمایش داده خواهد شد. تنظیم پارامتر فقط برای یک کاربر با حقوق در دسترس است edit_php.

قرار دادن منطقه شامل

برای قرار دادن منطقه شامل موارد زیر را انجام دهید:

  • یک قالب یا صفحه سایت را برای ویرایش باز کنید ویرایشگر بصری.
  • یک جزء اضافه کنید درج منطقه شامل (bitrix:main.include) به قالب سایت (یا بدنه صفحه) بروید و تنظیمات آن را پیکربندی کنید.

در هنگام ادغام در یک طرح، استفاده از مناطق شامل محدودیت وجود دارد. مربوط به اندازه اختصاص داده شده برای سلولی است که جزء در آن قرار دارد. اگر اندازه متن، تصویر یا چیز دیگری وارد شده بزرگتر از فضای اختصاص داده شده برای مؤلفه باشد، طرح «رفته»، یعنی تحریف می شود.

استفاده از قسمت های شامل به شما امکان می دهد چیزی بیش از متن را کنترل کنید. می توانید یک تصویر را به جای متن (یا یک جزء) در این قسمت قرار دهید عکس تصادفی) و یک نمای جداگانه از هر بخش دریافت کنید. در این مورد، فردیت "پویا" و قابل تغییر خواهد بود.

ایجاد و ویرایش منطقه شامل

ایجاد مناطق شامل می تواند انجام شود:


شما می توانید به طور مشابه به ویرایش مناطق شامل ادامه دهید:


توجه!اگر از گزینه به عنوان منطقه شامل استفاده می کنید از فایل، سپس باید بررسی کنید که فایل از سیستم متصل است و مستقیماً فراخوانی نشده است. این کار با استفاده از خط زیر انجام می شود:
.

نمونه ای از محتویات فایل شامل:

کتاب جهان
همه کتاب های دنیا


شامل قالب های منطقه

مناطق شامل از الگوهای ذخیره شده در پوشه هایی با نام /page_templates/ ایجاد می شوند:

  • /bitrix/templates/.default/page_templates/ - اگر این الگوی ناحیه شامل برای همه قالب‌های طراحی سایت استفاده شود.
  • /bitrix/templates/<идентификатор шаблона>/page_templates/ - اگر از الگوهای منطقه گنجاندن جداگانه برای الگوی سایت استفاده شود.

برای اینکه بتوانید در ویرایشگر بصری الگویی را انتخاب کنید که بر اساس آن یک ناحیه قابل ویرایش ایجاد می شود، باید لیستی از الگوهای مناطق قابل ویرایش به فایل اضافه شود. .content.php.

فایل .content.phpدر پوشه /page_templates/ در دایرکتوری قالب سایت مربوطه ذخیره می شود.

محتویات فایل نمونه:

GetMessage("standart"), "sort"=>1); $TEMPLATE["page_inc.php"] = آرایه("name"=>GetMessage("page_inc"), "sort"=>2); $TEMPLATE["sect_inc.php"] = آرایه("name"=>GetMessage("sect_inc")، "sort"=>3); ?>

لطفاً توجه داشته باشید که هنگام اتصال یک منطقه قابل ویرایش در الگوی سایت، نام الگو را می توان به عنوان پارامتر ارسال کرد ("TEMPLATE"=>"page_inc.php" در مثال زیر).


اگر مناطق قابل ویرایش را با با استفاده از PHPتوابع IncludeFile()، در مکان های مناسب در قالب طراحی قرار می گیرد، سپس کد می تواند به شکل زیر باشد:

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

اغلب شرایطی پیش می‌آید که لازم است عملکرد متد () basket emarket که مسئول افزودن کالا به سبد خرید است، گسترش یابد. در سیستم ورژن 2.8.4.3 و پایین تر در روش سبدرویداد سفارشی سازی این عمل هنوز ثبت نشده است، بنابراین برای حل مشکل از مثال ما، متد سبد را به یک فایل سفارشی منتقل می کنیم.

وظیفه:هنگام افزودن محصول به سبد خرید، لازم است به خریدار اجازه دهید تا نظر کوچکی را در مورد محصولی که به سبد خرید اضافه می کند، درج کند. همچنین، ما عملکردی را به روش جدید خود اضافه می کنیم که به شما امکان می دهد مقدار هر عنصر سفارش را یک بار افزایش یا کاهش دهید.

راه حل:بیایید کد روش سبد را از فایل کپی کنیم __purchasing.php، برای تشکیل پرونده classes/modules/emarket/__custom.phpو نام متد را به سبد_سفارشی. در روش جدید، خط:

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

نیاز به تغییر دارد به:

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

بعد از خط:

اگر ($itemType == "عنصر") (

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

این کد مقدار ارسال شده از فیلد را به عنصر سفارش اضافه می کند dop_info.

برای پیکربندی عملکرد برای افزایش یا کاهش مقدار هر عنصر سفارش، باید:

بعد از خط:

$options = getRequest("گزینه ها");

اضافه کنید:

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

و همچنین بعد از خط:

$amount = $amount ?

اضافه کنید:

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

اگر ($mode_change) $amount = ($mode_change == 1) ? $orderItem -> getAmount () + 1 : $orderItem -> getAmount () - 1 ;اگر از مثال موتور قالب TPL استفاده کنیم، وقتی در قالب استفاده می شود tpls/emarket/default.tpl، در بلوک

+ -

order_item

، پیوندها:

که می توانید دکمه ها را به آن وصل کنید، می توانید تعداد هر مورد سفارش را یک بار افزایش یا کاهش دهید.

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

آرایه("سبد_سفارشی")); ?>در قالب های سایت باید فرمی برای افزودن محصول به سبد خرید ایجاد شود، یک اکشن فرم، استاندارد، با این تفاوت که به جای روش سبد باید basket_custom را مشخص کنید. همچنین باید ورودی خود را به فرم اضافه کنید: در بخش اداری، در ماژولالگوهای داده باید نوع داده را برای ویرایش باز کنیدسفارش دهید

، نمایش xml آن را با اضافه کردن در انتها دریافت کنید

نوار آدرسمرورگر: xml داده های دریافتی تقریباً شامل بلوک زیر خواهد بود:"اسامی سفارش"

field-type-id= "12" visual= "visible" guide-id= "73" > "لیست کشویی با چند گزینه" data-type= "relation" multiple= "multiple" /> که در آن guide-id = "73" dop_info، سپس با استفاده از پیوند، نوع داده را با type_id = 73 برای ویرایش باز کنید /admin/data/type_edit/73/. در گروه Name Properties، فیلد دیگری از نوع String با شناسه رشته اضافه کنید. . برای نمایش مقدار ذخیره شده، هنگام مشاهده جزئیات سفارش، برخی از الگوها را مجدداً از فایل اختصاص می دهیم\styles\skins\mac\data\modules\emarket\order-edit.xsl

، برای دقیق تر، به نام عنصر order اضافه می کنیم و مقدار را از قسمت dop_info خارج می کنیم. برای اجرای این قسمت از دستور، فایل را اضافه کنید:\styles\skins\mac\data\modules\emarket\form.modify.custom.xsl
با محتوای زیر:"http://www.w3.org/1999/XSL/Transform" xmlns:xlink= "http://www.w3.org/TR/xlink" >>
"شیء" />

mode= "order-item-name" >

عملیات