Перейти к содержимому


Фотография
- - - - -

Произвольная цена товара


Сообщений в теме: 12

#1 ilyaantonov89

ilyaantonov89

Отправлено 06 May 2015 - 14:30

Сайт: http://order.stroycity.ru- Joomla: 3.4.1 JBZoo: 2.2.0 Pro (Beta #2 rev2421) Zoo: 3.3.3

Задача: Организовать дополнительную цену в корзине, например, разместив на форме заказа дополнительный пустое поле ввода (произвольная цена). Это поле пользователь может заполнять вручную. Тогда заказ должен формироваться следующим образом: если это поле остается пустым, алгоритм работы корзины отрабатывает стандартно, если оно заполнено, то алгоритм формирования заказа  использует новую цену, введенную пользователем. Соответственно, и сумма заказа будет другой.

Вопрос: как реализовать? в каких каталогах и какие файлы использовать? что в них изменять?


  • 0

#2 Cheren-dow

Cheren-dow

Отправлено 06 May 2015 - 23:53

как реализовать? в каких каталогах и какие файлы использовать? что в них изменять?

Общая сумма заказа хранится в элементе jbbasketItems а вычисляется в методе getTotalPrice, а сам метод используется в контроллере basket в методе createOrder.

 

Простенький вариант следующий:

1. Создаете в форме подачи свое поле куда будет вносится произвольная цена.

2. Выводите его в форме заказа.

3. Открой те файл

сайт\media\zoo\applications\jbuniversal\elements\jbbasketitems\jbbasketitems.php

и найдите метод getTotalPrice и замените его на 

    /**
     * Get total price
     */
    public function getTotalPrice($isFormated = false)
    {
        //return 5; // for interkassa debug

        $basketItems = $this->getOrderItems();

        $i        = 0;
        $summa    = 0;
        $count    = 0;
        $currency = '';

        if (!empty($basketItems)) {

            foreach ($basketItems as $basketInfo) {

                $count += $basketInfo['quantity'];

                $currency = $basketInfo['currency'];

                $subtotal = $basketInfo['quantity'] * $basketInfo['price'];
                $summa += $subtotal;
            }

            if ($isFormated) {
                return $this->app->jbmoney->toFormat($summa, $currency);
            }

            //  УКАЖИТЕ ID ЭЛЕМЕНТА В КОТОРОМ ВВОДИТСЯ ПРОИЗВОЛЬНАЯ ЦЕНА
            $elementCustomPrice = $this->getItem()->getElement('2f4e8ec9-09b3-4c45-812d-08b9af568847')->data();
            $customSum = $elementCustomPrice[0]['value'];

            if ($customSum > 0) {
                $summa = $customSum;
            }

            return round($summa, 2);
        }

        return null;
    }

не забудьте указать id элемента где вводится произвольная цена в коде. Так же нужно изменять и тадлицу элемента в форме заказа админки - файл

сайт\media\zoo\applications\jbuniversal\elements\jbbasketitems\tmpl\jbbasketitems.php

замените на

<?php
/**
 * JBZoo App is universal Joomla CCK, application for YooTheme Zoo component
 *
 * @package     jbzoo
 * @version     2.x Pro
 * @author      JBZoo App http://jbzoo.com
 * @copyright   Copyright (C) JBZoo.com,  All rights reserved.
 * @license     http://jbzoo.com/license-pro.php JBZoo Licence
 * @coder       Denis Smetannikov <denis@jbzoo.com>
 */

// no direct access
defined('_JEXEC') or die('Restricted access');

$customPriceElement = '2f4e8ec9-09b3-4c45-812d-08b9af568847';
$customPriceData = $this->_item->getElement($customPriceElement)->data();
$customPrice = $customPriceData[0]['value'];

$imageElementId = $this->app->zoo->getApplication()->getParams()->get('global.jbzoo_cart_config.element-image');

