I have been trying to index to algolia and I ran across the issue below.
./craft scout/index/import
Adding elements from index allProductData.[> ] 0% (0/1108) ETA: n/aException 'yii\base\UnknownPropertyException' with message 'Getting unknown property: craft\elements\db\CategoryQuery::0'
in /vol/site/build.20190820-172247-344c9d6a/vendor/yiisoft/yii2/base/Component.php:154
Stack trace:
#0 /vol/site/build.20190820-172247-344c9d6a/vendor/craftcms/cms/src/elements/db/ElementQuery.php(491): yii\base\Component->__get(0)
#1 /vol/site/build.20190820-172247-344c9d6a/vendor/craftcms/cms/src/elements/db/ElementQuery.php(597): craft\elements\db\ElementQuery->__get(0)
#2 /vol/site/build.20190820-172247-344c9d6a/config/scout.php(59): craft\elements\db\ElementQuery->offsetGet(0)
#3 [internal function]: craft\services\Config->{closure}(Object(craft\commerce\elements\Product))
#4 /vol/site/build.20190820-172247-344c9d6a/vendor/league/fractal/src/Scope.php(373): call_user_func(Object(Closure), Object(craft\commerce\elements\Product))
#5 /vol/site/build.20190820-172247-344c9d6a/vendor/league/fractal/src/Scope.php(315): League\Fractal\Scope->fireTransformer(Object(Closure), Object(craft\commerce\elements\Product))
#6 /vol/site/build.20190820-172247-344c9d6a/vendor/league/fractal/src/Scope.php(234): League\Fractal\Scope->executeResourceTransformers()
#7 /vol/site/build.20190820-172247-344c9d6a/vendor/rias/craft-scout/src/models/AlgoliaIndex.php(108): League\Fractal\Scope->toArray()
#8 /vol/site/build.20190820-172247-344c9d6a/vendor/rias/craft-scout/src/models/AlgoliaIndex.php(159): rias\scout\models\AlgoliaIndex->transformElement(Object(craft\commerce\elements\Product))
#9 /vol/site/build.20190820-172247-344c9d6a/vendor/rias/craft-scout/src/models/AlgoliaIndex.php(127): rias\scout\models\AlgoliaIndex->indexElement(Object(craft\commerce\elements\Product))
#10 /vol/site/build.20190820-172247-344c9d6a/vendor/rias/craft-scout/src/console/controllers/Scout/IndexController.php(91): rias\scout\models\AlgoliaIndex->indexElements(Array)
#11 [internal function]: rias\scout\console\controllers\scout\IndexController->actionImport('')
#12 /vol/site/build.20190820-172247-344c9d6a/vendor/yiisoft/yii2/base/InlineAction.php(57): call_user_func_array(Array, Array)
#13 /vol/site/build.20190820-172247-344c9d6a/vendor/yiisoft/yii2/base/Controller.php(157): yii\base\InlineAction->runWithParams(Array)
#14 /vol/site/build.20190820-172247-344c9d6a/vendor/yiisoft/yii2/console/Controller.php(148): yii\base\Controller->runAction('import', Array)
#15 /vol/site/build.20190820-172247-344c9d6a/vendor/yiisoft/yii2/base/Module.php(528): yii\console\Controller->runAction('import', Array)
#16 /vol/site/build.20190820-172247-344c9d6a/vendor/yiisoft/yii2/console/Application.php(180): yii\base\Module->runAction('scout/index/imp...', Array)
#17 /vol/site/build.20190820-172247-344c9d6a/vendor/craftcms/cms/src/console/Application.php(93): yii\console\Application->runAction('scout/index/imp...', Array)
#18 /vol/site/build.20190820-172247-344c9d6a/vendor/yiisoft/yii2/console/Application.php(147): craft\console\Application->runAction('scout/index/imp...', Array)
#19 /vol/site/build.20190820-172247-344c9d6a/vendor/yiisoft/yii2/base/Application.php(386): yii\console\Application->handleRequest(Object(craft\console\Request))
#20 /vol/site/build.20190820-172247-344c9d6a/craft(22): yii\base\Application->run()
#21 {main}
I am running stable craft 3 and commerce 2. Below is my scout config file:
<?php
use Craft;
use craft\i18n\Locale;
use craft\elements\Entry;
use craft\commerce\base\Model;
use craft\commerce\models\LineItem;
use craft\commerce\base\Purchasable;
use craft\commerce\base\PurchasableInterface;
use craft\commerce\elements\Order;
use craft\commerce\events\LineItemEvent;
use craft\commerce\elements\Product;
use craft\commerce\models\ProductType as Type;
use craft\commerce\elements\Variant;
use craft\commerce\models\PaymentCurrency;
use craft\commerce\models\TaxRate;
use craft\commerce\controllers\TaxRatesController as TaxRates;
use craft\commerce\Plugin as Commerce;
use craft\helpers\UrlHelper;
use superbig\imgix\Imgix;
use craft\elements\Asset;
use craft\elements\Category;
use craft\elements\GlobalSet;
use craft\elements\MatrixBlock;
use craft\elements\Tag;
use craft\elements\User;
return [
"sync" => true,
'connect_timeout' => 4,
"application_id" => "NHF40KMICV",
"admin_api_key" => "97545c7b55bc08bf3600a5bb9f4c6ce5",
"mappings" => [
[
'indexName' => 'allProductData',
'elementType' => Product::class,
'criteria' => [
'type' => craft\commerce\Plugin::getInstance()->getProductTypes()
],
'transformer' => function (Product $product) {
$paymentCurrency = PaymentCurrency::class;
$title = $product->title;
$url = $product->url;
$brand = (string)$product->productBrand[0];
$designer = (string)$product->productDesigner[0];
$num_decimals = (intval($product->defaultVariant->price) == $product->defaultVariant->price) ? 0 :2;
$price = number_format($product->defaultVariant->price,$num_decimals);
$primaryCurrency = Commerce::getInstance()->getPaymentCurrencies()->getPrimaryPaymentCurrency();
$currency = Commerce::getInstance()->getPaymentCurrencies()->getPrimaryPaymentCurrencyIso();
$currencySymbol = Craft::$app->getLocale()->getCurrencySymbol($currency);
$variants = $product->variants;
if(!empty($product->productImages->first())){
$frontImage = $product->productImages->first();
} else {
$frontImage = $product->defaultVariant->productImages->first();
}
$fm = Imgix::$plugin->imgixService->transformImage( $frontImage, [ 'width' => 500 ], ['lossless' => 0,'auto' => 'compress','fm' => 'jpg']);
$body = strip_tags((string) $product->body, '<strong><em><br>');
$totalPrice = $currencySymbol.$price;
$related = array(
'targetElement' => $product,
'field' => 'productBlock.product'
);
$typesCriteria = Entry::find()
->section('products')
->relatedTo($related);
$types = array_map(function($el) {
return [
'title' => $el->title,
'id' => $el->id,
'level' => $el->level,
];
}, $typesCriteria->all());
$typesByLevel = [];
foreach ($types as $type) {
$typesByLevel['types.level' . $type['level']][] = $type;
}
$variantAmount = count($variants);
return array_merge([
'title' => $title,
'id' => $product->id,
'frontImage' => $fm,
'type' => $product->type->name,
'types' => $types,
'designer' => $designer,
'brand' => $brand,
'price' => $totalPrice,
'productPrice' => (int)$product->defaultVariant->price,
'material' => $product->variantMaterials[0]->title,
'url' => $url,
'variants' => $variantAmount
], $typesByLevel);
},
],
[
'indexName' => 'allSiteData',
'elementType' => Product::class,
'criteria' => [
'type' => craft\commerce\Plugin::getInstance()->getProductTypes()
],
'transformer' => function (Product $product) {
$paymentCurrency = PaymentCurrency::class;
$title = $product->title;
$url = $product->url;
$brand = (string)$product->productBrand[0];
$designer = (string)$product->productDesigner[0];
$num_decimals = (intval($product->defaultVariant->price) == $product->defaultVariant->price) ? 0 :2;
$price = number_format($product->defaultVariant->price,$num_decimals);
$primaryCurrency = Commerce::getInstance()->getPaymentCurrencies()->getPrimaryPaymentCurrency();
$currency = Commerce::getInstance()->getPaymentCurrencies()->getPrimaryPaymentCurrencyIso();
$currencySymbol = Craft::$app->getLocale()->getCurrencySymbol($currency);
$variants = $product->variants;
if(!empty($product->productImages->first())){
$frontImage = $product->productImages->first();
} else {
$frontImage = $product->defaultVariant->productImages->first();
}
$fm = Imgix::$plugin->imgixService->transformImage( $frontImage, [ 'width' => 500 ], ['lossless' => 0,'auto' => 'compress','fm' => 'jpg']);
$body = strip_tags((string) $product->body, '<strong><em><br>');
$totalPrice = $currencySymbol.$price;
$related = array(
'targetElement' => $product,
'field' => 'productBlock.product'
);
$typesCriteria = Entry::find()
->section('products')
->relatedTo($related);
$types = array_map(function($el) {
return [
'title' => $el->title,
'id' => $el->id,
'level' => $el->level,
];
}, $typesCriteria->all());
$typesByLevel = [];
foreach ($types as $type) {
$typesByLevel['types.level' . $type['level']][] = $type;
}
$variantAmount = count($variants);
return array_merge([
'title' => $title,
'id' => $product->id,
'frontImage' => $fm,
'type' => $product->type->name,
'types' => $types,
'designer' => $designer,
'brand' => $brand,
'price' => $totalPrice,
'productPrice' => (int)$product->defaultVariant->price,
'material' => $product->variantMaterials[0]->title,
'url' => $url,
'variants' => $variantAmount
], $typesByLevel);
},
],
[
'indexName' => 'allSiteData',
'elementType' => Entry::class,
'criteria' => [
'section' => ['journal']
],
'transformer' => function(craft\base\Element $element) {
$frontImage = $element->catalogueGridImage[0];
$fm = '';
if(!empty($frontImage)){
$image = Imgix::$plugin->imgixService->transformImage( $frontImage, ['lossless' => 0,'auto' => 'compress','fm' => 'jpg']);
$fm = $image->url;
} else {
$fm = '/images/filler.jpg';
}
return [
'title' => $element->title,
'url' => $element->url,
'frontImage' => $fm,
];
},
],
[
'indexName' => 'allSiteData',
'elementType' => Entry::class,
'criteria' => [
'section' => ['products']
],
'transformer' => function(craft\base\Element $element) {
$frontImage = $element->catalogueGridImage[0];
$fm = '';
if(!empty($frontImage)){
$image = Imgix::$plugin->imgixService->transformImage( $frontImage, ['lossless' => 0,'auto' => 'compress','fm' => 'jpg']);
$fm = $image->url;
} else {
$fm = '/images/filler.jpg';
}
return [
'title' => $element->title,
'url' => $element->url,
'frontImage' => $fm,
];
},
],
[
'indexName' => 'allSiteData',
'elementType' => Entry::class,
'criteria' => [
'section' => ['products']
],
'transformer' => function(craft\base\Element $element) {
$frontImage = $element->catalogueGridImage[0];
$fm = '';
if(!empty($frontImage)){
$image = Imgix::$plugin->imgixService->transformImage( $frontImage, ['lossless' => 0,'auto' => 'compress','fm' => 'jpg']);
$fm = $image->url;
} else {
$fm = '/images/filler.jpg';
}
return [
'title' => $element->title,
'url' => $element->url,
'frontImage' => $fm,
];
},
],
[
'indexName' => 'allSiteData',
'elementType' => Category::class,
'criteria' => [
'group' => ['brands']
],
'transformer' => function(craft\base\Element $element) {
if($element->group->name == 'Brands'){
$frontImage = $element->photo[0];
$fm = '';
if(!empty($frontImage)){
$image = Imgix::$plugin->imgixService->transformImage( $frontImage, ['lossless' => 0,'auto' => 'compress','fm' => 'jpg']);
$fm = $image->url;
} else {
$fm = '/images/filler.jpg';
}
return [
'title' => $element->title,
'url' => $element->url,
'frontImage' => $fm,
];
}
},
],
[
'indexName' => 'allSiteData',
'elementType' => Category::class,
'criteria' => [
'group' => ['designers']
],
'transformer' => function(craft\base\Element $element) {
if($element->group->name == 'Designers'){
return [
'title' => $element->title,
'url' => $element->url,
];
}
},
],
[
'indexName' => 'allDesigners',
'elementType' => Category::class,
'criteria' => [
'group' => ['designers']
],
'transformer' => function(craft\base\Element $element) {
if($element->group->name == 'Designers'){
return [
'title' => $element->title,
'url' => $element->url,
];
}
},
],
[
'indexName' => 'allBrands',
'elementType' => Category::class,
'criteria' => [
'group' => ['brands']
],
'transformer' => function(craft\base\Element $element) {
if($element->group->name == 'Brands'){
$frontImage = $element->photo[0];
$fm = '';
if(!empty($frontImage)){
$image = Imgix::$plugin->imgixService->transformImage( $frontImage, ['lossless' => 0,'auto' => 'compress','fm' => 'jpg']);
$fm = $image->url;
} else {
$fm = '/images/filler.jpg';
}
return [
'title' => $element->title,
'url' => $element->url,
'frontImage' => $fm ?? null,
];
}
},
],
[
'indexName' => 'allProducts',
'elementType' => Product::class,
'criteria' => [
'type' => craft\commerce\Plugin::getInstance()->getProductTypes()
],
'transformer' => function (Product $product) {
$paymentCurrency = PaymentCurrency::class;
$title = $product->title;
$url = $product->url;
$brand = (string)$product->productBrand[0];
$designer = (string)$product->productDesigner[0];
$num_decimals = (intval($product->defaultVariant->price) == $product->defaultVariant->price) ? 0 :2;
$price = number_format($product->defaultVariant->price,$num_decimals);
$primaryCurrency = Commerce::getInstance()->getPaymentCurrencies()->getPrimaryPaymentCurrency();
$currency = Commerce::getInstance()->getPaymentCurrencies()->getPrimaryPaymentCurrencyIso();
$currencySymbol = Craft::$app->getLocale()->getCurrencySymbol($currency);
$variants = $product->variants;
if(!empty($product->productImages->one())){
$frontImage = $product->productImages->one();
} else {
$frontImage = $product->defaultVariant->productImages->one();
}
$fm = Imgix::$plugin->imgixService->transformImage( $frontImage, [ 'width' => 500 ], ['lossless' => 0,'auto' => 'compress','fm' => 'jpg']);
$body = strip_tags((string) $product->body, '<strong><em><br>');
$totalPrice = $currencySymbol.$price;
$related = array(
'targetElement' => $product,
'field' => 'productBlock.product'
);
$typesCriteria = Entry::find()
->section('products')
->relatedTo($related);
$types = array_map(function($el) {
return [
'title' => $el->title,
'id' => $el->id,
'level' => $el->level,
];
}, $typesCriteria->all());
$typesByLevel = [];
foreach ($types as $type) {
$typesByLevel['types.level' . $type['level']][] = $type;
}
$variantAmount = count($variants);
$postDate = date('Ymd', strtotime($product->postDate->getTimestamp() * 1000));
$rates = craft\commerce\Plugin::getInstance()->getTaxRates();
$allRates = $rates->getAllTaxRates();
$rateAmount = '';
foreach ($allRates as $rate) {
$rateAmount = $rate->rate;
$taxAmount = number_format($rateAmount,2);
$rateTrimmed = ltrim($taxAmount,"0.");
$rateAmount = $rateTrimmed;
}
$percentRounded = round($product->defaultVariant->price,3,PHP_ROUND_HALF_UP);
$percent = ($percentRounded/100)*$rateAmount;
$incVat = $product->defaultVariant->price + $percent;
$total = number_format($incVat);
// not sale price
$totalPrice = $currencySymbol.$total;
if(!empty($product->productBrand->one()->discountPercent) && $product->productBrand->one()->hasDiscount == true){
$discountPercent = $product->productBrand->one()->discountPercent;
$salePercent = (($incVat)/100)*$discountPercent;
$salePrice = $incVat - $salePercent;
$salePriceRound = number_format($salePrice);
$salePriceFinal = $currencySymbol.$salePriceRound;
}
return array_merge([
'title' => $title,
'id' => $product->id,
'dateAdded' => (int)date($postDate),
'frontImage' => $fm ?? null,
'type' => $product->type->name,
'types' => $types,
'designer' => $designer,
'brand' => $brand,
'price' => $totalPrice,
'salePrice' => $salePriceFinal ?? null,
'productPrice' => $incVat,
'material' => $product->variantMaterials[0]->title,
'colour' => $product->variantColor[0]->title ?? null,
'productionTime' => $product->dispatchTimes[0]->title ?? null,
'url' => $url,
'variants' => $variantAmount
], $typesByLevel);
},
],
]
];