Determinar tipo de página y página

11

Tengo un nuevo trabajo donde trabajo estrictamente en Magento todos los días ahora. No tengo experiencia previa con Magento, ¡así que ha sido un desafío decir lo menos hasta ahora!

Permítanme explicar brevemente la extensión que estamos construyendo.

Nos permitirá mostrar una ventana emergente / modal. El contenido HTML del Modal se almacenará en
unStatic Block


PÁGINA DE ADMINISTRADOR

Por lo tanto, el panel de administración consta de una nueva pestaña en System/Confuration/NUEVA PESTAÑA

El panel de administración le permite seleccionar en una lista desplegable en esa NUEVA PÁGINA DE PESTAÑAS el valor predeterminado Static Blockpara usar en estas secciones ...

HOME PAGEo HOME PAGE w/Items in Shopping Cart
ALL CATEGORY PAGESo ALL CATEGORY PAGES w/Items in Shopping Cart
ALL PRODUCTS PAGESo ALL PRODUCTS PAGES w/Items in Shopping Cart
ALL CMS PAGESo ALL CMS PAGES w/Items in Shopping Cart
SHOPPING CART PAGEo SHOPPING CART PAGE w/Items in Shopping Cart


VALORES POR DEFECTO

A continuación, las páginas reales de CMS , CATEGORÍA y PRODUCTO permiten la misma configuración que la página del Panel de administración, excepto que le permiten establecer STATIC BLOCKuna por elemento y anular la configuración predeterminada que teníamos en la configuración de administración anterior .


Hasta ahora tenemos el lado de administración de la extensión hecho. Tenemos todas las pestañas de administración para cada sección ... producto, categoría, CMS y página de configuración.

El siguiente paso será agregar a la misma extensión y hacer una Static Blockinserción en la página. Esto Static Blockserá responsable de ... Mostrar la correcta Static Blocken cada página según la configuración establecida en las áreas mencionadas ...

  • Determinar la página en la que estamos y el tipo de página (cms, producto, inicio, categoría)
  • Luego tendrá que leer todas las configuraciones personalizadas que se establecieron en las áreas mencionadas anteriormente.
  • Si se determina que estamos en una Categorypágina, tendremos que obtener la categoría específica real en la que estamos. Por ejemplo Category 3. Luego veremos si hay una configuración específica para esa categoría específica. ¡Si dice Enabledque buscaremos cuál Static Blockestá guardado para esa categoría y lo mostraremos en nuestra Static Blockpágina principal!
  • Si la categoría específica anterior se establece como Disablednuestra Modal Window, buscaremos más arriba en las configuraciones más globales para el modal y veremos si un modal está habilitado para todas las categorías. En caso afirmativo, veremos cuál Static Blockestá configurado para mostrarse en todas las categorías.
  • Además de todo esto, realizará este proceso para cada uno de los tipos de página principal (producto, categorías, cms, inicio, carrito)
  • También tendremos que verificar si el carrito de compras está vacío o no. SI no está vacío ... entonces tendremos que tenerlo en cuenta antes cuando comprobemos qué Static Blockmostrar para esa página, ya que cada configuración permite Static Blockestablecer un carro vacío y 1 para el carro no vacío. (Sé que esta es una tarea enorme y difícil, pero tenemos el lado del administrador hecho principalmente. Solo necesito hacer la parte que tenga en cuenta a todos para determinar qué Static Blockmostrar en qué página en particular.

Entonces, para llevarme en la dirección correcta, tengo un par de preguntas más pequeñas ...

  • ¿Cómo puedo determinar dentro de mi Static Blockcódigo (la parte PHP) en qué TIPO de PÁGINA estoy? Como mencioné, necesito saber si estoy en ... PÁGINA DE INICIO , PÁGINA DE CMS , PÁGINA DE CATEGORÍA , PÁGINA DE PRODUCTO o PÁGINA DE CARRITO .
  • Además del TIPO DE PÁGINA , necesito obtener la página real. Entonces, si estoy en la identificación del producto 1234, entonces necesito poder obtener la configuración (bloque estático establecido para esa página) para esa página en particular.

Sé que ha sido una publicación larga y posiblemente confusa. Si llegaste hasta aquí, gracias por tomarte tu tiempo para leer esto =)

Si puedes ayudarme con mi pregunta, cada pequeño trozo me acercará al objetivo final


A continuación hay un diagrama de flujo que hice sobre cómo necesitará trabajar mi módulo para determinar qué bloque estático insertar en la página

ingrese la descripción de la imagen aquí

JasonDavis
fuente
2
Te das cuenta de que has recreado efectivamente la funcionalidad que existe en el Mage_Widgetmódulo, ¿verdad?
Benmarks
Lo mismo dice @benmarks. En mi opinión, será mejor que intentes aprovechar los widgets e ir desde allí.
davidalger
@benmarks Mirando el diagrama de flujo que he agregado a mi pregunta, ¿diría que todavía es alcanzable al 100% con el Mage_Widget? Necesito investigar eso también
JasonDavis
No. Los bloques de widgets principales no entienden combinaciones como las indicadas en su gráfico. Vas a querer algo de lógica de bloque para esto.
Benmarks