if (!empty($items)) {
    ?>
    <div>
        <table class="jbbasket-table jsJBZooBasket" border="1" cellpadding="3" cellspacing="3">
            <thead>
            <tr>
                <th>#</th>
                <th><?php echo JText::_('JBZOO_CART_ITEM_SKU'); ?></th>
                <th><?php echo JText::_('JBZOO_CART_ITEM_NAME'); ?></th>
                <th><?php echo JText::_('JBZOO_CART_ITEM_PRICE'); ?></th>
                <th><?php echo JText::_('JBZOO_CART_ITEM_QUANTITY'); ?></th>
                <th><?php echo JText::_('JBZOO_CART_ITEM_SUBTOTAL'); ?></th>
            </tr>
            </thead>
            <tbody>
            <?php
            $i = 0;
            $summa = 0;
            $count = 0;
            $currency = '';
            $html = array();
            foreach ($basketItems as $basketInfo) {

                $count += $basketInfo['quantity'];

                $item     = $items[$basketInfo['itemId']];
                $image    = $this->app->jbitem->renderImageFromItem($item, $imageElementId, true);
                $currency = $basketInfo['currency'];
                $subtotal = $basketInfo['quantity'] * $basketInfo['price'];
                $summa += $subtotal;

                $itemLink = $this->app->jbrouter->adminItem($item);
                if ($this->app->jbenv->isSite()) {
                    $itemLink = $this->app->route->item($item);
                }

                if (strpos($itemLink, JUri::getInstance()->getHost()) === false) {
                    $itemLink = JUri::getInstance()->toString(array('scheme', 'host', 'port')) . $itemLink;
                }

                $html[] = '<tr class="row-' . $item->id . '" itemId="' . $item->id . '">' . "\n";
                $html[] = '<td>' . ++$i . '</td>';
                $html[] = '<td>' . $basketInfo['sku'] . '</td>';
                $html[] = '<td>';

                if ($image) {
                    $html[] = '<p align="left">' . $image . '</p>';
                }

                $html[] = '<a href="' . $itemLink . '" title="' . $item->name . '">' . $item->name . '</a>';

                if (isset($basketInfo['priceParams']) && !empty($basketInfo['priceParams'])) {
                    foreach ($basketInfo['priceParams'] as $key => $value) {
                        if (!empty($value)) {
                            $html[] = '<div><strong>' . $key . ':</strong> ' . $value . '</div>';
                        }
                    }
                }

                if (!empty($basketInfo['priceDesc'])) {
                    $html[] = '<br/><span class="price-description">' . $basketInfo['priceDesc'] . '</span>';
                }

                $html[] = "</td>\n";
                $html[] = '<td class="jsPricevalue" price="' . $basketInfo['price'] . '">'
                    . $this->app->jbmoney->toFormat($basketInfo['price'], $currency) . '</td>';
                $html[] = '<td>' . $basketInfo['quantity'] . '</td>';
                $html[] = '<td class="jsSubtotal">' . $this->app->jbmoney->toFormat($subtotal, $currency) . '</td>';
                $html[] = "</tr>\n";
            }

            echo implode("\n ", $html);
            ?>
            </tbody>
            <tfoot>
            <tr>
                <td colspan="3">&nbsp;</td>
                <td><strong><?php echo JText::_('JBZOO_CART_TOTAL'); ?>:</strong></td>
                <td class="jsTotalCount"><?php echo $count; ?></td>
                <td class="jsTotalPrice"><?php echo $this->app->jbmoney->toFormat($summa, $currency); ?></td>
            </tr>
            <?php if ($customPrice > 0) : ?>
            <tr>
                <td colspan="3">&nbsp;</td>
                <td><strong>Произвольная цена:</strong></td>
                <td></td>
                <td class="jsTotalPrice"><?php echo $this->app->jbmoney->toFormat($customPrice, $currency); ?></td>
            </tr>
            <?php endif; ?>
            </tfoot>
        </table>

        <?php if ($renderMode != 'nopayment') : ?>
            <div class="payment-system">

                <?php if (($params && $params->get('payment-info', true)) || !$params) : ?>

                    <?php $paymentData = $this->getPaymentData(); ?>

                    <?php if ($paymentData && $summa) : ?>
                        <ul>
                            <?php if (isset($paymentData['payment_date'])) : ?>
                                <li>
                                    <strong><?php echo JText::_('JBZOO_CART_REAL_DATE'); ?>:</strong>
                                    <?php echo $paymentData['payment_date']; ?>
                                </li>
                            <?php endif; ?>

                            <?php if (isset($paymentData['payment_system'])) : ?>
                                <li>
                                    <strong><?php echo JText::_('JBZOO_CART_PAYMENT_NAME'); ?>:</strong>
                                    <?php echo $paymentData['payment_system']; ?>
                                </li>
                            <?php endif; ?>

                            <li>
                                <strong><?php echo JText::_('JBZOO_CART_PAYMENT_STATUS'); ?>:</strong>
                                <?php echo '<span class="order-status ' . $this->getOrderStatus(false) . '">' . $this->getOrderStatus(true) . '</span>'; ?>
                            </li>

                            <?php if (isset($paymentData['additional_status'])) : ?>
                                <li>
                                    <strong><?php echo JText::_('JBZOO_CART_PAYMENT_STATUS_REAL'); ?>:</strong>
                                    <?php echo $paymentData['additional_status']; ?>
                                </li>
                            <?php endif; ?>
                        </ul>
                    <?php else: ?>
                        <p><?php echo JText::_('JBZOO_CART_PAYMENT_NODATA'); ?></p>
                    <?php endif; ?>

                <?php endif; ?>

                <?php echo $this->getOrderSubForm(); ?>

                <?php if (
                    $this->app->jbenv->isSite() &&
                    in_array($this->getOrderStatus(), array(ElementJBBasketItems::ORDER_STATUS_NOPAID, ElementJBBasketItems::ORDER_STATUS_NODATA)) &&
                    $params->get('payment-button', true) &&
                    $summa > 0
                ) :
                    $appId = $this->app->zoo->getApplication()->id;
                    $href  = $this->app->jbrouter->basketPayment($params->get('basket-menuitem'), $appId, $this->getItem()->id);
                    ?>
                    <p><a style="display:inline-block;" href="<?php echo $href; ?>"
                          class="jsGoto add-to-cart"><?php echo JText::_('JBZOO_PAYMENT_LINKTOFORM'); ?></a></p>

                <?php endif; ?>

            </div>
        <?php endif; ?>


    </div>
    <div class="clear"></div>
<?php
} else {
    echo '<p>' . JText::_('JBZOO_CART_ITEMS_NOT_FOUND') . '</p>';
}

