Personnalisation

La plupart des modèles de panier sont modifiables. Vous pouvez également remplacer le CSS pour des modifications esthétiques.

Pour commencer

Lorsque vous incluez Snipcart, vous devez créer un élément dans lequel inclure le panier.

<!-- Snipcart stylesheet -->
<link rel="stylesheet" href="https://cdn.snipcart.com/themes/v3.2.0/default/snipcart.css" />

<!-- Element where you set your API key and insert your custom templates -->
<div id="snipcart" data-api-key="<API_KEY>">
</div>

<!-- Snipcart script -->
<script src="https://cdn.snipcart.com/themes/v3.2.0/default/snipcart.js"></script>

Dans cet élément, vous pouvez fournir vos propres modèles. Reportez-vous à cette entrée de documentation pour voir la liste des composants. Chaque composant qui possède un Modèle par défaut peut être remplacé.

Pour remplacer un modèle, insérez un node dans div#snipcart. La balise de node doit être le nom du composant que vous voulez remplacer.

<div hidden id="snipcart" data-api-key="<API_KEY>">
    <component-to-override>
        <!-- The template must have a single root element -->
        <div class="root">
        </div>
    </component-to-override>
</div>

Vous devez fournir un node racine pour chaque composant que vous remplacez. Par exemple, ceci ne serait pas valide :

<div hidden id="snipcart" data-api-key="<API_KEY>">
    <component-to-override>
        <!-- You can't have more than one root element in your template. -->
        <div class="root">
        </div>
        <div class="root">
        </div>
    </component-to-override>
</div>

Sections

Certaines sections du panier sont également modifiables. Cela vous permet d'ajouter n'importe quel élément dans des sections spécifiques du panier sans nécessiter une modification complète. Cela peut être utile lorsque vous souhaitez uniquement ajouter un avis personnalisé ou un champ personnalisé.

La clé ici est de spécifier la section que vous voulez remplacer à côté du nom du composant :

<div hidden id="snipcart" data-api-key="<API_KEY>">
    <!-- Specify the section name with section attribute -->
    <component-to-override section="top">
        <div class="root">
            This will be inserted into the section named `top`.
        </div>
    </component-to-override>
</div>

Définir des modèles dans un fichier externe

Vous pouvez également inclure vos modèles dans un fichier externe, ce qui est particulièrement utile pour les clients construisant des applications avec des frameworks comme Next, Gatsby ou Nuxt. Pour éviter les conflits avec les moteurs de modèles de ces frameworks, c'est l'approche que nous suggérons.

Pour ce faire, il suffit de faire référence à votre fichier externe via l'attribut data-templates-url de votre div#snipcart.

<div id="snipcart" data-api-key="<API_KEY>" data-templates-url="/snipcart-templates.html">
</div>

Dans votre fichier snipcart-templates.html, mettez tous vos composants remplacés dans un div avec l'id snipcart-templates.

<!DOCTYPE html>
<html>
    <head><title>Templates</title></head>

    <body>
        <div id="snipcart-templates">
            <component-to-override>
                <!-- The template must have a single root element -->
                <div class="root">
                </div>
            </component-to-override>
        </div>
    </body>
</html>

Vous pouvez jeter un coup d'œil à cette entrée de documentation pour voir toutes les sections remplaçables.

Comment ça fonctionne

En-dessous, le panier est construit avec Vue.js. Donc les directives Vue sont supportées dans vos modèles personnalisés.

Cependant, vous n'avez pas besoin d'apprendre Vue pour écrire vos propres modèles. Mais si vous le connaissez, vous pourrez peut-être pousser les choses un peu plus loin.

Nous avons essayé d'encapsuler toute la logique dans des micro-composants et des enveloppes de composants. De cette façon, il est plus simple de comprendre le fonctionnement d'un modèle sans avoir à connaître Vue.

Cependant, nous avons conservé certaines directives Vue comme v-if et @click dans nos modèles. Nous avons envisagé d'essayer de les encapsuler dans des enveloppes de composants, mais nous avons réalisé que cela créerait un grand nombre de composants inutiles, nous avons donc décidé de les conserver dans des modèles.

Exemples

Voici un exemple de ce qui peut être fait avec nos modèles personnalisables.

Simplifier les éléments du panier

Disons que vous voulez mettre à jour le modèle de chaque article dans le panier. Vous devez supprimer les images, les descriptions, etc., et ne conserver que le strict minimum.

