Modèle personnalisé vs bloc Custom code
- Un modèle personnalisé remplace le rendu d’un bloc existant par votre propre balisage, et vous fournit les données propres à ce bloc (le titre et le nombre d’articles du Header, les totaux du Summary, etc.). Il n’ajoute rien de nouveau ; il restyle un bloc.
- Le bloc Custom code ajoute un nouveau bloc de HTML ou de React arbitraire n’importe où dans le panier.
Utiliser un modèle personnalisé
- Sélectionnez un bloc dans l’éditeur et ouvrez son onglet Code.
- Modifiez le modèle par défaut. Les modèles personnalisés sont uniquement en JSX (le choix HTML-ou-JSX est exclusif au bloc Custom code).
- Cliquez sur Compile. La compilation supprime les types et transpile le JSX, elle attrape donc les erreurs de syntaxe. Les erreurs de type n’empêchent pas la compilation : l’éditeur les signale en ligne pendant que vous tapez, avec le même IntelliSense qui autocomplète les props du bloc.
- Activez le modèle pour que le panier l’utilise à la place du rendu intégré.
- Reset to default restaure à tout moment le modèle d’origine du bloc.
Écrire un modèle avec l’IA
- Les règles de compilation (expression unique, pas de
export default, pas d’imports) - Les props exactes que le bloc reçoit, correspondant à ce qu’affiche l’IntelliSense de l’éditeur
- La signature de fonction verrouillée imposée par l’éditeur
- Les règles propres au bloc (formats monétaires, gestionnaires à connecter, exigences d’accessibilité)
- Une section à compléter où vous collez votre modèle actuel et décrivez la modification souhaitée
Le prompt est spécifique à chaque bloc. Le bouton Copy AI prompt n’apparaît que sur les blocs qui prennent en charge les modèles personnalisés.
Ce que votre modèle remplace
Ce que vous conservez : la position du bloc dans le panier, son interrupteur de visibilité, ses paramètres (qui alimentent toujours les props que vous recevez), le panneau Custom CSS du panier et le squelette de chargement intégré.
Ce dernier point surprend souvent. Le bloc vérifie si le panier est encore en cours de chargement avant d’atteindre votre modèle, donc le squelette intégré s’affiche pendant le chargement et votre modèle ne s’exécute qu’une fois le panier prêt. Vous n’avez pas à construire d’état de chargement.
Ce qui est disponible dans un modèle
- Vous disposez de cinq hooks :
useState,useEffect,useMemo,useRefetuseCallback. PlusFragment, pour<>…</>. - Il n’y a aucun import. Vous ne pouvez rien
import, et il n’y a pas d’objetReactdans la portée, donc pas deReact.useReducer, pas deReact.Children. Si un hook n’est pas dans la liste ci-dessus, il n’est pas disponible. - Les props sont en lecture seule. Muter une prop ne servira à rien. Pour modifier le panier, utilisez les props gestionnaires que le bloc vous fournit (
onClose,increment,selectPlan, etc.) plutôt que d’écrire directement dans les props. windowest accessible, donc un modèle peut appeler le Cart SDK viawindow.aftersell.cartlorsqu’il a besoin de quelque chose que les props du bloc ne couvrent pas.
Conventions communes à tous les blocs
- Les props
*Htmlsont du texte enrichi pré-assaini. Affichez-les avecdangerouslySetInnerHTML. Elles sont déjà passées par l’assainisseur du panier, et les jetons marchands comme{{total_price}}sont déjà résolus. - Les prix qui arrivent en tant que
stringsont déjà formatés dans le format monétaire de la boutique. Les prix en tant quenumbersont en centimes. Un bloc vous donne l’un ou l’autre, et le tableau de chaque bloc précise lequel. isLoadingest toujoursfalsedans un modèle. Le bloc affiche son squelette intégré et n’appelle votre modèle qu’une fois le panier chargé, donc la prop est transmise par souci d’exhaustivité plutôt que pour que vous fassiez des branchements dessus.
Quelques blocs ne renvoient rien du tout dans certains états, de sorte que votre modèle n’est jamais appelé avec des données vides. Le modèle Rewards ne voit jamais un
milestones vide, et le modèle Subscription upgrade ne voit jamais une view nulle. La référence de chaque bloc indique où cela s’applique, pour que vous puissiez ignorer la branche d’état vide.Styliser un modèle personnalisé
Les deux familles de classes
Ainsi,
cart-internal-header__title est ce qui donne au titre l’apparence du titre intégré, et cart-external-header__title est la poignée que vous êtes censé saisir lorsque vous voulez changer son apparence.
Petites modifications : conservez les deux classnames
cart-external-*.
Restructuration : supprimez les deux classnames
cart-internal-* parce que le CSS intégré a été écrit pour le DOM intégré. Conservez ces classes sur un balisage restructuré et vous héritez de règles de mise en page qui supposent des éléments que vous n’avez plus : des conteneurs flex attendant d’autres enfants, des espacements entre des éléments déplacés, un positionnement relatif à quelque chose que vous avez supprimé. Cela se manifeste généralement par votre propre CSS qui « ne fonctionne pas » alors que ce sont les règles intégrées qui l’emportent.
Deux façons de styliser ce que vous avez construit :
Option 1 : vos propres classnames plus Custom CSS
.header ou .title risque d’entrer en collision avec les classes propres du panier, le modèle d’une autre application ou un futur bloc.
Option 2 : styles inline
:hover ni d’autres pseudo-classes, pas de media queries, et pas de réutilisation entre blocs. Passez à l’option 1 dès que vous avez besoin de l’un de ces éléments.
Choisir une approche
Le panier est rendu dans un shadow root, donc la feuille de style de votre thème ne peut pas y pénétrer. Les styles d’un modèle personnalisé doivent provenir du panneau Custom CSS du panier ou de styles inline, pas de votre thème. Consultez Custom CSS.
Quand un modèle échoue
Comme le bloc disparaît silencieusement plutôt que d’afficher une erreur visible, vérifiez toujours un modèle en prévisualisation avant de publier. Si un bloc a disparu, ouvrez d’abord la console du navigateur.
Deux points méritent des garde-fous, car les deux font planter un modèle qui suppose le contraire :
- Les props nullables. De nombreuses props sont
nulldans des conditions normales (logoUrlsans logo,imageUrlsans image,variantTitlesur un produit à variante unique). Vérifiez avant de les utiliser. - Les tableaux qui peuvent être vides.
discountTagsetdiscountCodesvalent[]bien plus souvent qu’autrement.
Limitations
- Les modèles personnalisés sont des remplacements d’affichage. Pour exécuter une logique sur le panier (s’abonner aux événements, ajouter des articles, réagir aux modifications), utilisez les Scripts personnalisés et le Cart SDK.
- Presque tous les blocs en prennent un en charge. Les exceptions sont le bloc Express payments, qui héberge les boutons de paiement propres à Shopify, et le conteneur Cart items lui-même, bien que la ligne Product qu’il contient prenne en charge un modèle personnalisé.
- Un modèle ne peut pas changer ce qu’un bloc fait fondamentalement. Il change la façon dont les données du bloc sont présentées, pas les données ni le comportement sous-jacent.
Props de chaque bloc
Le bloc Custom code est la seule surface qui ajoute du balisage plutôt que de remplacer le rendu d’un bloc, donc ses props sont différentes : le panier entier, plus une action d’ajout au panier. Consultez Blocs de code personnalisé → Props.