в этом файле так же втавьте ID элемента в котором вводится цена.

 

Это не решение а всеголишь пример, коректную работу не гарантирую.


  • 0
Изображение
 

#3 ilyaantonov89

ilyaantonov89

Отправлено 07 May 2015 - 11:10

Уточнение вопроса: поле с произвольной ценой должно быть напротив каждого товара в корзине (на скриншоте); как и где это поле разместить? обрабатывать так же, как описано выше?

Прикрепленные изображения

  • shablons-05.jpg

  • 0

#4 Cheren-dow

Cheren-dow

Отправлено 07 May 2015 - 11:39

ilyaantonov89, добавлять в шаблоне формы корзины

сайт\media\zoo\applications\jbuniversal\templates\catalog\renderer\basket\_default.php 

Обрабатывать уже не много по другому но принцип тот же. Что за что отвечает я написал выше, если у вас есть навыки PHP можете это реализовать самостоятельно.


  • 0
Изображение
 

#5 ilyaantonov89

ilyaantonov89

Отправлено 07 May 2015 - 15:30

файла _default.php нет
на сайте используется общий шаблон uikit от Yootheme, поэтому вот, где шаблон формы корзины:
сайт\media\zoo\applications\jbuniversal\templates\uikit\renderer\basket\_table.php
 
код файла _table.php
<?php
/**
 * JBZoo App is universal Joomla CCK, application for YooTheme Zoo component
 * @package     jbzoo
 * @version     2.x Pro
 * @author      JBZoo App [url=http://jbzoo.com]http://jbzoo.com[/url]
 * @copyright   Copyright (C) JBZoo.com,  All rights reserved.
 * @license     [url=http://jbzoo.com/license-pro.php]http://jbzoo.com/license-pro.php[/url]JBZoo Licence
 * @coder       Alexander Oganov <t_tapak@yahoo.com>
 */

// no direct access
defined('_JEXEC') or die('Restricted access');

$this->app->jbassets->less('jbassets:less/cart/table.less');

$string = $this->app->jbstring;
$jbhtml = $this->app->jbhtml;

$cart   = JBCart::getInstance();
$order  = $cart->newOrder();
$config = $cart->getConfig();

echo $this->partial('basket', 'table.styles');

?>