<div hidden id="snipcart" data-api-key="<api_key>">
   <item-line>
       <li class="snipcart__item__line snipcart__box">
           <div class="snipcart__item__line__product">
               <div class="snipcart__item__line__header">
                   <h2 class="snipcart__item__line__header__title">
                       {{ item.name }}
                   </h2>

                   <item-quantity class="snipcart__item__line__quantity" v-if="!adding"></item-quantity>
                   <div class="snipcart__item__line__header__actions">
                       <remove-item-action class="snipcart__button--icon">
                           <icon name="trash" class="icon--red"  alt="item.remove_item"></icon>
                       </remove-item-action>
                   </div>
               </div>
           </div>
       </li>
   </item-line>
</div>

custom-item-line

Ajouter un champ téléphone dans le formulaire d'adresse

Si vous souhaitez recueillir le numéro de téléphone dans le formulaire d'adresse, vous pouvez ajouter le champ téléphone et la valeur apparaîtra dans les informations relatives au client.

<div id="snipcart" data-api-key="<api_key>" hidden>
    <address-fields section="top">
        <div>
            <snipcart-label for="phone">
                Phone number
            </snipcart-label>
            <snipcart-input name="phone">
            </snipcart-input>
        </div>
    </address-fields>
</div>

Phone number custom field

Personnaliser les champs d'adresse

Par défaut, les champs d'adresse offrent à vos clients un composant d'autocomplétion d'adresse pour une expérience de paiement plus rapide. Vous pourriez vouloir quelque chose de plus classique.

Pour ce faire, vous pouvez remplacer le composant address-fields de la manière suivante :

<div hidden id="snipcart" data-api-key="<api_key>">
    <address-fields>
    <div>
      <fieldset class="snipcart-form__set">
        <div class="snipcart-form__row">
          <div class="snipcart-form__field snipcart-form__cell--large">
            <snipcart-label
              class="snipcart__font--tiny"
              for="address1"
            >{{ $localize('address_form.address1') }}</snipcart-label>
            <snipcart-input name="address1"></snipcart-input>
            <snipcart-error-message name="address1"></snipcart-error-message>
          </div>

          <div class="snipcart-form__field snipcart-form__cell--tidy">
            <snipcart-label
              class="snipcart__font--tiny"
              for="address2"
            >{{ $localize('address_form.address2') }}</snipcart-label>
            <snipcart-input name="address2"></snipcart-input>
            <snipcart-error-message name="address2"></snipcart-error-message>
          </div>
        </div>

        <div class="snipcart-form__field">
          <snipcart-label
            class="snipcart__font--tiny"
            for="city"
          >{{ $localize('address_form.city') }}</snipcart-label>
          <snipcart-input name="city"></snipcart-input>
          <snipcart-error-message name="city"></snipcart-error-message>
        </div>

        <div class="snipcart-form__field">
          <snipcart-label
            class="snipcart__font--tiny"
            for="country"
          >{{ $localize('address_form.country') }}</snipcart-label>
          <snipcart-typeahead type="dropdown" name="country" autocomplete="country"></snipcart-typeahead>
        </div>

        <div class="snipcart-form__row">
          <div class="snipcart-form__field snipcart-form__cell--large">
            <snipcart-label
              class="snipcart__font--tiny"
              for="province"
            >{{ $localize('address_form.province') }}</snipcart-label>
            <snipcart-typeahead type="dropdown" name="province" autocomplete="province state"></snipcart-typeahead>
          </div>

          <div class="snipcart-form__field snipcart-form__cell--tidy">
            <snipcart-label
              class="snipcart__font--tiny"
              for="postalCode"
            >{{ $localize('address_form.postalCode') }}</snipcart-label>
            <snipcart-input name="postalCode"></snipcart-input>
            <snipcart-error-message name="postalCode"></snipcart-error-message>
          </div>
        </div>
      </fieldset>
    </div>
  </address-fields>
</div>

Personnaliser le formulaire de paiement

Vous pouvez personnaliser le formulaire de paiement en utilisant le SDK de Snipcart. Voir la référence du SDK ici.

Conclusion

Nous vous suggérons de jeter un coup d'œil à notre documentation de référence sur les composants. Vous trouverez la documentation de chaque modèle modifiable ainsi que son modèle par défaut.