Añadir Un paso en el checkout y mostrar paises (M2)

bravo_88

Miembro
Buenas,

por requisitos del cliente hay que añadir un paso previo en el checkout donde el primer paso sea unicamente pedir el pais donde se va a enviar el pedido, el segundo es pedir el resto de datos y ya pagar en el 3 paso.

Pues bien, por internet buscando encontre como hacer un módulo y añadir un paso previo, pero no consigo hacer un input donde mostrar todos los paises, no se donde captar esa info.

Como veis en la captura muestro un dropdown con paises (pero es estático, hecho a mano quiero decir) necesito que ese input se traiga toooodos los paises de magento para luego poder calcular el envio... Pero ni idea de donde traerme esa info.

Alguien puede ayudar¿?

Gracias!
 

Adjuntos

Toni FactoriaDigital

Experto en Magento de Factoría Digital
Miembro del equipo
Hola bravo,

Si inyectas en el bloque que tengas creado para ese template la colección de países podrás mostrarlos después dentro del mismo.

Dentro del constructor del bloque, inyecta la dependencia, asignándolo a su variable, algo parecido a:

PHP:
protected $_countryCollectionFactory;

public function __construct(
    ...
    \Magento\Directory\Model\ResourceModel\Country\CollectionFactory $countryCollectionFactory,
    ...
) {
    ...
    $this->_countryCollectionFactory = $countryCollectionFactory;
    ...
}
Hecho esto, podrás hacer una función desde la cual podrás recoger los valores luego en la plantilla:

PHP:
public function getCountries()
{
    $collection = $this->_countryCollectionFactory->create()->loadByStore();
    return $collection;
}
Después, en la plantilla asignada a ese bloque, podrás recoger esa colección así:

PHP:
$block->getCountries();
Ten en cuenta que en el checkout es posible que necesites utilizar KnockoutJS para arrastrar ciertos datos, si es lo que necesitas con el país de envío.

Un saludo.
 

bravo_88

Miembro
Así he dejado el codigo con tu aportación:
PHP:
<?php
/**
 * GiaPhuGroup Co., Ltd.
 *
 * NOTICE OF LICENSE
 *
 * This source file is subject to the GiaPhuGroup.com license that is
 * available through the world-wide-web at this URL:
 * https://www.giaphugroup.com/LICENSE.txt
 *
 * DISCLAIMER
 *
 * Do not edit or add to this file if you wish to upgrade this extension to newer
 * version in the future.
 *
 * @category    PHPCuong
 * @package     PHPCuong_HotDeals
 * @copyright   Copyright (c) 2018-2019 GiaPhuGroup Co., Ltd. All rights reserved. (http://www.giaphugroup.com/)
 * @license     https://www.giaphugroup.com/LICENSE.txt
 */

namespace PHPCuong\HotDeals\Model;

use Magento\Checkout\Model\ConfigProviderInterface;

class DefaultConfigProvider implements ConfigProviderInterface
{
    /**
     * @var \Magento\Catalog\Model\ResourceModel\Product\Collection
     */
    protected $productCollection;

    /**
     * @var \Magento\Catalog\Model\Category
     */
    protected $categoryFactory;

    /**
     * Store manager
     *
     * @var \Magento\Store\Model\StoreManagerInterface
     */
    protected $_storeManager;

    /**
     * Catalog product visibility
     *
     * @var \Magento\Catalog\Model\Product\Visibility
     */
    protected $productVisibility;

    /**
     * Catalog config
     *
     * @var \Magento\Catalog\Model\Config
     */
    protected $catalogConfig;

    /**
     * @var \Magento\Framework\Pricing\Helper\Data
     */
    protected $priceHelper;
    
    /**
     * @var \Magento\Directory\Model\ResourceModel\Country\CollectionFactory
     */
    
    protected $_countryCollectionFactory;

    /**
     * @param \Magento\Catalog\Model\ProductFactory $product
     * @param \Magento\Catalog\Model\CategoryFactory $categoryFactory
     * @param \Magento\Store\Model\StoreManagerInterface $storeManager
     * @param \Magento\Catalog\Model\Product\Visibility $productVisibility
     * @param \Magento\Catalog\Model\Config $catalogConfig
     * @param \Magento\Framework\Pricing\Helper\Data $priceHelper
     * @param \Magento\Directory\Model\ResourceModel\Country\CollectionFactory $_countryCollectionFactory
     */
    public function __construct(
        \Magento\Catalog\Model\ProductFactory $product,
        \Magento\Catalog\Model\CategoryFactory $categoryFactory,
        \Magento\Store\Model\StoreManagerInterface $storeManager,
        \Magento\Catalog\Model\Product\Visibility $productVisibility,
        \Magento\Catalog\Model\Config $catalogConfig,
        \Magento\Framework\Pricing\Helper\Data $priceHelper,
        \Magento\Directory\Model\ResourceModel\Country\CollectionFactory $countryCollectionFactory
    ) {
        $this->productCollection = $product;
        $this->categoryFactory = $categoryFactory;
        $this->_storeManager = $storeManager;
        $this->productVisibility = $productVisibility;
        $this->catalogConfig = $catalogConfig;
        $this->priceHelper = $priceHelper;
        $this->_countryCollectionFactory = $countryCollectionFactory;
    }