<table class="jbcart-table jsJBZooCartTable">
    <thead>
    <tr>
        <th class="jbcart-col jbcart-col-image"></th>
        <th class="jbcart-col jbcart-col-name"><?php echo JText::_('JBZOO_CART_ITEM_NAME'); ?></th>
        <th class="jbcart-col jbcart-col-price"><?php if ($config->get('tmpl_price4one', 1)) {
                echo JText::_('JBZOO_CART_ITEM_PRICE');
            } ?></th>
        <th class="jbcart-col jbcart-col-quantity"><?php if ($config->get('tmpl_quntity', 1)) {
                echo JText::_('JBZOO_CART_ITEM_QUANTITY');
            } ?></th>
        <th class="jbcart-col jbcart-col-subtotal"><?php if ($config->get('tmpl_subtotal', 1)) {
                echo JText::_('JBZOO_CART_ITEM_SUBTOTAL');
            } ?></th>
        <th class="jbcart-col jbcart-col-delete"></th>
    </tr>
    </thead>

    <tbody>

    <tr class="jbcart-row-empty">
        <td class="jbcart-cell-empty" colspan="6"></td>
    </tr>

    <?php foreach ($view->itemsHtml as $itemKey => $itemHtml) : ?>
        <tr class="jbcart-row jsCartTableRow js<?php echo $itemKey; ?>" data-key="<?php echo $itemKey; ?>">
            <td class="jbcart-image">
                <?php if ($config->get('tmpl_image_show', 1)) {
                    echo $itemHtml['image'];
                } ?>
            </td>
            <td class="jbcart-name">
                <?php echo $itemHtml['name']; ?>
                <?php if ($config->get('tmpl_sku_show', 1)) {
                    echo $itemHtml['sku'];
                } ?>
                <?php echo $itemHtml['params']; ?>
            </td>
            <td class="jbcart-price"><?php
                if ($config->get('tmpl_price4one', 1)) {
                    echo $itemHtml['price4one'];
                } ?>
            </td>
            <td class="jbcart-quantity"><?php
                if ($config->get('tmpl_quntity', 1)) {
                    echo $itemHtml['quantityEdit'];
                } ?>
            </td>
            <td class="jbcart-subtotal">
                <?php if ($config->get('tmpl_subtotal', 1)) {
                    echo $itemHtml['totalsum'];
                } ?>
            </td>
            <td class="jbcart-delete">
                <a class="uk-button uk-button-danger uk-button-small round jsDelete"><i class="uk-icon-trash-o"></i></a>
            </td>
        </tr>
    <?php endforeach; ?>

    </tbody>
    <tfoot>

    <?php
    if (!empty($view->items) && !empty($view->modifierPrice)) {
        $this->app->jbassets->less('jbassets:less/cart/modifier.less');
        echo $view->modifierOrderPriceRenderer->render('modifier.default', array('order' => $view->order));
    } ?>

    <tr class="jbcart-row-total">
        <td colspan="3" class="jbcart-total-cell">
            <div class="jbcart-items-in-cart">
                <span class="jbcart-label"><?php echo JText::_('JBZOO_CART_TABLE_TOTAL_COUNT'); ?>:</span>
                <span class="jbcart-value jsTotalCount"><?php echo $order->getTotalCount(); ?></span>
            </div>
            <div class="jbcart-price-of-goods">
                <span class="jbcart-label"><?php echo JText::_('JBZOO_CART_TABLE_SUBTOTAL_SUM'); ?>:</span>
                <span class="jbcart-value jsTotalPrice"><?php echo $order->getTotalForItems()->html(); ?></span>
            </div>
        </td>
        <td class="jbcart-shipping-cell">
            <?php if ($view->shipping) : ?>
                <div class="jbcart-label"><?php echo JText::_('JBZOO_CART_TABLE_SHIPPING'); ?>:</div>
                <div class="jbcart-value jsShippingPrice"><?php echo $order->getShippingPrice()->html(); ?></div>
            <?php endif; ?>
        </td>
        <td colspan="2" class="jbcart-total-price-cell">
            <div class="jbcart-label"><?php echo JText::_('JBZOO_CART_TABLE_TOTAL_SUM'); ?>:</div>
            <div class="jbcart-value jsTotal"><?php echo $order->getTotalSum()->html(); ?></div>
        </td>
    </tr>
    <tr class="jbcart-row-remove">
        <td colspan="6" class="jbcart-delete-all-cell">
            <a class="jsDeleteAll item-delete-all uk-button uk-button-danger">
                <i class="uk-icon-trash-o"></i>
                <?php echo JText::_('JBZOO_CART_REMOVE_ALL'); ?>
            </a>
        </td>
    </tr>
    </tfoot>
</table>
 
