Выгрузка габаритов и веса в ICML
This commit is contained in:
parent
23bfe5c6fb
commit
6e66eb3aea
@ -59,7 +59,7 @@ class CustomersExport extends Command
|
||||
*
|
||||
* @throws \Exception
|
||||
*
|
||||
* @return boolean
|
||||
* @return int
|
||||
*/
|
||||
protected function execute(InputInterface $input, OutputInterface $output)
|
||||
{
|
||||
@ -89,7 +89,7 @@ class CustomersExport extends Command
|
||||
if (empty($customers)) {
|
||||
$output->writeln('<comment>Customers not found</comment>');
|
||||
|
||||
return false;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/** @var \Magento\Customer\Model\Customer $customer */
|
||||
@ -112,6 +112,6 @@ class CustomersExport extends Command
|
||||
|
||||
$output->writeln('<info>Uploading customers finished</info>');
|
||||
|
||||
return true;
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
79
src/Console/Command/IcmlGenerate.php
Normal file
79
src/Console/Command/IcmlGenerate.php
Normal file
@ -0,0 +1,79 @@
|
||||
<?php
|
||||
|
||||
namespace Retailcrm\Retailcrm\Console\Command;
|
||||
|
||||
use Symfony\Component\Console\Command\Command;
|
||||
use Symfony\Component\Console\Input\InputInterface;
|
||||
use Symfony\Component\Console\Output\OutputInterface;
|
||||
use Symfony\Component\Console\Input\InputArgument;
|
||||
|
||||
class IcmlGenerate extends Command
|
||||
{
|
||||
private $icml;
|
||||
private $storeManager;
|
||||
private $appState;
|
||||
|
||||
public function __construct(
|
||||
\Retailcrm\Retailcrm\Model\Icml\Icml $icml,
|
||||
\Magento\Store\Model\StoreManagerInterface $storeManager,
|
||||
\Magento\Framework\App\State $appState
|
||||
) {
|
||||
$this->icml = $icml;
|
||||
$this->storeManager = $storeManager;
|
||||
$this->appState = $appState;
|
||||
|
||||
parent::__construct();
|
||||
}
|
||||
|
||||
protected function configure()
|
||||
{
|
||||
$this->setName('retailcrm:icml:generate')
|
||||
->setDescription('Generating ICML catalog in root directory')
|
||||
->addArgument('website', InputArgument::OPTIONAL, 'Website id');
|
||||
|
||||
parent::configure();
|
||||
}
|
||||
|
||||
/**
|
||||
* Generate ICML catalog
|
||||
*
|
||||
* @param InputInterface $input
|
||||
* @param OutputInterface $output
|
||||
*
|
||||
* @throws \Exception
|
||||
*
|
||||
* @return int
|
||||
*/
|
||||
protected function execute(InputInterface $input, OutputInterface $output)
|
||||
{
|
||||
$this->appState->setAreaCode(\Magento\Framework\App\Area::AREA_GLOBAL);
|
||||
|
||||
$arguments = $input->getArguments();
|
||||
$websites = [];
|
||||
|
||||
if (isset($arguments['website'])) {
|
||||
$websites[] = $this->storeManager->getWebsite($arguments['website']);
|
||||
} else {
|
||||
$websites = $this->storeManager->getWebsites();
|
||||
}
|
||||
|
||||
if (!$websites) {
|
||||
$output->writeln('<comment>Websites not found</comment>');
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
foreach ($websites as $website) {
|
||||
try {
|
||||
$this->icml->generate($website);
|
||||
} catch (\Exception $exception) {
|
||||
$output->writeln('<comment>' . $exception->getMessage() . '</comment>');
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
}
|
@ -20,6 +20,8 @@ class Icml
|
||||
private $searchCriteriaBuilder;
|
||||
private $productRepository;
|
||||
|
||||
const DIMENSION_FIELDS = ['height', 'length', 'width'];
|
||||
|
||||
public function __construct(
|
||||
\Magento\Store\Model\StoreManagerInterface $manager,
|
||||
\Magento\Catalog\Model\ResourceModel\Category\CollectionFactory $categoryCollectionFactory,
|
||||
@ -217,6 +219,20 @@ class Icml
|
||||
);
|
||||
}
|
||||
|
||||
if (!empty($offer['dimensions'])) {
|
||||
$e->appendChild($this->dd->createElement('dimensions'))
|
||||
->appendChild(
|
||||
$this->dd->createTextNode($offer['dimensions'])
|
||||
);
|
||||
}
|
||||
|
||||
if (!empty($offer['weight'])) {
|
||||
$e->appendChild($this->dd->createElement('weight'))
|
||||
->appendChild(
|
||||
$this->dd->createTextNode($offer['weight'])
|
||||
);
|
||||
}
|
||||
|
||||
if (!empty($offer['params'])) {
|
||||
foreach ($offer['params'] as $param) {
|
||||
$paramNode = $this->dd->createElement('param');
|
||||
@ -309,8 +325,16 @@ class Icml
|
||||
$offer['vendor'] = $associatedProduct === null
|
||||
? $product->getAttributeText('manufacturer')
|
||||
: $associatedProduct->getAttributeText('manufacturer');
|
||||
$offer['weight'] = $associatedProduct === null
|
||||
? $product->getWeight()
|
||||
: $associatedProduct->getWeight();
|
||||
|
||||
$offer['params'] = $this->getOfferParams($product, $customAdditionalAttributes, $associatedProduct);
|
||||
$params = $this->getOfferParams($product, $customAdditionalAttributes, $associatedProduct);
|
||||
|
||||
$offer['params'] = $params['params'];
|
||||
$offer['dimensions'] = $params['dimensions'];
|
||||
|
||||
unset($params);
|
||||
|
||||
return $offer;
|
||||
}
|
||||
@ -333,8 +357,16 @@ class Icml
|
||||
}
|
||||
|
||||
$attributes = explode(',', $customAdditionalAttributes);
|
||||
$dimensionsAttrs = [];
|
||||
$dimensions = '';
|
||||
|
||||
foreach ($attributes as $attributeCode) {
|
||||
if ($this->checkDimension($attributeCode) !== false) {
|
||||
$dimensionsAttrs += $this->checkDimension($attributeCode);
|
||||
|
||||
continue;
|
||||
}
|
||||
|
||||
$attribute = $this->resourceModelProduct->getAttribute($attributeCode);
|
||||
$attributeValue = $associatedProduct
|
||||
? $associatedProduct->getData($attributeCode)
|
||||
@ -350,7 +382,28 @@ class Icml
|
||||
}
|
||||
}
|
||||
|
||||
return $params;
|
||||
if ($dimensionsAttrs && count($dimensionsAttrs) == 3) {
|
||||
$length = $associatedProduct
|
||||
? $associatedProduct->getData($dimensionsAttrs['length'])
|
||||
: $product->getData($dimensionsAttrs['length']);
|
||||
$width = $associatedProduct
|
||||
? $associatedProduct->getData($dimensionsAttrs['width'])
|
||||
: $product->getData($dimensionsAttrs['width']);
|
||||
$height = $associatedProduct
|
||||
? $associatedProduct->getData($dimensionsAttrs['height'])
|
||||
: $product->getData($dimensionsAttrs['height']);
|
||||
|
||||
if ($length && $width && $height) {
|
||||
$dimensions = sprintf(
|
||||
'%s/%s/%s',
|
||||
$length,
|
||||
$width,
|
||||
$height
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
return ['params' => $params, 'dimensions' => $dimensions];
|
||||
}
|
||||
|
||||
/**
|
||||
@ -383,4 +436,20 @@ class Icml
|
||||
|
||||
return $quantity;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $attrCode
|
||||
*
|
||||
* @return mixed
|
||||
*/
|
||||
private function checkDimension($attrCode)
|
||||
{
|
||||
foreach (self::DIMENSION_FIELDS as $dimensionField) {
|
||||
if (mb_strpos($attrCode, $dimensionField) !== false) {
|
||||
return [$dimensionField => $attrCode];
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
@ -24,6 +24,7 @@ class Attribute implements \Magento\Framework\Option\ArrayInterface
|
||||
'select',
|
||||
'price'
|
||||
];
|
||||
|
||||
$attributes = $this->entityType->loadByCode('catalog_product')->getAttributeCollection();
|
||||
$attributes->addFieldToFilter('frontend_input', $types);
|
||||
|
||||
|
@ -13,6 +13,7 @@
|
||||
<argument name="commands" xsi:type="array">
|
||||
<item name="orders_export_command" xsi:type="object">Retailcrm\Retailcrm\Console\Command\OrdersExport</item>
|
||||
<item name="customers_export_command" xsi:type="object">Retailcrm\Retailcrm\Console\Command\CustomersExport</item>
|
||||
<item name="icml_generate_command" xsi:type="object">Retailcrm\Retailcrm\Console\Command\IcmlGenerate</item>
|
||||
</argument>
|
||||
</arguments>
|
||||
</type>
|
||||
|
Loading…
Reference in New Issue
Block a user