Порой случаются ситуации, когда клиенту что-то НУЖНО, но денег, чтобы купить более дорогую редакцию Битрикс у него нет. И тогда приходится придумывать разные интересные штуки, чтобы клиент остался доволен. Например нужно сделать форму заказа еды для редакции старт. Но проблемо!
Создаем инфоблок. В свойствах указываем например «Вес порции» и «Цена порции»
Создаем инфоблок для заказа
Делаем шаблон news.list для вывода товаров в форму заказа
<div class="order-list"> <?foreach($arResult["ITEMS"] as $arItem):?> <? $this->AddEditAction($arItem['ID'], $arItem['EDIT_LINK'], CIBlock::GetArrayByID($arItem["IBLOCK_ID"], "ELEMENT_EDIT")); $this->AddDeleteAction($arItem['ID'], $arItem['DELETE_LINK'], CIBlock::GetArrayByID($arItem["IBLOCK_ID"], "ELEMENT_DELETE"), array("CONFIRM" => GetMessage('CT_BNL_ELEMENT_DELETE_CONFIRM'))); ?> <div class="text-center order-item" id="<?=$this->GetEditAreaId($arItem['ID']);?>"> <?if($arParams["DISPLAY_NAME"]!="N" && $arItem["NAME"]):?> <h3 data-id="<?=$arItem['ID']?>"><?echo $arItem["NAME"]?></h3><br /> <?endif;?> <?if($arParams["DISPLAY_PICTURE"]!="N" && is_array($arItem["PREVIEW_PICTURE"])):?> <img class="img-responsive" border="0" src="<?=$arItem["PREVIEW_PICTURE"]["SRC"]?>" width="<?=$arItem["PREVIEW_PICTURE"]["WIDTH"]?>" height="<?=$arItem["PREVIEW_PICTURE"]["HEIGHT"]?>" alt="<?=$arItem["PREVIEW_PICTURE"]["ALT"]?>" title="<?=$arItem["PREVIEW_PICTURE"]["TITLE"]?>" style="margin: 0 auto;" /> <?endif?> <p><?if($arItem['DISPLAY_PROPERTIES']['WEIGHT']['VALUE'])echo('Порция - '.$arItem['DISPLAY_PROPERTIES']['WEIGHT']['VALUE'].' гр.')?> <b class="price"><span id="price<?=$arItem['ID']?>"><?=$arItem['DISPLAY_PROPERTIES']['PRICE']['VALUE']?></span><s>P</s></b><br/> <span class="minus" id="minus<?=$arItem['ID']?>" data-id="<?=$arItem['ID']?>">-</span> <span class="count" id="count<?=$arItem['ID']?>" data-id="<?=$arItem['ID']?>"> <?if($_GET['name'] == $arItem['ID']){?>1<?}else{?>0<?};?> //если мы перешили по ссылке "заказать блюдо", то количество этого блюда сразу делаем 1 </span> <span class="plus" id="plus<?=$arItem['ID']?>" data-id="<?=$arItem['ID']?>">+</span> <input type="hidden" name="PROPERTY[22][<?=$arItem['ID']?>]" value="<?echo $arItem["NAME"]?> - <?if($_GET['name'] == $arItem['ID']){?>1<?}else{?>0<?};?>" data-id="<?=$arItem['ID']?>"/> //PROPERTY[22] 22 - это ID нашего свойства "Заказ" </div> <?endforeach;?> </div>
Ставим на страничку заказа компонент iblock.element.add.form редактируем шаблон
$this->setFrameMode(false); if (!empty($arResult["ERRORS"])):?> <?ShowError(implode("<br />", $arResult["ERRORS"]))?> <?endif; if (strlen($arResult["MESSAGE"]) > 0):?> <?ShowNote($arResult["MESSAGE"])?> <?endif?> <div class="article-left"> <div class="article-right"> <div class="row"> <div class="col-xs-2 main-header-left"></div> <div class="col-xs-8"> <h1 class="main-header"> Заказ </h1> </div> <div class="col-xs-2 main-header-right"></div> </div> <hr/> <form name="iblock_add" action="<?=POST_FORM_ACTION_URI?>" method="post" enctype="multipart/form-data"> <?=bitrix_sessid_post()?> <?if ($arParams["MAX_FILE_SIZE"] > 0):?><input type="hidden" name="MAX_FILE_SIZE" value="<?=$arParams["MAX_FILE_SIZE"]?>" /><?endif?> <div class="row"> <div class="col-md-6"> <h2 class="order-header">Блюда</h2> <?$APPLICATION->IncludeComponent(// Здесь добавляем наш news.list для товаров "bitrix:news.list", "for-order", Array( "ACTIVE_DATE_FORMAT" => "d.m.Y", "ADD_SECTIONS_CHAIN" => "Y", "AJAX_MODE" => "N", "AJAX_OPTION_ADDITIONAL" => "", "AJAX_OPTION_HISTORY" => "N", "AJAX_OPTION_JUMP" => "N", "AJAX_OPTION_STYLE" => "Y", "CACHE_FILTER" => "N", "CACHE_GROUPS" => "Y", "CACHE_TIME" => "36000000", "CACHE_TYPE" => "A", "CHECK_DATES" => "Y", "COMPONENT_TEMPLATE" => "for-order", "DETAIL_URL" => "", "DISPLAY_BOTTOM_PAGER" => "Y", "DISPLAY_DATE" => "Y", "DISPLAY_NAME" => "Y", "DISPLAY_PICTURE" => "Y", "DISPLAY_PREVIEW_TEXT" => "Y", "DISPLAY_TOP_PAGER" => "N", "FIELD_CODE" => array(0=>"",1=>"",), "FILTER_NAME" => "", "HIDE_LINK_WHEN_NO_DETAIL" => "N", "IBLOCK_ID" => "6", "IBLOCK_TYPE" => "menu", "INCLUDE_IBLOCK_INTO_CHAIN" => "Y", "INCLUDE_SUBSECTIONS" => "Y", "MESSAGE_404" => "", "NEWS_COUNT" => "20", "PAGER_BASE_LINK_ENABLE" => "N", "PAGER_DESC_NUMBERING" => "N", "PAGER_DESC_NUMBERING_CACHE_TIME" => "36000", "PAGER_SHOW_ALL" => "N", "PAGER_SHOW_ALWAYS" => "N", "PAGER_TEMPLATE" => ".default", "PAGER_TITLE" => "Новости", "PARENT_SECTION" => "", "PARENT_SECTION_CODE" => "", "PREVIEW_TRUNCATE_LEN" => "", "PROPERTY_CODE" => array(0=>"WEIGHT",1=>"PRICE",2=>"",), "SET_BROWSER_TITLE" => "N", "SET_LAST_MODIFIED" => "N", "SET_META_DESCRIPTION" => "N", "SET_META_KEYWORDS" => "N", "SET_STATUS_404" => "N", "SET_TITLE" => "N", "SHOW_404" => "N", "SORT_BY1" => "ACTIVE_FROM", "SORT_BY2" => "SORT", "SORT_ORDER1" => "DESC", "SORT_ORDER2" => "ASC", "STRICT_SECTION_CHECK" => "N" ) );?> </div> <div class="col-md-6"> <h2 class="order-header">Напитки</h2> <?$APPLICATION->IncludeComponent(//Здесь тоже. Только другой инфоблок - для напитков. "bitrix:news.list", "for-order", Array( "ACTIVE_DATE_FORMAT" => "d.m.Y", "ADD_SECTIONS_CHAIN" => "Y", "AJAX_MODE" => "N", "AJAX_OPTION_ADDITIONAL" => "", "AJAX_OPTION_HISTORY" => "N", "AJAX_OPTION_JUMP" => "N", "AJAX_OPTION_STYLE" => "Y", "CACHE_FILTER" => "N", "CACHE_GROUPS" => "Y", "CACHE_TIME" => "36000000", "CACHE_TYPE" => "A", "CHECK_DATES" => "Y", "DETAIL_URL" => "", "DISPLAY_BOTTOM_PAGER" => "Y", "DISPLAY_DATE" => "Y", "DISPLAY_NAME" => "Y", "DISPLAY_PICTURE" => "Y", "DISPLAY_PREVIEW_TEXT" => "Y", "DISPLAY_TOP_PAGER" => "N", "FIELD_CODE" => array("",""), "FILTER_NAME" => "", "HIDE_LINK_WHEN_NO_DETAIL" => "N", "IBLOCK_ID" => "7", "IBLOCK_TYPE" => "menu", "INCLUDE_IBLOCK_INTO_CHAIN" => "Y", "INCLUDE_SUBSECTIONS" => "Y", "MESSAGE_404" => "", "NEWS_COUNT" => "20", "PAGER_BASE_LINK_ENABLE" => "N", "PAGER_DESC_NUMBERING" => "N", "PAGER_DESC_NUMBERING_CACHE_TIME" => "36000", "PAGER_SHOW_ALL" => "N", "PAGER_SHOW_ALWAYS" => "N", "PAGER_TEMPLATE" => ".default", "PAGER_TITLE" => "Новости", "PARENT_SECTION" => "", "PARENT_SECTION_CODE" => "", "PREVIEW_TRUNCATE_LEN" => "", "PROPERTY_CODE" => array("PRICE","WEIGHT",""), "SET_BROWSER_TITLE" => "N", "SET_LAST_MODIFIED" => "N", "SET_META_DESCRIPTION" => "N", "SET_META_KEYWORDS" => "N", "SET_STATUS_404" => "N", "SET_TITLE" => "N", "SHOW_404" => "N", "SORT_BY1" => "ACTIVE_FROM", "SORT_BY2" => "SORT", "SORT_ORDER1" => "DESC", "SORT_ORDER2" => "ASC", "STRICT_SECTION_CHECK" => "N" ) );?> <div id="result-price">//Здесь будет стоимость заказа </div> <div id="delivery-price">//Здесь будет стоимость доставки </div> <input id="input-price" type="hidden" name="PROPERTY[14][0]" value="" /> </div> </div> <div> <label class="control-label" for="name">Ваше имя<span class="starrequired">*</span></label><input class="form-control" id="name" type="text" name="PROPERTY[NAME][0]" size="30" value="" /> <label class="control-label" for="phone">Телефон<span class="starrequired">*</span></label><input class="form-control" id="phone" type="text" name="PROPERTY[13][0]" size="30" value="" /> <label class="control-label" for="adress">Адрес доставки<span class="starrequired">*</span></label><input class="form-control" id="adress" type="text" name="PROPERTY[15][0]" size="30" value="" /> <label class="control-label" for="comment">Комментарий</label><textarea class="form-control" id="comment" cols="30" rows="5" name="PROPERTY[DETAIL_TEXT][0]"></textarea> <input class="btn btn-primary" type="submit" name="iblock_submit" value="Отправить заказ" /> </div> </form> </div> </div>
Пишем скрипт, чтобы кнопочки нажимались, а цены считались
window.onload = function() { $('.minus').click(function(){//Нажимаем на минус var id = $(this).data('id'); var count = parseInt($('#count'+id).text()); var name = $('h3[data-id='+id+']').text(); if(count>0){ count--; $('#count'+id).text(count); $('input[data-id='+id+']').val(name+' - '+count); } console.log(name); calculate(); }) $('.plus').click(function(){//Нажимаем на плюс var id = $(this).data('id'); var name = $('h3[data-id='+id+']').text(); var count = parseInt($('#count'+id).text()); count++; $('#count'+id).text(count); $('input[data-id='+id+']').val(name+' - '+count); console.log(name); calculate(); }) var calculate = function(){//Считаем var totalPrice = 0; var deliveryPrice = 0; $.each($('.count'),function(index, text){ var id = $(text).data('id'); var currentPrice = parseInt($('#price'+id).text())*parseInt($('#count'+id).text()); console.log(currentPrice); totalPrice = totalPrice + currentPrice; $('#result-price').html('Стоимость заказа: '+totalPrice+'<s>P</s>'); }) if(totalPrice < 400){//Если сумма заказа меньше 400 рублей, добавляем стоимость доставки deliveryPrice = 100; $('#delivery-price').html('Стоимость доставки: 100<s>P</s>'); }else{ deliveryPrice = 0; $('#delivery-price').html('Доставка бесплатно!'); } console.log(totalPrice); var price = totalPrice+deliveryPrice; $('#input-price').val(price); } calculate(); }
В принципе всё готово. Но! Нам же нужно, чтобы заказ приходил к нам на почту! Для этого: создаем новое почтовое событие
Создаем для него шаблон
Идем в init.php и там создаем обработчик
<? define("LOG_FILENAME", $_SERVER["DOCUMENT_ROOT"]."/log.txt"); AddEventHandler("iblock", "OnAfterIBlockElementAdd", Array("NEW_ORDER", "OnAfterIBlockElementAddHandler")); class NEW_ORDER { // создаем обработчик события "OnAfterIBlockElementAdd" function OnAfterIBlockElementAddHandler(&$arFields) { if ($arFields["IBLOCK_ID"] == 8) { $content = ''; foreach($arFields["PROPERTY_VALUES"]["22"] as $contentField){ $content = $content.$contentField.'; '; } $arEventFields = array( "ORDER_NAME" => $arFields["NAME"], "ORDER_PHONE" => $arFields["PROPERTY_VALUES"]["13"], "ORDER_ADRESS" => $arFields["PROPERTY_VALUES"]["15"], "ORDER_COMMENT" => $arFields["DETAIL_TEXT"], "ORDER_PRICE" => $arFields["PROPERTY_VALUES"]["14"], "ORDER_CONTENT" => $content, ); //AddMessage2Log($arEventFields); CEvent::Send('NEW_ORDER',SITE_ID,$arEventFields); } } } ?>
Вы великолепны!