здесь, как я вижу, поля выводятся методами объекта $order, например, $order->getTotalSum()
Вопрос: возвращаясь к вышеизложенному, мне нужно напротив каждой товарной позиции вывести поле ввода произвольной цены - элемент c id = '170a8937-71bd-4cc0-9fd1-e13fe5bf45a1'; для этого создавать дополнительный метод класса или как то по-другому действовать?
  • 0

#6 Cheren-dow

Cheren-dow

Отправлено 07 May 2015 - 15:48

возвращаясь к вышеизложенному, мне нужно напротив каждой товарной позиции вывести поле ввода произвольной цены - элемент c id = '170a8937-71bd-4cc0-9fd1-e13fe5bf45a1'; для этого создавать дополнительный метод класса или как то по-другому действовать?

Тут уже нужно использовать обычный инпут т.е делаете форму с уникальным именем для атрибута name. Уже использовать элементы как я писал выше не получится.

 

А в методе getTotalPrice уже отлавливайте в $_POST значения из новых инпутов и обрабатывайте.


  • 0
Изображение
 

#7 ilyaantonov89

ilyaantonov89

Отправлено 08 May 2015 - 11:24

метод getTotalPrice не отрабатывает, я даже его переименовал в getTotalPrice__, но заказы все равно создаются в прежнем режиме
 
Код файла сайт\media\zoo\applications\jbuniversal\elements\jbbasketitems\tmpl\jbbasketitems.php
 
 
<?php
/**
 * JBZoo App is universal Joomla CCK, application for YooTheme Zoo component
 *
 * @package     jbzoo
 * @version     2.x Pro
 * @author      JBZoo App [url=http://jbzoo.com]http://jbzoo.com[/url]
 * @copyright   Copyright (C) JBZoo.com,  All rights reserved.
 * @license     [url=http://jbzoo.com/license-pro.php]http://jbzoo.com/license-pro.php[/url]JBZoo Licence
 * @coder       Denis Smetannikov <denis@jbzoo.com>
 */

// no direct access
defined('_JEXEC') or die('Restricted access');


// register ElementRepeatable class
App::getInstance('zoo')->loader->register('ElementRepeatable', 'elements:repeatable/repeatable.php');

/**
 * Class ElementJBBasketItems
 */
class ElementJBBasketItems extends Element implements iSubmittable
{
    public $renderMode = null;

    const ORDER_STATUS_NODATA   = 'nodata';
    const ORDER_STATUS_PAID     = 'paid';
    const ORDER_STATUS_NOPAID   = 'nopaid';
    const ORDER_STATUS_CANCEL   = 'cancel';
    const ORDER_STATUS_PROGRESS = 'progress';

    const SYSTEM_ROBOX  = 'Robokassa.ru';
    const SYSTEM_IKASSA = 'Interkassa.com';
    const SYSTEM_MANUAL = 'Manual';

    /**
     * Constructor
     */
    public function __construct()
    {
        parent::__construct();
        $this->registerCallback('paymentCallback');
        $this->registerCallback('ajaxSaveData');
    }

    /**
     * @param array $params
     * @return bool
     */
    public function hasValue($params = array())
    {
        return count($this->getOrderItems());
    }

    /**
     * Show basket items in admin panel
     * @return mixed
     */
    public function edit()
    {
        $basketItems   = $this->getOrderItems();
        $basketItemsId = $this->getOrderItemsId();

        JFactory::getSession()->set('items-' . $this->getItem()->id . '-' . $this->identifier, $this->data(), __CLASS__);

        if (!empty($basketItems)) {

            $items = JBModelFilter::model()->getZooItemsByIds($basketItemsId);

            if (!empty($items) && $layout = $this->getLayout('jbbasketitems.php')) {
                return self::renderLayout($layout, array(
                    'items'       => $items,
                    'basketItems' => $basketItems,
                    'params'      => isset($this->params) ? $this->params : null,
                    'renderMode'  => $this->renderMode,
                ));
            }
        }

        return '<p>' . JText::_('JBZOO_CART_ITEMS_NOT_FOUND') . '</p>';
    }