Respuestas:

12

Además de lo que respondió @benmarks :

Aquí hay un pequeño código para verificar algunas de las condiciones que mencionó:

// Check if it's a CMS page:
$page = Mage::getSingleton('cms/page');
if ($page->getId()) {
    // The current page is a CMS page

    if ($page->getIdentifier() == Mage::getStoreConfig('web/default/cms_home_page')) {
        // The current page is the CMS home page
    }
}

$product = Mage::registry('current_product');
$category = Mage::registry('current_category');
if ($product && $product->getId()) {
    // The current page is a product page.
    // If you only want the main product detail page, also check for 
    // Mage::app()->getFrontController()->getAction()->getFullActionName() == 'catalog_product_view'
    // Be aware that a current_product and a current_category can be set at the same time.
    // In that case the visitor is viewing a product in a category.
} elseif ($category && $category->getId()) {
    // The current page is a category page
    // If you only want the category list page, also check for 
    // Mage::app()->getFrontController()->getAction()->getFullActionName() == 'catalog_category_view'
}

// Check for cart page
if (Mage::app()->getFrontController()->getAction()->getFullActionName() == 'checkout_cart_index') {
    // The current page is the cart
}

Para comprobar si el carrito está vacío o no usar

$isEmpty = Mage::getSingleton('checkout/session')->getQuote()->getItemsCount() > 0

También preguntó si puede verificar la página actual dentro de un bloque CMS.
Probablemente no sea un buen enfoque (tendrías que incluir bloques personalizados, lo que anularía el propósito de usar bloques CMS en la primera página).
En cambio, es mejor verificar primero la página actual y luego elegir el bloque CMS para mostrar en función de eso.

EDITAR : corregido Mage::app()->getRequest()->getFullActionName()para ser Mage::app()->getFrontController()->getAction()->getFullActionName()mencionado por @Joseph en los comentarios. ¡Gracias!

Vinaí
fuente
¡Muchas gracias, esto realmente me ayudará a comenzar!
JasonDavis
1
Solo para tener en cuenta: el uso Mage::app()->getRequest()->getFullActionName()de una plantilla de carrito da como resultado un error fatal o al menos lo hizo para mí en 1.7.0.2. $this->getAction()->getFullActionName()funcionó a la perfección!
Joseph Leedy
Uh, sí, estás en el camino correcto. ¡Culpa mía! ¡Gracias!
Vinai
FYI, Mage :: getSingleton ('cms / page') -> getId () da un valor nulo en el evento controller_action_predispatch.
MagePsycho
7

Muchos enfoques que podrías tomar. Recomiendo agregar su bloque a través del <default>controlador de actualización de diseño, que lo haría disponible en todas las páginas. En el _prepareLayout()método de su bloque , puede determinar el alcance obteniendo el nombre completo de la acción actual del objeto de solicitud ( $this->getRequest()->getFullActionName()) y usándolo para determinar el contexto.

Los productos y categorías se registrarán en el registro. Su bloque también podría mirar los identificadores de actualización de diseño, que incluirán identificadores de ID de producto o de categoría.

puntos de referencia
fuente
3

Para detectar la página de inicio, debe utilizar la cadena de identificación (por ejemplo, "inicio") para que coincida con el valor de configuración, en lugar de la identificación numérica:

if ($ page-> getIdentifier () == Mage :: getStoreConfig ('web / default / cms_home_page')) {
    // Página de inicio
}

Aquí hay algunos otros:

$ fullActionName = Mage :: app () -> getFrontController () -> getAction () -> getFullActionName ();
if ('checkout_onepage_index' == $ fullActionName) {
    // Revisa
}

if ('checkout_onepage_success' == $ fullActionName) {
    // Pago exitoso
}

if ('customer_account_login' == $ fullActionName) {
    // Iniciar sesión
}

if ('customer_account_logoutSuccess' == $ fullActionName) {
    // Cerrar sesión correctamente
}

if ('customer_account_create' == $ fullActionName) {
    // Crear cuenta de cliente
}
if (0 === strpos ($ fullActionName, 'catalogsearch_')) {
    // Buscar
}

if (0 === strpos ($ fullActionName, 'customer_account_')
 || 0 === strpos ($ fullActionName, 'customer_address_')
 || 0 === strpos ($ fullActionName, 'wishlist_')
 || 0 === strpos ($ fullActionName, 'newsletter_manage_')
 || 0 === strpos ($ fullActionName, 'review_customer_')
 || 0 === strpos ($ fullActionName, 'sales_order_')
) {
    // Página de la cuenta del cliente (probablemente hay otras)
}

Gracias por la útil información a todos!

Kirkmadera
fuente