Пытаюсь сделать заказ в 1 клик
Переношу с демодизи
На текущий шаблон.
Скопировал функции класса для поддержки заказа в 1клик
getOneClickOrder,validOneClickInfo,saveOneClickInfo
Попробовал запустить перейдя по адресу.
пустой экран
спотыкалось на этой строчке
$objectId = $objects->addObject($order->getName(), $emarketOneClick->getId());
я добавил в таблицу
cms3_object_types новый тип с guid: emarket-purchase-oneclick
белый экран пропал но стала вылезать ошибка
error-required_one_click_list
и я не нашел что и куда добавлять теперь :(
собственно в этом и вопрос
значит проверка в функции emarket getOneClickOrder() не проходит
$errors = $dataModule->checkRequiredFields($form->getId());
if ($errors !== true) {
throw new publicException(getLabel('error-required_one_click_list') . $dataModule->assembleErrorFields($errors));
}
Судя по коду, из-за того, что не заполнены необходимые поля (checkRequiredFields) возможно он не может найти $form->getId(). Проверяйте по частям и смотрите что не работает.
P.S. попробуйте отключить обязательные поля, в созданном типе данных Данные из формы "Заказ в 1 клик". Станет понятно, он проверку не проходит или что-то другое ему мешает.
не совсем.
На тестовом
если перейти по ссылке /ru/emarket/getOneClickOrder/element/57.xml
то он в xml файле говорит:
<udata xmlns:xlink="http://www.w3.org/TR/xlink" module="emarket" method="getOneClickOrder" generation-time="0.022824">
<error>
Заказ не оформлен, потому что не были заполнены обязательные поля: Фамилия, Имя, E-mail, Телефон
</error>
</udata>
Если перейти по подобной ссылке том сайте где пытаюсь сделать то вот вывод:
<udata xmlns:xlink="http://www.w3.org/TR/xlink" module="emarket" method="getOneClickOrder" generation-time="0.009424">
<error>error-required_one_click_list</error>
</udata>
А когда тип не был определен то он спотыкался на этой строчке:
$form = $types->getTypeByGUID('emarket-purchase-oneclick');
много вопросов по вашим комментариям, но для начала, о самом явном... при вызове макроса, необходимо использовать протокол udata, а не uobject
замените
/uobject/data/getCreateForm/126(идешник этого типа)/
на
/udata/data/getCreateForm/126(идешник этого типа)/
Точно! сработало:
<udata xmlns:xlink="http://www.w3.org/TR/xlink" module="data" method="getCreateForm" generation-time="0.008884">
<group name="personal" title="Персональные данные">
<field name="lname" title="Фамилия" field_id="180" input_name="data[new][lname]" type="string" id="180" required="required"/>
<field name="fname" title="Имя" tip="Это поле содержит Имя пользователя. Оно отображается в характеристиках пользователя и может быть изменено самим пользователем." field_id="181" input_name="data[new][fname]" type="string" id="181" required="required"/>
<field name="father_name" title="Отчество" field_id="182" input_name="data[new][father_name]" type="string" id="182"/>
<field name="email" title="E-mail" field_id="209" input_name="data[new][email]" type="string" id="209" required="required"/>
<field name="phone" title="Телефон" field_id="440" input_name="data[new][phone]" type="string" id="440" required="required"/>
</group>
</udata>
когда поля не заполнены на тестовом сайте пишет
<error>
Заказ не оформлен, потому что не были заполнены обязательные поля: Фамилия, Имя, E-mail, Телефон
</error>
а у меня
<error>error-required_one_click_list</error>
Данные получаю по одинаковой ссылке
/ru/emarket/getOneClickOrder/element/57.xml
только ид отличается естественно
Закоментировал(я вообще не понял зачем это надо...)
if ($errors !== true) {
throw new publicException(getLabel('error-required_one_click_list') . $dataModule->assembleErrorFields($errors));
И все стало немного лучше, но не до конца, почему то вот такой результат выдает
<?xml version="1.0" encoding="utf-8"?><result xmlns:xlink="http://www.w3.org/TR/xlink">
<data><error code="0" type="valueRequiredException">Поле "Фамилия" обязательно должно быть заполнено</error><backtrace><trace>Array</trace><trace>Array</trace><trace>Array</trace><trace>Array</trace><trace>Array</trace><trace>Array</trace><trace>Array</trace><trace>Array</trace><trace>Array</trace><trace>Array</trace><trace>Array</trace><trace>Array</trace><trace>Array</trace><trace>Array</trace><trace>Array</trace><trace>Array</trace><trace>Array</trace><trace>Array</trace><trace>Array</trace></backtrace></data>
</result>
Так понял немного:
Прописал лабел
'error-required_one_click_list' => 'Заказ не оформлен, потому что не были заполнены обязательные поля: ',
Теперь показывается более правильно но не отображается, какие именно поля не заполнены. в отличии от теста
<error>
Заказ не оформлен, потому что не были заполнены обязательные поля:
</error>
вот тут косяк
throw new publicException(getLabel('error-required_one_click_list') . $dataModule->assembleErrorFields($errors));
в $dataModule->assembleErrorFields($errors) - пусто
вот заполнение
$dataModule = cmsController::getInstance()->getModule('data');
$errors = $dataModule->checkRequiredFields($form->getId());
Ура заменил папку в classes Data из тестового юми и все заработало....
всмысле вернуло правильную ошибку ))
Заказ не оформлен, потому что не были заполнены обязательные поля: Фамилия, Имя, E-mail, Телефон
Чего то не могу понять почему шаблон не применяется для этой формы:
пишу в шаблоне object.xsl
<xsl:apply-templates select="document('udata://data/getCreateForm/126')/udata" /> </xsl:template>
и прописываю для него шаблон:
<xsl:variable name="customer-info" select="document(concat('uobject://', document('udata://users/auth')/udata/user_id))" />
<xsl:variable name="customer-email" select="$customer-info//group[@name = 'idetntify_data']/property[@name = 'e-mail']/value" />
<xsl:template match="getCreateForm">
<div class="content">
<form class="buyer_data" enctype="multipart/form-data" method="post" action="/{udata/group/@lang}/emarket/getOneClickOrder/">
<xsl:apply-templates select="udata/group/field" />
</form>
</div>
</xsl:template>
<xsl:template match="field">
<div>
<label>
<xsl:if test="@required">
<xsl:attribute name="class">required</xsl:attribute>
</xsl:if>
<span>
<xsl:value-of select="@title" /><xsl:if test="@required"><xsl:text>*</xsl:text></xsl:if>:
</span>
<input type="text" class="textinputs" name="data[new][{@name}]">
<xsl:variable name="inputName" select="@name" />
<xsl:if test="@required">
<xsl:attribute name="required">required</xsl:attribute>
</xsl:if>
<xsl:choose>
<xsl:when test="$customer-info//object/@type-guid = 'users-user' and $inputName = 'email'">
<xsl:attribute name="value"><xsl:value-of select="$customer-email"/></xsl:attribute>
</xsl:when>
<xsl:otherwise>
<xsl:attribute name="value"><xsl:value-of select="$customer-info//property[@name = $inputName]/value"/></xsl:attribute>
</xsl:otherwise>
</xsl:choose>
</input>
</label>
</div>
</xsl:template>
А он не применяется...понять не могу почему...
Может кто знает?
ваш вызов
<xsl:apply-templates select="document('udata://data/getCreateForm/126')/udata" /> </xsl:template>
вернет xml вида
<udata module="data" method="getCreateForm" generation-time="0.009103">
<group name="group_1" title="Первая группа полей">
<field name="field_1_1" title="Первое поле" ... и другие атрибуты ... />
<field name="field_1_2" title="Первое поле" ... и другие атрибуты ... />
<field name="field_1_3" title="Первое поле" ... и другие атрибуты ... />
... и другие поля ...
</group>
<group name="group_2" title="Вторая группа полей">
<field name="field_2_1" title="Первое поле" ... и другие атрибуты ... />
<field name="field_2_2" title="Первое поле" ... и другие атрибуты ... />
<field name="field_2_3" title="Первое поле" ... и другие атрибуты ... />
... и другие поля ...
</group>
... и другие группы полей ...
</udata>
и начинать обрабатывать его надо шаблоном с другим match
<xsl:template match="udata[@method='getCreateForm']">
....
</xsl:template>
вот xml
<udata xmlns:xlink="http://www.w3.org/TR/xlink" module="data" method="getCreateForm" generation-time="0.011625">
<group name="personal" title="Персональные данные">
<field name="lname" title="Фамилия" field_id="180" input_name="data[new][lname]" type="string" id="180" required="required"/>
<field name="fname" title="Имя" tip="Это поле содержит Имя пользователя. Оно отображается в характеристиках пользователя и может быть изменено самим пользователем." field_id="181" input_name="data[new][fname]" type="string" id="181" required="required"/>
<field name="father_name" title="Отчество" field_id="182" input_name="data[new][father_name]" type="string" id="182"/>
<field name="email" title="E-mail" field_id="209" input_name="data[new][email]" type="string" id="209" required="required"/>
<field name="phone" title="Телефон" field_id="440" input_name="data[new][phone]" type="string" id="440" required="required"/>
</group>
</udata>
match не сработал
попробовал в вызове тоже применить
<xsl:apply-templates select="document('udata://data/getCreateForm/126')/udata[@method = 'getCreateForm']" />
все тож самое
match не сработал
вы уверенны что он не сработал? или что у вас сработал первый template? а сами поля не появились?
Так как в вашем примере дальше еще есть ошибки с match
например <xsl:apply-templates select="udata/group/field" />
должен превратиться в <xsl:apply-templates select="group/field" />
Для полной уверенности что проблема именно в вызове, попробуйте такую вставку:
вызов
<xsl:apply-templates select="document('udata://data/getCreateForm/126')/udata" mode="test" />
шаблон
<xsl:template match="udata[@method='getCreateForm']">
вывод успешно произведен
</xsl:template>
вот функции::
/**
* Оформление заказа в 1 клик
* @param bool $itemType
* @param bool $elementId
* @return array
* @throws publicException
*/
public function getOneClickOrder($itemType = false, $elementId = false) {
$params = array();
$customer = customer::get();
$types = umiObjectTypesCollection::getInstance();
$form = $types->getTypeByGUID('emarket-purchase-oneclick');
$dataModule = cmsController::getInstance()->getModule('data');
$errors = $dataModule->checkRequiredFields($form->getId());
if ($errors !== true) {
throw new publicException(getLabel('error-required_one_click_list') . $dataModule->assembleErrorFields($errors));
}
$errors = $this->validOneClickInfo();
if (count($errors) > 0) {
return $errors;
}
if ($itemType && $elementId) {
$_REQUEST['no-redirect'] = 1;
$this->basket('put', 'element', $elementId);
}
$order = self::getBasketOrder();
$this->saveOneClickInfo($order);
if ($order->getTotalAmount() < 1) {
throw new publicException('%error-market-empty-basket%');
}
$order->setValue('order_date', time());
$numOrder = $order->generateNumber();
$order->setOrderStatus('waiting');
$order->commit();
$params['orderId'] = $numOrder;
return $params;
}
/**
* Валидация данных о покупателе в 1 клик
* @return array
*/
public function validOneClickInfo() {
$dataForm = getRequest('data');
$emarketOneClick = umiObjectTypesCollection::getInstance()->getTypeByGUID('emarket-purchase-oneclick');
$errors = array();
foreach ($emarketOneClick->getAllFields() as $field) {
$value = $dataForm['new'][$field->getName()];
if($restrictionId = $field->getRestrictionId()) {
$restriction = baseRestriction::get($restrictionId);
if($restriction instanceof baseRestriction) {
if($restriction instanceof iNormalizeInRestriction) {
$value = $restriction->normalizeIn($value);
}
if($restriction->validate($value) == false) {
$fieldTitle = $field->getTitle();
$errstr = getLabel('error-wrong-field-value');
$errstr .= " \"{$fieldTitle}\" - " . $restriction->getErrorMessage();
$errors['nodes:error'][] = $errstr;
}
}
}
if (count($errors) > 0) {
return $errors;
}
}
}
/**
* Сохранение информации о покупателе, совершившем заказ в 1 клик
* @param $order
* @return array
*/
public function saveOneClickInfo($order) {
$dataForm = getRequest('data');
$objects = umiObjectsCollection::getInstance();
$emarketOneClick = umiObjectTypesCollection::getInstance()->getTypeByGUID('emarket-purchase-oneclick');
$objectId = $objects->addObject($order->getName(), $emarketOneClick->getId());
$object = $objects->getObject($objectId);
foreach ($emarketOneClick->getAllFields() as $field) {
$value = $dataForm['new'][$field->getName()];
$object->setValue($field->getName(), $value);
}
$object->commit();
if (!customer::get()->isFilled()) {
foreach ($emarketOneClick->getAllFields() as $field) {
$value = $dataForm['new'][$field->getName()];
customer::get()->setValue($field->getName(), $value);
}
}
$order->setValue('purchaser_one_click', $objectId);
$order->commit();
return;
}
вот в файле events.php
new umiEventListener('order-status-changed', 'events', 'onEmarketOrderAdded');
а вот в файле __events_handlers.php
public function onEmarketOrderAdded(iUmiEventPoint $event) {
if ($event->getMode() == "after" && $event->getParam("old-status-id") != $event->getParam("new-status-id")) {
if ($event->getParam("new-status-id") == order::getStatusByCode('waiting') && $event->getParam("old-status-id") != order::getStatusByCode('editing')) {
$module = cmsController::getInstance()->getModule('emarket');
$order = $event->getRef("order");
$link = $module->getObjectEditLink($order->getId(), 'order');
$this->registerEvent('emarket-order-add', array($link, $order->getName()), null, $order->getId());
}
}
}
то-есть вроде все есть...
при обычном оформлении заказа все отправляется
при заказе в 1 клик нет...
ilyar, спасибо за отклик! Постараюсь с учетом замечаний задавать вопросы, и по возможности привести коды. Заранее извиняюсь за километровое сообщение (дальше такого уже не будет)!
Вижу в правах пропустил validOneClickInfo, saveOneClickInfo. Если создаем новые публичные методы (макросы), надо и явно задавать права.
Переносил из localhost - там в правах не было validOneClickInfo, saveOneClickInfo. Но я всё же добавил, чтобы потом у меня и по этому поводу вопроса не было (/classes/modules/emarket/permissions.php):
<?php
$permissions = array(
'purchasing' => array(
'price', 'stores', 'ordersList', 'basketAddLink', 'basketAddFastLink', 'fastPurchase', 'applyPriceCurrency',
'order', 'basket', 'cart',
'purchase', 'getOneClickOrder', 'gateway', 'callback', 'receipt', 'removeDeliveryAddress',
'currencySelector', 'getCustomerInfo', 'selectCurrency', 'discountInfo', 'createForm', 'purchasing_one_step', 'saveinfo', 'validOneClickInfo', 'saveOneClickInfo'
),
'personal' => array(
'ordersList', 'customerDeliveryList'
),
'compare' => array(
'getCompareList', 'getCompareLink',
'addToCompare', 'removeFromCompare', 'resetCompareList',
'jsonAddToCompareList', 'jsonRemoveFromCompare', 'jsonResetCompareList'
),
'control' => array(
'orders', 'ordersList', 'del', 'order_edit', 'order_printable', 'order.edit',
'currency', 'currency_add', 'currency_edit', 'currency.edit',
'delivery', 'delivery_add', 'delivery_edit', 'delivery_address_edit', 'delivery.edit',
'discounts', 'discount_add', 'discount_edit', 'getModificators', 'getRules', 'discount', 'discount.edit',
'payment', 'payment_add', 'payment_edit', 'payment.edit',
'stores', 'store_add', 'store_edit', 'store', 'store.edit'
),
'order_editing' => array(
'editOrderAsUser', 'actAsUser'
)
);
?>
Добавленные/перенесенные макросы (/classes/modules/emarket/__purchasing.php) - макросы не трогал, т.е. ничего в них не менял:
/**
* Оформление заказа в 1 клик
* @param bool $itemType
* @param bool $elementId
* @return array
* @throws publicException
*/
public function getOneClickOrder($itemType = false, $elementId = false) {
$params = array();
$types = umiObjectTypesCollection::getInstance();
$form = $types->getTypeByGUID('emarket-purchase-oneclick');
$dataModule = cmsController::getInstance()->getModule('data');
$errors = $dataModule->checkRequiredFields($form->getId());
if ($errors !== true) {
throw new publicException(getLabel('error-required_one_click_list') . $dataModule->assembleErrorFields($errors));
}
$errors = $this->validOneClickInfo();
if (count($errors) > 0) {
return $errors;
}
if ($itemType && $elementId) {
$_REQUEST['no-redirect'] = 1;
$this->basket('put', 'element', $elementId);
}
$order = self::getBasketOrder();
$this->saveOneClickInfo($order);
if ($order->getTotalAmount() < 1) {
throw new publicException('%error-market-empty-basket%');
}
$order->setValue('order_date', time());
$numOrder = $order->generateNumber();
$order->setOrderStatus('waiting');
$order->commit();
$params['orderId'] = $numOrder;
return $params;
}
/**
* Валидация данных о покупателе в 1 клик
* @return array
*/
public function validOneClickInfo() {
$dataForm = getRequest('data');
$emarketOneClick = umiObjectTypesCollection::getInstance()->getTypeByGUID('emarket-purchase-oneclick');
$errors = array();
foreach ($emarketOneClick->getAllFields() as $field) {
$value = $dataForm['new'][$field->getName()];
if($restrictionId = $field->getRestrictionId()) {
$restriction = baseRestriction::get($restrictionId);
if($restriction instanceof baseRestriction) {
if($restriction instanceof iNormalizeInRestriction) {
$value = $restriction->normalizeIn($value);
}
if($restriction->validate($value) == false) {
$fieldTitle = $field->getTitle();
$errstr = getLabel('error-wrong-field-value');
$errstr .= " \"{$fieldTitle}\" - " . $restriction->getErrorMessage();
$errors['nodes:error'][] = $errstr;
}
}
}
if (count($errors) > 0) {
return $errors;
}
}
}
/**
* Сохранение информации о покупателе, совершившем заказ в 1 клик
* @param $order
* @return array
*/
public function saveOneClickInfo($order) {
$dataForm = getRequest('data');
$objects = umiObjectsCollection::getInstance();
$emarketOneClick = umiObjectTypesCollection::getInstance()->getTypeByGUID('emarket-purchase-oneclick');
$objectId = $objects->addObject($order->getName(), $emarketOneClick->getId());
$object = $objects->getObject($objectId);
foreach ($emarketOneClick->getAllFields() as $field) {
$value = $dataForm['new'][$field->getName()];
$object->setValue($field->getName(), $value);
}
$object->commit();
if (!customer::get()->isFilled()) {
foreach ($emarketOneClick->getAllFields() as $field) {
$value = $dataForm['new'][$field->getName()];
customer::get()->setValue($field->getName(), $value);
}
}
$order->setValue('purchaser_one_click', $objectId);
$order->commit();
return;
}
public function createForm($object_type) {
$langs = langsCollection::getInstance();
$lang = getRequest('lang');
$lang = $langs->getLangId($lang);
if (!$lang) {
$lang = $langs->getDefaultLang()->getId();
}
$cmsController = cmsController::getInstance();
$cmsController->setLang($langs->getLang($lang));
$data = cmsController::getInstance()->getModule('data');
$form = $data->getCreateForm($object_type);
if (array_key_exists('nodes:group', $form) && count($form['nodes:group']) > 0) {
$form['nodes:group'][0]['attribute:lang'] = $langs->getLang($lang)->getPrefix();
}
return $form;
}
};
Предположу что ответ есть в материале Заказ в 1 клик.
Еще есть такой материал Оформление заказа в один шаг – xslt шаблонизатор, может быть полезен тоже.
Читал документацию, и обращение в форму есть в basket.js, далее приведу скрипты, чтобы было видно наглядно, мало ли чего там не хватает (/js/site/basket.js - добавленный код):
...здесь всё то, что идет до этого - ничего не трогал, а далее site.basket.list поменял на...
site.basket.list = function(link) {
var oneClick = false;
var id = (link.id.indexOf('add_basket') != -1) ? link.id.replace(/^add_basket_/, '') : false;
if (!id) {
oneClick = true;
id = (link.id.indexOf('one_click') != -1) ? link.id.replace(/^one_click_/, '') : link;
}
if (!id) return false;
if (jQuery(link).hasClass('options_true')) {
var url = '/upage//' + id + '?transform=modules/catalog/popup-add-options.xsl';
if (oneClick) {
url = '/upage//' + id + '?transform=modules/catalog/popup-add-options-oneclick.xsl';
}
if (jQuery('#add_options_' + id).length == 0) {
jQuery.ajax({
url: url,
dataType: 'html',
success: function (data) {
site.message({
id: 'add_options_' + id,
header: 'Выбор опций',
width: 400,
content: data,
async: false
});
var form = jQuery('form.options');
form.append('<input type="submit" class="button" value="'+ i18n.basket_add_short +'" />');
form.submit(function() {
if (!site.basket.is_cart && !oneClick) {
site.basket.add(id, this, true);
} else if(!site.basket.is_cart && oneClick) {
site.basket.oneClick(id, this);
site.message.close(jQuery('#add_options_' + id), jQuery('.overlay'))
}
return false;
});
}
});
}
}
else if(!oneClick) {
this.add(id);
} else {
site.basket.oneClick(id);
}
};
...здесь site.basket.modify, site.basket.remove, site.basket.modify.complete, а дальше добавил...
site.basket.oneClick = function(id, form) {
var option = $(form).find('input[type="radio"]:checked');
var optional;
if (option.length > 0) {
optional = '?' + option.attr('name') + '=' + $(form).find('input[type="radio"]:checked').val()
} else {
optional = '';
}
var locale = location.pathname;
var lang = locale.substring(1,locale.substring(1).indexOf('/')+1);
jQuery.ajax({
url: '/udata/emarket/createForm/emarket-purchase-oneclick?transform=modules/catalog/one-click.xsl&lang=' + lang,
dataType: 'html',
success: function (data) {
site.message({
id: 'one_click_popup_' + id,
header: i18n.oneclick_checkout,
width: 400,
content: data,
async: false
});
var form = jQuery('form.buyer_data');
form.attr('action', form.attr('action') + 'element/' + id + '.xml' + optional)
form.append('<div><input type="submit" class="button big" value="' + i18n.checkout + '" /></div>');
form.submit(function() {
var xml = site.basket.sendForm(form).responseXML;
form.closest('.content').find('.error').remove();
$(xml).find('error').each(
function() {
form.closest('div').prepend('<div class="error">' + $(this).text() + '</div>');
}
);
form.closest('.content').find('.success').remove();
if ($(xml).find('orderId').length > 0) {
site.basket.replace('all');
form.closest('div').prepend('<div class="success"><div><p>' + i18n.finish_message_prefix + '<strong>#' + $(xml).find('orderId').eq(0).text() + '</strong>' + i18n.finish_message_postfix + '</p></div><a class="button big close">' + i18n.continue + '</a></div>');
form.remove();
}
return false;
});
}
});
}
site.basket.sendForm = function(form) {
return jQuery.ajax({
url: form.attr('action'),
dataType: 'xml',
method: form.attr('method'),
data: form.serialize(),
async: false,
success: function (data) {
return data;
}
});
}
...далее site.basket.init - без внесения каких-либо изменений
Переходит значит нет обработчика события клика (js event) или он обрабатывает ее не правильно. Текст "Debug message for UC-pages." следствие отсутствия обработчика, не предполагалось смотреть на страницу (site.ru/emarket/getOneClickOrder/element/3189/) для нее нет шаблона.
Провели, нет, см. выше. Нет всплывающего да потому что нет обработчика события.
Пример рабочего обработчика можно видеть тут http://jsfiddle.net/ilyar/Ygx2T/embedded/result/ по клику добавляем товар в корзину, блокируя в процессе возможные действия пользователя в процессе , в консоле браузера можно видеть сообщение обработчика. Этот пример не очень визуальный, но он работает и его реализация лаконично демонстрирует, как может быть реализовано подобное действие, соль примера в реализации http://jsfiddle.net/ilyar/Ygx2T/
Я выше привел скрипты js, там нет обработчика? Тоже всё из localhost. Просто, может я что-то еще не перенёс?! Ссылку на рабочий пример http://jsfiddle.net/ilyar/Ygx2T/embedded/result/ уже высылали, не понял, что мне отсюда надо, а чего не надо?!
Сама ссылка на object-view.xsl выглядет так (без class="basket_list one_click" страница перезагружается и происходит переход на ...page/@id) - сейчас нажимаю на ссылку, ничего не происходит вообще:
<a id="one_click_{page/@id}" class="basket_list one_click" href="{$lang-prefix}/emarket/getOneClickOrder/element/{page/@id}/">
<xsl:text>Купить в 1 клик</xsl:text>
</a>
Я выше привел скрипты js, там нет обработчика? Тоже всё из localhost. Просто, может я что-то еще не перенёс?! Ссылку на рабочий пример http://jsfiddle.net/ilyar/Ygx2T/embedded/result/ уже высылали, не понял, что мне отсюда надо, а чего не надо?!
Настоятельно рекомендую разобраться, от туда надо взять понимание как это работает, если там что то не понятно задавай вопросы, вот некоторые пояснения:
// Поле загрузки страницы, отрабатывает
jQuery(document).ready(function () {
site.init();
});
// будет запущено как страница загрузится
site.init = function () {
// назначение обработчика на клик элемента содержащего атрибут ckass="actionAdd"
jQuery('.actionAdd').click(function (event) {
event.preventDefault();
var data = jQuery(this).data();
site.addItem(data.id); // запускаем процесс добавления в корзину
});
};
Еще обработчик может быть назначен через атрибут элемента onClick , как то так <a onClick="javascript: site.addItem(jQuery(this).data());">clck me</a>, в этом случае нам не потребуется это делать в site.init, т.е. это взаимоисключающие подходы.
Подобный механизм будет работать в твоей задаче.
Сама ссылка на object-view.xsl выглядет так (без class="basket_list one_click" страница перезагружается и происходит переход на ...page/@id) - сейчас нажимаю на ссылку, ничего не происходит вообще:
Это говорит о том что на basket_list или one_click есть обработчик события клик из приведенного кода это не очевидно, ясно что метод site.basket.list участвует в этом процессе, а также для добавления товара в корзину.
Это говорит о том что на basket_list или one_click есть обработчик события клик из приведенного кода это не очевидно, ясно что метод site.basket.list участвует в этом процессе, а также для добавления товара в корзину.
ilyar, страница перезагружается даже при наличии просто класса basket_list или one_click, а вот когда вместе class="basket_list one_click", вот в этом случает уже страница не перезагружается - это я такое тестирование проводил.
В шаблоне demodizzy реализация Заказа в 1 клик начинается в файле templates/demodizzy/js/basket.js, там установлен обработчик на событие клик по элементу с атрибутом class="basket_list":
jQuery('.basket_list').click(function(){
if (!site.basket.is_cart || !jQuery(this).hasClass('options_false')) {
site.basket.list(this); // процесс добавления в корзину или заказ в один клик в зависимости от атрибута id см. реализацию site.basket.list
return false; // предотвращает переход по ссылке
}
});
Из этого можно сделать вывод, для работы этого обработчика необходимым элемент содержавший атрибуты class="basket_list" и id="one_click_{ID товара}"
Я знаю, что, чтобы заработало условие options false/true, в моем случае, в файле object-view.xsl необходимо наличие кода (иначе система вызовет ошибку строки с этим классом):
<xsl:variable name="is_options">
<xsl:apply-templates select="$object/page/properties" mode="is_options" />
</xsl:variable>
В файле object-view.xsl в каком месте, т.е. где именно и как именно указать этот variable?
К сожалению, в этом случае я все равно не понял, куда именно, т.е. конкретное место в коде на странице object-view.xsl
Там куда это надо пометить должна быть задекларирована переменная $object :
<xsl:variable name="object">...</xsl:variable>
Т.е. так (в таком виде нет ошибок в коде, если посмотреть по строчно? object-view.xsl):
1. <xsl:template match="udata" mode="object-view">
2. <xsl:variable name="object" select="document(concat('upage://', page/@id))/udata" />
3. <xsl:variable name="is_options">
4. <xsl:apply-templates select="$object/page/properties" mode="is_options" />
5. </xsl:variable>
...
// Шаблон для mode="is_options" есть в /modules/catalog/common.xsl