    /**
     * Render action
     * @param array $params
     * @return mixed|string
     * @throws JException
     */
    public function render($params = array())
    {
        $params       = $this->app->data->create($params);
        $this->params = $params; // hack for saving
        $template     = $params->get('template', 'default');

        if ($template == 'default') {
            return $this->edit();

        } else if ($template == 'table') {

            $this->renderMode = 'nopayment';

            return $this->edit();

        } else if ($template == 'totalprice') {
            return $this->getTotalPrice(true);

        } else if ($template == 'method') {
            return $this->getPaymentType();

        } else if ($template == 'status') {

            $summa = $this->getTotalPrice();
            if ($summa) {
                return '<span class="order-status ' . $this->getOrderStatus(false) . '">' . $this->getOrderStatus(true) . '</span>';
            } else {
                return JText::_('JBZOO_PAYMENT_STATUS_PAID');
            }

        } else if ($template == 'paymentlink') {

            $summa = $this->getTotalPrice();
            if ($this->getOrderStatus() == self::ORDER_STATUS_NOPAID && $summa) {

                $appId = $this->app->zoo->getApplication()->id;
                $href  = $this->app->jbrouter->basketPayment($params->get('basket-menuitem'), $appId, $this->getItem()->id);

                $html = '<p><a style="display:inline-block;" href="' . $href . '" class="jsGoto add-to-cart">'
                    . JText::_('JBZOO_PAYMENT_LINKTOFORM') . '</a></p>';

                return $html;
            }
        }

        return null;
    }

    /**
     * Render submission
     * @param array $params
     * @return string
     */
    public function renderSubmission($params = array())
    {
        return '<input type="hidden" name="' . $this->getControlName('value') . '" value="_jbbaskteitems_" />';
    }

    /**
     * Validate submission
     * @param $value
     * @param $params
     * @return mixed
     * @throws JException
     */
    public function validateSubmission($value, $params)
    {
        $items = $this->app->jbcart->getAllItems();

        if (empty($items)) {
            throw new JException(JText::_('JBZOO_CART_VALIDATE_EMPTY_BASKET'));
        }

        foreach ($items as $key => $item) {
            $item = $this->app->table->item->get($item['itemId']);

            if ($item) {
                $items[$key]['name'] = $item->name;
            } else {
                unset($items[$key]);
            }
        }

        $appParams = $this->getItem()->getApplication()->getParams();
        if ((int)$appParams->get('global.jbzoo_cart_config.is_advance', 0)) {
            return array(
                'is_advance' => true,
                'items'      => $items,
                'order_info' => array(),
            );
        }

        return $items;
    }

    /**
     * Get total price
     */
    public function getTotalPrice__($isFormated = false)
    {
        //return 5; // for interkassa debug

        $basketItems = $this->getOrderItems();

        $i        = 0;
        $summa    = 0;
        $count    = 0;
        $currency = '';
 

        if (!empty($basketItems)) {

            foreach ($basketItems as $basketInfo) {

                $count += $basketInfo['quantity'];

                $currency = $basketInfo['currency'];

                $subtotal = $basketInfo['quantity'] * $basketInfo['price'];
                $summa += $subtotal;
            }

            if ($isFormated) {
                return $this->app->jbmoney->toFormat($summa, $currency);
            }
            
            //  УКАЖИТЕ ID ЭЛЕМЕНТА В КОТОРОМ ВВОДИТСЯ ПРОИЗВОЛЬНАЯ ЦЕНА
            
            /*$elementCustomPrice = $this->getItem()->getElement('1241cb68-b7b7-4b38-b904-b183d8951973')->data();
            $customSum = $elementCustomPrice[0]['value']*$basketInfo['quantity'];

            if ($customSum > 0) {
                $summa = $customSum;
            }*/
            
            
            // ОТЛАВЛИВАЕМ ЗНАЧЕНИЕ ИЗ  <input name="any_price_1" />
            //$jinput = JFactory::getApplication()->input;
            
            $price_1 = JRequest::getVar('any_price_1');
            
            $summa = $price_1;           

            return round($summa, 2);
        }

        return null;
    }

    /**
     * Ajax call - paymentCallback
     */
    public function paymentCallback($date, $system = null, $additionalStatus = null, $comment = null)
    {
        $orderInfo = $this->getOrderInfo();
        $item      = $this->getItem();
        $appParams = $item->getApplication()->getParams();

        if (!isset($orderInfo['description'])) {
            $orderInfo['description'] = '';
        }

        $orderInfo = array(
            'payment_date'      => $date,
            'payment_system'    => $system,
            'additional_status' => $additionalStatus,
            'description'       => $orderInfo['description'] . "\n\n" . $comment,
        );

        if ($system == self::SYSTEM_MANUAL) {
            $orderInfo['status'] = self::ORDER_STATUS_NOPAID;
        } else {
            $orderInfo['status'] = self::ORDER_STATUS_PAID;
        }

        $this->bindOrderInfo($orderInfo);

        // save item
        $this->app->table->item->save($item);

        // notify Zoo dispatcher
        $this->app->event->dispatcher->notify($this->app->event->create($item, 'payment:callback', array(
            'item'      => $item,
            'appParams' => $appParams
        )));
    }

