Вычислить значение атрибута в индексаторе или cron?
Это мой наблюдатель и он обновляет мой пользовательский атрибут каждый раз, когда я сохраняю атрибуты в событии catalog_product_attribute_update_before.
namespace MyVendor\MyModule\Observer;
class TotalCalcScore implements \Magento\Framework\Event\ObserverInterface
{
protected $_product;
public function __construct(
\Magento\Catalog\Model\ProductFactory $product
) {
$this->_product = $product;
}
public function execute(
\Magento\Framework\Event\Observer $observer
)
{
$productIds = $observer->getProductIds();
foreach($productIds as $id){
$product = $this->_product->create()->load($id);
if($product->getId()){
// attribute_first_count
$value_offirst_count = $product->getattribute_first_count();
// attribute_second_count
$value_offsecond_score = $product->getattribute_second_count();
// attribute_calculated_count
$value_calculated_score = $product->getattribute_calculated_count();
// calculate
$value_calculated_score = $value_offsecond_score + $value_offirst_count
//save calculated value
//$product->setCalculatedValue($value_calculated_score);
//save to attribute_calculated_score
$product->setAttrCalculatedScore($value_calculated_score);
$product->save();
}
}
}
Но что мне делать, если я хочу перенести это в модель и запустить это как задание cron или индексацию? Или лучше запустить это перед индексацией, как наблюдатель. (но в таком случае мне нужна коллекция загрузки?)
ОБНОВЛЕНИЕ:
Я создал mview.xml и indexer.xml и это мой Model/Review/Indexer/Review.php но все еще не работает должным образом
class Review implements \Magento\Framework\Indexer\ActionInterface, \Magento\Framework\Mview\ActionInterface
{
/**
* Execute full indexation
*
* @return void
*/
public function executeFull()
{
// TODO: Implement executeFull() method.
}
/**
* Execute partial indexation by ID list
*
* @param int[] $ids
*
* @return void
*/
public function executeList(array $ids)
{
// TODO: Implement executeList() method.
}
/**
* Execute partial indexation by ID
*
* @param int $id
*
* @return void
*/
public function executeRow($id)
{
// TODO: Implement executeRow() method.
}
/**
* @var \Magento\Catalog\Api\Data\ProductInterfaceFactory
*/
private $productFactory;
/**
* @var \Magento\Catalog\Api\ProductRepositoryInterface
*/
private $productRepository;
/**
* MyClass constructor
*
* @param \Magento\Catalog\Api\Data\ProductInterfaceFactory $productFactory
* @param \Magento\Catalog\Api\ProductRepositoryInterface $productRepository
*/
protected $collectionFactory;
public function __construct(
\Magento\Framework\App\Action\Context $context,
\Magento\Catalog\Api\Data\ProductAttributeInterface $productAttribute,
\Magento\Catalog\Api\ProductRepositoryInterface $productRepository,
\Magento\Catalog\Model\ResourceModel\Product\CollectionFactory $collectionFactory
)
{
$this->productRepository = $productRepository;
$this->collectionFactory = $collectionFactory;
$this->collectionFactory = $productAttribute;
}
/**
* Execute materialization on ids entities
*
* @param int[] $ids
*
* @return void
* @api
*/
public function execute($ids)
{
// $post = $this->_postFactory->create();
// $collection = $post->getCollection();
// Use factory to create a new product collection
$productCollection = $this->collectionFactory->create();
// Apply filters here
$productCollection->addAttributeToSelect('*');
// Don't have to do this
$productCollection->load();
foreach($collection as $ids){
$productCollection->addAttributeToSelect('*');
// Don't have to do this
// $productCollection->load();
foreach ($productCollection as $product) {
// attribute_first_count
$value_offirst_count = $product->getattribute_first_count();
// attribute_second_count
$value_offsecond_score = $product->getattribute_second_count();
// attribute_calculated_count
$value_calculated_score = $product->getattribute_calculated_count();
// calculate
$value_calculated_score = $value_offsecond_score + $value_offirst_count
//save calculated value
//$product->setCalculatedValue($value_calculated_score);
//save to attribute_calculated_score
$product->setAttrCalculatedScore($value_calculated_score);
$product->save();
}
}
exit();
return $this->_pageFactory->create();
}
}
После переиндексации: индекс был успешно перестроен в 00:00:00 , но значение атрибута не изменилось
Может быть, мне следует добавить это как задание cron, и это выше не имеет никакого смысла?
1 answers
Я закончил, чтобы настроить это как задание cron. Я не уверен, что это правильный способ сделать это.
Я перенес свою функцию с наблюдателя на контроллер и изменил crontab.xml чтобы использовать этот контроллер.
<job name="custom_cronjob" instance="MyVendor\MyModule\Controller\Calc" method="execute">
<schedule>* * * * *</schedule>
</job>