Smartweb

Sync Data

Opsætning af en datafeed #

Bemærk: Denne datafeed fra Smartweb/HostedShop er forældet. Det betyder, at vi tilbyder begrænset support for dette. Vi anbefaler stærkt, at du skifter til Smartweb/HostedShop’s SOAP API datafeed.

  1. I SmartWeb Admin går du til Kontrolpanel->Prisindeks

  2. Opret et nyt Prisindex ved at klikke på Opret Eget Prisindeks i øverste højre hjørne.

  3. Giv det navnet Clerk.

  4. Brug følgende kode til at oprette Data Feed. Dette vil generere et link med produktfeedet, som kan bruges i HTML Annotations importøren på my.clerk.io.

Indsæt i Feed Start Skabelon #

{* Billedstørrelse *}
{$imageWidth = 293}
{$imageHeight = 293}

{* Miniature størrelse *}
{$thumbnailWidth = 60}
{$thumbnailHeight = 60}

{* Er prisen inklusive moms - indstil via forespørgsel price_including_vat=true/false - standard: true *}
{$priceIncludingVat = true}

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

{* Inkluder udsolgte produkter - indstil via forespørgsel include_out_of_stock=true/false - standard: false *}
{$includeOutOfStock = (isset($smarty.get.include_out_of_stock) && $smarty.get.include_out_of_stock eq "true")}

{* Instantiere controllere *}
{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)}

