Como visualizar los datos del backend al frontend

Buenas tardes, Estoy usando yii2 y cree mi crud llamada productos y ya inserte algunos datos que contiene, nombre, descripcion e imagenes en el backend y ahora lo que quiero es que se muestre en el frontend en el mismo modulo producto para que los usuarios lo puedan visualizar, y eso no se como hacerle.
He visto que lo hacen en el sitecontroller del frontend en la parte del index pero lo intente pero aún no sale.
¿Y una duda más es necesario que el crud de Productos esté en la carpte Modules o puede estar en cualquiera?
De ante mano, Muchas gracias!

Hay varias formas de hacer lo que planteas. Para hacerte una idea.

Resumiendo, los módulos son sólo una forma de organizar el código. Usar como un módulo te permite crear una funcionalidad de forma independiente de la aplicación que estés programando, y reusar ese código en otras aplicaciones. La metes en su carpeta, la añades y/o configuras en main.php y a rodar.

Si tienes la plantilla avanzada, que tiene frontend, y backend como apps diferentes, lo normal es que el módulo con CRUD lo tengas en el backend.

Para mostrar esos datos en el frontend puedes crear otro módulo de productos en frontend/modules con su propio controlador MainController, y sus propias vistas, con el diseño del frontend. Lo configurarías igual que el de backend, pero en frontend/config/main.php

En principio ese MainController sólo dejaría acceder a las acciones que un usuario del frontend pueda hacer.

Por ejemplo, si sólo puede ver listados de productos y detalles de un producto concreto, dejarías sólo index y view como acciones. Si el usuario puede comprar un producto, esa acción también iría en el controlador de frontend, pero en el del backend la puedes ignorar.

Respecto al modelo, lo mismo. En frontend/modules/productos/models escribirías el código que se aplica al frontend. Por ejemplo contaría con lo necesario para buscar, obtener una lista de productos y obtener un solo producto. Pero también puede usar métodos para descontar el stock o cosas de facturación que en el backend no importan.

entiendo que está usando el template advanced, ambos templates (basic y advanced) usan namespaces. Para llamar registros se puede hacer algo así:

use backend/models/Producto;
...
$productos = Producto::find()->all();

No importa si está en backend, frontend o en app para el template básicos, lo importante es llamar el namespace correcto.
Yo no suelo usar módulos, suelo poner todo en models.

Yii también cuenta con la herramienta gii que crea el CRUD completo, lo que debe tener en cuenta es los namespaces a la hora de contruirlo, ingresa en /index.php?r=gii

Pero al hacer eso, ¿Verdad que necesito una vista en mi caso del producto en el frontend en el cual es donde lo voy a llamar por medio de la ruta?

use backend/models/Producto;

$productos = Producto::find()->all(); ¿En que parte lo pondría esto?

¿Esto lo pondría en el Index del frontend?

Es que no lo entiendo bien

Si estoy usando la plantilla Advanced, en el backend ya tengo echo el CRUD en mi caso se llama Producto y ahí estoy metiendo toda la infromación como: Nombre, descripcion, imagen y fecha y eso quiero que aparezca en el frontend.

Intentaré probar con lo que mencionaste de crear el CRUD en el frontend pero con la ruta de modules ya que en el backend no lo estoy usando.

La respuesta de blonder4131 funcionará también, como digo se puede hacer de varias formas.

La idea de los módulos es que tengas un “productos” en backend y otro “productos” en el frontend, y que sean independientes.

Hagas lo que hagas debes crear las views para cada acción. Normalmente porque el diseño del frontend es diferente.

A tu otra pregunta, aunque no va para mí:

use backend/models/Producto;
…
$productos = Producto::find()->all(); ¿En que parte lo pondría esto?

En ese caso concreto, una vez has hecho el “use” del modelo, puedes llamar a sus métodos igual que lo hacías en el controlador de backend. Y sí, sería algo como…

public function actionIndex()
{

$productos = Producto::find()->andWhere(['activo' => 1])->all(); 
// ... aquí pasarías el resultado a la view y tal.

}

Suerte y ya comentas cómo te va,

Ya lo terminé y lo hice como me dijo cree nuevo modelo y de ahí su CRUD en la parte del frontend y ya me muestra los datos ahora lo que pasa es que como mis datos también tienen imagenes a la hora de mostrar la imagen en el frontend lo que muestra es el nombre de la información, ¿Cómo puedo hacer para que me muestre la imagen y también como le puedo hacer para que se vean acomodados esteticamente?

ASÍ SE VE EN EL FRONTEND:

Boligrafo (Boligrafos de distintos tipos de materiales, tamaños, colores y diseños propios. uploads/1639081046_boligrafo.jpg

Eso es un clásico.

Las imágenes deben estar en un directorio que pueda leer el navegador, pero al tener dos aplicaciones separadas para frontend y backend, siempre hay lío. Supongo que las guardas en /backend/web/imagenes o algo así.

Tambi’en hay varias formas de hacerlo, pero así sencillo puedes hacer un alias en common/config/bootstrap.php

Yii::setAlias('@imagenes', dirname(dirname(__DIR__)) . 'backend/web/images');

Y luego cuando quieras una imagen:

Yii::getAlias('@imagenes') . '/' . $modelo->nombreFichero;

Lo escribo de memoria, pero a ver si te haces una idea.

Creo que te sería más sencillo usar la plantilla básica, yo es la que uso ahora y lo hago a mi manera :slight_smile:

Lo intentare hacer con las alias a ver si me sale y espero que si.
Pues he estado usando la plantilla avanzada y pues como ya mero termino mi proyecto solo es eso que aparezcan las imagenes y darle formato a eso mismo y hacer un carrusel dinámico es lo unico que me hace falta para terminarlo.

<?php use yii\helpers\Html; //use yii\grid\GridView; use yii\widgets\LinkPager; $this->title = 'Productos'; ?>

Productos

    <?php foreach ($productos as $producto): ?>
  • <?= Html::encode("{$producto->nombre}: {$producto->descripcion} - {$producto->imagen}." ) ?>
  • <?php endforeach; ?>
<?= LinkPager::widget(['pagination' => $pagination]) ?>

En mi caso este es el código que uso para poder mostrar la información del backend al frontend pero no entiendo como usar lo del yii:getAlias en este apartado que es cuando quiero que se muestren las imagenes.

Una vez definas el alias en common/config/bootstrap.php lo puedes usar como una cadena de texto normal. Algo así:

<?= Html::encode("{$producto->nombre}: {$producto->descripcion}") . Html::img( Url::to('@imagenes/{$producto->imagen}')) ?> 

Si no transforma bien el @imagenes, es cuando se usa getAlias. Algo así.

<?= Html::encode("{$producto->nombre}: {$producto->descripcion}") . Html::img( Url::to(Yii::getAlias('imagenes') . "/" . {$producto->imagen}')) ?>

Verifiqué las dos formas que me comento y ninguna me funciona y ya esta definida el alias pero aún así no me muestra las imagenes, no encuentra ningún error pero si gue sin mostrar las imagenes.

¿Qué código html se genera donde debe ir la imagen?

No sé si he usado bien en el ejemplo los helpers de Html::img o el Url::to. Puede que falte algo, pero lo primero es asegurarse de que la ruta de las imágenes es la correcta.

Mira en el código html que genera la página si donde va esto:

Html::img( Url::to(Yii::getAlias('imagenes') . "/" . {$producto->imagen}'))

Hay un <a href=“ruta” … > y si esa ruta es la correcta de la imagen.

Pues lo estuve checando cambiando la ruta pero aún así no me aparecen las imagenes, pero tampoco me marca error así que no se que pueda ser