Курс 2016 года “Разработка на UMI.CMS от 0 до готового сайта”

Просмотр сообщений

В этом разделе можно просмотреть все сообщения, сделанные этим пользователем.


Сообщения - stud_mai

Страницы: [1]
1
Да, спасибо! Отлично работает ;D

2
Добрый день!

Столкнулся с казалось бы простой задачей, но никак не могу найти решения: нужно просуммировать значения атрибутов элемента на xslt. Подскажите, пожалуйста, как для приведенного ниже примера найти сумму количества товара на складах, то есть просуммировать значения атрибута "КоличествоНаСкладе"?
<Предложение>
<Ид>94fc9103-77c0-11e4-8b2c-d850e64ee1bc#d3874fa8-2a04-11e4-bd13-d850e64ee1bc</Ид>
<Артикул>1902319_9430</Артикул>
<Наименование>Вело куртка мужская</Наименование>
....
<Склад ИдСклада="213628c5-fdd3-11e3-b78c-dc85de5515fd" КоличествоНаСкладе="1"/>
<Склад ИдСклада="213628c6-fdd3-11e3-b78c-dc85de5515fd" КоличествоНаСкладе="3"/>
</Предложение>

Пробовал так:
<xsl:variable name="count" select="0"/>
<xsl:for-each select="../../Склад">
<xsl:variable name="count" select="$count + number(@КоличествоНаСкладе)" />
</xsl:for-each>
<option float="{$count}" object-id="{substring-after(../../Ид, '#')}"/>

но не работает, вылетает ошибка.

3
Смущало то, что файл не создавался. Решил проблему, дописав путь к корню:
$file =  getServer('DOCUMENT_ROOT') . '/log.txt';
Еще как оказалось почему-то в Total Commander не сразу появлялся созданный файл. Только при сбросе и вновь восстановленном соединении с ftp файл отображался. Так что может быть и первоначальный код работал исправно...

4
Может немного не так описал проблему... Но у меня не отдельный файл со скриптом. Для ясности приведу пример функции process():
public function process($template = null) {
$this->order->order();

objectProxyHelper::includeClass('emarket/classes/payment/api/', 'TinkoffMerchantAPI');
$tinkoff = new TinkoffMerchantAPI($this->getValue('terminal_key'),$this->getValue('password'),$this->getValue('url'));

$amount = $this->order->getActualPrice() * 100;
$orderId = $this->order->getValue('number');

$customerId = $this->order->getCustomerId();
$customer = umiObjectsCollection::getInstance()->getObject($customerId);
$email = $customer->getValue('e-mail');

if(!$email) {
$email = $customer->getValue('email');
}

$params = array('OrderId' => $orderId, 'Amount' => $amount, 'DATA' => 'Email='.$email);
        $tinkoff->init($params);

$param = array();
$param['link'] = $tinkoff->paymentUrl;

// Вот этот кусок...
$file = 'log.txt';
$info = 'Параметры: ';
$info .= $params['OrderId'];
$info .= PHP_EOL;
$info .= 'Ссылка: ';
$info .= $param['link'];
$info .= PHP_EOL;
file_put_contents($file, $info);
        // ...кода не работает

$this->order->setPaymentStatus('initialized');
list($templateString) = def_module::loadTemplates("emarket/payment/tinkoff/".$template);
return def_module::parseTemplate($templateString, $param);
}

5
Добрый день!

Провожу интеграцию с эквайрингом от Tinkoff. Все вроде получается, но встал вопрос: хочу для отладки писать в файл данные, которыми обменивается umi с tinkoff. Все необходимые функции process(), poll() и validate() описаны в классе tinkoffPayment в файле, расположенном в classes\modules\emarket\classes\payment\systems\. Тамже я использую file_put_contents, чтобы записать необходимые данные в файл, но файл не создается. Почему не понимаю. Может кто-нибудь помочь в этом вопросе?

6
Может кому понадобится... В общем, решил задачу переписав немного стандартный метод использования бонусов в заказе и их начисления покупателю. Кастомный метод использования бонусов в заказе описал в emarket/__custom.php:
public function applyBonus(){
$urlPrefix = cmsController::getInstance()->getUrlPrefix() ? (cmsController::getInstance()->getUrlPrefix() . '/') : '';
$order = $this->getBasketOrder();
$bonus = getRequest('bonus');
if ($bonus || $bonus === 0 || $bonus === '0') {
$order->setBonusDiscount($bonus);
$order->refresh();
if (!$order->getActualPrice()) {
$order->setPaymentStatus('accepted');
}
}
$this->redirect($this->pre_lang .'/'. $urlPrefix . 'emarket/cart/');
}

Также не надо забывать про permissions.custom.php:

$permissions = array('purchasing' => array('applyBonus'));

В xsl-шаблоне, описывающий вывод корзины, добавил следующее:
<xsl:if test="$bonus > 0">
  <tr>
      <td colspan="6" style="border:0;text-align:right;color:#408fd1;font-weight:bold;padding:2px 5px;">