{* Indstil dato variabel (nu + 1 måned i 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:"html"|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}

{* Sider *}
{controller type=page assign=pagecontroller primary=true}
{collection assign=subPagess controller=page parentId=$page.id  showInMenuCheck=false visibleCheck=false primary=true }

{function name=renderPages}
    {foreach $items->getData() as $Page}
        {collection assign=subPagess2 controller=page parentId=$Page->Id  showInMenuCheck=false visibleCheck=false primary=true }

        {$pageTitle     =     trim($Page->Title)}
        {$link         =     trim($pagecontroller->link($Page->Id))}
        {if $Page->Type == "text" && $Page->Visible == 0 && $Page->ShowInMenu == 0}
        <span class="clerk-pages-info"
            data-id="{$Page->Id}"
            data-type="cms"
            data-url="{$Page->Id}"
            data-title="{$Page->Title|unescape:"html"|clearText}"
            data-text="{$pagecontroller->getText($Page->Id)|unescape:"html"|clearText}">
        </span>
        <br>
        {/if}
        {call name=renderPages items=$subPagess2}
    {/foreach}
{/function}
{call renderPages items=$subPagess}

Indsæt i Feed Item Skabelon #

{* Bestem om produktet er udsolgt *}
{$soldout = ($product->Soldout and !$product->AllowOutOfStockPurchase)}

{if !$soldout || $includeOutOfStock}
    {* Indlæs varianter af produktet *}
    {collection assign=variants controller=$variantController productId=$product->Id variantId=$product->VariantIds}
    {assign variants $variants->getData()}

    {if $product->Soldout}
        {assign stockhtml $productController->getDeliveryTime($product->DeliveryTimeId, false)|escape:'htmlall'}
    {else}
        {assign stockhtml $productController->getDeliveryTime($product->DeliveryTimeId, true)|escape:'htmlall'}
    {/if}

    {* Hent mærket af produktet *}
    {entity assign=brand controller=$brandController id=$product->ProducerId}

    {* Hent varianttyperne af produktet *}
    {collection assign=variantTypes controller=$variantTypeController productId=$product->Id}

    {* Hent billedet af produktet *}
    {*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}

    {* Hent den korte beskrivelse af produktet *}
    {*{assign productDescription $productController->getDescriptionShort($product->Id)}*}

    {* Hvis blank, hent listebeskrivelsen af produktet *}
   {* {if empty($productDescription)}
        {assign productDescription $productController->getDescriptionList($product->Id)}
    {/if}

    {* Hvis blank, hent den lange beskrivelse af produktet *}
    {*{if empty($productDescription)}
        {assign productDescription $productController->getDescription($product->Id)}
    {/if}*}

    {assign productDescription $productController->getDescription($product->Id)}

    {* Trim beskrivelsen til en maksimal længde på 5000 tegn *}
    {$productDescription = $productDescription|strip_tags|unescape:"html"|trimTo:5000}
    {* Trim beskrivelsen til en maksimal længde på 200 tegn *}
    {$productEmailDescription = $productDescription|strip_tags|unescape:"html"|trimTo:200}

    {* Hent kategoriens sti for produktet *}
    {assign categoryPathTitle {categoryTitlePath product=$product separator=" > "}}



    {* Konverter produktalder fra sekunder til dage *}
    {$ageInDays = ($product->Age / 60 / 60 / 24)|string_format:"%.1f"}

    <span class="clerk-product-info"

        {* Titel *}
        data-name="{$product->Title|escape:'html'|clearText}"

        {* Link URI *}
        data-url="{itemLink product=$product}"

         {* Link URL uden domæne*}
        {assign productSurl {itemLink product=$product}}
        data-urls="{$productSurl|replace:'https://www.grejfreak.dk/':'/'}"

        {* Produkt id *}
        data-id="{$product->Id}"


        {* Beskrivelse *}
        data-description="{$productDescription|clearText}"

        {* Beskrivelse *}
        data-shortdescription="{$productEmailDescription|clearText}"

        {* Brug SEO nøgleord til ekstra søgbare nøgleord *}

        {*
        {assign var="keywords" value="$productController->getTranslation($product->Id, 'seo_keywords')|lower|escape:"htmlall"|clearText"}
        {assign var="keyword_list" value=","|explode:$keywords}
        data-keywords2 = "{$keyword_list}"*}

        data-keywords="{$productController->getTranslation($product->Id, 'seo_keywords')|lower|escape:"htmlall"|clearText}"

        {* Billede *}
        data-image="{$imagePath|solutionPath}"

        {* Miniature *}
        data-thumbnail="{$thumbnailPath|solutionPath}"

        {* Varenummer *}
        data-sku="{$product->ItemNumber|toUTF8}"


                {collection assign=productCustomDatas controller=productCustomData productId=$product->Id typeId=14}
        {if $productCustomDatas gt 0}
            {foreach $productCustomDatas->getData() as $productCustomData}
                data-prislabel="{$productCustomData->Title}"
            {/foreach}
        {/if}

        {collection assign=productCustomDatas controller=productCustomData productId=$product->Id typeId=15}
        {if $productCustomDatas gt 0}
            {foreach $productCustomDatas->getData() as $productCustomData}
                data-profitlabel="{$productCustomData->Title}"
            {/foreach}
        {/if}

        {collection assign=productCustomDatas controller=productCustomData productId=$product->Id typeId=12}
        {if $productCustomDatas gt 0}
            {foreach $productCustomDatas->getData() as $productCustomData}
                data-customlabel="{$productCustomData->Title|toUTF8}"
            {/foreach}
        {/if}


        {if !empty($product->Ean)}
            {* Ean nummer *}
            data-ean="{$product->Ean|toUTF8}"
        {/if}

        {* Hent prisen på produktet *}
        {entity assign=priceLine controller=$priceController productId=$product->Id}

        {* Hent lagerstatus teksten for produktet *}
        {$stockStatusText = {stockStatusText product=$product inStockText='på lager' notInStockText='udsolgt'}}


    {* tjekker om produktet er Normal eller variant *}
    {if $product->Type == "normal"}
        {if $product->Soldout}
            {$type="normaloutstockstatus"}
           {* {$deliveryText = "&lt;span&gt;&lt;strong&gt;IKKE PÅ LAGER&lt;/strong&gt;&lt;br&gt;Levering 3-14 dage&lt;/span&gt;"}*}
           {$deliveryText = $stockhtml}
        {else}
            {$type="normalinstockstatus"}
            {*$deliveryText = "&lt;span&gt;&lt;strong&gt;PÅ LAGER&lt;/strong&gt;&lt;/span&gt;&nbsp;"*}
            {$deliveryText = $stockhtml}
        {/if}

    {/if}

    {if $product->Type == "variant"}
        {if $product->Soldout}
            {$type="variantoutstockstatus"}
            {*$deliveryText = "&lt;span&gt;&lt;strong&gt;IKKE PÅ LAGER&lt;/strong&gt;&lt;br&gt;Levering 3-14 dage&lt;/span&gt;"*}
            {$deliveryText = $stockhtml}
        {else}
            {$type="variantinstockstatus"}
            {*$deliveryText = "&lt;p&gt;&lt;strong&gt;LAGERSTATUS&lt;/strong&gt;VÆLG VARIANT&lt;/p&gt;"*}
            {$deliveryText = "<p><strong>{$text.VARIATION_STOCK_BOLD_MESSAGE}</strong>{$text.VARIATION_STOCK_NORMAL_MESSAGE}</p>"}
        {/if}
    {/if}

        data-stock-type ="{$type}"
        data-deliveryText ="{$deliveryText}"


        {* Priser *}
        {assign price $priceLine->PriceMinWithVat}

        {if !$priceIncludingVat}
            {assign price $priceLine->PriceMinWithoutVat}
        {/if}

        {* Salgspris *}
        data-price="{$price}"

        {* Salgspris - Formateret med sprog specifik valuta iso *}
        data-pformatted="{$price|formatPrice}"

        {if $priceLine->PriceMin !== $priceLine->PriceMax}
            data-pricefrom="true"
        {/if}


        {$onSale = ($priceLine->PriceMinWithVat < $priceLine->FullPriceMinWithVat)}

        {* Hvis produktet er rabatteret, sætter vi den normale pris som listepris *}
        {if $onSale}
            {assign listPrice $priceLine->FullPriceMinWithVat}

            {if !$priceIncludingVat}
                {assign listPrice $priceLine->FullPriceMinWithoutVat}
            {/if}

            {* Normal pris *}
            data-list-price="{$listPrice}"

            {* Normal pris - Formateret med sprog specifik valuta iso *}
            data-lpformatted="{$listPrice|formatPrice}"

            {*Tilføj tekst med tilbud *}
            data-sale-text="tilbud"

             {* Tilføj Procent hvis på tilbud *}
            {$priceMin = $priceLine->PriceMin}
            {$priceFull = $priceLine->FullPriceMin}
            {$diffprice = $priceLine-$priceMin}
            {$percentChange = (1 - $priceMin / $priceFull) * 100 }
            {$percentChange = (int)$percentChange}
            data-price-procent="{$percentChange}"
            data-price-procent_int="{$percentChange|formatPrice}"

        {/if}

        data-on-sale="{if $onSale}true{else}false{/if}"
        data-in-stock="{if !$soldout}true{else}false{/if}"

        data-stock-av="{if $product->Soldout}false{else}true{/if}"

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

        {* Hvis produktet er nyere end 30 dage, betragter vi det som nyt *}
        {if $ageInDays lt 90}
            data-new="true"
        {/if}

        {* Mærke *}
        {if !empty($brand->Title)}
            {$brandLink = "{$productPageLink}?brand={$brand->Id}-{$brand->Title|formatLink}"}

            data-brand="{$brand->Title|escape:"html"|clearText}"
            data-brand-url="{$brandLink}"
            data-brand-id="{$brand->Id}"
        {/if}

        {* Hvis produktet har varianter *}
        {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}
                ]"*}

            data-variants-ean="[
                {foreach $variants as $variant}
                    '{assign variantTitle {variantTitle productId=$product->Id variantId=$variant->Id}}{if !empty($variant->Ean)}{$variant->Ean|escape:"htmlall"}{/if}'{if !$variant@last},{/if}
                {/foreach}
                ]"

        {/if}

        {collection assign=productCustomDatas controller=productCustomData productId=$product->Id typeId=11}
        {if $productCustomDatas gt 0}
            {foreach $productCustomDatas->getData() as $productCustomData}
                data-splash="{$productCustomData->Title}"
            {/foreach}
        {/if}

        {* Splash array *}
        {if $productCustomDatas gt 0}
        data-splasharray='[
                {foreach $productCustomDatas->getData() as $productCustomData}
                    "{$productCustomData->Title}"{if !$productCustomData@last},{/if}
                {/foreach}
        ]'
        {/if}

        {* Splash array uden fil type *}
        {if $productCustomDatas gt 0}
        data-splasharray-simple='[
                {foreach $productCustomDatas->getData() as $productCustomData}
                    {assign splashSimple {$productCustomData->Title|toUTF8|replace:'.svg':''}}
                    "{$splashSimple}"{if !$productCustomData@last},{/if}
                {/foreach}
        ]'
        {/if}

        {* Kategorier *}
        data-categories="[
            {$product->CategoryId}
                {if $product->SecondaryCategoryIds}
                    {foreach $product->SecondaryCategoryIds as $productCategory}
                        , {$productCategory}
                    {/foreach}
                {/if}
            ]">
    </span>
{/if}

