I modified some code from a discussion on the Shopify wiki about using radio buttons for variants (instead of the default drop down list). This is for a Stack Overflow question about custom Shopify variants for shipping options.
Relevant Links:
I modified some code from a discussion on the Shopify wiki about using radio buttons for variants (instead of the default drop down list). This is for a Stack Overflow question about custom Shopify variants for shipping options.
Relevant Links:
| ... | |
| <td> | |
| <div class="item-title"> | |
| <a href="{{ item.product.url | within: collections.all }}">{{ item.title }}</a> | |
| {% for p in item.properties %} | |
| {% unless p.last == blank %} | |
| <br /> | |
| {{ p.last }} | |
| <br /> | |
| {% endunless %} | |
| {% endfor %} | |
| </div> | |
| </td> | |
| ... |
| <style type="text/css"> | |
| del { font-size:70%; color:#777 } | |
| ul { list-style:none; text-align:left; padding-left:0 } | |
| p { text-align:left } | |
| li label { font-weight:bold } | |
| li span { padding-left:20px } | |
| </style> | |
| <div class="product-page clearfix"> | |
| <div class="product-images left"> | |
| <div class="product-featured-image"> | |
| <a href="{{ product.featured_image.src | product_img_url: 'original' }}"> | |
| <img src="{{ product.featured_image.src | product_img_url: 'grande' }}" alt="{{product.featured_image.alt | escape }}" /> | |
| </a> | |
| </div> | |
| <div class="product-img-list clearfix"> | |
| {% for image in product.images | offset:1 %} | |
| <div class="product-img left {% cycle '','','last' %}"> | |
| <a href="{{ image.src | product_img_url: 'original' }}"> | |
| <img src="{{ image.src | product_img_url: 'small' }}" alt="{{ image.alt | escape }}" /> | |
| </a> | |
| </div> | |
| {% endfor %} | |
| </div> | |
| </div> | |
| <div class="product-details left"> | |
| <h2 class="product-title">{{ product.title }}</h2> | |
| <div class="product-desc rte">{{ product.description }}</div> | |
| <div class="price-field"> | |
| {% if product.compare_at_price > product.price %} | |
| <del>{{ product.compare_at_price | money_with_currency }}</del> | |
| {% endif %} | |
| <span>{{ product.price | money_with_currency }}</span> | |
| </div> | |
| <form action="/cart/add" method="post" class="product-form"> | |
| <p>Shipping Date: <input type="text" id="datepicker" /></p> | |
| <script> | |
| function updateDeliveryDates(dateText, inst) { | |
| var dateArray = dateText.split("/"); | |
| var selectedDate = new Date(parseInt(dateArray[2]), parseInt(dateArray[1]) - 1, parseInt(dateArray[0]), 0, 0, 0, 0); | |
| var standardShippingDate = new Date(selectedDate.getTime()); | |
| standardShippingDate.setDate(selectedDate.getDate() + 5); | |
| var express3DayShippingDate = new Date(selectedDate.getTime()); | |
| express3DayShippingDate.setDate(selectedDate.getDate() + 3); | |
| var express2DayShippingDate = new Date(selectedDate.getTime()); | |
| express2DayShippingDate.setDate(selectedDate.getDate() + 2); | |
| jQuery("#delivery-date-10000").html("Earliest: " + jQuery.datepicker.formatDate('dd/mm/yy', standardShippingDate)); | |
| jQuery("#delivery-date-11500").html("Guaranteed by " + jQuery.datepicker.formatDate('dd/mm/yy', express3DayShippingDate)); | |
| jQuery("#delivery-date-12500").html("Guaranteed by " + jQuery.datepicker.formatDate('dd/mm/yy', express2DayShippingDate)); | |
| // Set hidden line item property when delivery date changes | |
| jQuery("ul li input[type='radio']:checked").click(); | |
| } | |
| jQuery(function() { | |
| // Initialize jQuery datepicker | |
| jQuery("#datepicker").datepicker({ | |
| dateFormat: "dd/mm/yy", | |
| onSelect: updateDeliveryDates | |
| }); | |
| // Set initial date in text field to today's date | |
| jQuery("#datepicker").datepicker('setDate', '+0'); | |
| // Set initial values for delivery date spans | |
| updateDeliveryDates(jQuery("#datepicker").val(), jQuery("#datepicker")); | |
| }); | |
| </script> | |
| {% if product.variants.size > 1 %} | |
| <script type="text/javascript" charset="utf-8"> | |
| jQuery(function() { | |
| var first_variant_price = jQuery("ul li input[type='radio']:checked").attr("data-price"); | |
| var first_variant_compare_at_price = jQuery("ul li input[type='radio']:checked").attr("data-compare-at-price") || ''; | |
| jQuery(".price-field span").html(first_variant_price); | |
| jQuery(".price-field del").html(first_variant_compare_at_price); | |
| jQuery("input[type='radio']").click(function() { | |
| var variant_price = jQuery(this).attr("data-price"); | |
| jQuery(".price-field span").html(variant_price); | |
| var variant_compare_at_price = jQuery(this).attr("data-compare-at-price") || ''; | |
| jQuery(".price-field del").html(variant_compare_at_price); | |
| // Get delivery date from span below variant title & update hidden line item property | |
| var delivery_date = jQuery("ul li input[type='radio']:checked").siblings("span").html(); | |
| jQuery("#delivery-date").val(delivery_date); | |
| }); | |
| // Set initial value for hidden line item property | |
| jQuery("ul li input[type='radio']:checked").click(); | |
| }); | |
| </script> | |
| <div id="product-variants"> | |
| <ul> | |
| {% assign found_available_variant = false %} | |
| {% for variant in product.variants %} | |
| <li>{% if variant.available %} | |
| <input type="radio"{% if variant.compare_at_price > variant.price %} data-compare-at-price="{{ variant.compare_at_price | money_with_currency }}"{% endif %} data-price="{{ variant.price | money_with_currency }}" id="{{ variant.id }}" value="{{ variant.id }}" name="id"{% if found_available_variant == false %}{% assign found_available_variant = true %} checked="checked"{% endif %} /> | |
| <label for="{{ variant.id }}">{{ variant.title }}</label> | |
| <br /><span id="delivery-date-{{ variant.price }}"></span><br /><br /> | |
| {% else %} | |
| <input type="radio" class="out-of-stock" id="{{ variant.id }}" value="{{ variant.id }}" name="id" disabled="disabled" /> | |
| <label for="{{ variant.id }}" class="out-of-stock">{{ variant.title }}</label>{% endif %} | |
| </li> | |
| {% endfor %} | |
| </ul> | |
| </div> | |
| {% else %} | |
| <input type="text" name="id" value="{{ product.variants.first.id }}" /> | |
| {% endif %} | |
| <input type="hidden" id="delivery-date" name="properties[DeliveryDate]" /> | |
| <input type="submit" name="add" value="Purchase" class="btn" /> | |
| </form> | |
| {% if collection %} | |
| <div class="product-nav clearflex"> | |
| {% if collection.previous_product %} | |
| <div class="left">{{ '← Previous Product' | link_to: collection.previous_product }}</div> | |
| {% endif %} | |
| {% if collection.next_product %} | |
| <div class="right">{{ 'Next Product →' | link_to: collection.next_product }}</div> | |
| {% endif %} | |
| </div> | |
| {% endif %} | |
| </div> | |
| </div> | |
| <script type="text/javascript"> | |
| // <![CDATA[ | |
| var selectCallback = function(variant, selector) { | |
| if (variant && variant.available == true) { | |
| // selected a valid variant | |
| jQuery('.purchase').removeClass('disabled').removeAttr('disabled'); // remove unavailable class from add-to-cart button, and re-enable button | |
| jQuery('.price-field').html(Shopify.formatMoney(variant.price, "{{shop.money_with_currency_format}}")); // update price field | |
| } else { | |
| // variant doesn't exist | |
| jQuery('.purchase').addClass('disabled').attr('disabled', 'disabled'); // set add-to-cart button to unavailable class and disable button | |
| var message = variant ? "Sold Out" : "Unavailable"; | |
| jQuery('.price-field').text(message); // update price-field message | |
| } | |
| }; | |
| // initialize multi selector for product | |
| jQuery(function() { | |
| new Shopify.OptionSelectors("product-select", { product: {{ product | json }}, onVariantSelected: selectCallback }); | |
| jQuery('.selector-wrapper').addClass('clearfix'); | |
| {% if product.options.size == 1 %} | |
| jQuery('.selector-wrapper').prepend("<label for='product-select-option-0'>{{ product.options.first }}</label>"); | |
| {% endif %} | |
| }); | |
| // ]]> | |
| </script> |
| <head> | |
| ... | |
| {{ 'http://code.jquery.com/ui/1.10.3/jquery-ui.js' | script_tag }} | |
| {{ 'http://code.jquery.com/ui/1.10.3/themes/smoothness/jquery-ui.css' | stylesheet_tag }} | |
| </head> |