Вы можете оплатить Ваш заказ накопленными бонусами. Доступно бонусов на <span id="bonus_available"><xsl:value-of select="$bonus" /></span> руб.
      </td>
      <td colspan="2" style="border:0;text-align:center;padding:2px 5px;">
            <input type="text" id="bonus_amount" name="bonus" placeholder="Введите кол-во бонусов"/>
      </td>
      <td style="border:0">
            <input type="button" id="bonus_apply" class="btn bonus_apply" value="Оплатить" />
      </td>
  </tr>
</xsl:if>

Далее остается только связать это дело ajax'ом:

$('#bonus_apply').live('click',function(e){
e.preventDefault();

//Вызов кастомного метода зачисления бонусов
$.ajax({
type: "POST",
url: '/emarket/applyBonus/',
data: $('#bonus_amount').serialize(),
success: function(response){

var totalPrice = $('#total_price').text().replace(/\s/g, ''),
deliveryPrice = $('#result_delivery_price').text(),
newDiscount = $(response).find('#result_discount').text().replace(/\s/g, ''),
bonusAvailable = $(response).find('#bonus_available').text(),
resultTotalPrice;

resultTotalPrice = +totalPrice + +deliveryPrice - +newDiscount;
$('#result_discount').text(newDiscount.replace(/(\d)(?=(\d\d\d)+([^\d]|$))/g, '$1 '));
$('#result_total_price').text(String(resultTotalPrice).replace(/(\d)(?=(\d\d\d)+([^\d]|$))/g, '$1 '));
$('#bonus_available').text(bonusAvailable);
}
});

});

Также была необходимость сделать зачисление бонусов покупателю всегда от полной стоимости покупки. Изменил строчку в функции addBonus в файле emarket/__events.php, описывающий события:
$price = $order->getActualPrice();
на
$price = $order->getOriginalPrice();

Понимаю, что это неправильно. Кто подскажет как это вынести в кастомный файл?

7
Возникают проблема следующего рода: так как используется "заказ в 1 шаг", при оформлении заказа этап оплаты бонусами пролетаем мимо, что видно из следующего кода (как в wiki "Оформление заказа в один шаг – xslt шаблонизатор", да и в classes\modules\emarket\__purchasing_one_step.php точно такое же написано):

//сохранение способа оплаты и редирект на итоговую страницу, либо страницу подтверждения оплаты.
  $order->setValue('payment_id', getRequest('payment-id'));
  $order->refresh();
 
  $paymentId = getRequest('payment-id');
  if(!$paymentId) {
    $this->errorNewMessage(getLabel('error-emarket-choose-payment'));
    $this->errorPanic();
  }
  $payment = payment::get($paymentId);
 
  if($payment instanceof payment) {
    $paymentName = $payment->getCodeName();
    $url = "{$this->pre_lang}/".cmsController::getInstance()->getUrlPrefix()."emarket/purchase/payment/{$paymentName}/";
  } else {
    $url = "{$this->pre_lang}/".cmsController::getInstance()->getUrlPrefix()."emarket/cart/";
  }
  $this->redirect($url);

