Craft Commerceで商品タイプ別に検索することは可能ですか?

私は、Craft Commerce Commerce_ProductModel
からすべての製品を取得するAPIを構築しています。ここでは、Element APIプラグインを使用して構築しています。私はCraft
2の最新バージョンを実行しています。

私はこれまでJSON APIを構築しており、以下のコードで必要なものを返しています:

'api/allproducts' => [
    'elementType' => 'Commerce_Product',
    'criteria' => [
        'search' => buildSearchQuery(craft()->request->getParam('types'))
    ],
    'transformer' => function(Commerce_ProductModel $product) {

        $mergedProductData = [];

        $title = $product->title;
        $url = UrlHelper::getUrl($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);

        $frontImage = $product->productImages[0];
        $frontImages = [];

        if ($frontImage)
        {
            craft()->config->set('generateTransformsBeforePageLoad', true);

            if (craft()->plugins->getPlugin('Imager'))
            {
                $transformedImages = craft()->imager->transformImage(
                    $frontImage,
                    array(
                        array(
                            'width' => 1170,
                        ),
                        array(
                            'width' => 780,
                            'jpegQuality' => 65,
                        ),
                        array(
                            'width' => 390,
                            'jpegQuality' => 65,
                        ),
                    ),
                    array(
                        'ratio' => 16/9,
                        'position' => 'bottom-right',
                        'jpegQuality' => 80,
                    ),
                    array(
                        'fillTransforms' => true,
                    )
                );

                $frontImages[] = craft()->imager->srcset($transformedImages);

            } else {
                $frontImages[] = $frontImage->getUrl(['width' => 390, 'height' => 294]);
            }
        }

        $mergedProductData[] = [
            'id' => $product->id,
            'title' => $title,
            'productImage' => $frontImages,
            'body' => (string) $product->body,
            'brand' => $brand,
            'designer' => $designer,
            'url' => $url
        ];

        return [
            'title' => $title,
            'id' => $product->id,
            'frontImage' => $frontImages,
            'type' => $product->type->name,
            'designer' => $designer,
            'brand' => $brand,
            'price' => $price,
            'url' => $url,
            'isInWishlist' => craft()->like->isLike($product->id),
            'quickViewJson' => $mergedProductData
        ];
    },
],

これは素晴らしいもので、私が必要としているものは何も返すことはありませんが、
Commerce_ProductModel
という製品タイプを探し出し、それを把握することで検索値を返そうとしています。

私が理想的にしたいのは、次のようなURLクエリを実行することです:

/api/allproducts?types[]=New&types[]=Tables

上記のコードでは、上のURLのようなクエリを作成できる別の開発者から与えられたこの関数があります。

buildSearchQuery(craft()->request->getParam('types'))

これで、Craft
Commerceの製品タイプを照会できるようにしたいので、これらのタイプの製品のみを返します。この機能は以下の通りです:

function buildSearchQuery($input) {

    $query = "";
    $i = 0;

    foreach ($input as $value) {

        if($i > 0) {
            $query .= " OR ";
        }

        $query .= "title:*$value* OR body:*$value*";
        $i++;
    }

    return $query;
}

どのようにしてこれをやり遂げることができるのか誰にも分かりますか?

ベストアンサー

商品は、商品タイプ type (ハンドルまたはProductTypeModel)またはタイプIDで
typeId によって照会できます。

テンプレートの場合、次のようになります。

craft.commerce.products.typeId([1,3,4]).find()

または

craft.commerce.products.type(['new','another']).find()

This is as per the parameter value syntax: https://craftcms.com/docs/templating/elementcriteriamodel#parameter-value-syntax

したがって、PHPの要素基準クエリ構文では、次のようになります。

'criteria' => [
  'type' => ['New','Another']
],

または

'criteria' => [
  'typeId' => [1,2]
],

または

'criteria' => [
  'type' => craft()->commerce_productTypes->getAllProductTypes()[0]
],

The example you can was to build a query string fまたは the search
element criteria param, which could optionally be another criteria
if you wanted.

返信を残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です