Añadir Un paso en e...
 
Avisos
Vaciar todo

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

6 Respuestas
2 Usuarios
0 Me gustas
653 Visitas
(@bravo_88)
Respuestas: 78
Estimable Member
Topic starter
 

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!

Attached files

 
Respondido : 04/03/2020 11:16 am
Toni FactoriaDigital
(@toni-factoriadigital)
Respuestas: 358
Illustrious Member Moderator
 

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:

[CODE=php]protected $_countryCollectionFactory;

public function __construct(
...
MagentoDirectoryModelResourceModelCountryCollectionFactory $countryCollectionFactory,
...
) {
...
$this->_countryCollectionFactory = $countryCollectionFactory;
...
}[/code]

Hecho esto, podrás hacer una función desde la cual podrás recoger los valores luego en la plantilla:

[CODE=php]public function getCountries()
{
$collection = $this->_countryCollectionFactory->create()->loadByStore();
return $collection;
}[/code]

Después, en la plantilla asignada a ese bloque, podrás recoger esa colección así:

[CODE=php]$block->getCountries();[/code]

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.

Experto en Magento de FactoriaDigital
Prueba 1 mes gratis nuestro Hosting Magento

 
Respondido : 04/03/2020 11:35 am
(@bravo_88)
Respuestas: 78
Estimable Member
Topic starter
 

Muchas gracias!! Probaré a ver!

 
Respondido : 04/03/2020 11:51 am
(@bravo_88)
Respuestas: 78
Estimable Member
Topic starter
 

Así he dejado el codigo con tu aportación:
[CODE=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:
*

*
* 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

*/

namespace PHPCuongHotDealsModel;

use MagentoCheckoutModelConfigProviderInterface;

class DefaultConfigProvider implements ConfigProviderInterface
{
/**
* @var MagentoCatalogModelResourceModelProductCollection
*/
protected $productCollection;

/**
* @var MagentoCatalogModelCategory
*/
protected $categoryFactory;

/**
* Store manager
*
* @var MagentoStoreModelStoreManagerInterface
*/
protected $_storeManager;

/**
* Catalog product visibility
*
* @var MagentoCatalogModelProductVisibility
*/
protected $productVisibility;

/**
* Catalog config
*
* @var MagentoCatalogModelConfig
*/
protected $catalogConfig;

/**
* @var MagentoFrameworkPricingHelperData
*/
protected $priceHelper;

/**
* @var MagentoDirectoryModelResourceModelCountryCollectionFactory
*/

protected $_countryCollectionFactory;

/**
* @param MagentoCatalogModelProductFactory $product
* @param MagentoCatalogModelCategoryFactory $categoryFactory
* @param MagentoStoreModelStoreManagerInterface $storeManager
* @param MagentoCatalogModelProductVisibility $productVisibility
* @param MagentoCatalogModelConfig $catalogConfig
* @param MagentoFrameworkPricingHelperData $priceHelper
* @param MagentoDirectoryModelResourceModelCountryCollectionFactory $_countryCollectionFactory
*/
public function __construct(
MagentoCatalogModelProductFactory $product,
MagentoCatalogModelCategoryFactory $categoryFactory,
MagentoStoreModelStoreManagerInterface $storeManager,
MagentoCatalogModelProductVisibility $productVisibility,
MagentoCatalogModelConfig $catalogConfig,
MagentoFrameworkPricingHelperData $priceHelper,
MagentoDirectoryModelResourceModelCountryCollectionFactory $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
];
}
}
[/code]

Y me ha salido esta excepcion:

1 exception(s):
Exception #0 (MagentoFrameworkExceptionRuntimeException): Type Error occurred when creating object: PHPCuongHotDealsModelDefaultConfigProvider

Exception #0 (MagentoFrameworkExceptionRuntimeException): Type Error occurred when creating object: PHPCuongHotDealsModelDefaultConfigProvider
<pre>#1 MagentoFrameworkObjectManagerFactoryCompiled->create() called at [vendor/magento/framework/ObjectManager/Factory/Compiled.php:150]....

</pre>

 
Respondido : 04/03/2020 12:14 pm
(@bravo_88)
Respuestas: 78
Estimable Member
Topic starter
 

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

[CODE=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>
[/code]

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

 
Respondido : 04/03/2020 2:36 pm
Toni FactoriaDigital
(@toni-factoriadigital)
Respuestas: 358
Illustrious Member Moderator
 

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:

[ICODE]$block->getCountries() [/ICODE]

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.

Experto en Magento de FactoriaDigital
Prueba 1 mes gratis nuestro Hosting Magento

 
Respondido : 06/03/2020 4:54 pm