Здесь мне становиться непонятно как и когда вызвать метод отвечающий за оплату бонусами. Ради интереса, пробовал, находясь в корзине с товаром, вбивать в адресную строку запрос вида mysite/emarket/purchase/payment/bonus/. Попадал на этап оплаты бонусами, далее если бонусов хватало на всю покупку, то выдавалась страница об успешном оформлении заказа, если нет, то предлагался выбор способа оплаты, затем опять успешное завершение оформления. Ни в том, ни в другом случае после оформления заказа в нем не было сохранено ни способа оплаты, ни адреса доставки. Также заметил, что если доставка выбиралась платной, то ее бонусами оплатить нельзя было, т.е. оплачивать можно только товары.
Есть ли какие-то мысли? Может это только мне не очевидно, т.к. недавно работаю в этой области :(

8
Добрый вечер!

Интересует такой вопрос: кто-либо озадачивался проблемой настройки накопительной скидки если в корзине используется "заказ в 1 шаг", а не как в demodizzy пошаговый? Если кто-то делал такое, можете поподробнее описать действия

Заранее спасибо откликнувшимся!

9
Спасибо! Отличный вариант

10
Добрый день!

Возник дурацкий вопрос: переписывая кастомный шаблон commerceML2.xsl встала необходимость взглянуть на формируемый Umidump, и никак не пойму откуда его заполучить. Не подскажите как?

11
Понятно, я просто думал, что если уж в задаются такие значение статусов по умолчанию, то они как-то разделяются между собой. Интересно почему разработчики юми сразу их по разному не назвали?!

Кстати, предложенный вами метод работает, спасибо!

12
Спасибо за быстрый ответ, пока его не испытывал, зато сейчас для себя отметил странную штуку: если менять статус из модуля Интернет магазин / Заказы (где таблица со списком заказов), то условие выполняется, а если статус менять непосредственно из заказа (Интернет магазин / Редактирование заказа), то все работает. Почему интересно так??

Также остается открытым вопрос о том, почему при смене статуса доставки на "Доставляется" подхватывается тот код, который предназначен для статуса заказа "Доставляется".

13
А что может содержаться в поле delivery_service_id?
И какой у данного поля тип данных?

Вот такой вид поля delivery_service_id:
<property id="618" name="delivery_service_id" type="string">
<title>Идентификатор отслеживания</title>
<value>12291951MOW</value>
</property>
Я позаимствовал это условие из другой части сайта - из личного кабинета, где все прекрасно работает в том смысле, что если поле отсутствует, то ничего не выводится. Вот код от туда:
<xsl:if test="document(concat('uobject://',@id,'.delivery_service'))//value">
 <tr>
    <td>
        <xsl:text>Отслеживание заказа:</xsl:text>
    </td>
    <td>
        <xsl:apply-templates select="document(concat('uobject://',@id))/udata" mode="delivery_service" />     
     </td>
 </tr>
</xsl:if>
Хотя здесь используется поле delivery_service для условия, смысл не меняется, т.к. они оба взаимосвязаны: без одного из них желаемый результат в дальнейшем не достижим. Изначально я и с ним пробовал, результат аналогичный - условие выполняется(((

Вид поля delivery_service:
<property id="617" name="delivery_service" type="relation">
<title>Сервис доставки</title>
<value>
<item id="36165" name="DPD" type-id="250" ownerId="2" xlink:href="uobject://36165"/>
</value>
</property>

Тип данных создавался новый - Справочник для поля "Сервис доставки"

К слову сказать, также писал чуть по-другому условие:
<xsl:template match="status_notification">
 <xsl:variable name="order" select="document(concat('uobject://', order_id))/udata" />
 <br />
 <xsl:text>Ваш заказ № </xsl:text>
  ....
      <xsl:when test="contains(status, 'доставляется')">
доставляется.               
                <xsl:if test="$order//property[@name = 'delivery_service_id']/value">
Отследить ход доставки Вы можете на сайте
<xsl:apply-templates select="document(concat('uobject://',order_id))/udata" mode="delivery_link" />     
                </xsl:if>
  ....

Результат точь-в-точь

14
Добрый день!

Имеется код, взятый с wiki.umisoft.ru, для отправки уведомлений с разным текстом при изменении статуса заказа и доставки:

<xsl:template match="status_notification">
    <br />
<xsl:text>Ваш заказ № </xsl:text>
<xsl:value-of select="order_number" />
<xsl:text> </xsl:text>
<xsl:choose>
<!-- Уведомления о статусе заказа -->
<xsl:when test="contains(status, 'поступил в обработку')">
был получен.
</xsl:when>
<xsl:when test="contains(status, 'отменён')">
был отменен.
</xsl:when>
<xsl:when test="contains(status, 'отклонён')">
был отклонен.
</xsl:when>
<xsl:when test="contains(status, 'доставляется')">
доставляется.
                <xsl:if test="document(concat('uobject://',order_id,'.delivery_service_id'))//value">
                                       <xsl:apply-templates select="document(concat('uobject://',order_id))/udata" mode="delivery_link" />     
                                </xsl:if>   
</xsl:when>
<xsl:when test="contains(status, 'готов')">
готов.
</xsl:when>
<xsl:when test="contains(status, 'принят')">
принят.
</xsl:when>
<xsl:when test="contains(status, 'оплачивается')">
оплачивается.
</xsl:when>
<xsl:when test="contains(status, 'редактируется')">
редактируется.
</xsl:when>
<!-- Уведомления о статусе оплаты -->
<xsl:when test="contains(status, 'ожидает оплаты')">
ожидает оплаты.
</xsl:when>
<xsl:when test="contains(status, 'оплачен')">
был оплачен.
</xsl:when>
<xsl:when test="contains(status, 'обновлен: оплата подтверждена')">
был обновлен, оплата подтверждена.
</xsl:when>
<xsl:when test="contains(status, 'обновлен: оплата отклонена')">
был обновлен, оплата отклонена.
</xsl:when>
<!-- Уведомления о статусе доставки -->
<xsl:when test="contains(status, 'ожидает отгрузки')">
ожидает отгрузки.
</xsl:when>
<xsl:when test="contains(status, 'доставляется')">
отправлен.
</xsl:when>
<xsl:when test="contains(status, 'доставлен')">
доставлен.
</xsl:when>
</xsl:choose>
<br/><br/>
<xsl:text>Посмотреть историю заказов и самостоятельно отслеживать этапы доставки заказа Вы можете в своем </xsl:text>
<a href="http://{domain}/users/login/">
<xsl:text>личном кабинете</xsl:text>
</a> в разделе <a href="http://{domain}/emarket/ordersList/" target="_blank"><xsl:text>"Мои заказы"</xsl:text></a>.<br />
</xsl:template>

Все работает нормально за исключением того момента, условие <xsl:if test="document(concat('uobject://',order_id,'.delivery_service_id'))//value"> в статусе "Доставляется" никак не обрабатывается, точнее как-будто test всегда = true, хотя это не так. Никак не могу понять в чем причина такого поведения? Может кто сталкивался с подобной ситуацией?

P.S. При смене статуса доставки заказа на "Доставляется" почему-то подхватывается тот код, который предназначен для статуса заказа "Доставляется". Тоже интересно почему так?

Страницы: [1]