Skip to content
An example about what and how to customize the core engine
Ruby
Find file
Latest commit 461846e Oct 18, 2011 did wrong gem
Failed to load latest commit information.
app
config first draft Oct 18, 2011
db first commit Oct 18, 2011
doc first commit Oct 18, 2011
lib first draft Oct 18, 2011
public first draft Oct 18, 2011
script
vendor/plugins first commit Oct 18, 2011
.gitignore first commit Oct 18, 2011
Gemfile wrong gem Oct 18, 2011
Gemfile.lock first draft Oct 18, 2011
README.md
Rakefile first commit Oct 18, 2011
config.ru first commit Oct 18, 2011

README.md

How to customize a Locomotive instance

Menu Tab

  • To create a new tab, open your config/application.rb file and in the activate method, modify the MainMenuCell by calling the update_for class method.

Example:

::Admin::MainMenuCell.update_for(:shop) do |menu|
  menu.add_before :settings, :shop, :url => menu.admin_products_url
end
  • To create a sub menu for your new tab, just create a new class (in app/cells/admin) inheriting from Admin::SubMenuCell and do not forget to overide the build_list method.

Example:

class Admin::ShopMenuCell < ::Admin::SubMenuCell

  protected

  def build_list
    add :products,  :url => admin_products_url
    add :orders,    :url => admin_orders_url
  end

end

Models / Controllers

The config/initializers/locomotive_loaded_first.rb file loads all the core engine classes before your own classes. Thus, you are able to open an already defined class such as Page or Site and add your code within it. It works the same way with controllers.

Assets

Put your assets in public/{stylesheets|javascripts|images}/admin and do not forget to reference them in the config/assets.yml file

Liquid

All your custom liquid tags, drop and filters should be included in a module other than Locomotive.

Example:

lib/shop/liquid/drops lib/shop/liquid/filters ...etc

At the lib/shop/liquid folder, just create the following liquid.rb file:

require 'locomotive/liquid/drops/base'

%w{. tags drops filters}.each do |dir|
  Dir[File.join(File.dirname(__FILE__), 'liquid', dir, '*.rb')].each do |lib|
    if Rails.env.development?
      load lib
    else
      require lib
    end
  end
end

Finally, put a new file named shop.rb in lib/

if Rails.env.development?
  load File.join(File.dirname(__FILE__), 'shop', 'liquid.rb')
else
  require 'shop/liquid'
end

If you want to access in your liquid templates your own model collections, you will have to set 2 things up.

  • Create 2 drops related to both your model and the model collection.

Example:

module Shop
  module Liquid
    module Drops
      class Products < ::Liquid::Drop

        def first
          self.collection.first
        end

        def last
          self.collection.last
        end

        def each(&block)
          self.collection.each(&block)
        end

        def each_with_index(&block)
          self.collection.each_with_index(&block)
        end

        ...etc

      end

      class Product < ::Locomotive::Liquid::Drops::Base

        delegate :name, :description, :price, :to => '_source'


        ...etc
      end
    end
  end
end
  • Specify in your model the statement to convert it into a liquid drop

Example:

class Product
  ...etc

  def to_liquid
    Shop::Liquid::Drops::Product.new(self)
  end
end
  • Register the "collection" drop in Liquid

Open your config/application.rb and inside the activate method, write the following line:

Locomotive.config.context_assign_extensions = { 'products' => Shop::Liquid::Drops::Products.new }

Note: do not use symbols over string

Like this, in your liquid templates, you will have access to products list

Example:

{% for product in products %}...{{ product.name }}....{% endfor %}
Something went wrong with that request. Please try again.