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>