Estar participando en grandes proyectos con Magento 2 es todo un privilegio, un honor. Con esto, que últimamente estoy investigando sobre cómo programar en Magento 2. Así que antes de entrar al tajo con el desarrollo de los módulos, programación de la plantilla (frontend), o programación para el panel de control (backend).. podemos empezar a juguetear con scripts externos a Magento que bootstrapean toda la aplicación para tenerlo todo disponible.
Me explico, el hacer scripts externos a Magento es la mejor manera de comenzar a probar los fragmentos de código que vamos a necesitar después en módulos, frontend y/o backend. Es decir, si vamos a necesitar una sección, que te liste ciertos tipos de productos/pedidos/categorías/usuarios.. lo mejor es probar estos listados en otra parte. Mejor probamos en estos scripts externos, para luego incluirlos con toda su cáscara de frontend o backend, según proceda.
Independientemente de donde vamos a embeber estos códigos fuentes.. a veces es necesario hacerlo así, para trabajar masivamente los datos, haciendo lecturas, tratamiento de los datos, y grabados después. También podemos sacar listados, enviar emails, o cualquier cosa que necesites. Es decir, de esta forma no estas limitado a los 30 segundos de ejecución que te dan los servidores web. Haciendo este tipo de scripts puedes lanzar tareas sin límite de tiempo.
Al grano, la carcasa del script, el código fuente
Tengo la manía de poner un directorio extra/ en los proyectos. Así que de esta manera creo un script en el fichero extra/test.php como el siguiente:
<?php
ini_set('display_errors', 1);
ini_set('max_execution_time', 0);
ini_set('memory_limit', '-1');
set_time_limit(0);
error_reporting(E_ALL);
use Magento\Framework\App\Bootstrap;
include __DIR__.'/../app/bootstrap.php';
$bootstrap = Bootstrap::create(BP, $_SERVER);
$objectManager = $bootstrap->getObjectManager();
$state = $objectManager->get('Magento\Framework\App\State');
$state->setAreaCode('adminhtml');
Ya tenemos con esto el punto de partida para empezar a hacer scripting. Mira que simplemente es lo que tenemos en el index.php pero quitando todo lo innecesario. De esta forma podremos ejecutar todas las pruebas que necesitemos, haciendo desde línea de comandos lo siguiente:
php extra/test.php
Otra cosa a tener en cuenta es el estado de la aplicación que corre desde el script. Podemos usar los siguientes mirando en el fichero vendor/magento/framework/App/Area.php que tenemos los siguientes:
const AREA_GLOBAL = 'global';
const AREA_FRONTEND = 'frontend';
const AREA_ADMINHTML = 'adminhtml';
const AREA_DOC = 'doc';
const AREA_CRONTAB = 'crontab';
const AREA_WEBAPI_REST = 'webapi_rest';
const AREA_WEBAPI_SOAP = 'webapi_soap';
const AREA_GRAPHQL = 'graphql';
Si por ejemplo van a ser códigos para programar el frontend, deberíamos ponerle el ‘frontend’, y así simulamos ese entorno.
Otro código fuente de ejemplo, listando los productos con todos los atributos simples
<?php
ini_set('display_errors', 1);
ini_set('max_execution_time', 0);
ini_set('memory_limit', '-1');
set_time_limit(0);
error_reporting(E_ALL);
use Magento\Framework\App\Bootstrap;
include __DIR__.'/../app/bootstrap.php';
$bootstrap = Bootstrap::create(BP, $_SERVER);
$objectManager = $bootstrap->getObjectManager();
$state = $objectManager->get('Magento\Framework\App\State');
$state->setAreaCode('adminhtml');
$productsCollection = $objectManager->get('Magento\Catalog\Model\Product')->getCollection()
->addAttributeToSelect('*');
foreach ($productsCollection as $product) {
//var_dump($product->getData()); exit;
echo $product->getEntityId().' ### '
.$product->getSku().' ### '
.$product->getCreatedAt().' ### '
.$product->getUpdatedAt().' ### '
.$product->getName().' ### '
.$product->getShortDescription().' ### '
.$product->getDescription().' ### '
.$product->getMetaTitle().' ### '
.$product->getMetaDescription().' ### '
.$product->getPrice().' ### '
.$product->getSpecialPrice().' ### '
.$product->getTaxClassId().' ### '
.PHP_EOL;
}
Otra forma de consultar los datos de productos es con la función:
$product->getData('attribute_code');
Y así sucesivamente. Es curioso que los objetos principales de Magento 2, aunque han cambiado internamente, tienen nombres de funciones parecidos a Magento 1. También los nombres de las relaciones entre los objetos son parecidas. Sólo me queda remitirte a la documentación oficial por si necesitas más: https://devdocs.magento.com/
¡Un saludo! Otro día más..