RSS Мои друзья Контакты

Magento - добавляем комментарий к заказу

Есть несколько дополнений к Magento, которые делают возможным комментировать заказ, но в большинстве они просто добавляют новый атрибут к сущности ордера. Напрашивается вопрос зачем? Ведь в Magento уже есть достаточно хороший механизм комментирования.

Ищем где приютится

Благодаря восхитительным возможностям Linux команды grep, было установлено существование события checkout_type_onepage_save_order. Чтобы установить комментарий на заказ, можно использовать код

$order->setCustomerNote('мой первый комментарий');
# или же
$order->addStatusToHistory($order->getStatus(), 'мой первый комментарий', false);

Первый вариант более удобен, тем что после оформления заказа в отправленном письме (о новом заказе) Magento автоматически включит комментарий в текст сообщения.

Приступаем к работе

Для начала нужно создать модуль с такой структурой

|-app
|---code
|-----local
|-------Freaks
|---------OrderComments
|-----------etc
|-------------config.xml
|-----------Model
|-------------Observer.php
|---design
|-----frontend
|-------default
|---------default
|-----------template
|-------------checkout
|---------------onepage
|-----------------agreements.phtml
|---etc |-----modules |-------Freaks_OrderComments.xml

В файле конфигурации ничего особенного, за исключением

<frontend>
    <events>
        <checkout_type_onepage_save_order>
            <observers>
                <Freaks_OrderComments>
                    <class>freaks_ordercomments/observer</class>
                    <method>addOrderComment</method>
                </Freaks_OrderComments>
            </observers>
        </checkout_type_onepage_save_order>
    </events>
.........................................................................................................
</frontend>

Это значит, что при возникновении события checkout_type_onepage_save_order, нужно вызвать метод обсервера addOrderComment.

Сам обсервер очень прост. Берем заказ из события, устанавливаем комментарий из запроса посредством выше упомянутых средств и все

<?php
class Freaks_OrderComments_Model_Observer
{
    /**
     * Add a customer order comment when the order is placed.
     * Listen "checkout_type_onepage_save_order" event
     *
     * @param Varien_Event_Observer $observer
     * @return Freaks_OrderComments_Model_Observer
     */
    public function addOrderComment(Varien_Event_Observer $observer)
    {
        $order = $observer->getEvent()->getOrder();
        $request = Mage::app()->getRequest();

        $comments = strip_tags($request->getParam('customer_comment'));

        if(!empty($comments)){
            $order->setCustomerNote($comments);
        }

        return $this;
    }
}

Чтобы комментарий отправлялся на сервер, нужно переопределить шаблон платежных соглашений. Просто допишем в него еще одно поле textarea

<form action="" id="checkout-agreements" onsubmit="return false;">
<?php if ($this->getAgreements()): ?>
    <ol class="checkout-agreements">
    <?php foreach ($this->getAgreements() as $_a): ?>
        <li>
            <div class="agreement-content"<?php echo ($_a->getContentHeight() ? ' style="height:' . $_a->getContentHeight() . '"' : '')?>>
                <?php if ($_a->getIsHtml()):?>
                    <?php echo $_a->getContent() ?>
                <?php else:?>
                    <?php echo nl2br($this->htmlEscape($_a->getContent())) ?>
                <?php endif; ?>
            </div>
            <p class="agree">
                <input type="checkbox" id="agreement-<?php echo $_a->getId()?>" name="agreement[<?php echo $_a->getId()?>]" value="1" title="<?php echo $this->htmlEscape($_a->getCheckboxText()) ?>" class="checkbox" /><label for="agreement-<?php echo $_a->getId()?>"><?php echo $this->htmlEscape($_a->getCheckboxText()) ?></label>
            </p>
        </li>
    <?php endforeach ?>
    </ol>
<?php endif ?>
    <ol class="checkout-comments" style="padding-left:9px;">
        <li>
            <label for="customer_comment"><?php echo $this->__('Comment') ?></label>
            <br/><textarea name="customer_comment" id="customer_comment" style="width:440px; height:100px"></textarea>
        </li>
    </ol>
</form>

Вот что получилось у меня

Magento комментарий к заказу onepage checkout

Не забываем, что комментарий появится только на странице OnePage чекаута. Скачать готовое решение можно здесь

Добавить комментарий

Комментариев: 8

  • Виталий
    Ответить 4 декабря 2011 г., 16:43
    Вы волшебник! Мало того что описали все подробно, так еще и ссылку на исходник дали!

    Спасибо!
  • Igor
    Ответить 12 февраля 2012 г., 17:27
    Спасибо, очень хороший материал!
    Такой еще возник вопрос - а можно, например, блок комментария поместить на шаг раньше, т.е. чтобы он был виден уже в корзине?
    • Сергей (Администратор)
      Ответить 12 февраля 2012 г., 23:17
      Можно, но тогда прийдется сохранять его еще и в квоте.
      Недавно писал чекаут для сайта http://viland.ua
      Все на одной странице.
      Я со временем выложу его как екстеншен
  • AndrossISE
    Ответить 30 марта 2012 г., 5:22
    Ваш сайт - freaksidea.com показался мне очень привлекательным и перспективным.
    Хочу приобрести рекламное место для баннера в шапке Вашего сайта.
    Какова будет стоимость данной услуги?
    Оплачивать буду через WebMoney, 50% сразу, а 50% через 2 недели.

    И еще, адрес моего сайта http://megasto.com.ua/ - он не будет противоречть тематике Вашего сайта?

    Напишите о Вашем решении мне на почту megasto.com.ua@gmail.com
    Заранее благодарен за оперативный ответ.
  • NRG
    Ответить 25 апреля 2012 г., 13:31
    Как заставить вставлять комментарий в письмо?
    • Сергей (Администратор)
      Ответить 25 апреля 2012 г., 17:03
      В email шаблоне в нужном месте добавляем строку:
      {{var order.getEmailCustomerNote()}}
  • Stevenkr
    Ответить 11 февраля 2016 г., 3:45
    cool place!
  • EasiFun
    Ответить 30 октября 2017 г., 19:33
    Спасибо за плагин