Indsæt i Feed Slut Skabelon #

{*Tilføj pagination*}
{if !isset($smarty.get.length)}
    {$length = 50}
{else}
    {$length = $smarty.get.length}
{/if}

{if isset($smarty.get.start)}
    {$start = $smarty.get.start + $length}
{else}
    {$start = 0}
{/if}

{* Tjek om udsolgte produkter skal tilføjes*}
{if isset($smarty.get.include_out_of_stock)}
    {$stock = $smarty.get.include_out_of_stock}
{else}
    {$stock = "false"}
{/if}

{* Opret det næste link til crawleren at følge *}
{if $product->Id}
<a href="/framework/priceindex/?index=clerk&start={$start}&length={$length}&include_out_of_stock={$stock}"></a>
{/if}

Gem Prisindex.

Derefter vil du have et link, der ligner dette, tilgængeligt:

https://www.mysmartwebshop.com/framework/priceindex/index=Clerk&include_out_of_stock=false

Gå til my.clerk.io -> Data.

Under Sync Method vælger du HTML annotations og indsætter dit link.

Indstil derefter Max Requests/Sec til 1 og vælg sproget.

Til sidst klikker du på Opdater Indstillinger og derefter Start Sync.

Send ordredata med en CSV-fil #

Da Smartweb Prisindeks desværre ikke tillader salg at blive inkluderet fra Smartweb, skal ordrehistorikken eksporteres som en CSV-fil, der derefter kan konverteres og uploades til Clerk.io.

