Cómo verificar si un producto es nuevo

15

En una búsqueda rápida, la única referencia que encontré fue en los foros de Magento, lo que sugiere que debe escribir un código personalizado para verificar si un producto es nuevo.

Pensé que habría un isNew()método simple en el Mage_Catalog_Model_Productque se tiene en cuenta el menú desplegable Destacado , así como los campos Establecer producto como nuevo desde la fecha y Establecer como nuevo hasta la fecha , pero ese no parece ser el caso.

¿Se necesitan los codez personalizados?

kalenjordan
fuente
isNew () solo está verificando si esto es nuevo en la base de datos (es decir, aún no se ha guardado y todavía no tiene una identificación de entidad, la mayoría de las veces el aumento automático)
Kristof en Fooman el
@Fooman Creo que es eso, isObjectNew()pero entiendo lo que estás diciendo.
kalenjordan
Mira este enlace. Establece cómo hacerlo. universalcoder.wordpress.com/2014/04/14/…
Dexter

Respuestas:

13

No debe convertir y validar fechas manualmente, ya que esto puede causar problemas de zona horaria. Magento tiene un método incorporado isStoreDateInInterval()en Mage_Core_Model_Localeclase. Por lo tanto, debe crear un método auxiliar que pueda verse así

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);
}

Puede encontrar más detalles aquí http://quicktips.ru/all/check-product-is-new/

Denis Óbukhov
fuente
Dispara una buena llamada, gracias por eso. He actualizado mi respuesta muy rápido.
kalenjordan
6

No hay una sola llamada al método. Al menos no soy consciente de ello.

Sin embargo, siempre puedes usar algo como esto:

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

Lo siento, no soy bueno en la comparación de fechas PHP.

Buena pregunta por cierto.

usuario487772
fuente
Adapte su función para mostrar el producto que no tiene getNewsToDate definido también. <? php if ((date ("Ymd")> = substr ($ _ product-> getNewsFromDate (), 0, 10) && $ _product-> getNewsFromDate ()! = "") && (date ("Ymd") < = substr ($ _ product-> getNewsToDate (), 0, 10) || $ _product-> getNewsToDate () == "")):?> ... <? php endif?>
Eduardo
5

Como referencia, aquí está el método de ayuda que se me ocurrió para comprobar si hay novedades. Es compatible tanto con el menú desplegable Destacado como con las fechas, y también admite que cualquier fecha esté vacía.

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;
}

ACTUALIZACIÓN: Gracias a @Rooooomine por mencionar que esta conversión manual de fecha que sugerí es una muy mala idea debido a posibles problemas de configuración regional. Echa un vistazo en su Mage::app()->getLocale()->isStoreDateInInterval($product->getStoreId(), $newsFromDate, $newsToDate)lugar.

kalenjordan
fuente
3

Una precisión que podría ser útil para alguien. Todas estas respuestas están utilizando el atributo "news_from_date" pero si desea obtener la fecha real de creación del producto en la base de datos, debe obtener el atributo "created_at" utilizando el método:

$product->getCreatedAt()

En el proyecto en el que estoy trabajando, algunos productos pueden tener un valor de "news_from_date" diferente de "created_at". De hecho, de acuerdo con las reglas comerciales, un producto puede estar agotado durante mucho tiempo y luego volver como productos nuevos cuando vuelva a estar en el catálogo.

Laila
fuente
0

Solución 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
fuente
1
Gracias Chirag ¡Lo único que me molesta un poco sobre este ejemplo de código es la sangría! :)
kalenjordan
0

Puedes probar el siguiente código

 $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);

Donde $thises objeto Mage_Catalog_Model_Producty necesita cargar el producto si aún no está cargado.

Anshu Mishra
fuente
1
Gracias Anshu: creo que esto podría no ser compatible con las fechas vacías.
kalenjordan