Posting in the Magento forums has been disabled pending the implementation of a new and improved forum solution which should better serve the community.

For new questions please post at magento.stackexchange.com, the community-run support site for the Magento community. We will be providing updates on the new forum solution soon. For questions or concerns please email community@magento.com.

Magento Forum

Как изменить * Наличие: На складе * если товар “Под заказ”? 
 
Deus
Sr. Member
 
Avatar
Total Posts:  122
Joined:  2009-04-16
Russia. Moscow
 

Доброго времени суток друзья. Не знаю на сколько покажется актуальной тема, но для меня она актуальна как никогда. Понимаю, что есть решения данного вопроса (модули), но покупать модуль ради изменения одной строчки не эффективно, да и функционал представленный в готовых модулях не всегда требуется (может быть в будущем). Перечитал и перерыл кучу инфы и вот что удалось найти. Это не моё творение, топик из англоязычного форума. Оригинал: http://www.magentocommerce.com/boards/viewthread/59143/
Я лишь попытался его слегка перевести для удобства восприятия. Итак:

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

Кроме того, хотелось бы получить некоторую гибкость. Так на пример без привязки к тому, что товар прибудет на пример в субботу или воскресенье, т.к он отправляется толлько с понедельника по пятницу.

Вот что я сделал:
1) Я добавил настраиваемый атрибут под названием “days_to_ship” и включил его в мой набор атрибутов.
2) Затем я создал для этого атрибута выпадающий список выбора количества рабочих дней 5, 6, 10 дней и т.д.
3) Далее в интернете я нашел следующий фрагмент Java, который планировал использовать:

<script type="text/javascript">
function 
businessDays(n){
var D=new Date();
var 
num=Math.abs(n);
var 
tem,count=0;
var 
dir= (n<0)? -11;
while(
countnum){
D
= new Date(D.setDate(D.getDate()+dir));
tem=D.getDay();
if(
tem!=&& tem!=6) ++count;
}
return D;
}
var D=businessDays(10).toLocaleDateString(); //string
[removed](D);
</script>
Обратите внимание, что количество дней, в будущем я хочу установить на этой линии:
var D=businessDays(10).toLocaleDateString(); //string

В этом случае сценарий будет показывать 10 рабочих дней с того момента дня каждый раз, когда будет отображаться страница товара.
Далее я изменил код в оригинальном файле
/app/design/frontend/defaultMYTHEME/template/catalog/product/view/type/default.phtml

<?php if($_product->isSaleable()): ?>
    