For at downloade denne CSV-fil, start med at logge ind på din Smartweb backend.

Gå derefter til Eksport:

På den følgende side vælger du Ordrer under Vælg Data og vælger CSV fil under Vælg Format, og klikker derefter på Næste.

Nu skal du vælge, hvilke data der skal inkluderes i CSV-filen.

Clerk.io har brug for følgende data fra ordrerne:

  • Ordre ID (standard)

  • Dato

  • Produkt ID

  • Kunde e-mail

  • Bruger ID

Alle disse kan tjekkes i dropdown-menuerne:

Efter at have tjekket felterne, brug Efter Periode datointervalvælgeren for at inkludere salgsdata helt tilbage til, da du havde dine første ordrer, og klik på Næste:

Til sidst klikker du på Download for at modtage din CSV-fil:

Der! Du har nu dine Smartweb salgsdata som en CSV-fil.

Nu skal du blot kontakte Clerk.io’s Support for at finde den bedste og mest sikre måde at uploade filen til din konto.

Vælg produkter til import #

Smartweb / Hostedshop feedet giver dig mulighed for nemt at filtrere væk eller inkludere udsolgte produkter ved at ændre en simpel del af feed URL.

Gå til my.clerk.io og vælg Data Sync.

Sørg for, at URL’en slutter med &include_out_of_stock=true

Klik derefter på Opdater Indstillinger og Start Sync for at indlæse alle dine produkter til Clerk.io.

Når du importerer alle produkter, inklusive udsolgte, vil du få attributten in_stock tilgængelig for alle produkter, så du kan filtrere nogle Clerk.io-elementer, så de ikke vises.

Denne side er oversat af en hjælpsom AI, og der kan derfor være sproglige fejl. Tak for forståelsen.