Динамические условия в Magento - PullRequest
3 голосов
/ 14 марта 2012

Я создал два Положения и условия оформления заказа, используя Admin -> Sales -> Terms & Conditions.Как я могу отобразить только один из них в зависимости от общей суммы заказа?Например, если общая сумма гранта меньше $ 2000, отобразите первые Условия и положения.А если общая сумма превышает 2000 долларов, то отображается вторая.И второй вопрос: как я могу вставить сумму в текст Положений и условий?

Ответы [ 2 ]

1 голос
/ 26 марта 2012

Код, который фильтрует соглашения, находится в классе Mage_Checkout_Block_Agreements:

public function getAgreements()
{
    if (!$this->hasAgreements()) {
        if (!Mage::getStoreConfigFlag('checkout/options/enable_agreements')) {
            $agreements = array();
        } else {
            $agreements = Mage::getModel('checkout/agreement')->getCollection()
                ->addStoreFilter(Mage::app()->getStore()->getId())
                ->addFieldToFilter('is_active', 1);
        }
        $this->setAgreements($agreements);
    }
    return $this->getData('agreements');
}

Это просто возвращает коллекцию активных соглашений в пределах допустимой области хранилища.Файл шаблона вызывает этот метод (checkout / onepage / соглашения.phtml):

<?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 $_a->getIsHtml() ? $_a->getCheckboxText() : $this->htmlEscape($_a->getCheckboxText()) ?></label>
        </p>
    </li>
<?php endforeach ?>

Самый простой способ выполнить то, что вы хотите, - это, вероятно, изменить файл шаблона.Поэтому я хотел бы представить некоторую логику, например, такую:

$total = Mage::getSingleton('checkout/cart')->getQuote()->getGrandTotal();
$agreement_name = ($total < 2000) ? 'lt2000' : 'gt2000';
$agreements = Mage::getModel('checkout/agreement')->getCollection()
    ->addStoreFilter(Mage::app()->getStore()->getId())
    ->addFieldToFilter('is_active', 1)
    ->addFieldToFilter('name', $agreement_name);
}
<?php foreach ($agreements as $_a): ?>
    ....

В этом примере у вас есть два термина и условия с именами 'lt2000' и 'gt2000' (или более - с теми же именами, но назначенными дляразличные области применения магазина / сайта).Однако этот код не учитывает дополнительные соглашения, которые могут потребоваться для отображения на странице оформления заказа.

Чтобы ответить на второй вопрос, этот является хорошим справочным материалом о том, как добавитьпользовательские переменные для статических блоков.В вашем случае вам просто нужно изменить имя и значение переменной на то, что вам нужно, и передать $ _a-> getContent () через метод filter.Затем вы сможете указать эту переменную в тексте ваших условий.

Так, например, ссылаясь на ссылку, вы можете добавить в код вашего шаблона:

$custom_vars = array('total'=>$total);
$filter = Mage::getModel('core/email_template_filter');
$filter->setVariables($custom_vars);
...
<?php echo $filter->filter($_a->getContent()) ?>
...
<?php echo nl2br($this->htmlEscape($filter->filter($_a->getContent()))) ?>

И тогда вы можете добавить {{var total}} в содержание ваших правил и условий в admin.

0 голосов
/ 14 декабря 2012

Если вы хотите отфильтровать условия, которые вы настроили в admin по имени, вам нужно изменить функцию getAgreements в классе блочных соглашений Mage Checkout и функцию getRequiredAgreementIds в классе данных помощника Mage Checkout.

Например, если вы хотите использовать термины для группы розничных клиентов и термины для группы оптовых клиентов, вы должны создать термины со словом RETAIL и WHOLESALE в именах терминов в admin, а затем сделать что-то вроде ниже, где мы фильтруем термины на основена имя.

$groupId = Mage::getSingleton('customer/session')->getCustomerGroupId();

if ($groupId == 1)
{
$agreements = Mage::getModel('checkout/agreement')->getCollection()
->addStoreFilter(Mage::app()->getStore()->getId())
->addFieldToFilter('is_active', 1)
->addFieldToFilter('name', array('like' => '%RETAIL%'));

}

Если группа 1 является розничной группой, продублируйте код для других групп.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...