    /**
     * @return Int
     */
    protected function _getFirstElementId()
    {
        $basketItems = $this->data();

        reset($basketItems);
        $firstKey = key($basketItems);

        return $firstKey;
    }

    /**
     * Get current order status
     * @param bool $isFormated
     * @return mixed
     */
    public function getOrderStatus($isFormated = false)
    {
        $orderInfo = $this->app->data->create($this->getOrderInfo());
        $status    = $orderInfo->get('status', self::ORDER_STATUS_NODATA);

        if ($isFormated) {
            return JText::_('JBZOO_PAYMENT_STATUS_' . JString::strtoupper($status));
        }

        return $status;
    }

    /**
     * Get payment data
     * @deprecated
     * @return null
     */
    public function getPaymentData()
    {
        return $this->getOrderInfo();
    }

    /**
     * Get payment data
     * @return null
     */
    public function getPaymentType()
    {
        $orderInfo = $this->app->data->create($this->getOrderInfo());
        return $orderInfo->get('payment_system');
    }

    /**
     * Bind data on save
     * Hack for save from admin
     * @param array $data
     */
    public function bindData($data = array())
    {
        $saveData = $data;

        if ($this->getItem()) {
            $newData = JFactory::getSession()->get('items-' . $this->getItem()->id . '-' . $this->identifier, null, __CLASS__);
        }

        if (!empty($newData)) {
            $saveData = $newData;
        }

        // for administator only
        if (isset($data['order_info_admin'])) {

            $orderInfo = array(
                'status'      => $data['order_info_status'],
                'description' => $data['order_info_description'],
                //'payment_date'      => $this->app->date->create()->toSQL(),
                //'payment_system'    => 'Admin Edit',
                //'additional_status' => 'none',
            );

            if (isset($saveData['is_advance'])) {
                $saveData['order_info'] = array_merge($saveData['order_info'], $orderInfo);

            } else {
                reset($saveData);
                $firstKey = key($saveData);

                if (!isset($saveData[$firstKey]['order_info'])) {
                    $saveData[$firstKey]['order_info'] = array();
                }

                $saveData[$firstKey]['order_info'] = array_merge($saveData[$firstKey]['order_info'], $orderInfo);
            }
        }

        parent::bindData($saveData);
    }

    /**
     * Render HTML for admin edit form
     * @return null
     */
    public function getOrderSubForm()
    {
        if ($this->app->jbenv->isSite()) {
            return null;
        }

        if ($layout = $this->getLayout('adminform.php')) {

            $orderInfo = $this->getOrderInfo();

            return self::renderLayout($layout, array(
                'description' => isset($orderInfo['description']) ? $orderInfo['description'] : '',
                'status'      => $this->getOrderStatus(),
            ));

        }

        return null;
    }

    /**
     * Get status list
     * @return array
     */
    protected function _getStatusList()
    {
        return array(
            self::ORDER_STATUS_NODATA   => JText::_('JBZOO_PAYMENT_STATUS_' . self::ORDER_STATUS_NODATA),
            self::ORDER_STATUS_CANCEL   => JText::_('JBZOO_PAYMENT_STATUS_' . self::ORDER_STATUS_CANCEL),
            self::ORDER_STATUS_NOPAID   => JText::_('JBZOO_PAYMENT_STATUS_' . self::ORDER_STATUS_NOPAID),
            self::ORDER_STATUS_PROGRESS => JText::_('JBZOO_PAYMENT_STATUS_' . self::ORDER_STATUS_PROGRESS),
            self::ORDER_STATUS_PAID     => JText::_('JBZOO_PAYMENT_STATUS_' . self::ORDER_STATUS_PAID),
        );
    }

    /**
     * Load assets
     * @return $this
     */
    public function loadAssets()
    {
        $this->app->jbassets->basketItems();
        return parent::loadAssets();
    }

    /**
     * Check is element in advance mode
     * @return int
     */
    public function isAdvance()
    {
        $data = $this->data();
        return isset($data['is_advance']);
    }

    /**
     * Get order items
     * @return array
     */
    public function getOrderItems()
    {
        $data = $this->data();

        if ($this->isAdvance() && isset($data['items'])) {
            return $data['items'];
        }

        return $data;
    }

