1
0
mirror of synced 2024-11-21 20:46:06 +03:00

Merge pull request #18 from iyzoer/master

Выгрузка габаритов и веса в ICML
This commit is contained in:
Alex Lushpai 2019-01-16 10:36:27 +03:00 committed by GitHub
commit 6dd54014ae
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 155 additions and 5 deletions

View File

@ -59,7 +59,7 @@ class CustomersExport extends Command
* *
* @throws \Exception * @throws \Exception
* *
* @return boolean * @return int
*/ */
protected function execute(InputInterface $input, OutputInterface $output) protected function execute(InputInterface $input, OutputInterface $output)
{ {
@ -89,7 +89,7 @@ class CustomersExport extends Command
if (empty($customers)) { if (empty($customers)) {
$output->writeln('<comment>Customers not found</comment>'); $output->writeln('<comment>Customers not found</comment>');
return false; return 0;
} }
/** @var \Magento\Customer\Model\Customer $customer */ /** @var \Magento\Customer\Model\Customer $customer */
@ -112,6 +112,6 @@ class CustomersExport extends Command
$output->writeln('<info>Uploading customers finished</info>'); $output->writeln('<info>Uploading customers finished</info>');
return true; return 0;
} }
} }

View 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;
}
}

View File

@ -20,6 +20,8 @@ class Icml
private $searchCriteriaBuilder; private $searchCriteriaBuilder;
private $productRepository; private $productRepository;
const DIMENSION_FIELDS = ['height', 'length', 'width'];
public function __construct( public function __construct(
\Magento\Store\Model\StoreManagerInterface $manager, \Magento\Store\Model\StoreManagerInterface $manager,
\Magento\Catalog\Model\ResourceModel\Category\CollectionFactory $categoryCollectionFactory, \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'])) { if (!empty($offer['params'])) {
foreach ($offer['params'] as $param) { foreach ($offer['params'] as $param) {
$paramNode = $this->dd->createElement('param'); $paramNode = $this->dd->createElement('param');
@ -309,8 +325,16 @@ class Icml
$offer['vendor'] = $associatedProduct === null $offer['vendor'] = $associatedProduct === null
? $product->getAttributeText('manufacturer') ? $product->getAttributeText('manufacturer')
: $associatedProduct->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; return $offer;
} }
@ -333,8 +357,16 @@ class Icml
} }
$attributes = explode(',', $customAdditionalAttributes); $attributes = explode(',', $customAdditionalAttributes);
$dimensionsAttrs = [];
$dimensions = '';
foreach ($attributes as $attributeCode) { foreach ($attributes as $attributeCode) {
if ($this->checkDimension($attributeCode) !== false) {
$dimensionsAttrs += $this->checkDimension($attributeCode);
continue;
}
$attribute = $this->resourceModelProduct->getAttribute($attributeCode); $attribute = $this->resourceModelProduct->getAttribute($attributeCode);
$attributeValue = $associatedProduct $attributeValue = $associatedProduct
? $associatedProduct->getData($attributeCode) ? $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; 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;
}
} }

View File

@ -24,6 +24,7 @@ class Attribute implements \Magento\Framework\Option\ArrayInterface
'select', 'select',
'price' 'price'
]; ];
$attributes = $this->entityType->loadByCode('catalog_product')->getAttributeCollection(); $attributes = $this->entityType->loadByCode('catalog_product')->getAttributeCollection();
$attributes->addFieldToFilter('frontend_input', $types); $attributes->addFieldToFilter('frontend_input', $types);

View File

@ -13,6 +13,7 @@
<argument name="commands" xsi:type="array"> <argument name="commands" xsi:type="array">
<item name="orders_export_command" xsi:type="object">Retailcrm\Retailcrm\Console\Command\OrdersExport</item> <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="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> </argument>
</arguments> </arguments>
</type> </type>