<class="availability"><?php echo $this->__('Availability: In stock.'?></p>
<?php else: ?>
    
<class="availability"><?php echo $this->__('Availability: Out of stock.'?></p>
<?php endif; ?>
Вот этим:
<?php if($_product->isSaleable()): ?>
    
<class="availability">
    
<?php if ($_product->getData('days_to_ship')): ?>
    <?php $_shipdays
$_product->getResource()->getAttribute('days_to_ship')->getFrontend()->getValue($_product); ?>
    Ð—аказной Ñ‚овар
При Ð·Ð°ÐºÐ°Ð·Ðµ ÑÐµÐ³Ð¾Ð´Ð½ÑÑ‚овар Ð±ÑƒÐ´ÐµÑ‚ Ð½Ð° ÑÐºÐ»Ð°Ð´Ðµ Ð½Ðµ Ð¿Ð¾Ð·Ð´Ð½ÐµÐµ:<br />
    <
script type="text/javascript">function businessDays(n){var D=new Date();var num=Math.abs(n);var tem,count=0;var dir= (n<0)? -11;while(countnum){D= new Date(D.setDate(D.getDate()+dir));tem=D.getDay();if(tem!=&& tem!=6) ++count;}return D;}var  D=businessDays(<?php echo $_shipdays ?>).toLocaleDateString();[removed](D);</script>
<?php 
else: ?>
<?php 
echo $this->__('Availability: In Stock'?>
    <?php 
endif; ?>
</p>
<?php else: ?>
    
<class="availability"><?php echo $this->__('Availability: Out of stock.'?></p>
<?php endif; ?>

Что же получилось? Просто я добавил скрипт в цикл, который проверяет, если атрибут “days_to_ship” активный и в нём выбрано кол-во дней для доставки, то устанавливается “Var D = businessDays” на этот конкретный товар.

Теперь, когда мы заводим товар, в поле “"Доступность" на странице сайта будет отображаться следующее:

1 - Если товар в наличии, но я не ставлю “days_to_ship” значение:
Доступность: На складе

2 - Если это в наличии, и я поставил “days_to_ship” и указал в выпадающем списке значение дней то в поле “Наличие” будет следующая надпись:
Заказной товар. При заказе сегодня, товар будет на складе не позднее: .....

3 - Если товр в наличии:
Доступность: на складе

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

 
Magento Community Magento Community
Magento Community
Magento Community
 
Deus
Sr. Member
 
Avatar
Total Posts:  122
Joined:  2009-04-16
Russia. Moscow
 

Сделал всё, как пишет автор и о чудо - это работает но......  Как оказалось работает это только в дефолтных шаблонах тем magento Ñ‚.к в app\design\frontend\base\default\template\catalog\product\view.phtml строка выводящая инфу о статусе товара

<?php echo $this->getChildHtml('product_type_data'?>

в моей же теме app\design\frontend\моя тема\default\template\catalog\product\view.phtml
это выглядит так

<?php if($_product->isSaleable()): ?>
                
<class="availability in-stock"><?php echo $this->__('Availability:'?> <span><?php echo $this->__('In stock'?></span></p>
            
<?php else: ?>
                
<class="availability out-of-stock"><?php echo $this->__('Availability:'?> <span><?php echo $this->__('Out of stock'?></span></p>
и как следствие, решение приведённое выше не работает.
Собственно вопрос.
Что мне нужно изменить в файле view.phtml для того, чтобы данный скрипт работал в моей теме?
В дефолтной теме product_type_data выводит не только статус товара (в наличии или нет), но и стоимость.
Как сделать так, чтобы выводился только статус (без стоимости т.к за вывод цены у меня отвечает другой блок кода) если код в моей теме заменить на
<?php echo $this->getChildHtml('product_type_data'?>

Ну и собственно (даже в дефолтной теме) не отображается кол-во дней (как указывает автор) хотя я выбираю значение в созданном атрибуте. Т.е выводится просто

Заказной товар. При заказе сегодня, товар будет на складе не позднее: (дни не отображаются)

а я так понимаю, что это должно выглядеть примерно так:

Заказной товар. При заказе сегодня, товар будет на складе не позднее: 14 дней

Я не слишком силён в программинге (всё на уровне логики) поэтому буду признателен за участие.

а ну и версия движка 1.7.0

 
Magento Community Magento Community
Magento Community
Magento Community
 
Deus
Sr. Member
 
Avatar
Total Posts:  122
Joined:  2009-04-16
Russia. Moscow
 

Вопрос с выводом скрипта в поле статус товара решился. Вопрос с выводом дней остаётся открытым.

 
Magento Community Magento Community
Magento Community
Magento Community
 
Deus
Sr. Member
 
Avatar
Total Posts:  122
Joined:  2009-04-16
Russia. Moscow
 

Тема закрыта. Всех благодарю за участие!

 
Magento Community Magento Community
Magento Community
Magento Community
 
niro
Mentor
 
Avatar
Total Posts:  1609
Joined:  2009-03-04
Latvia, Riga
 

Поделитесь для будущих поколений, почему не выводилось?

 
Magento Community Magento Community
Magento Community
Magento Community
 
Deus
Sr. Member
 
Avatar
Total Posts:  122
Joined:  2009-04-16
Russia. Moscow
 

Ну, как оказалось всё довольно банально.
Во первых каюсь (мои познания английского не идеальны) и автор хотел вывести не кол-во дней, а дату (числ., мес., год).
Другими словами в админке мы создаём атрибут с выпадающим списком в котором указываем кол-во дней через которое, по нашему мнению, в случае заказа мы може привезти товар к нам на склад.
Исходя из этого мы устанавливаем числовые значения дней в атрибуте ( у меня это 10, 14, 23 и 28). Значения по понятным причинам для каждого индивидуальны.
Далее, когда мы заводим товар, которого на пример нет на складе и (как в моём случае) он является заказным, если атрибут days_to_ship мы делаем активным, выбирая из выпадающего списка значение дней доставки - на пример 14, далее в поле “наличие на складе” указываем “в наличии” и ставим произвольное кол-во товара на складе, то в этом случае на странице товара у нас будет выводится следующая надпись (каждый может её отредактировать по своему) У меня так

Заказной товар
При заказе сегодня, товар будет на складе не позднее: тут генерируется дата (числ., мес., год) через которую товар можно будет в случае заказ привезти на склад.

На пример если сегодня 29 июня 2012 года, а в атрибуте стоит 10, то дата в строке будет 9 июля 2012 года. И так автоматически каждый последующий день.

Тперь почему не выводилась у меня строка скрипта. Тут ошибка моя.
В скрипте у автора <p class="availability">, а вмоей теме <p class="availability in-stock">. Я же просто не обратил на это внимание когда вставлял код. Поэтому если кому то данное решение покажется полезным рекомендую не идти по моим стопам, а внимательно проверять код в вашем шаблоне.

Теперь о выводе самой даты. Тут ни автор, ни я не обратили внимание на то, что в скрипте удалена часть кода [removed], а именно:

if(tem!=&& tem!=6) ++count;}return D;}var  D=businessDays(<?php echo $_shipdays ?>).toLocaleDateString();[b][removed][/b](D);</script>
Вероятно кому то из модераторов это сильно мешало жить. )))

Решение следующее: вместо [removed] мы указываем [removed] И строка принимает вид

if(tem!=&& tem!=6) ++count;}return D;}var  D=businessDays(<?php echo $_shipdays ?>).toLocaleDateString();[removed](D);</script>
Теперь всё работает.
Желающие могут повозиться с CSS и привести это в визуально достойный вид. У меня это выглядит так, как на прикреплённом скрине.

Надеюсь я Вас не сильно утомил и Вам это поможет.

Image Attachments
img_12.png
 
Magento Community Magento Community
Magento Community
Magento Community
 
Deus
Sr. Member
 
Avatar
Total Posts:  122
Joined:  2009-04-16
Russia. Moscow
 

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

Image Attachments
123.png
 
Magento Community Magento Community
Magento Community
Magento Community
 
rabfak
Jr. Member
 
Total Posts:  1
Joined:  2011-02-03
 

Вариант описаный выше работает только для простых товаров?
По крайней мере для конфигурируемых не работает, более того прячет Доступность.
И не понятно как он считает рабочие дни?
Сегодня 26 декабря
Я поставил срок 15 дней
И выводится 16 января 2013
??? Просветите, пжлста.
Но если кому необходимо при условии торговли простыми товарами, то немного подправил.
1. Атрибут days_to_ship лучше сделать обязательным. “Требуются значения” - Да
2. Меняем код на этот (не програмист) cool smile

<?php /* @var $this Mage_Catalog_Block_Product_View_Abstract */?>
<?php $_product 
$this->getProduct(); $i round($_product->getStockItem()->getQty())?>
<?php 
if($_product->isSaleable()): ?>
      
<class="availability in-stock">
              
<?php if ($i): ?>
              
<class="availability in-stock"><?php echo $this->__('Availability:'?> <span><?php echo $this->__('In stock'?></span></p>
              
<?php else: ?>
                  <?php 
if ($_product->getData('days_to_ship')): ?>
                <?php $_shipdays 
$_product->getResource()->getAttribute('days_to_ship')->getFrontend()->getValue($_product); ?>
                Ð—аказной Ñ‚овар
.<br />Срок Ð¸ÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð´Ð¾<?php echo $_shipdays ?> Ñ€Ð°Ð±Ð¾Ñ‡Ð¸Ñ… Ð´Ð½ÐµÐ¹.<br /> ÐŸÑ€Ð¸ Ð·Ð°ÐºÐ°Ð·Ðµ ÑÐµÐ³Ð¾Ð´Ð½ÑÑ‚овар Ð±ÑƒÐ´ÐµÑ‚ Ð½Ð° ÑÐºÐ»Ð°Ð´Ðµ Ð¾Ñ€Ð¸ÐµÐ½Ñ‚ировочно:<br />
                <
script type="text/javascript">function businessDays(n){var D=new Date();var num=Math.abs(n);var tem,count=0;var dir= (n<0)? -11;while(countnum){D= new Date(D.setDate(D.getDate()+dir));tem=D.getDay();if(tem!=&& tem!=6) ++count;}return D;}var  D=businessDays(<?php echo $_shipdays ?>).toLocaleDateString(); [removed](D);</script>
                <?php 
endif; ?>
               <?php 
endif; ?>
        
</p>
<?php else: ?>
    
<class="availability out-of-stock"><?php echo $this->__('Availability:'?> <span><?php echo $this->__('Out of stock'?></span></p>
<?php endif; ?>
<?php 
echo $this->getChildHtml('product_type_data_extra'?>
<?php 
echo $this->getPriceHtml($_product?>
Лишнее удалите: + выводит Срок исполнения
Теперь работает более корректно
+
если товар появится в наличии, не нужно бегать по вкладкам и устанавливать/снимать кол-во days_to_ship. Вся надпись исчезнет самостоятельно.
если количество упадёт до 0 (хорошо бы доделать, что бы сравнивала с “Кол-во, при котором статус товара становится “нет в наличии” но я не нашел этих переменных)
В общем полезная весчь, если остались живые - давайте доведём до ума.
Ну и прикрепил файл ввиду вырезания кода форумом, хотя ничего не вырезало cool smirk
File Attachments
default.phtml.zip  (File Size: 2KB - Downloads: 29)
 
Magento Community Magento Community
Magento Community
Magento Community
 
Deus
Sr. Member
 
Avatar
Total Posts:  122
Joined:  2009-04-16
Russia. Moscow
 

У меня данный метод работает, как с настраиваемыми так и с простыми товарами. Просто эти методом я сообщаю покупателю (в самом файле написать можно любой тескт), что данный товар заказной и при заказе сегодня он поступит на наш склад через 24 дня на пример. При этом товар доступен к заказу. Ничего более. вероятно это действительно не очень удобно когда товаров ооооооочень много и большинство из них под заказ. В этом случае предложенный Вами вариант наверно предпочтительнее. Но с другой стороны какова гарантия что пусть я указал приблизительный срок на пример 24 дня а товар не поступит через 18 дней или 30 дней. Пути и работа нашей таможни неисповедимы ))))) У меня товаров пока не много поэтому при поступлении их на склад я меняю доступность сам.

 
Magento Community Magento Community
Magento Community
Magento Community
Magento Community
Magento Community
Back to top