    /**
     * Get order item ID list
     * @return array
     */
    public function getOrderItemsId()
    {
        $items = $this->getOrderItems();

        $result = array();
        if (!empty($items)) {
            foreach ($items as $item) {
                $result[] = $item['itemId'];
            }
        }

        return $result;
    }

    /**
     * Get information about the order
     * @return array
     */
    public function getOrderInfo()
    {
        if ($this->isAdvance()) {
            $data = $this->data();
            if (isset($data['order_info'])) {
                return $data['order_info'];
            }

        } else {
            $first = $this->_getFirstElementId();
            if ($first) {
                $data = $this->get($first);
                if (isset($data['order_info'])) {
                    return $data['order_info'];
                }
            }
        }

        return array();
    }

    /**
     * Set new order information
     * @param array $data
     */
    public function bindOrderInfo(array $data)
    {
        $orderInfo = array_merge($this->getOrderInfo(), $data);

        if ($this->isAdvance()) {
            $this->set('order_info', $orderInfo);
        } else {
            $id   = $this->_getFirstElementId();
            $data = $this->data();

            $data[$id]['order_info'] = $orderInfo;
            $this->set($id, $data[$id]);
        }
    }
}

  • 0

#8 Cheren-dow

Cheren-dow

Отправлено 08 May 2015 - 13:02

ilyaantonov89, если сделать следующее, в файле события

сайт\media\zoo\applications\jbuniversal\framework\events\jbevent.basket.php

метод beforeSave заменить на

    /**
     * On before order save
     * @param AppEvent $event
     */
    public static function beforeSave($event)
    {
        $params = $event->getParameters();
        $item   = $params['item'];

        $jbbasketitems   = $item->getElementsByType('jbbasketitems');
        $basketElementId = key($jbbasketitems);

        $basketElement = $item->getElement($basketElementId);
        $basketItem    = $basketElement->data(); // получаем данные

        var_dump($basketItem);
        $basketItem['items']['91']['price'] = '111'; // заменяем цену для продукта с id = 91

        $basketElement->bindData($basketItem); // заменяем/сохраняем новые данные
        var_dump($basketItem);
        jexit();
    }

В это случае я добавил в корзину материал с id = 91 и сделал для него принудительную замену цены

eciy_200x0.png

в итоге сохраняется нужная цена

v0ad_200x0.jpg

Исходя из этого кода усовершенствуйте его для своих форм


  • 0
Изображение
 

#9 ilyaantonov89

ilyaantonov89

Отправлено 08 May 2015 - 14:14

ilyaantonov89, если сделать следующее, в файле события

сайт\media\zoo\applications\jbuniversal\framework\events\jbevent.basket.php

метод beforeSave заменить на

    /**
     * On before order save
     * @param AppEvent $event
     */
    public static function beforeSave($event)
    {
        $params = $event->getParameters();
        $item   = $params['item'];

        $jbbasketitems   = $item->getElementsByType('jbbasketitems');
        $basketElementId = key($jbbasketitems);

        $basketElement = $item->getElement($basketElementId);
        $basketItem    = $basketElement->data(); // получаем данные

        var_dump($basketItem);
        $basketItem['items']['91']['price'] = '111'; // заменяем цену для продукта с id = 91

        $basketElement->bindData($basketItem); // заменяем/сохраняем новые данные
        var_dump($basketItem);
        jexit();
    }

В это случае я добавил в корзину материал с id = 91 и сделал для него принудительную замену цены

eciy_200x0.png

в итоге сохраняется нужная цена

v0ad_200x0.jpg

Исходя из этого кода усовершенствуйте его для своих форм

 

метод beforeSave не находит объект $params

 

Fatal error: Call to a member function getElementsByType() on a non-object in /home/o/otdelito/order.stroycity.ru/public_html/media/zoo/applications/jbuniversal/framework/events/jbevent.basket.php on line 87


  • 0

#10 Cheren-dow

Cheren-dow

Отправлено 08 May 2015 - 14:45

ilyaantonov89, это решение я делал на 2.1.5. Только сейчас заметил что у вас 220. За заказы от в 220 отвечает 

сайт\media\zoo\applications\jbuniversal\framework\models\jbmodel.order.php

смотрите метод save и что храниться в $order. Или же писась элемент для корзины на похожий на quntity.


  • 0
Изображение
 




Click to return to top of page in style!