123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899 |
- module ShopifyAPI
- # Assets represent the files that comprise your theme.
- # There are different buckets which hold different kinds
- # of assets, each corresponding to one of the folders
- # within a theme's zip file: "layout", "templates",
- # "snippets", "assets", and "config". The full key of an
- # asset always starts with the bucket name, and the path
- # separator is a forward slash, like layout/theme.liquid
- # or assets/bg-body.gif.
- #
- # Initialize with a key:
- # asset = ShopifyAPI::Asset.new(:key => 'assets/special.css', :theme_id => 12345)
- #
- # Find by key:
- # asset = ShopifyAPI::Asset.find('assets/image.png', :params => {:theme_id => 12345})
- #
- # Get the text or binary value:
- # asset.value # decodes from attachment attribute if necessary
- #
- # You can provide new data for assets in a few different ways:
- #
- # * assign text data for the value directly:
- # asset.value = "div.special {color:red;}"
- #
- # * provide binary data for the value:
- # asset.attach(File.read('image.png'))
- #
- # * set a URL from which Shopify will fetch the value:
- # asset.src = "http://mysite.com/image.png"
- #
- # * set a source key of another of your assets from which
- # the value will be copied:
- # asset.source_key = "assets/another_image.png"
- class Asset < Base
- include DisablePrefixCheck
- self.primary_key = 'key'
- self.prefix = "/admin/themes/:theme_id/"
-
- def self.prefix(options={})
- options[:theme_id].nil? ? "/admin/" : "/admin/themes/#{options[:theme_id]}/"
- end
-
- def self.element_path(id, prefix_options = {}, query_options = nil) #:nodoc:
- prefix_options, query_options = split_options(prefix_options) if query_options.nil?
- "#{prefix(prefix_options)}#{collection_name}.#{format.extension}#{query_string(query_options)}"
- end
-
- # find an asset by key:
- # ShopifyAPI::Asset.find('layout/theme.liquid', :params => {:theme_id => 99})
- def self.find(*args)
- if args[0].is_a?(Symbol)
- super
- else
- params = {:asset => {:key => args[0]}}
- params = params.merge(args[1][:params]) if args[1] && args[1][:params]
- path_prefix = params[:theme_id] ? "/admin/themes/#{params[:theme_id]}" : "/admin"
- resource = find(:one, :from => "#{path_prefix}/assets.#{format.extension}", :params => params)
- resource.prefix_options[:theme_id] = params[:theme_id] if resource && params[:theme_id]
- resource
- end
- end
-
- # For text assets, Shopify returns the data in the 'value' attribute.
- # For binary assets, the data is base-64-encoded and returned in the
- # 'attachment' attribute. This accessor returns the data in both cases.
- def value
- attributes['value'] ||
- (attributes['attachment'] ? Base64.decode64(attributes['attachment']) : nil)
- end
-
- def attach(data)
- self.attachment = Base64.encode64(data)
- end
-
- def destroy
- connection.delete(element_path(prefix_options.merge(:asset => {:key => key})), self.class.headers)
- end
-
- def new?
- false
- end
-
- def method_missing(method_symbol, *arguments) #:nodoc:
- if %w{value= attachment= src= source_key=}.include?(method_symbol)
- wipe_value_attributes
- end
- super
- end
-
- private
-
- def wipe_value_attributes
- %w{value attachment src source_key}.each do |attr|
- attributes.delete(attr)
- end
- end
- end
- end
|