Como verificar se um produto é novo

15

Em uma pesquisa rápida, a única referência que encontrei foi nos fóruns do Magento, o que sugere que você precise escrever um código personalizado para verificar se um produto é novo.

Eu teria pensado que haveria um isNew()método simples Mage_Catalog_Model_Productque leva em consideração o menu suspenso Em destaque , bem como os campos Definir produto como novo a partir da data e Definir produto como novo até a data - mas esse não parece ser o caso?

O codez personalizado é necessário?

kalenjordan
fonte
isNew () está apenas verificando se isso é novo no banco de dados (ou seja, ainda não foi salvo e ainda não possui um ID de entidade, na maioria das vezes o incremento automático)
Kristof no Fooman
@Fooman Acho que isObjectNew()sim , mas entendo o que você está dizendo.
precisa saber é o seguinte
Verifique este link. Ele afirma como fazê-lo. universalcoder.wordpress.com/2014/04/14/…
Dexter

Respostas:

13

Você absolutamente NÃO deve converter e validar datas manualmente, pois isso pode causar problemas de fuso horário. Magento tem método embutido isStoreDateInInterval()na Mage_Core_Model_Localeclasse. Portanto, você deve criar um método auxiliar que pode se parecer com isso

function isProductNew(Mage_Catalog_Model_Product $product)
{
    $newsFromDate = $product->getNewsFromDate();
    $newsToDate   = $product->getNewsToDate();
    if (!$newsFromDate && !$newsToDate) {
        return false;
    }
    return Mage::app()->getLocale()
            ->isStoreDateInInterval($product->getStoreId(), $newsFromDate, $newsToDate);
}

Mais detalhes você pode encontrar aqui http://quicktips.ru/all/check-product-is-new/

Denis Óbukhov
fonte
Atire boa chamada - obrigado por isso. Atualizei minha resposta rapidamente.
kalenjordan
6

Não há uma chamada de método única. Pelo menos não estou ciente disso.

No entanto, você sempre pode usar algo como isto:

<?php if (date("Y-m-d") >= substr($_product->getNewsFromDate(), 0, 10) && date("Y-m-d") <= substr($_product->getNewsToDate(), 0, 10)) : ?>
...
<?php endif ?>

Desculpe, eu não sou bom na comparação de datas do PHP.

Boa pergunta, a propósito.

user487772
fonte
Adaptei sua função para mostrar o produto que também não possui getNewsToDate. <? php if ((date ("Ymd")> = substr ($ _ product-> getNewsFromDate (), 0, 10) && $ _product-> getNewsFromDate ()! = "") && (date ("Ymd") < = substr ($ _ product-> getNewsToDate (), 0, 10) || $ _product-> getNewsToDate () == "")):?> ... <? php endif?>
Eduardo
5

Para referência, aqui está o método auxiliar que eu criei para verificar a novidade. Ele suporta o menu suspenso Em destaque, bem como as datas, e também suporta a data em branco.

public function isNew($product)
{
    if ($product->getData('featured_product')) {
        return true;
    }

    if ($product->getData('news_from_date') == null && $product->getData('news_to_date') == null) {
        return false;
    }

    if ($product->getData('news_from_date') !== null) {
        if (date('Y-m-d', strtotime($product->getData('news_from_date'))) > date('Y-m-d', time())) {
            return false;
        }
    }

    if ($product->getData('news_to_date') !== null) {
        if (date('Y-m-d', strtotime($product->getData('news_to_date'))) < date('Y-m-d', time())) {
            return false;
        }
    }

    return true;
}

ATUALIZAÇÃO: Agradecemos a @Rooooomine por mencionar que essa conversão manual de datas que sugeri é uma péssima idéia devido a possíveis problemas de localidade. Confira em Mage::app()->getLocale()->isStoreDateInInterval($product->getStoreId(), $newsFromDate, $newsToDate)vez disso.

kalenjordan
fonte
3

Uma precisão que pode ser útil para alguém. Todas essas respostas estão usando o atributo "news_from_date", mas se você deseja obter a data real de criação do produto no banco de dados, deve obter o atributo "created_at" usando o método:

$product->getCreatedAt()

No projeto em que estou trabalhando, alguns produtos podem ter um valor "news_from_date" diferente de "created_at". De fato, de acordo com as regras de negócios, um produto pode ficar fora de estoque por um longo período de tempo e depois voltar como novos produtos quando voltar ao catálogo.

Laila
fonte
0

Solução Rápida

    <?php
    foreach ($_productCollection as $_product):
    $date = date("Y-m-d 00:00:00");
        $newtodate = $_product['news_to_date'];
        $newfromdate = $_product['news_from_date'];

    if (isset($newfromdate) and isset($newtodate) and $date >= $newfromdate and $date <= $newtodate) 
       {
          echo "Product is new";
        }?>
     <?php endforeach ?>
chirag dodia
fonte
11
Obrigado Chirag. A única coisa que me incomoda um pouco nesse exemplo de código é o recuo! :)
kalenjordan
0

Você pode tentar o código abaixo

 $current_date = new DateTime($date); // compare date
 $from_date = new DateTime($this->getData('news_from_date')); // begin date
 $to_date = new DateTime($this->getData('news_to_date')); // end date        
 $new = ($current_date >= $from_date && $current_date <= $to_date);

Onde $thisé o objeto Mage_Catalog_Model_Producte você precisa carregar o produto se ele ainda não estiver carregado.

Anshu Mishra
fonte
11
Obrigado Anshu - Eu acho que isso pode não suportar vazio a partir de ou para datas embora.
kalenjordan