    /**get country**/


    public function getCountries()
    {
        $collection = $this->_countryCollectionFactory->create()->loadByStore();
        return $collection;
    }


    /**
     * {@inheritdoc}
     */
    public function getConfig()
    {
        $store = $this->_storeManager->getStore();
        $categoryId = 41;
        $category = $this->categoryFactory->create()->load($categoryId);
        $_products = $this->productCollection->create()->getCollection()
        ->setStoreId(
            $store->getId()
        )->addAttributeToSelect(
            $this->catalogConfig->getProductAttributes()
        )->addMinimalPrice()->addFinalPrice()->addTaxPercents()->addUrlRewrite(
            $categoryId
        )->addCategoryFilter(
            $category
        )->setVisibility(
            $this->productVisibility->getVisibleInCatalogIds()
        )->setCurPage(1)->setPageSize(10);

        $hotDealsProducts = [];
        foreach ($_products as $_product) {
            $hotDealsProducts[] = [
                'id' => $_product->getId(),
                'name' => $_product->getName(),
                'price' => $this->priceHelper->currency($_product->getFinalPrice(), true, false),
                'thumbnail' => $_product->getThumbnail()
            ];
        }

        return [
            'hot_deals_product' => $hotDealsProducts
        ];
    }
}
Y me ha salido esta excepcion:

1 exception(s):
Exception #0 (Magento\Framework\Exception\RuntimeException): Type Error occurred when creating object: PHPCuong\HotDeals\Model\DefaultConfigProvider

Exception #0 (Magento\Framework\Exception\RuntimeException): Type Error occurred when creating object: PHPCuong\HotDeals\Model\DefaultConfigProvider
<pre>#1 Magento\Framework\ObjectManager\Factory\Compiled->create() called at [vendor/magento/framework/ObjectManager/Factory/Compiled.php:150]....

</pre>
 

bravo_88

Miembro
Estoy viendo que hay un html que el que pinta las osas en pantalla:

HTML:
<li id="hot_deals" data-bind="fadeVisible: isVisible" class="hot_deals">
    <div class="step-title" data-bind="i18n: 'Hot Deals'" data-role="title"></div>
    <div id="checkout-step-title"
         class="step-content"
         data-role="content">
        <br/>
        <form data-bind="submit: addToCart" novalidate="novalidate" class="form">
            <div class="hot-deals" data-bind="foreach: getProductsList()">
                <p>
                    <input type="checkbox" name="product_id" data-bind="attr: {id: 'product_id_' +id, value: id}"/>
                    <label class="product-detail" data-bind="text: name + ' ' + price, attr: {for: 'product_id_' +id}"></label>
                </p>
            </div>
            <div class="actions-toolbar">
                <div class="primary">
                    <button data-role="opc-continue" type="submit" class="button action add-to-cart primary">
                        <span data-bind="i18n: 'Add to Cart'"></span>
                    </button>
                    <button data-role="opc-continue" type="button" class="button action continue primary" data-bind="click: navigateToNextStep">
                        <span data-bind="i18n: 'Skip & Next'"></span>
                    </button>
                </div>
            </div>
        </form>
    </div>
</li>
En el ejemplo que me descargue hace un foreach para todos los productos con getProductsList(), pero no se de donde lo coge. He probado llamando en ese lugar a getCountries() pero no funciona... algo se me escapa eso es obvio
 

Toni FactoriaDigital

Experto en Magento de Factoría Digital
Miembro del equipo
Hola bravo,

Desde un .html no podrás recoger datos si no tienes vinculado el modelo JS con el modelo de datos, puede que te ayude esta guía: Using JS Knockout in Magento 2 [Tips and Examples]

Desde un .phtml, deberás tenerlo declarado en el layout XML del tema o el módulo, por lo que desde ahí, habrás indicado que ese .phtml pertenece a un bloque en concreto de tu módulo. En ese bloque, es donde podrás poner la función que recoja los datos de getCountries(), ya sea llamando al modelo que adjuntas (seria lo ideal, de cara a POO) o bien incluyendo el código dentro del mismo bloque, para que desde el .phtml puedas hacer un:

$block->getCountries()

Y recibir los datos.

Al ser un paso del checkout, como te adelantaba anteriormente, vas a necesitar conocimientos de KnockoutJS para poder implementar lo que buscas. Puedes ayudarte de la guía e incluso de la propia documentación de KnockoutJS: Knockout : Introduction
Verás ejemplos en diversos módulos del core de Magento, que también pueden ayudarte a resolverlo.

Un saludo.
 
Arriba