SmartWeb Feed

Create a new Prisindex and use the following code in the different feeds, to create the product-feed. This will generate a link with the product feed, which can be used in the importer.

Feed Start Template

{* Image size *}
{$imageWidth = 282}
{$imageHeight = 282}

{* Thumbnail size *}
{$thumbnailWidth = 60}
{$thumbnailHeight = 60}

{* Is price including vat - set via query price_including_vat=true/false - default: true *}
{$priceIncludingVat = true}

{if isset($smarty.get.price_including_vat)}
    {$priceIncludingVat = ($smarty.get.price_including_vat eq "true")}
{/if}

{* Include out of stock products - set via query include_out_of_stock=true/false - default: false *}
{$includeOutOfStock = (isset($smarty.get.include_out_of_stock) && $smarty.get.include_out_of_stock eq "true")}

{* Instantiate controllers *}
{controller assign=productController type=product}
{controller assign=brandController type=user}
{controller assign=variantController type=productVariant}
{controller assign=priceController type=productPrice}
{controller assign=cartController type=cart}

{$productPageLink = PageController::link($page.productPageId)}

{* Set date variable (now + 1 month in Y-m-d format) *}
{assign date {date('Y-m-d', strtotime("+1 months", strtotime("NOW")))}}

{collection controller=productCategory assign=categories}

{$productLink = {page id=$page.productPageId print=Link}}

{function name=renderCategories}
    {foreach $items->getData() as $item}
        {collection controller=productCategory assign=subCategories parentId=$item->Id}

        <span class="clerk-category-info"
            data-id="{$item->Id}"
            data-name="{$item->Title|unescape:"htmlall"|clearText}"
            data-url="/{$productLink}/{$item->Handle}/"
            data-subcategories="[{if $subCategories}{foreach $subCategories->getData() as $category}{$category->Id}{if not $category@last}, {/if}{/foreach}{/if}]">
        </span>

        {call name=renderCategories items=$subCategories}
    {/foreach}
{/function}

{call renderCategories items=$categories}

Feed Item Template

{* Determine if product is sold out *}
{$soldout = ($product->Soldout and !$product->AllowOutOfStockPurchase)}

