Для одного из проектов, разрабатываемых на системе управления сайтом HostCMS, было необходимо сделать функцию выбора даты доставки. Я набросал базовый функционал дополнительного поля в шаге «Адрес доставки» корзины. В дальнейшем этот набросок был доведен до окончательного варианта на тестовой версии и интегрирован в интернет-магазин. На выходе получается дополнительное поле со встроенным календарем «Дата доставки», данные которого не только отображаются в последнем шаге корзины «Данные доставки», но и фигурируют в письмах пользователю и администратору интернет-магазина. Данный пример для оплаты при получении.
1. Создаем файл delivery-day.js
Создаем файл с любым названием, которое нравится, главное чтобы оно было по смыслу подходящее. Не забывайте кодировка файла должна быть UTF-8, при желании без BOM (Byte Order Mark). Вносим в него одну функцию:
function formatDate(date) { var dd = date.getDate()+1; if ( dd < 10 ) dd = '0' + dd; var mm = date.getMonth()+1; if ( mm < 10 ) mm = '0' + mm; var yy = date.getFullYear(); return dd+'.'+mm+'.'+yy; }
Если вы используете какой-нибудь другой файл на своем сайте, в котором храните Java Script код, а если он ещё и вызывается из основного макета, записывайте приведенный выше скриптик туда.
2. Добавляем строчки в XSL-шаблон.
Шаблон находиться в админке: XSL-шаблоны ? Интернет-магазин ? МагазинАдресДоставки.
2.1. Подключаем JS:
<script type="text/javascript" src="/admin/js/ui/jquery-ui.js"></script> <script type="text/javascript" src="/admin/js/ui/i18n/jquery.ui.datepicker-ru.js"></script> <script type="text/javascript" src="/admin/js/ui/timepicker/timepicker.js"></script> <script type="text/javascript" src="/{путь_до_файла_на_сервере}/delivery-day.js"></script>
2.2. Дописываем:
<div class="row"> <div class="caption">День доставки:</div> <div class="field"><input class="width1" id="delivery_day" type="text" disabled="disabled" name="delivery_day" size="16" value="" /> <input onclick="document.getElementById('delivery_day').disabled=(this.checked==true)?false:true;" type="checkbox" value="0" /></div> </div> <pre> <script type="text/javascript" language="JavaScript">// <![CDATA[ var d = new Date(); document.getElementById("delivery_day").value = formatDate(d); (function($) { $("#delivery_day") .datepicker({showOtherMonths: true, selectOtherMonths: true, changeMonth: true, changeYear: true, timeFormat: 'hh:mm:ss'}); })(jQuery); // ]]></script>
3. Вносим изменения в последний шаг корзины.
Заходим: XSL-шаблоны ? Интернет-магазин ? Формы оплаты ? ОплатаПриПолучении
В
<!-- Шаблон вывода данных о заказе --> <xsl:template match="shop_order">
Вставляем:
<xsl:if test="../ДеньДоставки != ''"> <br /><b>День доставки:</b><xsl:text> </xsl:text><xsl:value-of select="../ДеньДоставки"/> </xsl:if>
4. Исправляем шаблоны писем.
XSL-шаблоны ? Интернет-магазин ?
«ПисьмоАдминистратору» и «ПисьмоПользователю».
В зависимости от ветки размещения, копируем:
<xsl:if test="../ДеньДоставки !=''"> День доставки:</b><xsl:text> </xsl:text><xsl:value-of select="../ДеньДоставки"/> <br /> </xsl:if>
или
<xsl:if test="ДеньДоставки !=''"> День доставки:</b><xsl:text> </xsl:text><xsl:value-of select="ДеньДоставки"/> <br /> </xsl:if>
5. Записываем данные поля в сессию.
Типовые динамические страницы ? Интернет-магазин ? Интернет-магазин корзина
В код страницы в «case 2» добавляем:
$_SESSION['hostcmsOrder']['delivery_day'] = strval(Core_Array::getPost('delivery_day'));
6. Добавляем передачу доп.свойств в XSL.
Интернет-магазины ? Ваш магазин ? Справочник платежных систем ? Оплата наличными
В
class Shop_Payment_System_Handler1 extends Shop_Payment_System_Handler {
Вписываем функцию:
protected function _processXml() { Core_Event::notify('Shop_Payment_System_Handler.onBeforeProcessXml', $this); $oShop = $this->_shopOrder->Shop->clearEntities(); $oShop ->addEntity($oShop->Shop_Company) ->addEntity( $oShop->Site->clearEntities()->showXmlAlias() ) ->addEntity( $this->_shopOrder->clearEntities() ->showXmlCurrency(TRUE) ->showXmlCountry(TRUE) ->showXmlItems(TRUE) ->showXmlDelivery(TRUE) ->showXmlPaymentSystem(TRUE) ->showXmlOrderStatus(TRUE) ->showXmlProperties(TRUE) ) ->addEntity(Core::factory('Core_Xml_Entity')->name('ДеньДоставки')->value($_SESSION['hostcmsOrder']['delivery_day'])); $sXml = $oShop->getXml(); $return = Xsl_Processor::instance() ->xml($sXml) ->xsl($this->_xsl) ->process(); $this->_shopOrder->clearEntities(); Core_Event::notify('Shop_Payment_System_Handler.onAfterProcessXml', $this); return $return; }
Проверяем, должно всё работать.
О, это для меня слишком сложно, не смог повторить, пришлось скопировать