Intégration développeur Shopify#
Ajoutez le bouton ideal.house à un thème Shopify et associez-le au SKU de la variante sélectionnée.
<!-- DASHBOARD_READINESS -->Avant de charger le SDK : Ouvrez Dashboard → Paramètres, ajoutez l'origine de votre boutique en ligne à Allowed Origins (CORS), puis cliquez sur Enregistrer. Incluez l'hôte publié et toutes les origines de prévisualisation ou de préproduction que vous utilisez ; séparez plusieurs origines par des virgules. Consultez étapes de configuration.
1. Confirmez les prérequis#
- Vous pouvez modifier le code du thème en direct ou une copie sécurisée du thème.
- Au moins un produit de test est importé et actif dans Catalog.
- Le SKU de la variante sélectionnée correspond au productCode persisté utilisé par Catalog pour ce Shop.
2. Créez l'extrait de bouton#
snippets/idealhouse-view-button.liquid#
{%- comment -%}
Renders an ideal.house authored visualizer button.
Accepts:
- product_code: {String} Variant SKU used by the ideal.house Catalog mapping.
- placement: {String} "card", "pdp-desktop", or "pdp-mobile".
{%- endcomment -%}
{%- liquid
assign button_code = product_code | strip
assign button_placement = placement | default: 'card'
-%}
<button
type="button"
class="idealhouse-view-button idealhouse-view-button--{{ button_placement | escape }}"
data-idealhouse-authored-button
data-active="false"
{% if button_code != blank %}
data-product-code="{{ button_code | escape }}"
{% else %}
disabled
{% endif %}
style="visibility: hidden;"
>
<span>View in my room</span>
</button>
Gardez le bouton masqué jusqu'à ce que le SDK confirme l'éligibilité du produit.
3. Restituez le bouton dans les surfaces du thème#
Cartes de collection et de recherche#
{%- render 'idealhouse-view-button',
product_code: card_product.selected_or_first_available_variant.sku,
placement: 'card'
-%}
Les fichiers courants incluent snippets/card-product.liquid, snippets/product-card.liquid ou snippets/product-grid-item.liquid. Adaptez card_product à la variable product utilisée par le thème.
Page de détail du produit#
{%- render 'idealhouse-view-button',
product_code: product.selected_or_first_available_variant.sku,
placement: 'pdp-desktop'
-%}
{%- render 'idealhouse-view-button',
product_code: product.selected_or_first_available_variant.sku,
placement: 'pdp-mobile'
-%}
Les fichiers courants incluent sections/main-product.liquid ou snippets/product.liquid. Placez des rendus pour ordinateur et mobile séparées uniquement lorsque le thème dispose de mises en page distinctes.
4. Chargez le SDK et synchronisez les variantes#
assets/idealhouse-room-visualizer.js#
(function () {
'use strict';
var buttonSelector = '[data-idealhouse-authored-button]';
var sdkRequested = false;
var buttonObserver = null;
function resetButton(button) {
button.dataset.active = 'false';
button.style.visibility = 'hidden';
delete button.dataset.rvProductCode;
delete button.dataset.rvProductType;
delete button.dataset.rvProductId;
delete button.dataset.rvProductIds;
}
function syncButton(button, productCode) {
if (!button) return false;
var code = typeof productCode === 'string' ? productCode.trim() : '';
resetButton(button);
delete button.dataset.productCode;
if (!code) {
button.disabled = true;
return false;
}
button.disabled = false;
button.dataset.productCode = code;
return true;
}
function syncButtons(container, productCode) {
(container || document).querySelectorAll(buttonSelector).forEach(function (button) {
syncButton(button, productCode);
});
}
function loadSdk() {
if (sdkRequested || !document.querySelector(buttonSelector)) return false;
sdkRequested = true;
if (buttonObserver) buttonObserver.disconnect();
var script = document.createElement('script');
script.src = 'https://sdk.ideal.house/sdk.js';
script.async = true;
script.dataset.shopId = '<SHOP_ID>';
script.dataset.publishableKey = '<PUBLISHABLE_KEY>';
script.dataset.authoredButtonSelector = buttonSelector;
document.head.appendChild(script);
return true;
}
function startSdkLoader() {
if (loadSdk() || typeof MutationObserver === 'undefined') return;
buttonObserver = new MutationObserver(loadSdk);
buttonObserver.observe(document.documentElement, { childList: true, subtree: true });
}
// Dispatch this event from your theme's variant-change callback.
document.addEventListener('idealhouse:variant-change', function (event) {
var detail = event.detail || {};
syncButtons(detail.container || document, event.detail && event.detail.sku);
});
window.IdealhouseShopify = {
syncButton: syncButton,
syncButtons: syncButtons
};
if (document.readyState === 'loading') {
document.addEventListener('DOMContentLoaded', startSdkLoader);
} else {
startSdkLoader();
}
}());
Shopify ne définit pas d'événement universel unique pour les variantes de thème. Connectez l'adaptateur ci-dessous à l'événement ou au rappel exposé par le thème actif.
Exemple d'adaptateur d'événement de thème#
Remplacez l'événement d'exemple par l'API du thème actif. Certains thèmes publient via window.subscribe ; d'autres déclenchent un événement DOM ou mettent à jour product-info.
// Example only: replace "variant:change" with your theme's event.
document.addEventListener('variant:change', function (event) {
var variant = event.detail && event.detail.variant;
var productContainer = event.target.closest('product-info') || document;
document.dispatchEvent(new CustomEvent('idealhouse:variant-change', {
detail: {
container: productContainer,
sku: variant && variant.sku
}
}));
});
5. Ajoutez les styles du thème#
assets/idealhouse-room-visualizer.css#
.idealhouse-view-button {
align-items: center;
justify-content: center;
width: 100%;
min-height: 44px;
padding: 0.75rem 1rem;
border: 1px solid currentColor;
border-radius: 6px;
background: transparent;
color: inherit;
cursor: pointer;
font: inherit;
}
.idealhouse-view-button[data-active="true"] {
display: inline-flex;
visibility: visible;
}
.idealhouse-view-button:disabled {
cursor: not-allowed;
opacity: 0.5;
}
Le thème peut remplacer ces styles visuels.
6. Incluez les ressources dans theme.liquid#
Incluez la feuille de style et le script du visualiseur dans layout/theme.liquid pour appliquer les styles et activer le chargeur SDK.
Incluez la feuille de style (dans <head>)#
{{ 'idealhouse-room-visualizer.css' | asset_url | stylesheet_tag }}
Placez-la dans la balise <head> de layout/theme.liquid afin que les styles soient chargés proprement.
Incluez le script (avant </body>)#
<script src="{{ 'idealhouse-room-visualizer.js' | asset_url }}" defer="defer"></script>
Utilisez defer et placez-le juste avant la balise de fermeture </body> dans layout/theme.liquid pour éviter de bloquer le rendu de la page.
Le bouton « View in my room » reste masqué tant que ce script de chargement n'est pas inclus dans theme.liquid.
7. Vérifiez sur la boutique en ligne en direct#
- Le panneau Network affiche sdk.js chargé avec une réponse HTTP 200.
- La donnée data-product-code du bouton correspond exactement au productCode du Catalog.
- Les produits éligibles affichent un bouton ; les produits non éligibles le gardent masqué.
- Le changement de variante met à jour data-product-code et revalide le bouton.
- Les emplacements de collection/recherche, page produit sur ordinateur et page produit sur mobile fonctionnent là où ils sont présents.
- Cliquer sur le bouton ouvre le Viewer ideal.house avec le produit sélectionné.