{if !$soldout || $includeOutOfStock}
    {* Load variants of the product *}
    {collection assign=variants controller=$variantController productId=$product->Id variantId=$product->VariantIds}
    {assign variants $variants->getData()}
    
    {* Fetch the brand of the product *}
    {entity assign=brand controller=$brandController id=$product->ProducerId}
    
    {* Fetch the variant types of the product *}
    {collection assign=variantTypes controller=$variantTypeController productId=$product->Id}
    
    {* Fetch the picture of the product *}
    {*assign productPicture {picturePath productId=$product->Id}*}
    {entity assign=image controller=files type=shop productId=$product->Id}

    {if $image}
        {$crop = "fill"}

        {if !empty($template.settings.DESIGN_IMAGE_BACKGROUND_COLOR)}
            {$crop = $template.settings.DESIGN_IMAGE_BACKGROUND_COLOR}
        {/if}

        {$thumbnailPath = $image->thumbnail($thumbnailWidth, $thumbnailHeight, $crop)}
        {$imagePath = $image->thumbnail($imageWidth, $imageHeight, $crop)}
    {else}
        {placeholdImage assign=placeholder width=$thumbnailWidth height=$thumbnailHeight background=$template.settings.DESIGN_IMAGE_BACKGROUND_COLOR color=$template.settings.FONT_COLOR_PRIMARY text=$text.IMAGE_PLACEHOLDER_TEXT}

        {$thumbnailPath = $placeholder->getRelativeFile()}

        {placeholdImage assign=placeholder width=$imageWidth height=$imageHeight background=$template.settings.DESIGN_IMAGE_BACKGROUND_COLOR color=$template.settings.FONT_COLOR_PRIMARY text=$text.IMAGE_PLACEHOLDER_TEXT}

        {$imagePath = $placeholder->getRelativeFile()}
    {/if}
    
    {* Fetch the short description of the product *}
    {assign productDescription $productController->getDescriptionShort($product->Id)}
    
    {* If blank, fetch the list description of the product *}
    {if empty($productDescription)}
        {assign productDescription $productController->getDescriptionList($product->Id)}
    {/if}
    
    {* If blank, fetch the long description of the product *}
    {if empty($productDescription)}
        {assign productDescription $productController->getDescription($product->Id)}
    {/if}
    
    {* Trim the description to a max length of 5000 characters *}
    {$productDescription = $productDescription|strip_tags|unescape:"htmlall"|trimTo:5000}
    
    {* Fetch the category path of the product *}
    {assign categoryPathTitle {categoryTitlePath product=$product separator=" > "}}
    
    {* Convert product age from seconds to days *}
    {$ageInDays = ($product->Age / 60 / 60 / 24)|string_format:"%.1f"}

    <span class="clerk-product-info"
    
        {* Title *}
        data-name="{$product->Title|escape:"htmlall"|clearText}"
    
        {* Link URI *}
        data-url="{itemLink product=$product}"
    
        {* Product id *}
        data-id="{$product->Id}"
    
        {* Description *}
        data-description="{$productDescription|clearText}"
        
        {* Use SEO keywords for extra searchable keywords *}
        data-keywords="{$productController->getTranslation($product->Id, 'seo_keywords')|lower|escape:"htmlall"|clearText}"
    
        {* Image *}
        data-image="{$imagePath|solutionPath}"

        {* Thumbnail *}
        data-thumbnail="{$thumbnailPath|solutionPath}"
        
        {* Item number *}
        data-sku="{$product->ItemNumber|toUTF8}"

        {* Fetch the price line of the product *}
        {entity assign=priceLine controller=$priceController productId=$product->Id}
    
        {* Fetch the stock status text of the product *}
        {$stockStatusText = {stockStatusText product=$product inStockText='in stock' notInStockText='out of stock'}}
    
        {* Prices *}
        {assign price $priceLine->PriceMinWithVat}
        
        {if !$priceIncludingVat}
            {assign price $priceLine->PriceMinWithoutVat}
        {/if}
        
        {* Selling price *}
        data-price="{$price}"
    
        {* Selling price - Formatted with language specific currency iso *}
        data-pformatted="{$price|formatPrice}"
    
        {$onSale = ($priceLine->PriceMinWithVat < $priceLine->FullPriceMinWithVat)}
    
        {* If the product is discounted we set the normal price as list price *}
        {if $onSale}
            {assign listPrice $priceLine->FullPriceMinWithVat}
        
            {if !$priceIncludingVat}
                {assign listPrice $priceLine->FullPriceMinWithoutVat}
            {/if}
    
            {* Normal price *}
            data-list-price="{$listPrice}"
            
            {* Normal price - Formatted with language specific currency iso *}
            data-lpformatted="{$listPrice|formatPrice}"
        {/if}
        
        data-on-sale="{if $onSale}true{else}false{/if}"
        data-in-stock="{if !$soldout}true{else}false{/if}"

        {* Product age *}
        data-age="{$ageInDays}"

        {* If the product is newer than 30 days, we consider it as new *}
        {if $ageInDays lt 30}
            data-new="true"
        {/if}
    
        {* Brand *}
        {if !empty($brand->Title)}
            {$brandLink = "{$productPageLink}?brand={$brand->Id}-{$brand->Title|formatLink}"}

            data-brand="{$brand->Title|escape:"htmlall"|clearText}"
            data-brand-url="{$brandLink}"
        {/if}
            
        {* If the product has variants *}
        {if $variants}
            data-variants-sku="[
                {foreach $variants as $variant}
                    {if !empty($variant->ItemNumber)}
                        '{$variant->ItemNumber}'{if !$variant@last},{/if}
                    {/if}

                {/foreach}
                ]"
            data-variants-name="[
                {foreach $variants as $variant}
                    '{assign variantTitle {variantTitle productId=$product->Id variantId=$variant->Id}}{$variantTitle|escape:"htmlall"|clearText}'{if !$variant@last},{/if}
                {/foreach}
                ]"
        {/if}
    
        {* Categories *}
        data-categories="[
            {$product->CategoryId}
                {if $product->SecondaryCategoryIds}
                    {foreach $product->SecondaryCategoryIds as $productCategory}
                        , {$productCategory}
                    {/foreach}
                {/if}
            ]">
    </span>
{/if}