h1. Rich-CMS A Rails gem (and also plugin) for a pluggable CMS frontend h2. Introduction Rich-CMS is a module of E9s ("http://github.com/archan937/e9s":http://github.com/archan937/e9s) which provides a frontend for your CMS content. h2. Installation h3. Using Rich-CMS as gem Install the Rich-CMS gem:
sudo gem install rich_cmsAdd rich_cms in @environment.rb@ as a gem dependency:
config.gem "rich_cms"h3. Using Rich-CMS as plugin Install the Rich-CMS plugin:
./script/plugin install git://github.com/archan937/rich_cms.gith2. Use the provided Rails generators Rich-CMS requires two entities: * An @Authlogic@ authenticated user model * An @ActiveRecord@ model used for CMS content storage Fortunately, Rich-CMS is provided with two Rails generators with which you can generate both entities. h3. Authlogic user Run the following in your console:
script/generate rich_authlogic_user*Note*: At default, it will create both the @User@ and @UserSesson@ classes and @CreateUsers@ migration. You can alter the class names with the following:
script/generate rich_authlogic_user CodeHeroes::User --migrate*Note*: Both generators have the @-m@ or @--migrate@ option which runs @rake db:migrate@ after creating the files. h3. CMS content Run the following in your console:
script/generate rich_cms_content*Note*: At default, it will create the @CmsContent@ model and @CreateCmsContents@ migration. You can alter the class name with the following:
script/generate rich_cms_content CmsItemIn case you have used the Rails generators, you can skip the *Create required entities manually* section and go straight to *Render Rich-CMS in your views*. h2. Create required entities manually h3. Specify the authentication mechanism Provide the mechanism as a symbol (e.g. @:authlogic@) and the authenticated class along with the attribute used to identify the instance in a hash.
Rich::Cms::Engine.authenticate(:authlogic, {:class_name => "User", :identifier => :email})Unfortunately, only AuthLogic ("http://github.com/binarylogic/authlogic":http://github.com/binarylogic/authlogic) is supported, but we are working hard on making Rich-CMS compatible with other mechanisms. h3. Register CMS content Every type of content is identified with its correspending CSS selector (used by the jQuery based Javascript module of Rich-CMS). You will have to provide some specifications: * @:class_name@ - The class of the CMS content model which contain the data The following specifications are optional as Rich-Cms uses defaults: * @:key@ (default: @:key@) - The key used for identification of content. You can also provide an array for a combined key (e.g. @[:key, :locale]@) * @:value@ (default: @:value@) - The attribute which stores the value of the content instance. * @:tag@ (default: @:span@) - The tag used for content items. * @:add@ (default: @[]@) - An array of the content item attributes included within the HTML attributes. * @:before_edit@ (default: @nil@) - Javascript function called before showing the edit form of a content item * @:after_update@ (default: @Rich.Cms.Editor.afterUpdate@) - Javascript function called after update a content item
Rich::Cms::Engine.register(".cms_content", {:class_name => "Cms::StaticContent"}) Rich::Cms::Engine.register(".i18n" , {:class_name => "Translation", :key => [:key, :locale], :before_edit => "Rich.I18n.beforeEdit", :after_update => "Rich.I18n.afterUpdate"})h2. Render Rich-CMS in your views h3. Alter your layout Add the following line at the beginning of the @@ tag:
<%= rich_cms %> ...h3. Use the Rich-CMS helper method Rich-CMS requires a rendered DOM element provided with meta data of the content instance. Fortunately, you can call a method provided by Rich-CMS. Just specify the identifier of the content type and the key of the CMS content instance in question:
>> key = "test_content" => "test_content" >> Rich::Cms::Engine.to_content_tag(".cms_content", key) => "When using a combined key for content identification, just call it as follows:Hello world!"
>> Rich::Cms::Engine.to_content_tag(".cms_content", {:key => key, :locale => I18n.locale}) => "*Note*: In this case, the content was registered with @Rich::Cms::Engine.register(".cms_content", {:class_name => "Cms::StaticContent", :key => [:key, :locale]})@ We have also provided you a helper method to render Rich-CMS content tags:Hallo wereld!"
... <%= rich_cms_tag ".cms_content", "test_content" %> <%= rich_cms_tag ".cms_content", {:key => "test_content", :locale => I18n.locale} %> ...h3. Rich-CMS in your browser Open "http://localhost:3000/cms":http://localhost:3000/cms, log in and start managing CMS content. h2. Customizing the after update implementation The @update@ action response of @Rich::CmsController@ is provided with "JSON":http://www.json.org data regarding the updated content item. The response will be passed to the @after_update@ Javascript function. Its default JSON data:
{"__selector__": ".cms_content", "__identifier__": {"key": "test_paragraph"}, "value": "Hello world!"}*Note*: @__selector__@ and @__identifier__@ are *always* provided in the JSON data. When specifying a custom after update Javascript function, you probably want to acquire more information than provided in the default JSON data. You can customize this by defining the @to_rich_cms_response@ method in the CMS content model class:
class Translation < ActiveRecord::Base def to_rich_cms_response(params) {:value => value, :translations => Hash[*params[:derivative_keys].split(";").uniq.collect{|x| [x, x.t]}.flatten]} end endThe JSON data provided will be look like:
{"__selector__": ".i18n", "__identifier__": {"locale": "nl", "key": "word.user"}, "value": "gebruiker", "translations": {"users": "gebruikers"}}h2. Contact me For support, remarks and requests please mail me at "paul.engel@holder.nl":mailto:paul.engel@holder.nl. h2. Credit This Rails gem / plugin depends on: jQuery