<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-3059015612137649698</id><updated>2012-02-14T10:10:30.898-08:00</updated><title type='text'>Radiant CMS</title><subtitle type='html'>Find all Radiant CMS solutions</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://vpanchal.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3059015612137649698/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://vpanchal.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Vijayta Panchal</name><uri>http://www.blogger.com/profile/04140284328285563574</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>38</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-3059015612137649698.post-6883353645039180809</id><published>2007-07-16T22:37:00.001-07:00</published><updated>2007-07-16T22:42:28.331-07:00</updated><title type='text'>Extensions Available in Radiant</title><content type='html'>&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Blog Tags&lt;/span&gt; &lt;small&gt;(&lt;a href="http://seansantry.com/svn/radiant/extensions/blogtags/trunk"&gt;svn&lt;/a&gt;)&lt;/small&gt;&lt;/li&gt;&lt;/ul&gt;Provides useful tags for blogs, like getting the next and previous articles or showing the post time in words (eg, “Posted by Sean 2 days ago”)&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Comments&lt;/span&gt; &lt;small&gt;(&lt;a href="http://svn.artofmission.com/svn/plugins/radiant/extensions/comments"&gt;svn&lt;/a&gt;)&lt;/small&gt;&lt;/li&gt;&lt;/ul&gt;Adds blog-like comment functionality to Radiant (still very alpha)&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Copy Move&lt;/span&gt; &lt;small&gt;(&lt;a href="http://darcs.bigchieflabs.com/radiant/extensions/copy_move/rdoc/"&gt;docs&lt;/a&gt;)&lt;/small&gt;&lt;/li&gt;&lt;/ul&gt;It allows for a page to be copied (or moved) under a new parent.&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight: bold;" class="caps"&gt;CSS&lt;/span&gt;&lt;span style="font-weight: bold;"&gt; &lt;/span&gt;&lt;small&gt;&lt;span style="font-weight: bold;"&gt;(&lt;/span&gt;&lt;a href="http://www.sharedhostlogic.com/css.tar.gz"&gt;download&lt;/a&gt;)&lt;/small&gt;&lt;/li&gt;&lt;/ul&gt;Allows pages to be rendered as &lt;span class="caps"&gt;CSS&lt;/span&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Default Page Parts&lt;/span&gt; &lt;small&gt;(&lt;a href="http://darcs.bigchieflabs.com/radiant/extensions/default_page_parts/rdoc/"&gt;docs&lt;/a&gt;)&lt;/small&gt;&lt;/li&gt;&lt;/ul&gt;With this extension you can create a page of !DefaultPageParts type and specify the default parts of all its children.&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Dynamic &lt;/span&gt;&lt;small&gt;(&lt;a href="http://darcs.bigchieflabs.com/radiant/extensions/dynamic/rdoc/"&gt;docs&lt;/a&gt;)&lt;/small&gt;&lt;/li&gt;&lt;/ul&gt;With this extension you can create a page of Dynamic type that will be updated every time that one of its children will be created/saved/destroyed.&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Enkoder Tags &lt;/span&gt;&lt;small&gt;(&lt;a href="http://seansantry.com/svn/radiant/extensions/enkodertags/trunk"&gt;svn&lt;/a&gt;)&lt;/small&gt;&lt;/li&gt;&lt;/ul&gt;Provides tags for enkoding email addresses (or arbitrary content) using &lt;a href="http://hivelogic.com/enkoder"&gt;Dan Benjamin’s Enkoder&lt;/a&gt; to block spam harvesters&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Event Calendar (iCal)&lt;/span&gt; &lt;small&gt;(&lt;a href="http://svn.fn-group.com/radiant_extensions/event_calendar"&gt;svn&lt;/a&gt;)&lt;/small&gt;&lt;/li&gt;&lt;/ul&gt;Create calendars in Radiant admin which have iCal subscriptions attached to them. Retrieve events to each calendar through refreshes from the iCal subscription. Works best when used in conjunction with an iCal publishing front-end app like Google Calendars or .Mac and a cron job setup on your server to run the refresh automatically every hour or more.&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Flickr Tags &lt;/span&gt;&lt;small&gt;(&lt;a href="http://seansantry.com/svn/radiant/extensions/flickrtags/trunk"&gt;svn&lt;/a&gt;)&lt;/small&gt;&lt;/li&gt;&lt;/ul&gt;Provides a tag for embedding a Flickr slideshow like the one in &lt;a href="http://seansantry.com/portfolio"&gt;my portfolio&lt;/a&gt;.&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Gallery &lt;/span&gt;&lt;small&gt;(&lt;a href="http://darcs.bigchieflabs.com/radiant/extensions/gallery/rdoc/"&gt;svn&lt;/a&gt;)&lt;/small&gt;&lt;/li&gt;&lt;/ul&gt;The Gallery extension allows Radiant to manage galleries of images.&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;HomeDir&lt;/span&gt; &lt;small&gt;(&lt;a href="http://abisso.org/projects/home_dir/"&gt;home&lt;/a&gt;, &lt;a href="http://www.lilik.it/cgi-bin/viewcvs.cgi/home_dir/trunk/"&gt;svn&lt;/a&gt;)&lt;/small&gt;&lt;/li&gt;&lt;/ul&gt;This Radiant extension allow you to define /~user routes like apache userdir module.&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Language Redirect&lt;/span&gt; &lt;small&gt;(&lt;a href="https://svn1.hosted-projects.com/medlar/language_redirect_extension"&gt;svn&lt;/a&gt;)&lt;/small&gt;&lt;/li&gt;&lt;/ul&gt;Redirects the browser to a different page root based on the accepted locale.&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Maruku Text Filter&lt;/span&gt; &lt;small&gt;(&lt;a href="http://blog.brandalism.com/assets/2007/2/24/maruku_filter.zip"&gt;archive&lt;/a&gt;, &lt;a href="http://blog.brandalism.com/2007/2/24/maruku-filter-for-radiant"&gt;docs&lt;/a&gt;)&lt;/small&gt;&lt;/li&gt;&lt;/ul&gt;A Markdown variant extension for Radiant&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Page Attachments&lt;/span&gt; &lt;small&gt;(&lt;a href="http://svn.seancribbs.com/svn/rails/plugins/extensions/page_attachments"&gt;svn&lt;/a&gt;, &lt;a href="http://wiki.radiantcms.org/Installing_Extension_-_Page_Attachments"&gt;installation&lt;/a&gt;)&lt;/small&gt;&lt;/li&gt;&lt;/ul&gt;Adds support for file uploads via attachments&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Page Attributes&lt;/span&gt; &lt;small&gt;(&lt;a href="https://dev.eyebeam.org/svn/radiant-partatts/radiant/vendor/extensions/"&gt;svn&lt;/a&gt;, &lt;a href="http://dev.eyebeam.org/projects/radiant-partatts/wiki/radiant-partatts"&gt;docs&lt;/a&gt;)&lt;/small&gt;&lt;/li&gt;&lt;/ul&gt;This extension/hack of Radiant gives all your pages an “attributes” tab where you can add named strings, bools, links, and files… (and then reference them from r: tags).&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;RadiantOnRails &lt;/span&gt;&lt;small&gt;(&lt;a href="http://radiantonrails.rubyforge.org/"&gt;docs&lt;/a&gt;, &lt;a href="svn://rubyforge.org/var/svn/radiantonrails/trunk"&gt;svn&lt;/a&gt;)&lt;/small&gt;&lt;/li&gt;&lt;/ul&gt;Allows for a Ruby on Rails application to integrate with the features offered by Radiant &lt;span class="caps"&gt;CMS&lt;/span&gt;.&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Record Tags&lt;/span&gt; &lt;small&gt;(&lt;a href="http://www.boardgamerspastime.com/downloads/radiant/extensions/record_tags.zip"&gt;archive&lt;/a&gt;, &lt;a href="http://wiki.radiantcms.org/Extension_-_Record_Tags"&gt;docs&lt;/a&gt;)&lt;/small&gt;&lt;/li&gt;&lt;/ul&gt;Adds tags for displaying database records.  A natural front end for custom, back-end models.&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Resizing Text Area&lt;/span&gt; &lt;small&gt;(&lt;a href="http://svn.somedutchguy.com/projects/show/3"&gt;docs&lt;/a&gt;)&lt;/small&gt;&lt;/li&gt;&lt;/ul&gt;This extension appears to be defunct&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight: bold;" class="caps"&gt;RSS&lt;/span&gt;&lt;span style="font-weight: bold;"&gt; Reader 0.2 &lt;/span&gt;&lt;small&gt;(&lt;a href="http://www.scidept.com/content/rss_reader-0.2"&gt;docs&lt;/a&gt;)&lt;/small&gt;&lt;/li&gt;&lt;/ul&gt;This extension appears to be defunct&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Smooth Gallery&lt;/span&gt; &lt;small&gt;(&lt;a href="http://svn.somedutchguy.com/projects/show/1"&gt;docs&lt;/a&gt;)&lt;/small&gt;&lt;/li&gt;&lt;/ul&gt;This extension appears to be defunct&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight: bold;" class="caps"&gt;VIM&lt;/span&gt; &lt;small&gt;(&lt;a href="http://www.raphinou.com/radiant.vim"&gt;vim file&lt;/a&gt;)&lt;/small&gt;&lt;/li&gt;&lt;/ul&gt;Allows you to edit Radiant pages from VI.&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Virtual Domain&lt;/span&gt; &lt;small&gt;(&lt;a href="http://silverinsanity.com/%7Ebenji/radiant/virtual_domain-1.2.1.tar.gz"&gt;archive&lt;/a&gt;)&lt;/small&gt;&lt;/li&gt;&lt;/ul&gt;Makes each top-level page the root of a different website (based on the host name).&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight: bold;" class="caps"&gt;WYSIWYG&lt;/span&gt;&lt;span style="font-weight: bold;"&gt; Text Editor&lt;/span&gt; &lt;small&gt;(&lt;a href="http://blog.brandalism.com/assets/2007/2/23/tiny_mce_extension.zip"&gt;archive&lt;/a&gt;, &lt;a href="http://blog.brandalism.com/2007/2/24/wysiwyg-editing-for-radiant"&gt;docs&lt;/a&gt;)&lt;/small&gt;&lt;/li&gt;&lt;/ul&gt;Based on the TinyMCE editor&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3059015612137649698-6883353645039180809?l=vpanchal.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vpanchal.blogspot.com/feeds/6883353645039180809/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3059015612137649698&amp;postID=6883353645039180809' title='42 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3059015612137649698/posts/default/6883353645039180809'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3059015612137649698/posts/default/6883353645039180809'/><link rel='alternate' type='text/html' href='http://vpanchal.blogspot.com/2007/07/extensions-available-in-radiant.html' title='Extensions Available in Radiant'/><author><name>Vijayta Panchal</name><uri>http://www.blogger.com/profile/04140284328285563574</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>42</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3059015612137649698.post-5304141134198021697</id><published>2007-07-12T01:44:00.001-07:00</published><updated>2007-07-12T01:44:35.336-07:00</updated><title type='text'>WHAT'S NEW IN  RADIANT</title><content type='html'>&lt;pre&gt;* Added support for extensions--an extremely flexible way to extend&lt;br /&gt;  Radiant&lt;br /&gt;* Merged Behaviors into the Page class; subclass page now instead&lt;br /&gt;* Improved database support for Postgres and Sqlite&lt;br /&gt;* Limited support for SQL Server&lt;br /&gt;* Exceptions from tags now bubble up during testing&lt;br /&gt;* Page parts are now sorted by ID so the order that you create them in&lt;br /&gt;  is preserved [Josh Ferguson]&lt;br /&gt;* Implemented tag documentation DSL and UI [Sean Cribbs]&lt;br /&gt;* Reworked the setup code&lt;br /&gt;* Renamed script/setup_database to rake db:bootstrap&lt;br /&gt;* Reworked the upgrade code to work around rake tasks&lt;br /&gt;* Added rake tasks for freezing and unfreezing radiant to the edge&lt;br /&gt;* r:children:each, r:children:first, and r:children:last now all accept&lt;br /&gt;  the same ordering and limit attributes and have the same defaults&lt;br /&gt;* Snippets are now responsive to global context via the r:page tag. This&lt;br /&gt;  means that any tags inside r:page will refer to the page currently&lt;br /&gt;  being rendered, i.e. the page requested, not the local contextual page&lt;br /&gt;  via tags like r:children:each, etc. This is most relevant to recursive&lt;br /&gt;  snippets like the sitemapper example [Sean Cribbs]&lt;br /&gt;* r:navigation now uses the pipe character ("|") to delimit URLs in the&lt;br /&gt;  urls attribute rather than the semi-colon&lt;br /&gt;* :date now accepts a "for" attribute that specifies which attribute of&lt;br /&gt;  the page to render. Valid values of the attribute are published_at,&lt;br /&gt;  updated_at, created_at, and now.&lt;br /&gt;* Created the r:cycle tag to make alternating tables and lists possible&lt;br /&gt;* Added popups for filter and tag documentation inside the page editing&lt;br /&gt;  interface&lt;br /&gt;* Added support for optimistic locking for all models [Daniel Shepherd]&lt;br /&gt;* Added support to Radiant::Config for boolean values [Sean Cribbs]&lt;br /&gt;* Caching no longer stores the headers and body in the same file [Daniel&lt;br /&gt;  Shepherd]&lt;br /&gt;* Added support for the X-Sendfile header that works in conjunction with&lt;br /&gt;  caching to speed it up (by default X-Sendfile support is off) [Daniel&lt;br /&gt;  Shepherd]&lt;br /&gt;* Moved the images and stylesheets into images/admin and&lt;br /&gt;  stylesheets/admin respectively to make it easier for Radiant's assets&lt;br /&gt;  to coexist easily with the site's assets&lt;br /&gt;* Improved the Javascript that automatically updates the slug and&lt;br /&gt;  breadcrumb based off of the title so that it now response to all&lt;br /&gt;  change events&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3059015612137649698-5304141134198021697?l=vpanchal.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vpanchal.blogspot.com/feeds/5304141134198021697/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3059015612137649698&amp;postID=5304141134198021697' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3059015612137649698/posts/default/5304141134198021697'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3059015612137649698/posts/default/5304141134198021697'/><link rel='alternate' type='text/html' href='http://vpanchal.blogspot.com/2007/07/whats-new-in-radiant.html' title='WHAT&apos;S NEW IN  RADIANT'/><author><name>Vijayta Panchal</name><uri>http://www.blogger.com/profile/04140284328285563574</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3059015612137649698.post-608143964665219305</id><published>2007-07-12T01:36:00.001-07:00</published><updated>2007-07-12T01:36:32.613-07:00</updated><title type='text'>Radiant CMS, Managing Web Sites on Rails</title><content type='html'>&lt;p&gt;Managing the content of a web site is still a painful task, more that 10 years after the web took of. Web site management is an holy grail and Content Management Systems (CMS) have try to fill the gap without much success… &lt;/p&gt;  &lt;p&gt;&lt;span id="more-104"&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;The problem is that mostly all Open Source CMS you can find are generally too complex. They want to achieve everything possible with an unique system. That leads to too many screens, too many options and too many plugins… Non expert people just can’t use those geeky systems and it’s very hard to train people on how to use the admin interface…&lt;/p&gt;  &lt;p&gt;Here comes &lt;a href="http://radiantcms.org/"&gt;Radiant&lt;/a&gt;, an Open Source CMS made with Ruby on Rails. Radiant is more pragmatic and adopted a “less is more” philosophy. It focus on managing medium-size web sites with a page-centric approach that most people are used to.&lt;/p&gt;  &lt;p&gt;The project is in early stages of development but already useable. It been able to power a web site I’m building in only 1 hour. I’ve put all my content into Radiant, pages, templates, styles and so on. Everything is in the system and I can manage it right from the administration interface. Neat!&lt;/p&gt;  &lt;p&gt;The administration interface included with Radiant is simple enough for people to understand it… One of the real value of Radiant. &lt;/p&gt;  &lt;p&gt;Concerning development, I needed a French localized interface for my web site and I’ve been able to submit a patch in no time. Since Radiant is written with Ruby on Rails, it’s quite extensible and you can use any plugin developed for Rails such as &lt;a href="http://rubyforge.org/projects/gloc"&gt;GLoc&lt;/a&gt;.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3059015612137649698-608143964665219305?l=vpanchal.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vpanchal.blogspot.com/feeds/608143964665219305/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3059015612137649698&amp;postID=608143964665219305' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3059015612137649698/posts/default/608143964665219305'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3059015612137649698/posts/default/608143964665219305'/><link rel='alternate' type='text/html' href='http://vpanchal.blogspot.com/2007/07/radiant-cms-managing-web-sites-on-rails_12.html' title='Radiant CMS, Managing Web Sites on Rails'/><author><name>Vijayta Panchal</name><uri>http://www.blogger.com/profile/04140284328285563574</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3059015612137649698.post-8244760542282030946</id><published>2007-07-12T01:26:00.000-07:00</published><updated>2007-07-12T01:27:19.698-07:00</updated><title type='text'>Radiant is an awesome CMS</title><content type='html'>&lt;p&gt;I think &lt;a href="http://radiantcms.org/"&gt;Radiant&lt;/a&gt; is an awesome CMS, the clean interface, helpful community, and benefits of Ruby on Rails make it shine in the world of bloated, clunky CMS systems.&lt;/p&gt;  &lt;p&gt;Knowing Ruby and Rails makes it easy to extended and customize. This new &lt;em&gt;Extentions&lt;/em&gt; concept is a step forward from the old &lt;em&gt;Behaviors&lt;/em&gt;. Being able to essentially &lt;strong&gt;embedd your Ruby on Rails applications into the CMS&lt;/strong&gt; is a dream. I really think this CMS is will continue to lead the pack in the Ruby based CMS solutions.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3059015612137649698-8244760542282030946?l=vpanchal.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vpanchal.blogspot.com/feeds/8244760542282030946/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3059015612137649698&amp;postID=8244760542282030946' title='85 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3059015612137649698/posts/default/8244760542282030946'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3059015612137649698/posts/default/8244760542282030946'/><link rel='alternate' type='text/html' href='http://vpanchal.blogspot.com/2007/07/radiant-is-awesome-cms.html' title='Radiant is an awesome CMS'/><author><name>Vijayta Panchal</name><uri>http://www.blogger.com/profile/04140284328285563574</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>85</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3059015612137649698.post-6785190255576099995</id><published>2007-07-10T03:51:00.000-07:00</published><updated>2007-07-10T03:53:47.454-07:00</updated><title type='text'>Exploring the Radiant CMS</title><content type='html'>&lt;p&gt;&lt;strong&gt;If you are a Ruby on Rails developer you should learn about Radiant.&lt;/strong&gt;&lt;/p&gt;    &lt;p&gt;(If you are a non-developer looking for a good &lt;span class="caps"&gt;CMS&lt;/span&gt;, befriend a Rails developer to get some help with the install.)&lt;/p&gt;    &lt;p&gt;Simple as that, it’s a very good &lt;span class="caps"&gt;CMS&lt;/span&gt;. It manages to stay simple enough to be useful for most kinds of sites instead of packing so many bells and whistles that you get lost immediately (I’m looking at you, Textpattern).&lt;/p&gt;    &lt;h2&gt;The Good&lt;/h2&gt;    &lt;p&gt;Radiant has a good interface, and is extremely easy to navigate and use. I like that it has several text filters (including my favorite, Textile), and that is also makes it easy to assign pages layouts and behaviors.&lt;/p&gt;    &lt;p&gt;The hierarchical pages are well done, and upon clicking on the Pages tab it is immediately clear how the website is organized.&lt;/p&gt;    &lt;p&gt;Snippets make perfect sense, and are easy to use.&lt;/p&gt;    &lt;p&gt;While it took me a bit to get used to Radius tags, it is the best solution I’ve seen to giving power to the user to sprinkle in bits of code without having to actually touch the underlying ruby code of the application.&lt;/p&gt;    &lt;p&gt;I was also pleased to see that Radiant uses a lot of the caching power of Rails and caches content pages as static &lt;span class="caps"&gt;YAML&lt;/span&gt; files.  This bodes well for Radiant’s ability to work as a &lt;span class="caps"&gt;CMS&lt;/span&gt; for heavily trafficked websites.&lt;/p&gt;    &lt;h2&gt;The Bad&lt;/h2&gt;    &lt;p&gt;I have a few gripes as well about Radiant, but luckily many are being addressed.&lt;/p&gt;    &lt;p&gt;There is no way yet to upload images and files, but the Radiant dev says that is it being addressed, so it should show up in a later release. Current you just have to manually put any resources like those in the public directory.&lt;/p&gt;    &lt;p&gt;Also right now Stylesheets must exist as a mix of a layout and pages. I’d like to see Stylesheets given their own tab in the interface and the ability to assign stylesheets to layouts and pages the same way layouts are assigned to pages.&lt;/p&gt;    &lt;p&gt;There is also very little documentation for Radiant, but this is such a new project that documentation will come with time. I plan to write an installation tutorial for Radiant to help with this disparity.&lt;/p&gt;    &lt;h2&gt;The Ugly&lt;/h2&gt;    &lt;p&gt;My one gripe with Radiant is really just a wart it gets from being a Rails app, and not anything inherently bad with Radiant inself. Deploying a Rails app of any kind still requires some experience with the framework and hosting services. You need to know how to set up Apache / Lighttpd, how to edit your database.yml correctly, and run any setup scripts to give your database any base data.&lt;/p&gt;    &lt;p&gt;This is something that Rails core team knows about, and the deployment tutorials across the web are getting better and better. Shared hosts are also getting more comfortable with Rails as well, which is easing much of the pain. I’m confident many Rails deployment challenges will be solved within the coming year.&lt;/p&gt;    &lt;h2&gt;Final Notes&lt;/h2&gt;    &lt;p&gt;I still believe that content management systems are the best bridge we have right now to bring web developers, designers, and clients / users together. I also think &lt;span class="caps"&gt;WYSIWYG&lt;/span&gt; webdesign programs are responsible for a lot of problems that content management systems solve nicely (Frontpage still makes my eyes bleed).&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3059015612137649698-6785190255576099995?l=vpanchal.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vpanchal.blogspot.com/feeds/6785190255576099995/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3059015612137649698&amp;postID=6785190255576099995' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3059015612137649698/posts/default/6785190255576099995'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3059015612137649698/posts/default/6785190255576099995'/><link rel='alternate' type='text/html' href='http://vpanchal.blogspot.com/2007/07/exploring-radiant-cms.html' title='Exploring the Radiant CMS'/><author><name>Vijayta Panchal</name><uri>http://www.blogger.com/profile/04140284328285563574</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3059015612137649698.post-5741071586187245466</id><published>2007-07-10T00:28:00.000-07:00</published><updated>2007-07-10T00:29:07.822-07:00</updated><title type='text'>Radiant Overview</title><content type='html'>&lt;div class="feature"&gt; &lt;img src="http://radiantcms.org/images/features/admin.jpg" alt="" /&gt; &lt;h3&gt;Simple Admin Interface&lt;/h3&gt; &lt;p&gt;Built from the ground up to be as simple as possible, Radiant features an elegant administrative interface that centers around three key components: &lt;strong&gt;pages&lt;/strong&gt;, &lt;strong&gt;snippets&lt;/strong&gt;, and &lt;strong&gt;layouts&lt;/strong&gt;.&lt;/p&gt; &lt;/div&gt;  &lt;div class="feature"&gt; &lt;img src="http://radiantcms.org/images/features/pages.jpg" alt="" /&gt; &lt;h3&gt;Pages&lt;/h3&gt; &lt;p&gt;Pages contain the meat of the content for a Web site and may use &lt;a href="http://daringfireball.net/projects/markdown/"&gt;Markdown&lt;/a&gt;, &lt;a href="http://www.textism.com/tools/textile/"&gt;Textile&lt;/a&gt;, or plain &lt;span class="caps"&gt;&lt;span class="caps"&gt;HTML&lt;/span&gt;&lt;/span&gt;. Pages are composed of &lt;strong&gt;multiple parts&lt;/strong&gt; such as a body and sidebar.&lt;/p&gt; &lt;/div&gt;  &lt;div class="feature"&gt; &lt;img src="http://radiantcms.org/images/features/snippets.jpg" alt="" /&gt; &lt;h3&gt;Snippets&lt;/h3&gt; &lt;p&gt;Content that is used in multiple places can be stored in a snippet. Snippets are very similar to &lt;span class="caps"&gt;&lt;span class="caps"&gt;PHP&lt;/span&gt;&lt;/span&gt; &lt;strong&gt;includes&lt;/strong&gt; or Rails &lt;strong&gt;partials&lt;/strong&gt;.&lt;/p&gt; &lt;/div&gt;  &lt;div class="feature"&gt; &lt;img src="http://radiantcms.org/images/features/layouts.jpg" alt="" /&gt; &lt;h3&gt;Layouts&lt;/h3&gt; &lt;p&gt;Layouts generally contain most of the &lt;span class="caps"&gt;&lt;span class="caps"&gt;HTML&lt;/span&gt;&lt;/span&gt; for a page’s design. Layouts can render pages parts in any way they choose. One layout could choose to render the body and sidebar of a page, while another layout (a print layout) could render only the body.&lt;/p&gt; &lt;/div&gt;  &lt;div class="feature"&gt; &lt;img src="http://radiantcms.org/images/features/site-hierarchy.jpg" alt="" /&gt; &lt;h3&gt;Flexible Site Structure&lt;/h3&gt; &lt;p&gt;Unlike many other blogging engines Radiant allows you to arrange pages according to any hierarchy. A Weblog in Radiant can be as simple as a collection of child pages underneath a parent page.&lt;/p&gt; &lt;/div&gt;  &lt;div class="feature"&gt; &lt;img src="http://radiantcms.org/images/features/radius.jpg" alt="" /&gt; &lt;h3&gt;Radius Template Language&lt;/h3&gt; &lt;p&gt;Radiant has a special macro language (similar to &lt;span class="caps"&gt;&lt;span class="caps"&gt;HTML&lt;/span&gt;&lt;/span&gt;) called Radius which makes it easy to include content from other pages, iterate over page children, and display content conditionally. Radius tags are available in &lt;strong&gt;pages&lt;/strong&gt;, &lt;strong&gt;snippets&lt;/strong&gt;, and &lt;strong&gt;layouts&lt;/strong&gt;.&lt;/p&gt; &lt;/div&gt;  &lt;div class="feature"&gt; &lt;img src="http://radiantcms.org/images/features/filters.jpg" alt="" /&gt; &lt;h3&gt;Custom Text Filters&lt;/h3&gt; &lt;p&gt;Radiant ships with support for Markdown and Textile, but developers can easily create text filters for any markup language such as RDoc, BBCode, or Structured Text.&lt;/p&gt; &lt;/div&gt;  &lt;div class="feature"&gt; &lt;img src="http://radiantcms.org/images/features/caching.jpg" alt="" /&gt; &lt;h3&gt;Intelligent Page Caching&lt;/h3&gt; &lt;p&gt;Radiant includes an intelligent caching mechanism which allows content to be cached for a maximum of &lt;strong&gt;5 minutes&lt;/strong&gt;. This ensures that content is always fresh and provides an optimal level of performance.&lt;/p&gt; &lt;/div&gt;  &lt;div class="feature"&gt; &lt;img src="http://radiantcms.org/images/features/rails.jpg" alt="" /&gt; &lt;h3&gt;Built with Ruby on Rails&lt;/h3&gt; &lt;p&gt;Radiant is built using &lt;a href="http://rubyonrails.com/"&gt;Ruby on Rails&lt;/a&gt;. This means it’s easy for developers to extend Radiant because it’s built on a widely accepted (and understood) Web application development platform.&lt;/p&gt; &lt;/div&gt;  &lt;div class="feature"&gt; &lt;img src="http://radiantcms.org/images/features/license.jpg" alt="" /&gt; &lt;h3&gt;Licensed Under the &lt;span class="caps"&gt;&lt;span class="caps"&gt;MIT&lt;/span&gt;&lt;/span&gt; License&lt;/h3&gt; &lt;p&gt;Radiant is licensed under the &lt;a href="http://dev.radiantcms.org/radiant/browser/trunk/radiant/LICENSE"&gt;&lt;span class="caps"&gt;MIT&lt;/span&gt; License&lt;/a&gt;. This means that Radiant is &lt;strong&gt;free&lt;/strong&gt; for &lt;strong&gt;commercial and non-profit&lt;/strong&gt; use. It also means that you are free to modify and distribute Radiant as long as you don’t remove the appropriate notices from the source code.&lt;/p&gt; &lt;/div&gt;  &lt;div id="highlight"&gt; &lt;p&gt;&lt;strong&gt;Not impressed yet?&lt;/strong&gt; Try the &lt;a href="http://radiantcms.org/demo/"&gt;live demo&lt;/a&gt;.&lt;/p&gt; &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3059015612137649698-5741071586187245466?l=vpanchal.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vpanchal.blogspot.com/feeds/5741071586187245466/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3059015612137649698&amp;postID=5741071586187245466' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3059015612137649698/posts/default/5741071586187245466'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3059015612137649698/posts/default/5741071586187245466'/><link rel='alternate' type='text/html' href='http://vpanchal.blogspot.com/2007/07/radiant-overview.html' title='Radiant Overview'/><author><name>Vijayta Panchal</name><uri>http://www.blogger.com/profile/04140284328285563574</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3059015612137649698.post-3029573522421210516</id><published>2007-07-10T00:01:00.000-07:00</published><updated>2007-07-10T00:02:37.772-07:00</updated><title type='text'>How To: Understanding Radius Tags</title><content type='html'>&lt;p&gt;Ever wondered how Radiant does its magic? What do all those tags mean and how do they make stuff happen? How to use the tags has already &lt;a href="http://radiantcms.org/blog/2006/05/11/tag-primer/"&gt;&lt;span style=""&gt;been&lt;/span&gt;&lt;/a&gt; &lt;a href="http://radiantcms.org/blog/2006/06/15/tag-primer-2/"&gt;&lt;span style=""&gt;discussed&lt;/span&gt;&lt;/a&gt;, but not how they work.&lt;/p&gt;  &lt;p&gt;In the second of our “How To” series, I’m going to walk you through how to read and understand Radiant’s Radius tag definitions (i.e. code). For this How To, it helps to understand Ruby and know some stuff about Rails, but just in case you don’t, I’ll fill you in on the needed knowledge as we go.&lt;/p&gt;  &lt;h2&gt;Reading and Understanding Tags&lt;/h2&gt;  &lt;p&gt;Radius tags are what give you the hooks into cool functionality offered by Radiant. There are a number of tags which are available to every page and some that are specific to individual behaviors. Let’s start by analyzing one of the built-in tags that can be found in the file &lt;code&gt;&lt;span style="font-size: 10pt;"&gt;app/models/page_context.rb&lt;/span&gt;&lt;/code&gt;. These tags are available to any page, snippet, or layout in Radiant.&lt;/p&gt;  &lt;h3&gt;Anatomy of a Tag Definition: &lt;code&gt;&lt;span style="font-size: 10pt; line-height: 115%;"&gt;r:content&lt;/span&gt;&lt;/code&gt;&lt;/h3&gt;  &lt;p&gt;The &lt;code&gt;&lt;span style="font-size: 10pt;"&gt;r:content&lt;/span&gt;&lt;/code&gt; tag in Radiant displays the content of a given “part” of a page—those tabs you see when you are editing one. With no &lt;code&gt;&lt;span style="font-size: 10pt;"&gt;part&lt;/span&gt;&lt;/code&gt; attribute specified, it will display the “body” part/tab. Let’s take a look at how it works.&lt;/p&gt;  &lt;p&gt;If you want to follow along, please look at the source of &lt;a href="http://dev.radiantcms.org/radiant/browser/trunk/radiant/app/models/page_context.rb"&gt;&lt;code&gt;&lt;span style="font-size: 10pt;"&gt;page_context.rb&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; around line 194. This is a fairly complex tag, but we’ll take it slow.&lt;/p&gt;  &lt;pre&gt;&lt;code&gt;&lt;span style=""&gt;  &lt;/span&gt;define_tag 'content' do |tag|&lt;span style=""&gt;  &lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;  &lt;p&gt;This is the standard tag definition. It begins with &lt;code&gt;&lt;span style="font-size: 10pt;"&gt;define_tag&lt;/span&gt;&lt;/code&gt; which says we’re going to define a new tag. The next thing is &lt;code&gt;&lt;span style="font-size: 10pt;"&gt;'content'&lt;/span&gt;&lt;/code&gt;, which is the name of the tag. If this tag were scoped (we’ll talk about that more below), like &lt;code&gt;&lt;span style="font-size: 10pt;"&gt;children:each&lt;/span&gt;&lt;/code&gt;, we would have a string of colon-separated names. The next two things are &lt;code&gt;&lt;span style="font-size: 10pt;"&gt;do |tag|&lt;/span&gt;&lt;/code&gt; which signifies we’re going to start a block that has a single parameter named &lt;code&gt;&lt;span style="font-size: 10pt;"&gt;tag&lt;/span&gt;&lt;/code&gt;. Blocks are a Ruby feature that lets you define code that can be reused in different contexts, kind of like anonymous functions in Java or Javascript. For our purposes, though, just know that the &lt;code&gt;&lt;span style="font-size: 10pt;"&gt;do |tag|&lt;/span&gt;&lt;/code&gt; means, “here comes the tag definition, so listen up and give me a hook into the context called &lt;code&gt;&lt;span style="font-size: 10pt;"&gt;tag&lt;/span&gt;&lt;/code&gt;”.&lt;/p&gt;  &lt;p&gt;This type of declaration is only valid in PageContext, whereas in your cool new behavior that you’ll be writing after this How To, the same tag would look like:&lt;/p&gt;  &lt;pre&gt;&lt;code&gt;&lt;span style=""&gt;  &lt;/span&gt;define_tags do&lt;o:p&gt;&lt;/o:p&gt;&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code&gt;&lt;span style=""&gt;    &lt;/span&gt;tag 'content' do |tag|&lt;o:p&gt;&lt;/o:p&gt;&lt;/code&gt;&lt;/pre&gt;  &lt;p&gt;This is a subtle difference, but one to take note of. Also notice that the declaration in &lt;code&gt;&lt;span style="font-size: 10pt;"&gt;PageContext&lt;/span&gt;&lt;/code&gt; takes place in the &lt;code&gt;&lt;span style="font-size: 10pt;"&gt;initialize&lt;/span&gt;&lt;/code&gt; method, whereas the second one would be at the class level of your behavior (i.e. not inside &lt;code&gt;&lt;span style="font-size: 10pt;"&gt;initialize&lt;/span&gt;&lt;/code&gt;). If that last sentence is gibberish to you, don’t worry about it; you don’t need to understand that to get the rest of this How To.&lt;/p&gt;  &lt;p&gt;The end of each tag definition is marked by the &lt;code&gt;&lt;span style="font-size: 10pt;"&gt;end&lt;/span&gt;&lt;/code&gt; keyword, which you can see on line 216 (Actually, all blocks like these are terminated with &lt;code&gt;&lt;span style="font-size: 10pt;"&gt;end&lt;/span&gt;&lt;/code&gt;).&lt;/p&gt;  &lt;p&gt;Okay, now that we have our tag definition started, let’s look at what happens next. We’ll take the first two lines.&lt;/p&gt;  &lt;pre&gt;&lt;code&gt;&lt;span style=""&gt;  &lt;/span&gt;page = tag.locals.page &lt;o:p&gt;&lt;/o:p&gt;&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code&gt;&lt;span style=""&gt;  &lt;/span&gt;part_name = tag_part_name(tag)&lt;/code&gt;&lt;/pre&gt;  &lt;p&gt;The first line creates a variable named &lt;code&gt;&lt;span style="font-size: 10pt;"&gt;page&lt;/span&gt;&lt;/code&gt; that refers to &lt;code&gt;&lt;span style="font-size: 10pt;"&gt;tag.locals.page&lt;/span&gt;&lt;/code&gt;. The nice thing about the &lt;code&gt;&lt;span style="font-size: 10pt;"&gt;tag&lt;/span&gt;&lt;/code&gt; parameter that gets passed in is all the goodies that come along with it. &lt;code&gt;&lt;span style="font-size: 10pt;"&gt;tag.locals&lt;/span&gt;&lt;/code&gt; is a collection of variables that refer to the current context, and were set by tags that occur outside the current tag. So if you need to get information about where you are and what’s around, &lt;code&gt;&lt;span style="font-size: 10pt;"&gt;tag.locals&lt;/span&gt;&lt;/code&gt; will tell you. In this case, we’re grabbing the &lt;code&gt;&lt;span style="font-size: 10pt;"&gt;page&lt;/span&gt;&lt;/code&gt; variable to figure out what the current page is. Interestingly enough, the &lt;code&gt;&lt;span style="font-size: 10pt;"&gt;page&lt;/span&gt;&lt;/code&gt; variable refers to a Rails model named &lt;code&gt;&lt;span style="font-size: 10pt;"&gt;Page&lt;/span&gt;&lt;/code&gt;. (Models are objects that abstract and encapsulate information that a web application (RadiantCMS) uses. In this case, it’s a web page that you can browse to.)&lt;/p&gt;  &lt;p&gt;So once we have this &lt;code&gt;&lt;span style="font-size: 10pt;"&gt;Page&lt;/span&gt;&lt;/code&gt;, we can get all kinds of information about what content was typed into the current page, when it was published, who wrote it, etc. The next line calls a function that extracts the designated part. Parts, or &lt;code&gt;&lt;span style="font-size: 10pt;"&gt;PagePart&lt;/span&gt;&lt;/code&gt; models, are the tabs that you see when editing a page. The second line of code will call a custom function that gives us the value of the tag’s attribute &lt;code&gt;&lt;span style="font-size: 10pt;"&gt;part&lt;/span&gt;&lt;/code&gt;. Jump down to line 508 to see what the function does. The function clues us into another useful item on the &lt;code&gt;&lt;span style="font-size: 10pt;"&gt;tag&lt;/span&gt;&lt;/code&gt; variable, &lt;code&gt;&lt;span style="font-size: 10pt;"&gt;tag.attr&lt;/span&gt;&lt;/code&gt;. This gives us access to the attributes that the user put on the tag in their page. The function grabs the “part” attribute, or in case it wasn’t defined, gives us “body”. Head back to line 197 and we’ll go on.&lt;/p&gt;  &lt;pre&gt;&lt;code&gt;&lt;span style=""&gt;  &lt;/span&gt;boolean_attr = proc do |attribute_name, default| &lt;o:p&gt;&lt;/o:p&gt;&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code&gt;&lt;span style=""&gt;    &lt;/span&gt;attribute = (tag.attr[attribute_name] || default).to_s &lt;o:p&gt;&lt;/o:p&gt;&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code&gt;&lt;span style=""&gt;    &lt;/span&gt;raise TagError.new(%{`#{attribute_name}' attribute of `content' tag must be set to either "true" or "false"}) unless attribute =~ /true|false/i &lt;o:p&gt;&lt;/o:p&gt;&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code&gt;&lt;span style=""&gt;    &lt;/span&gt;(attribute.downcase == 'true') ? true : false &lt;o:p&gt;&lt;/o:p&gt;&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code&gt;&lt;span style=""&gt;  &lt;/span&gt;end&lt;/code&gt;&lt;/pre&gt;  &lt;p&gt;We’re going to gloss over these lines a little bit because they involve some Ruby “magic”. Remember when I talked about blocks before? Here we’re defining a block inline and assigning it to a variable so we can use it later in the tag definition. Overall, this code says:&lt;/p&gt;  &lt;ol start="1" type="1"&gt;&lt;li class="MsoNormal" style="line-height: normal;"&gt;Make me a      block with two parameters, &lt;code&gt;&lt;span style="font-size: 10pt;"&gt;attribute_name&lt;/span&gt;&lt;/code&gt;      and &lt;code&gt;&lt;span style="font-size: 10pt;"&gt;default&lt;/span&gt;&lt;/code&gt;, and hold onto      that block in the variable &lt;code&gt;&lt;span style="font-size: 10pt;"&gt;boolean_attr&lt;/span&gt;&lt;/code&gt;.&lt;/li&gt;&lt;li class="MsoNormal" style="line-height: normal;"&gt;Inside      this block, grab the tag’s attribute of the name that we passed in and      keep a copy of it, or the default value, in the &lt;code&gt;&lt;span style="font-size: 10pt;"&gt;attribute&lt;/span&gt;&lt;/code&gt; variable.&lt;/li&gt;&lt;li class="MsoNormal" style="line-height: normal;"&gt;If      somebody gave us something other than “true” or “false”, throw up a red      flag (&lt;code&gt;&lt;span style="font-size: 10pt;"&gt;TagError&lt;/span&gt;&lt;/code&gt;).&lt;/li&gt;&lt;li class="MsoNormal" style="line-height: normal;"&gt;Assuming      there’s no error, if the attribute is the text “true”, give me back the      boolean &lt;code&gt;&lt;span style="font-size: 10pt;"&gt;true&lt;/span&gt;&lt;/code&gt; value, otherwise      give me &lt;code&gt;&lt;span style="font-size: 10pt;"&gt;false&lt;/span&gt;&lt;/code&gt;.&lt;/li&gt;&lt;/ol&gt;  &lt;p&gt;If you look at the next line, we can see how the block we just created is used.&lt;/p&gt;  &lt;pre&gt;&lt;code&gt;&lt;span style=""&gt;  &lt;/span&gt;inherit = boolean_attr['inherit', false]&lt;/code&gt;&lt;/pre&gt;  &lt;p&gt;This says, get the value of the attribute “inherit” as a boolean or give me false, then store it into our local variable “inherit”. The “inherit” attribute on the &lt;code&gt;&lt;span style="font-size: 10pt;"&gt;r:content&lt;/span&gt;&lt;/code&gt; tag says that if the selected page part doesn’t exist, get whatever the parent or closest ancestor page has; and that’s exactly what the next few lines of code do.&lt;/p&gt;  &lt;pre&gt;&lt;code&gt;&lt;span style=""&gt;  &lt;/span&gt;part_page = page &lt;o:p&gt;&lt;/o:p&gt;&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code&gt;&lt;span style=""&gt;  &lt;/span&gt;if inherit &lt;o:p&gt;&lt;/o:p&gt;&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code&gt;&lt;span style=""&gt;    &lt;/span&gt;while (part_page.part(part_name).nil? and (not part_page.parent.nil?)) do &lt;o:p&gt;&lt;/o:p&gt;&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code&gt;&lt;span style=""&gt;      &lt;/span&gt;part_page = part_page.parent &lt;o:p&gt;&lt;/o:p&gt;&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code&gt;&lt;span style=""&gt;    &lt;/span&gt;end &lt;o:p&gt;&lt;/o:p&gt;&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code&gt;&lt;span style=""&gt;  &lt;/span&gt;end&lt;/code&gt;&lt;/pre&gt;  &lt;ol start="1" type="1"&gt;&lt;li class="MsoNormal" style="line-height: normal;"&gt;Start with      the current page, store it in &lt;code&gt;&lt;span style="font-size: 10pt;"&gt;part_page&lt;/span&gt;&lt;/code&gt;.&lt;/li&gt;&lt;li class="MsoNormal" style="line-height: normal;"&gt;If we’re      supposed to inherit the content from an ancestor page,&lt;/li&gt;&lt;li class="MsoNormal" style="line-height: normal;"&gt;Search      through the ancestor pages until one of them has the required part and      hold onto that in &lt;code&gt;&lt;span style="font-size: 10pt;"&gt;part_page&lt;/span&gt;&lt;/code&gt;.&lt;/li&gt;&lt;/ol&gt;  &lt;p&gt;The next line checks another boolean attribute, this time it’s &lt;code&gt;&lt;span style="font-size: 10pt;"&gt;contextual&lt;/span&gt;&lt;/code&gt;.&lt;/p&gt;  &lt;pre&gt;&lt;code&gt;&lt;span style=""&gt;  &lt;/span&gt;contextual = boolean_attr['contextual', true]&lt;/code&gt;&lt;/pre&gt;  &lt;p&gt;The &lt;code&gt;&lt;span style="font-size: 10pt;"&gt;contextual&lt;/span&gt;&lt;/code&gt; attribute says whether an inherited page part, that is, if the current page doesn’t have it and we used the &lt;code&gt;&lt;span style="font-size: 10pt;"&gt;inherited&lt;/span&gt;&lt;/code&gt; attribute, should be rendered in the context of the &lt;em&gt;current&lt;/em&gt; page. In most cases, this is what we want, so it defaults to true. If it’s false, we’ll render it in the context of the page it belongs to.&lt;/p&gt;  &lt;p&gt;Our next section of code &lt;em&gt;finally&lt;/em&gt; does the output of the content, now that we’re all prepared.&lt;/p&gt;  &lt;pre&gt;&lt;code&gt;&lt;span style=""&gt;  &lt;/span&gt;if inherit and contextual &lt;o:p&gt;&lt;/o:p&gt;&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code&gt;&lt;span style=""&gt;    &lt;/span&gt;part = part_page.part(part_name) &lt;o:p&gt;&lt;/o:p&gt;&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code&gt;&lt;span style=""&gt;    &lt;/span&gt;page.behavior.render_snippet(part) unless part.nil? &lt;o:p&gt;&lt;/o:p&gt;&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code&gt;&lt;span style=""&gt;  &lt;/span&gt;else &lt;o:p&gt;&lt;/o:p&gt;&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code&gt;&lt;span style=""&gt;    &lt;/span&gt;part_page.behavior.render_page_part(part_name) &lt;o:p&gt;&lt;/o:p&gt;&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code&gt;&lt;span style=""&gt;  &lt;/span&gt;end&lt;/code&gt;&lt;/pre&gt;  &lt;p&gt;A quick analysis:&lt;/p&gt;  &lt;ol start="1" type="1"&gt;&lt;li class="MsoNormal" style="line-height: normal;"&gt;If we      inherited the part and we’re rendering it in the context of the current      page, &lt;/li&gt;&lt;ol start="1" type="1"&gt;&lt;li class="MsoNormal" style="line-height: normal;"&gt;Get       the part of the page that we found.&lt;/li&gt;&lt;li class="MsoNormal" style="line-height: normal;"&gt;Use       the current page’s behavior to render the part, unless it’s empty.&lt;/li&gt;&lt;/ol&gt;&lt;li class="MsoNormal" style="line-height: normal;"&gt;Otherwise,      render the page part in the context of the page it came from.&lt;/li&gt;&lt;/ol&gt;  &lt;p&gt;There you have it! An analysis of one of the built-in tag definitions.&lt;/p&gt;  &lt;h3&gt;Tying up Loose Ends&lt;/h3&gt;  &lt;p&gt;We saw a lot of code above, but unfortunately, we didn’t see everything you’ll need to know to read tag definitions or to create your own. Here’s a few more pointers.&lt;/p&gt;  &lt;ul type="disc"&gt;&lt;li class="MsoNormal" style="line-height: normal;"&gt;&lt;code&gt;&lt;span style="font-size: 10pt;"&gt;tag.locals&lt;/span&gt;&lt;/code&gt; is very flexible, and anything you      set will be available to any tags nested inside the current one. So, if      you want all the containing tags to have access to your local &lt;code&gt;&lt;span style="font-size: 10pt;"&gt;foo&lt;/span&gt;&lt;/code&gt; variable, set &lt;code&gt;&lt;span style="font-size: 10pt;"&gt;tag.locals.foo      = foo&lt;/span&gt;&lt;/code&gt; and then those tags can access it. Set &lt;code&gt;&lt;span style="font-size: 10pt;"&gt;tag.locals.page&lt;/span&gt;&lt;/code&gt; if you want to tell containing      tags to refer to a different page. This is how &lt;code&gt;&lt;span style="font-size: 10pt;"&gt;r:children:each&lt;/span&gt;&lt;/code&gt; works.&lt;/li&gt;&lt;li class="MsoNormal" style="line-height: normal;"&gt;&lt;code&gt;&lt;span style="font-size: 10pt;"&gt;tag.globals&lt;/span&gt;&lt;/code&gt; works just like &lt;code&gt;&lt;span style="font-size: 10pt;"&gt;tag.locals&lt;/span&gt;&lt;/code&gt;, except it generally isn’t changed      in the context. If you want the current page that is being rendered      (ignoring the context), access &lt;code&gt;&lt;span style="font-size: 10pt;"&gt;tag.globals.page&lt;/span&gt;&lt;/code&gt;.&lt;/li&gt;&lt;li class="MsoNormal" style="line-height: normal;"&gt;&lt;code&gt;&lt;span style="font-size: 10pt;"&gt;tag.attr&lt;/span&gt;&lt;/code&gt;, as we saw above, contains key-value      pairs for every attribute that the author put on the Radius tag. So if I      wrote &lt;code&gt;&lt;span style="font-size: 10pt;"&gt;&lt;r:content part="mine"&gt;&lt;/span&gt;&lt;/code&gt;, the &lt;code&gt;&lt;span style="font-size: 10pt;"&gt;tag.attr['part']&lt;/span&gt;&lt;/code&gt;      would be assigned “mine” inside the ‘content’ tag definition.&lt;/li&gt;&lt;li class="MsoNormal" style="line-height: normal;"&gt;Whatever      is mentioned on the last line of the tag definition is what will be passed      back to the parent tags in the nesting order, and ultimately output on      your page. So if I created a tag like so: &lt;/li&gt;&lt;/ul&gt;  &lt;pre style="margin-left: 0.5in; text-indent: -0.25in;"&gt;&lt;!--[if !supportLists]--&gt;&lt;code&gt;&lt;span style="font-family: Symbol;"&gt;&lt;span style=""&gt;·&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;"&gt;         &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;!--[endif]--&gt;&lt;code&gt;&lt;span style=""&gt;  &lt;/span&gt;define_tag "foo" do |tag|&lt;o:p&gt;&lt;/o:p&gt;&lt;/code&gt;&lt;/pre&gt;&lt;pre style="margin-left: 0.5in; text-indent: -0.25in;"&gt;&lt;!--[if !supportLists]--&gt;&lt;code&gt;&lt;span style="font-family: Symbol;"&gt;&lt;span style=""&gt;·&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;"&gt;         &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;!--[endif]--&gt;&lt;code&gt;&lt;span style=""&gt;    &lt;/span&gt;"bar" &lt;o:p&gt;&lt;/o:p&gt;&lt;/code&gt;&lt;/pre&gt;&lt;pre style="margin-left: 0.5in;"&gt;&lt;code&gt;&lt;span style=""&gt;  &lt;/span&gt;end&lt;/code&gt;&lt;/pre&gt;  &lt;p class="MsoNormal" style="margin-left: 0.5in;"&gt;It would output “bar” (without the quotes) anytime I use the &lt;code&gt;&lt;span style="font-size: 10pt; line-height: 115%;"&gt;r:foo&lt;/span&gt;&lt;/code&gt; tag in a page.&lt;/p&gt;  &lt;ul type="disc"&gt;&lt;li class="MsoNormal" style="line-height: normal;"&gt;You can      find out if the tag was called as a singleton or a container (singleton      tags end in a slash and don’t contain other tags). If it’s a singleton      tag, &lt;code&gt;&lt;span style="font-size: 10pt;"&gt;tag.single?&lt;/span&gt;&lt;/code&gt; will return      true, if it’s a container, &lt;code&gt;&lt;span style="font-size: 10pt;"&gt;tag.double?&lt;/span&gt;&lt;/code&gt; will      return true.&lt;/li&gt;&lt;li class="MsoNormal" style="line-height: normal;"&gt;Most tags      either output something or redefine the context and then pass on the      output to tags contained inside, or a little of both. To process the      output of the contained tags and text, we call &lt;code&gt;&lt;span style="font-size: 10pt;"&gt;tag.expand&lt;/span&gt;&lt;/code&gt;. Take, for example, this simple tag      definition that allows you to access the parent page: &lt;/li&gt;&lt;/ul&gt;  &lt;pre style="margin-left: 0.5in; text-indent: -0.25in;"&gt;&lt;!--[if !supportLists]--&gt;&lt;code&gt;&lt;span style="font-family: Symbol;"&gt;&lt;span style=""&gt;·&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;"&gt;         &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;!--[endif]--&gt;&lt;code&gt;&lt;span style=""&gt;  &lt;/span&gt;define_tag "parent" do |tag|&lt;o:p&gt;&lt;/o:p&gt;&lt;/code&gt;&lt;/pre&gt;&lt;pre style="margin-left: 0.5in; text-indent: -0.25in;"&gt;&lt;!--[if !supportLists]--&gt;&lt;code&gt;&lt;span style="font-family: Symbol;"&gt;&lt;span style=""&gt;·&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;"&gt;         &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;!--[endif]--&gt;&lt;code&gt;&lt;span style=""&gt;    &lt;/span&gt;tag.locals.page = tag.locals.page.parent&lt;o:p&gt;&lt;/o:p&gt;&lt;/code&gt;&lt;/pre&gt;&lt;pre style="margin-left: 0.5in; text-indent: -0.25in;"&gt;&lt;!--[if !supportLists]--&gt;&lt;code&gt;&lt;span style="font-family: Symbol;"&gt;&lt;span style=""&gt;·&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;"&gt;         &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;!--[endif]--&gt;&lt;code&gt;&lt;span style=""&gt;    &lt;/span&gt;tag.expand unless tag.locals.page.nil?&lt;o:p&gt;&lt;/o:p&gt;&lt;/code&gt;&lt;/pre&gt;&lt;pre style="margin-left: 0.5in;"&gt;&lt;code&gt;&lt;span style=""&gt;  &lt;/span&gt;end&lt;/code&gt;&lt;/pre&gt;  &lt;p class="MsoNormal" style="margin-left: 0.5in;"&gt;Notice how we reset the context to the parent page (assigned &lt;code&gt;&lt;span style="font-size: 10pt; line-height: 115%;"&gt;tag.locals.page&lt;/span&gt;&lt;/code&gt;), then evaluated the contents inside the &lt;code&gt;&lt;span style="font-size: 10pt; line-height: 115%;"&gt;r:parent&lt;/span&gt;&lt;/code&gt; tag if the parent page exists. &lt;/p&gt;  &lt;ul type="disc"&gt;&lt;li class="MsoNormal" style="line-height: normal;"&gt;In      addition to the context created by &lt;code&gt;&lt;span style="font-size: 10pt;"&gt;tag.locals&lt;/span&gt;&lt;/code&gt;,      tags can have a scoped context. This is signified by the colons in the tag      definition. The colons signify the nesting level of the tag. So if I write      this in my page, &lt;/li&gt;&lt;/ul&gt;  &lt;pre style="margin-left: 0.5in;"&gt;&lt;code&gt;&lt;span style=""&gt;  &lt;/span&gt;&lt;r:foo:bar&gt;&lt;/code&gt;&lt;/pre&gt;  &lt;p class="MsoNormal" style="margin-left: 0.5in;"&gt;Radiant would look for a tag definition for “foo:bar”, and if it can’t find that, one named “bar”. In addition to this, it will call the tag definition for “foo”, which &lt;em&gt;&lt;span style="font-family: &amp;quot;Calibri&amp;quot;,&amp;quot;sans-serif&amp;quot;;"&gt;should&lt;/span&gt;&lt;/em&gt; have a call to &lt;code&gt;&lt;span style="font-size: 10pt; line-height: 115%;"&gt;tag.expand&lt;/span&gt;&lt;/code&gt; which ultimately renders “foo:bar” or “bar”. So, in a sense, the above tag is equivalent to: &lt;/p&gt;  &lt;pre style="margin-left: 0.5in;"&gt;&lt;code&gt;&lt;span style=""&gt;  &lt;/span&gt;&lt;r:foo&gt;&lt;r:bar&gt;&lt;/r:foo&gt;&lt;/code&gt;&lt;/pre&gt;  &lt;p class="MsoNormal" style="margin-left: 0.5in;"&gt;In this way, you can redefine how certain tags are rendered in different nesting combinations. If I wanted to change how the &lt;code&gt;&lt;span style="font-size: 10pt; line-height: 115%;"&gt;r:link&lt;/span&gt;&lt;/code&gt; tag operates inside my &lt;code&gt;&lt;span style="font-size: 10pt; line-height: 115%;"&gt;foo&lt;/span&gt;&lt;/code&gt; tag, I’d create a tag definition for &lt;code&gt;&lt;span style="font-size: 10pt; line-height: 115%;"&gt;foo:link&lt;/span&gt;&lt;/code&gt;, then do what I want inside that tag definition.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3059015612137649698-3029573522421210516?l=vpanchal.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vpanchal.blogspot.com/feeds/3029573522421210516/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3059015612137649698&amp;postID=3029573522421210516' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3059015612137649698/posts/default/3029573522421210516'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3059015612137649698/posts/default/3029573522421210516'/><link rel='alternate' type='text/html' href='http://vpanchal.blogspot.com/2007/07/how-to-understanding-radius-tags.html' title='How To: Understanding Radius Tags'/><author><name>Vijayta Panchal</name><uri>http://www.blogger.com/profile/04140284328285563574</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3059015612137649698.post-8902217531434600283</id><published>2007-07-09T23:59:00.001-07:00</published><updated>2007-07-09T23:59:43.548-07:00</updated><title type='text'>More about Radiant CMS</title><content type='html'>&lt;p&gt;After a long haul with more than 6 months of development a new stable release of Radiant has been released. Check out the announcement on their blog &lt;a href="http://radiantcms.org/blog/2007/04/24/radiant-0-6-lapidary-release/"&gt;here&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;The big new thing in 0.6, or “Lapidary”, is the new extension system.&lt;/p&gt;  &lt;p&gt;Full changelog:&lt;/p&gt;  &lt;ul type="disc"&gt;&lt;li class="MsoNormal" style="line-height: normal;"&gt;Added      support for extensions—an extremely flexible way to extend radiant&lt;/li&gt;&lt;li class="MsoNormal" style="line-height: normal;"&gt;Merged      Behaviors into the Page class; subclass page now instead&lt;/li&gt;&lt;li class="MsoNormal" style="line-height: normal;"&gt;Improved      database support for Postgres and Sqlite&lt;/li&gt;&lt;li class="MsoNormal" style="line-height: normal;"&gt;Limited      support for &lt;span class="caps"&gt;SQL&lt;/span&gt; Server&lt;/li&gt;&lt;li class="MsoNormal" style="line-height: normal;"&gt;Exceptions      from tags now bubble up during testing&lt;/li&gt;&lt;li class="MsoNormal" style="line-height: normal;"&gt;Page parts      are now sorted by ID so the order that you create them in is preserved      [Josh Ferguson]&lt;/li&gt;&lt;li class="MsoNormal" style="line-height: normal;"&gt;Implemented      tag documentation &lt;span class="caps"&gt;DSL&lt;/span&gt; and UI [Sean Cribbs]&lt;/li&gt;&lt;li class="MsoNormal" style="line-height: normal;"&gt;Reworked      the setup code&lt;/li&gt;&lt;li class="MsoNormal" style="line-height: normal;"&gt;Renamed      script/setup_database to rake db:bootstrap&lt;/li&gt;&lt;li class="MsoNormal" style="line-height: normal;"&gt;Reworked      the upgrade code to work around rake tasks&lt;/li&gt;&lt;li class="MsoNormal" style="line-height: normal;"&gt;Added rake      tasks for freezing and unfreezing radiant to the edge&lt;/li&gt;&lt;li class="MsoNormal" style="line-height: normal;"&gt;r:children:each,      r:children:first, and r:children:last now all accept the same ordering and      limit attributes and have the same defaults&lt;/li&gt;&lt;li class="MsoNormal" style="line-height: normal;"&gt;Snippets      are now responsive to global context via the r:page tag. This means that      any tags inside r:page will refer to the page currently being rendered,      i.e. the page requested, not the local contextual page via tags like      r:children:each, etc. This is most relevant to recursive snippets like the      sitemapper example [Sean Cribbs]&lt;/li&gt;&lt;li class="MsoNormal" style="line-height: normal;"&gt;r:navigation      now uses the pipe character (”|”) to delimit URLs in the urls attribute      rather than the semi-colon&lt;/li&gt;&lt;li class="MsoNormal" style="line-height: normal;"&gt;:date now      accepts a “for” attribute that specifies which attribute of the page to      render. Valid values of the attribute are published_at, updated_at,      created_at, and now.&lt;/li&gt;&lt;li class="MsoNormal" style="line-height: normal;"&gt;Created      the r:cycle tag to make alternating tables and lists possible&lt;/li&gt;&lt;li class="MsoNormal" style="line-height: normal;"&gt;Added      popups for filter and tag documentation inside the page editing interface&lt;/li&gt;&lt;li class="MsoNormal" style="line-height: normal;"&gt;Added      support for optimistic locking for all models [Daniel Shepherd]&lt;/li&gt;&lt;li class="MsoNormal" style="line-height: normal;"&gt;Added      support to Radiant::Config for boolean values [Sean Cribbs]&lt;/li&gt;&lt;li class="MsoNormal" style="line-height: normal;"&gt;Caching no      longer stores the headers and body in the same file [Daniel Shepherd]&lt;/li&gt;&lt;li class="MsoNormal" style="line-height: normal;"&gt;Added      support for the X-Sendfile header that works in conjunction with caching      to speed it up (by default X-Sendfile support is off) [Daniel Shepherd]&lt;/li&gt;&lt;li class="MsoNormal" style="line-height: normal;"&gt;Moved the      images and stylesheets into images/admin and stylesheets/admin respectively      to make it easier for Radiant’s assets to coexist easily with the site’s      assets&lt;/li&gt;&lt;li class="MsoNormal" style="line-height: normal;"&gt;Improved      the Javascript that automatically updates the slug and breadcrumb based      off of the title so that it now response to all change events&lt;/li&gt;&lt;li class="MsoNormal" style="line-height: normal;"&gt;For the      full scoop on what’s changed see Sean Cribbs’ detailed blog post &lt;a href="http://seancribbs.com/tech/2007/04/18/whats-new-in-radiant-0-6"&gt;here&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3059015612137649698-8902217531434600283?l=vpanchal.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vpanchal.blogspot.com/feeds/8902217531434600283/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3059015612137649698&amp;postID=8902217531434600283' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3059015612137649698/posts/default/8902217531434600283'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3059015612137649698/posts/default/8902217531434600283'/><link rel='alternate' type='text/html' href='http://vpanchal.blogspot.com/2007/07/more-about-radiant-cms.html' title='More about Radiant CMS'/><author><name>Vijayta Panchal</name><uri>http://www.blogger.com/profile/04140284328285563574</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3059015612137649698.post-332775462680286749</id><published>2007-07-09T22:38:00.000-07:00</published><updated>2008-12-11T09:27:09.555-08:00</updated><title type='text'>Radiant Feedback Extension</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_hQFVzimvQwA/RpMb-YaKE-I/AAAAAAAAABU/IzA5poRgUlc/s1600-h/radiant-feedback.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_hQFVzimvQwA/RpMb-YaKE-I/AAAAAAAAABU/IzA5poRgUlc/s320/radiant-feedback.jpg" alt="" id="BLOGGER_PHOTO_ID_5085439162749424610" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Technologies: Radiant CMS, Radiant Extension API, Radiant Mailer Extension&lt;br /&gt;&lt;br /&gt;The Solution:&lt;br /&gt;some of projects required a highly customisable email form page for the Radiant CMS backed by database storage of data collected from users. Radiant’s Mailer extension provided a large component of what project desired, so we worked together to identify the missing functionality.&lt;br /&gt;&lt;br /&gt;By creating a new Feedback Extension which inherited from the Mailer extension, I was able to provide the additional features for exporting the user’s feedback into the database, without modifying the core of either Radiant or the Mailer extension.&lt;br /&gt;&lt;br /&gt;A “User Feedback” tab was added to the default Radiant administration area, allowing the administrator to view and delete feedback submitted by users, and the administrator can now specify required fields which must be completed to permit form submission.&lt;br /&gt;&lt;br /&gt;Despite the fact that this project was the first time I had worked with the Radiant CMS at all, I was able to very quickly get up to speed and understand the Extension API, which is very straightforward, yet allowed me to customise the interface exactly as I wanted.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3059015612137649698-332775462680286749?l=vpanchal.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vpanchal.blogspot.com/feeds/332775462680286749/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3059015612137649698&amp;postID=332775462680286749' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3059015612137649698/posts/default/332775462680286749'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3059015612137649698/posts/default/332775462680286749'/><link rel='alternate' type='text/html' href='http://vpanchal.blogspot.com/2007/07/radiant-feedback-extension.html' title='Radiant Feedback Extension'/><author><name>Vijayta Panchal</name><uri>http://www.blogger.com/profile/04140284328285563574</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_hQFVzimvQwA/RpMb-YaKE-I/AAAAAAAAABU/IzA5poRgUlc/s72-c/radiant-feedback.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3059015612137649698.post-4866703615607635193</id><published>2007-07-09T21:51:00.000-07:00</published><updated>2007-07-09T22:16:26.625-07:00</updated><title type='text'>Custom Tags in Radius</title><content type='html'>&lt;span style="font-weight:bold;"&gt;Defining Tags&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Before you can parse a template with Radius you need to create a Context object which defines the tags that will be used in the template. This is actually quite simple:&lt;br /&gt;&lt;br /&gt;  require 'radius'&lt;br /&gt;&lt;br /&gt;  context = Context.new&lt;br /&gt;  context.define_tag "hello" do |tag|&lt;br /&gt;    "Hello #{tag.attr['name'] || 'World'}!"&lt;br /&gt;  end&lt;br /&gt;&lt;br /&gt;Once you have defined a context you can easily create a Parser:&lt;br /&gt;&lt;br /&gt;  parser = Radius::Parser.new(context)&lt;br /&gt;  puts parser.parse('&lt; p &gt;&lt; radius:hello /&gt;&lt; /p &gt;')&lt;br /&gt;  puts parser.parse('&lt; p &gt;&lt; radius:hello name="John" /&gt;&lt; /p &gt;')&lt;br /&gt;&lt;br /&gt;This code will output:&lt;br /&gt;&lt;br /&gt;  &lt; p &gt;Hello World!&lt; /p &gt;&lt;br /&gt;  &lt; p &gt;Hello John!&lt; /p &gt;&lt;br /&gt;&lt;br /&gt;Note how you can pass attributes from the template to the context using the attributes hash. Above, the first tag that was parsed didn’t have a name attribute so the code in the hello tag definition uses "World" instead. The second time the tag is parsed the name attribute is set to "John" which is used to create the string "Hello John!". Tags that do not follow this rule will be treated as if they were undefined (like normal methods).&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Container Tags&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Radius also allows you to define "container" tags. That is, tags that contain content and that may optionally manipulate it in some way. For example, if you have RedCloth installed you could define another tag to parse and create Textile output:&lt;br /&gt;&lt;br /&gt;  require 'redcloth'&lt;br /&gt;&lt;br /&gt;  context.define_tag "textile" do |tag|&lt;br /&gt;    contents = tag.expand&lt;br /&gt;    RedCloth.new(contents).to_html&lt;br /&gt;  end&lt;br /&gt;&lt;br /&gt;(The code tag.expand above returns the contents of the template between the start and end tags.)&lt;br /&gt;&lt;br /&gt;With the code above your parser can easily handle Textile:&lt;br /&gt;&lt;br /&gt;  parser.parse('&lt;radius:textile&gt;h1. Hello **World**!&lt;/radius:textile&gt;')&lt;br /&gt;&lt;br /&gt;This code will output:&lt;br /&gt;&lt;br /&gt;  &lt; h1 &gt; Hello &lt; strong&gt;World&lt; /strong&gt;!&lt; /h1 &gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Nested Tags&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;But wait!—it gets better. Because container tags can manipulate the content they contain you can use them to iterate over collections:&lt;br /&gt;&lt;br /&gt;  context = Context.new&lt;br /&gt;&lt;br /&gt;  context.define_tag "stooge" do |tag|&lt;br /&gt;    content = ''&lt;br /&gt;    ["Larry", "Moe", "Curly"].each do |name|&lt;br /&gt;      tag.locals.name = name&lt;br /&gt;      content &lt;&lt; tag.expand&lt;br /&gt;    end&lt;br /&gt;    content&lt;br /&gt;  end&lt;br /&gt;&lt;br /&gt;  context.define_tag "stooge:name" do&lt;br /&gt;    tag.locals.name&lt;br /&gt;  end&lt;br /&gt;&lt;br /&gt;  parser = Radius::Parser.new(context)&lt;br /&gt;&lt;br /&gt;  template = &lt;&lt;-TEMPLATE&lt;br /&gt;  &lt; ul &gt;&lt;br /&gt;  &lt; radius:stooge &gt;&lt;br /&gt;    &lt; li &gt;&lt; radius:name /&gt;&lt; /li &gt;&lt;br /&gt;  &lt; /radius:stooge&gt;&lt;br /&gt;  &lt; /ul &gt;&lt;br /&gt;  TEMPLATE&lt;br /&gt;&lt;br /&gt;  puts parser.parse(template)&lt;br /&gt;&lt;br /&gt;This code will output:&lt;br /&gt;&lt;br /&gt;  &lt; ul &gt;&lt;br /&gt;&lt;br /&gt;    &lt; li &gt;Larry&lt; /li &gt;&lt;br /&gt;&lt;br /&gt;    &lt; li &gt;Moe &lt; /li &gt;&lt;br /&gt;&lt;br /&gt;    &lt; li &gt;Curly&lt; /li &gt;&lt;br /&gt;&lt;br /&gt;  &lt; /ul &gt;&lt;br /&gt;&lt;br /&gt;Note how the definition for the name tag is defined. Because "name" is prefixed with "stooge:" the name tag cannot appear outside the stooge tag. Had it been defined simply as "name" it would be valid anywhere, even outside the stooge tag (which was not what we wanted). Using the colon operator you can define tags with any amount of nesting.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Exposing Objects to Templates&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;During normal operation, you will often want to expose certain objects to your templates. Writing the tags to do this all by hand would be cumbersome of Radius did not provide several mechanisms to make this easier. The first is a way of exposing objects as tags on the context object. To expose an object simply call the define_tag method with the for option:&lt;br /&gt;&lt;br /&gt;  context.define_tag "count", :for =&gt; 1&lt;br /&gt;&lt;br /&gt;This would expose the object 1 to the template as the count tag. It’s basically the equivalent of writing:&lt;br /&gt;&lt;br /&gt;  context.define_tag("count") { 1 }&lt;br /&gt;&lt;br /&gt;So far this doesn’t save you a whole lot of typing, but suppose you want to expose certain methods that are on that object? You could do this:&lt;br /&gt;&lt;br /&gt;  context.define_tag "user", :for =&gt; user, :expose =&gt; [ :name, :age, :email ]&lt;br /&gt;&lt;br /&gt;This will add a total of four tags to the context. One for the user variable, and one for each of the three methods listed in the expose clause. You could now get the user’s name inside your template like this:&lt;br /&gt;&lt;br /&gt;  &lt;radius:user&gt;&lt;radius:name /&gt;&lt;/radius:user&gt;&lt;br /&gt;&lt;br /&gt;If "John" was the value stored in user.name the template would render as "John".&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Tag Shorthand&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;In the example above we made reference to user.name in our template by using the following code:&lt;br /&gt;&lt;br /&gt;  &lt; radius:user&gt;&lt;radius:name /&gt;&lt;/radius:user&gt;&lt;br /&gt;&lt;br /&gt;There is a much easer way to refer to the user.name variable. Use the colon operator to "scope" the reference to name:&lt;br /&gt;&lt;br /&gt;  &lt; radius:user:name /&gt;&lt;br /&gt;&lt;br /&gt;Radius allows you to use this shortcut for all tags.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Changing the Tag Prefix&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;By default, all Radius tags must begin with "radius". You can change this by altering the tag_prefix attribute on a Parser. For example:&lt;br /&gt;&lt;br /&gt;  parser = Radius::Parser.new(context, :tag_prefix =&gt; 'r')&lt;br /&gt;&lt;br /&gt;Now, when parsing templates with parser, Radius will require that every tag begin with "r" instead of "radius".&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Custom Behavior for Undefined Tags&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Context#tag_missing behaves much like Object#method_missing only it allows you to define specific behavior for when a tag is not defined on a Context. For example:&lt;br /&gt;&lt;br /&gt;  class LazyContext &lt; Radius::Context&lt;br /&gt;    def tag_missing(tag, attr, &amp;block)&lt;br /&gt;      "&lt; strong &gt;ERROR: Undefined tag `#{tag}' with attributes #{attr.inspect}&lt; /strong &gt;"&lt;br /&gt;    end&lt;br /&gt;  end&lt;br /&gt;&lt;br /&gt;  parser = Radius::Parser.new(LazyContext.new, :tag_prefix =&gt; 'lazy')&lt;br /&gt;  puts parser.parse('&lt;lazy:weird value="true" /&gt;')&lt;br /&gt;&lt;br /&gt;This will output:&lt;br /&gt;&lt;br /&gt;  &lt; strong &gt;ERROR: Undefined tag `weird' with attributes {"value"=&gt;"true"}&lt; /strong &gt;&lt;br /&gt;&lt;br /&gt;Normally, when the Radius Parser encounters an undefined tag for a Context it raises an UndefinedTagError, but since we have defined tag_missing on LazyContext the Parser now outputs a nicely formated error message when we parse a string that does not contain a valid tag.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Tag Bindings&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Radius passes a TagBinding into the block of the Context#define_tag method. The tag binding is useful for a number of tasks. A tag binding has an expand instance method which processes a tag’s contents and returns the result. It also has a attr method which returns a hash of the attributes that were passed into the tag. TagBinding also contains the TagBinding#single? and TagBinding#double? methods which return true or false based on wether the tag is a container tag or not. More about the methods which are available on tag bindings can be found on the Radius::TagBinding documentation page.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Tag Binding Locals, Globals, and Context Sensitive Tags&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;A TagBinding also contains two OpenStruct-like objects which are useful when developing tags. TagBinding#globals is useful for storing variables which you would like to be accessible to all tags:&lt;br /&gt;&lt;br /&gt;  context.define_tag "inc" do |tag|&lt;br /&gt;    tag.globals.count ||= 0&lt;br /&gt;    tag.globals.count += 1&lt;br /&gt;  end&lt;br /&gt;&lt;br /&gt;  context.define_tag "count" do |tag|&lt;br /&gt;    tag.globals.count || 0&lt;br /&gt;  end&lt;br /&gt;&lt;br /&gt;TagBinding#locals mirrors the variables that are in TagBinding#globals, but allows child tags to redefine variables. This is valuable when defining context sensitive tags:&lt;br /&gt;&lt;br /&gt;  require 'radius'&lt;br /&gt;&lt;br /&gt;  class Person&lt;br /&gt;    attr_accessor :name, :friend&lt;br /&gt;    def initialize(name)&lt;br /&gt;      @name = name&lt;br /&gt;    end&lt;br /&gt;  end&lt;br /&gt;&lt;br /&gt;  jack = Person.new('Jack')&lt;br /&gt;  jill = Person.new('Jill')&lt;br /&gt;  jack.friend = jill&lt;br /&gt;  jill.friend = jack&lt;br /&gt;&lt;br /&gt;  context = Radius::Context.new do |c|&lt;br /&gt;    c.define_tag "jack" do |tag|&lt;br /&gt;      tag.locals.person = jack&lt;br /&gt;      tag.expand&lt;br /&gt;    end&lt;br /&gt;    c.define_tag "jill" do |tag|&lt;br /&gt;      tag.locals.person = jill&lt;br /&gt;      tag.expand&lt;br /&gt;    end&lt;br /&gt;    c.define_tag "name" do |tag|&lt;br /&gt;      tag.locals.person.name rescue tag.missing!&lt;br /&gt;    end&lt;br /&gt;    c.define_tag "friend" do |tag|&lt;br /&gt;      tag.locals.person = tag.locals.person.friend rescue tag.missing!&lt;br /&gt;      tag.expand&lt;br /&gt;    end&lt;br /&gt;  end&lt;br /&gt;&lt;br /&gt;  parser = Radius::Parser.new(context, :tag_prefix =&gt; 'r')&lt;br /&gt;&lt;br /&gt;  parser.parse('&lt;r:jack:name /&gt;') #=&gt; "Jack"&lt;br /&gt;  parser.parse('&lt;r:jill:name /&gt;') #=&gt; "Jill"&lt;br /&gt;  parser.parse('&lt;r:jill:friend:name /&gt;') #=&gt; "Jack"&lt;br /&gt;  parser.parse('&lt;r:jill:friend:friend:name /&gt;') #=&gt; "Jack"&lt;br /&gt;  parser.parse('&lt;r:jill&gt;&lt;r:friend:name /&gt; and &lt;r:name /&gt;&lt;/r:jill&gt;') #=&gt; "Jack and Jill"&lt;br /&gt;  parser.parse('&lt;r:name /&gt;') # raises an UndefinedTagError exception&lt;br /&gt;&lt;br /&gt;Notice how TagBinding#locals enables intelligent nesting. "&lt;r:jill:name /&gt;" evaluates to "Jill", but "&lt;r:jill:friend:name /&gt;" evaluates to "Jack". Locals loose scope as soon as the tag they were defined in closes. Globals on the other hand, never loose scope.&lt;br /&gt;&lt;br /&gt;The final line in the example above demonstrates that calling "&lt;r:name /&gt;" raises a TagMissing error. This is because of the way the name tag was defined:&lt;br /&gt;&lt;br /&gt;  tag.locals.person.name rescue tag.missing!&lt;br /&gt;&lt;br /&gt;If person is not defined on locals it will return nil. Calling name on nil would normally raise a NoMethodError exception, but because of the ‘rescue’ clause the TagBinding#missing! method is called which fires off Context#tag_missing. By default Context#tag_missing raises a UndefinedTagError exception. The ‘rescue tag.missing!’ idiom is extremly useful for adding simple error checking to context sensitive tags.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Tag Specificity&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;When Radius is presented with two tags that have the same name, but different nesting Radius uses an algorithm similar to the way winning rules are calculated in Cascading Style Sheets (CSS) to determine which definition should be used. Each time a tag is encountered in a template potential tags are assigned specificity values and the tag with the highest specificity wins.&lt;br /&gt;&lt;br /&gt;For example, given the following tag definitions:&lt;br /&gt;&lt;br /&gt;  nesting&lt;br /&gt;  extra:nesting&lt;br /&gt;  parent:child:nesting&lt;br /&gt;&lt;br /&gt;And template:&lt;br /&gt;&lt;br /&gt;  &lt; r:parent:extra:child:nesting /&gt;&lt;br /&gt;&lt;br /&gt;Radius will calculate specificity values like this:&lt;br /&gt;&lt;br /&gt;  nesting =&gt; 1.0.0.0&lt;br /&gt;  extra:nesting =&gt; 1.0.1.0&lt;br /&gt;  parent:child:nesting =&gt; 1.1.0.1&lt;br /&gt;&lt;br /&gt;Meaning that parent:child:nesting will win. If a template contained:&lt;br /&gt;&lt;br /&gt;  &lt; r:parent:child:extra:nesting /&gt;&lt;br /&gt;&lt;br /&gt;The following specificity values would be assigned to each of the tag definitions:&lt;br /&gt;&lt;br /&gt;  nesting =&gt; 1.0.0.0&lt;br /&gt;  extra:nesting =&gt; 1.1.0.0&lt;br /&gt;  parent:child:nesting =&gt; 1.0.1.1&lt;br /&gt;&lt;br /&gt;Meaning that extra:nesting would win because it is more "specific".&lt;br /&gt;&lt;br /&gt;Values are assigned by assigning points to each of the tags from right to left. Given a tag found in a template with nesting four levels deep, the maximum specificity a tag could be assigned would be:&lt;br /&gt;&lt;br /&gt;  1.1.1.1&lt;br /&gt;&lt;br /&gt;One point for each of the levels.&lt;br /&gt;&lt;br /&gt;A deep understanding of tag specificity is not necessary to be effective with Radius. For the most part you will find that Radius resolves tags precisely the way that you would expect. If you find this section confusing forget about it and refer back to it if you find that tags are resolving differently from the way that you expected.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3059015612137649698-4866703615607635193?l=vpanchal.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vpanchal.blogspot.com/feeds/4866703615607635193/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3059015612137649698&amp;postID=4866703615607635193' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3059015612137649698/posts/default/4866703615607635193'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3059015612137649698/posts/default/4866703615607635193'/><link rel='alternate' type='text/html' href='http://vpanchal.blogspot.com/2007/07/custom-tags-in-radius.html' title='Custom Tags in Radius'/><author><name>Vijayta Panchal</name><uri>http://www.blogger.com/profile/04140284328285563574</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3059015612137649698.post-3041689197404874417</id><published>2007-07-09T21:47:00.000-07:00</published><updated>2007-07-09T21:49:29.945-07:00</updated><title type='text'>Why Radiant?</title><content type='html'>&lt;pre&gt;    My vision for Radiant, even though I'm not a member of the core team&lt;br /&gt;would be one of a 'base' or 'core' CMS that Radiant is today. Radiant&lt;br /&gt;would be a relatively neutral system from which developers could easily&lt;br /&gt;extend to solve problems within their specific domain. My ideal&lt;br /&gt;situation would be to simply be able to type something like&lt;br /&gt;'script/radiant_plugin install radiant_blog' and automatically get&lt;br /&gt;comments, trackbacks, tagging and other blog functionality automatically&lt;br /&gt;integrated into the database and admin interface. Make a note that I&lt;br /&gt;don't want to drop modules on top of the CMS, I want to fundamentally&lt;br /&gt;change its operation to suit the problem domain.&lt;br /&gt;&lt;br /&gt;What has to be covered?&lt;br /&gt;   I will assume that the installation of Radiant is clean and has not&lt;br /&gt;been installed over anything else. My proposal is for a plugin system&lt;br /&gt;that works easily and seamlessly alongside of the rails plugin system.&lt;br /&gt;The goals of my proposals are the following:&lt;br /&gt;&lt;br /&gt;1) The plugins should be compatible with the rails plugin system&lt;br /&gt;2) The plugins should not be dependent on any plugins not controlled by&lt;br /&gt;the radiant core team&lt;br /&gt;3) All plugins should be non-destructive and should not heavily modify&lt;br /&gt;the workings of the core CMS&lt;br /&gt;4) All plugins should be easily removed and all changes should be&lt;br /&gt;reversible (this is particularly important to migrations)&lt;br /&gt;5) The burden of extending the functionality of the system should lie on&lt;br /&gt;the developer of the plugin which means as little modification as&lt;br /&gt;possible should be done to the current radiant system.&lt;br /&gt;&lt;br /&gt;There are 4 main considerations when extending Radiant in a way that&lt;br /&gt;allows things to be easily packaged. They are as follows:&lt;br /&gt;&lt;br /&gt;1) Modifying controllers and models&lt;br /&gt;2) Adding behaviors and radius tags&lt;br /&gt;3) Adding table to the database&lt;br /&gt;4) Modifying the administration views&lt;br /&gt;&lt;br /&gt;Proposed Solutions&lt;br /&gt;1) Modifying controllers and models&lt;br /&gt;   This is what rails plugins were meant to do. Since our plugins are&lt;br /&gt;rails plugins we get this for free. There is one consideration. In order&lt;br /&gt;for a plugin to not break compatibility as radiant gets upgraded the&lt;br /&gt;preferred method of modifying controller and model logic is to use&lt;br /&gt;before and after hooks so that if Radiant's core functionality is&lt;br /&gt;changed in the future the plugin will not break that functionality.&lt;br /&gt;&lt;br /&gt;2) Adding behaviors and radius tags&lt;br /&gt;   If you use the normal rails plugin structure then adding tags and&lt;br /&gt;behaviors to radiant is easy.&lt;br /&gt;&lt;br /&gt;3) Migrating the database&lt;br /&gt;   Migrating the database is slight more difficult as rails doesn't&lt;br /&gt;have any built in methods for migrating out of plugin directories. This&lt;br /&gt;is where I want to suggest another file in the main plugin directory&lt;br /&gt;that sits alongside init.rb called radiant.rb. Radiant.rb is a file that&lt;br /&gt;contains initialization code that is specific to the plugin being a&lt;br /&gt;radiant plugin. Radiant.rb does not replace init.rb. This file will&lt;br /&gt;refer to the directory with the database migrations along with any&lt;br /&gt;future improvements to the plugin system that might come along.&lt;br /&gt;   A separate rake task will be needed to run the plugin migrations but&lt;br /&gt;can easily be included in lib/tasks. This task will look for all plugins&lt;br /&gt;with a radiant.rb file and attempt to migrate them into the current&lt;br /&gt;environment's database. The one rule that should be applied to radiant&lt;br /&gt;plugin migrations is that forward migrations must be non-destructive to&lt;br /&gt;the 'core' CMS structure. In the event that two different plugins'&lt;br /&gt;migrations clash the migration process itself will cause an error to be&lt;br /&gt;reported to the user. There is the possibility that these migrations&lt;br /&gt;don't increment the version number of the database and simply work as an&lt;br /&gt;atomic database change that the normal migrations are unaware of. This&lt;br /&gt;needs to be investigated a bit further, but this can be solved.&lt;br /&gt;   There should be a separate script command that gets the plugin like&lt;br /&gt;a normal rails plugin, and then runs the migrations if the user chooses&lt;br /&gt;to do so. There should also be a script for reverting the migrations and&lt;br /&gt;deleting the plugin. These are relatively trivial to code.&lt;br /&gt;&lt;br /&gt;4) Modifying the administration views&lt;br /&gt;   The problem of modifying the admin interface really can be a show&lt;br /&gt;stopper. I have thought of a few solutions and I will present the one&lt;br /&gt;solution that would get most of the way there and is easiest to&lt;br /&gt;implement into the current system.&lt;br /&gt;&lt;br /&gt;   The solution is to rely on helpers to place callbacks during the&lt;br /&gt;rendering of the of the administrative views. These filters would be&lt;br /&gt;before each item in a list, form, or set of tabs and before the ending&lt;br /&gt;of the list, form or set of tabs. The goal is to break down the&lt;br /&gt;administrative interface into smaller pieces that can be independently&lt;br /&gt;added onto by either changing the data before a list item or form&lt;br /&gt;control gets rendered or by rendering new list items or form controls.&lt;br /&gt;&lt;br /&gt;   How coarse or fine should these helper callbacks be? Well my idea&lt;br /&gt;for instance on the 'Edit Page' action is to place a call to a blank&lt;br /&gt;helper method called before_title_input just before the title input box&lt;br /&gt;and before_body_input just before the body input. This would allow&lt;br /&gt;plugin developers to easily extend the existing forms and lists by&lt;br /&gt;assigning before filters to the form or list element that is about to be&lt;br /&gt;rendered. Tabs could be achieved through a bit of coercing of the same&lt;br /&gt;methodology only with helpers that make callbacks inside of javascript&lt;br /&gt;blocks (this might take some more investigation)&lt;br /&gt;&lt;br /&gt;   I'm of the opinion that simplicity should trump flexibility in most&lt;br /&gt;of these cases and that the callbacks should be kept to a minimum to&lt;br /&gt;allow modification of the default behavior. What might an implementation&lt;br /&gt;of this system look like? Lets try and add a trackback URL to our New&lt;br /&gt;Page and Edit Page action.&lt;br /&gt;&lt;br /&gt;The *plugin helper* might look like&lt;br /&gt;&lt;br /&gt;module Admin::PageHelper&lt;br /&gt; before_filter :trackback_input, :only =&gt; [:end_new_form, :end_edit_form]&lt;br /&gt;&lt;br /&gt; def trackback_input(*args)&lt;br /&gt;   trackback_input = '&lt;textarea name="trackbacks"&gt;&lt;/textarea&gt;'&lt;br /&gt; end&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;The *plugin controller* might look like&lt;br /&gt;&lt;br /&gt;class Admin::PageController &lt; ApplicationController&lt;br /&gt;   after_filter :do_trackback, :only =&gt; [:new, :edit]&lt;br /&gt;&lt;br /&gt;   def do_trackback&lt;br /&gt;     if request.post?&lt;br /&gt;       if @page.errors.blank?&lt;br /&gt;       # code for making a trackback requests using params[:trackbacks]...&lt;br /&gt;       end&lt;br /&gt;     end&lt;br /&gt;   end&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;What might we have to do to the radiant system to have this functionality?&lt;br /&gt;&lt;br /&gt;The *radiant helpers* might look like&lt;br /&gt;&lt;br /&gt;module ApplicationHelper&lt;br /&gt; # holds the list of filter functions in some structure (possibly a&lt;br /&gt;nested hash?)&lt;br /&gt; attr_accessor :filters&lt;br /&gt;&lt;br /&gt; def before_filter(filtered_method, options = {})&lt;br /&gt;   # add a new lambda with appropriate options to the filters list&lt;br /&gt; end&lt;br /&gt;&lt;br /&gt; def method_missing(*args)&lt;br /&gt;   # check if it starts with 'filters_for' and then run filters for the&lt;br /&gt;proper helper&lt;br /&gt; end&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;module Admin::PageHelper&lt;br /&gt; def end_new_form(*args)&lt;br /&gt;   filters_for_end_new_form(args)&lt;br /&gt; end&lt;br /&gt;&lt;br /&gt; def end_edit_form(*args)&lt;br /&gt;   filters_for_end_edit_form(args)&lt;br /&gt; end&lt;br /&gt;&lt;br /&gt; ... More Callbacks Go Here ...&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;The *radiant view* might look like&lt;br /&gt;&lt;br /&gt;&lt;%= start_form_tag %&gt;&lt;br /&gt;&lt;br /&gt;... default form stuff here ...&lt;br /&gt;&lt;br /&gt;&lt;%= end_new_form %&gt;&lt;br /&gt;&lt;br /&gt;&lt;%= end_form_tag %&gt;&lt;br /&gt;&lt;br /&gt;   The potential to have a long list of callbacks is definitely there&lt;br /&gt;but I still think it is one of the easiest way to implement flexibility&lt;br /&gt;into the administration system without hacking deeper into rails to&lt;br /&gt;alter how views are rendered. I'd say there would be about 7 or 8&lt;br /&gt;callbacks per helper. It might end up not being manageable but if there&lt;br /&gt;is a standard naming convention it shouldn't be bad at all. This would&lt;br /&gt;allow new callbacks to be added easily without breaking old&lt;br /&gt;functionality. It also allows more than one plugin to register into a&lt;br /&gt;callback chain so that more than one domain specific plugin can be&lt;br /&gt;present at one time, leading to a cross-domain specific CMS.&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3059015612137649698-3041689197404874417?l=vpanchal.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vpanchal.blogspot.com/feeds/3041689197404874417/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3059015612137649698&amp;postID=3041689197404874417' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3059015612137649698/posts/default/3041689197404874417'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3059015612137649698/posts/default/3041689197404874417'/><link rel='alternate' type='text/html' href='http://vpanchal.blogspot.com/2007/07/why-radiant.html' title='Why Radiant?'/><author><name>Vijayta Panchal</name><uri>http://www.blogger.com/profile/04140284328285563574</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3059015612137649698.post-6796270831150831311</id><published>2007-07-09T01:34:00.000-07:00</published><updated>2007-07-09T01:34:07.564-07:00</updated><title type='text'>Vijayta: What's New in Radiant 0.6</title><content type='html'>&lt;a href="http://vpanchal.blogspot.com/2007/07/whats-new-in-radiant-06.html#links"&gt;Vijayta: What's New in Radiant 0.6&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3059015612137649698-6796270831150831311?l=vpanchal.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://vpanchal.blogspot.com/2007/07/whats-new-in-radiant-06.html#links' title='Vijayta: What&apos;s New in Radiant 0.6'/><link rel='replies' type='application/atom+xml' href='http://vpanchal.blogspot.com/feeds/6796270831150831311/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3059015612137649698&amp;postID=6796270831150831311' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3059015612137649698/posts/default/6796270831150831311'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3059015612137649698/posts/default/6796270831150831311'/><link rel='alternate' type='text/html' href='http://vpanchal.blogspot.com/2007/07/vijayta-whats-new-in-radiant-06.html' title='Vijayta: What&apos;s New in Radiant 0.6'/><author><name>Vijayta Panchal</name><uri>http://www.blogger.com/profile/04140284328285563574</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3059015612137649698.post-1070776882331843969</id><published>2007-07-09T01:12:00.001-07:00</published><updated>2007-07-09T01:12:59.333-07:00</updated><title type='text'>Choosing a Rails Blogging System</title><content type='html'>&lt;p&gt;For a long time if you wanted to use Ruby on Rails to run a blog you had one choice, Typo. In the past six months or so more Blogging systems and &lt;span class="caps"&gt;CMS&lt;/span&gt; applications have been released and there is finally some choices to be made. So here’s a roundup of all the available blogging systems that use Ruby on Rails.&lt;/p&gt;    &lt;h2&gt;Typo&lt;/h2&gt;    &lt;p&gt;After a long wait &lt;a href="http://www.typosphere.org/trac/"&gt;Typo 4&lt;/a&gt; is out, and this release firmly cements Typo as the gorilla of the Rails blogging systems. It literally encompasses about every feature you could want.&lt;/p&gt;    &lt;ul&gt;&lt;li&gt;Ability to post from desktop clients&lt;/li&gt;&lt;li&gt;Atom and &lt;span class="caps"&gt;RSS&lt;/span&gt; feeds&lt;/li&gt;&lt;li&gt;Comments, Trackbacks, and spam filtering to go along with it&lt;/li&gt;&lt;li&gt;Gravatar support&lt;/li&gt;&lt;li&gt;Themes (with a healthy stock of existing themes to back it up)&lt;/li&gt;&lt;li&gt;Installer&lt;/li&gt;&lt;li&gt;The kitchen sink.&lt;/li&gt;&lt;/ul&gt;    &lt;p&gt;Typo has been around for awhile, which explains its hefty feature set. It also has a reputation for being a bit of a hog and not very lean, which is saying a lot for Rails apps (which usually clock in at 20 mb of memory minimum). But if you want your blogging system to allow you blog and make you breakfast, this is the way to go.&lt;/p&gt;    &lt;h2&gt;Mephisto&lt;/h2&gt;    &lt;p&gt;While it’s been in development for awhile, &lt;a href="http://mephistoblog.com/"&gt;Mephisto&lt;/a&gt; is a fairly new, and really only has the official 0.5 release as of this posting. The nice thing about Mephisto is that its developers understand that a lot of people want to be able to have several regular pages exist along side a blog. In the past you usually had to hack a blogging system to make this popular (ask the Textpattern camp about this).&lt;/p&gt;    &lt;p&gt;Mephisto ends up being part blog, part &lt;span class="caps"&gt;CMS&lt;/span&gt;, and allows you make custom templates using Liquid. It has a nice simple interface and doesn’t have a huge learning curve. Mephisto is still early in the development phase though, and lacks features like image / file uploads.&lt;/p&gt;    &lt;h2&gt;Simplelog&lt;/h2&gt;    &lt;p&gt;[Update 8/22: Added Simplelog upon reader request. I had completely forgotten about it, even though I’m actually subscribed to Garrett Murray’s feed. Sorry Garrett!]&lt;/p&gt;    &lt;p&gt;&lt;a href="http://simplelog.net/"&gt;Simplelog&lt;/a&gt; is a basic blogging system that is geared specifically at allowing people to do nothing more than blog. All the things you commonly find in blog sidebars just aren’t there (blog rolls, del.icio.us links, flickr streams, etc). Simplelog is intentionally kept simple and given a low feature count in order to keep the application easy to use.&lt;/p&gt;    &lt;p&gt;I haven’t personally used Simplelog yet, but I think the user interface looks clean and easy to understand, and I like the fact that it is geared to have less features on purpose.&lt;/p&gt;    &lt;p&gt;Simplelog also gets some good karma since half of any donation to the project is given to the National &lt;span class="caps"&gt;MS &lt;/span&gt;Society.&lt;/p&gt;    &lt;h2&gt;Radiant&lt;/h2&gt;    &lt;p&gt;The &lt;a href="http://radiantcms.org/"&gt;Radiant &lt;span class="caps"&gt;CMS&lt;/span&gt;&lt;/a&gt; is a true &lt;span class="caps"&gt;CMS&lt;/span&gt; that strives to manage content pages first and be a blogging system second. One of Radiant’s biggest features is a dynamic page hierarchy. You can easily create root pages and add on child pages. The admin UI also makes it easy to see how the site is structured. Radiant also allows for content snippets and layouts for reuse to make a site as easily maintainable as possible. Radiant also uses the Radius tag system to add &lt;span class="caps"&gt;ERB&lt;/span&gt;-like scripting into pages.&lt;/p&gt;    &lt;p&gt;Radiant’s other big feature is behaviors, which are ways to make a page behave in a certain way. The default archive behavior supplied makes it easy to quickly add a blog to a site powered by Radiant.&lt;/p&gt;    &lt;p&gt;I’d recommend people use Radiant when they have a lot of non-blog content for a site and don’t need a blog to be the focus of the site.&lt;/p&gt;    &lt;h2&gt;Comatose&lt;/h2&gt;    &lt;p&gt;&lt;a href="http://comatose.rubyforge.org/"&gt;Comatose&lt;/a&gt; is a micro &lt;span class="caps"&gt;CMS&lt;/span&gt; plugin for Rails by Matt McCray. It supports a dynamic hierarchical page structure just like Radiant, but assumes you will build your site around Comatose and extend it to suit your needs.&lt;/p&gt;    &lt;p&gt;I’d recommend Comatose for Rails developers who either have an existing site they’d like to add a &lt;span class="caps"&gt;CMS&lt;/span&gt; to with minimal hassle, or for someone who doesn’t want to have to extend the larger blogging systems to fit their needs.&lt;/p&gt;    &lt;h2&gt;The Final Verdict&lt;/h2&gt;    &lt;p&gt;I’d like to be able to declare one of these five applications the “winner”, but they all serve such different niches that it is difficult to directly compare them. My best advice is to decide what kind of site you are looking to build and choose your Rails blogging system appropriately. From the full-featured Typo to the do-it-yourself plugin nature of Comatose there is something for every level of Rails developer.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3059015612137649698-1070776882331843969?l=vpanchal.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vpanchal.blogspot.com/feeds/1070776882331843969/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3059015612137649698&amp;postID=1070776882331843969' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3059015612137649698/posts/default/1070776882331843969'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3059015612137649698/posts/default/1070776882331843969'/><link rel='alternate' type='text/html' href='http://vpanchal.blogspot.com/2007/07/choosing-rails-blogging-system.html' title='Choosing a Rails Blogging System'/><author><name>Vijayta Panchal</name><uri>http://www.blogger.com/profile/04140284328285563574</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3059015612137649698.post-5480870206871398827</id><published>2007-07-09T00:59:00.001-07:00</published><updated>2007-07-09T00:59:44.348-07:00</updated><title type='text'>Radiant CMS, Managing Web Sites on Rails</title><content type='html'>Managing the content of a web site is still a painful task, more that 10 years after the web took of. Web site management is an holy grail and Content Management Systems (CMS) have try to fill the gap without much success…&lt;br /&gt;&lt;br /&gt;The problem is that mostly all Open Source CMS you can find are generally too complex. They want to achieve everything possible with an unique system. That leads to too many screens, too many options and too many plugins… Non expert people just can’t use those geeky systems and it’s very hard to train people on how to use the admin interface…&lt;br /&gt;&lt;br /&gt;Here comes Radiant, an Open Source CMS made with Ruby on Rails. Radiant is more pragmatic and adopted a “less is more” philosophy. It focus on managing medium-size web sites with a page-centric approach that most people are used to.&lt;br /&gt;&lt;br /&gt;The project is in early stages of development but already useable. It been able to power a web site I’m building in only 1 hour. I’ve put all my content into Radiant, pages, templates, styles and so on. Everything is in the system and I can manage it right from the administration interface. Neat!&lt;br /&gt;&lt;br /&gt;The administration interface included with Radiant is simple enough for people to understand it… One of the real value of Radiant.&lt;br /&gt;&lt;br /&gt;Concerning development, I needed a French localized interface for my web site and I’ve been able to submit a patch in no time. Since Radiant is written with Ruby on Rails, it’s quite extensible and you can use any plugin developed for Rails such as GLoc.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3059015612137649698-5480870206871398827?l=vpanchal.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vpanchal.blogspot.com/feeds/5480870206871398827/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3059015612137649698&amp;postID=5480870206871398827' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3059015612137649698/posts/default/5480870206871398827'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3059015612137649698/posts/default/5480870206871398827'/><link rel='alternate' type='text/html' href='http://vpanchal.blogspot.com/2007/07/radiant-cms-managing-web-sites-on-rails.html' title='Radiant CMS, Managing Web Sites on Rails'/><author><name>Vijayta Panchal</name><uri>http://www.blogger.com/profile/04140284328285563574</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3059015612137649698.post-9061807568234333806</id><published>2007-07-09T00:48:00.000-07:00</published><updated>2007-07-09T00:52:00.481-07:00</updated><title type='text'>Top 20 Ruby on Rails Content Management Systems CMS Tools</title><content type='html'>&lt;h3&gt;Ready for the Top 20 Ruby on Rails CMS?&lt;/h3&gt;   &lt;p&gt;This article contains a breakdown of all known (to me) Ruby on &lt;strong&gt;Rails&lt;/strong&gt; content management systems to date. It is revised from its previous version, fixing a few inconsitencies and adding two new content management systems to the list! &lt;/p&gt;   &lt;p&gt;It has continually been asked in the "&lt;strong&gt;rails&lt;/strong&gt;" community about the quality of &lt;strong&gt;Rails&lt;/strong&gt; &lt;strong&gt;cms&lt;/strong&gt; systems, and several different groups/individuals have branched off independantly to create a &lt;strong&gt;rails&lt;/strong&gt; &lt;strong&gt;cms&lt;/strong&gt;. Some are trying to make the most ajaxified &lt;strong&gt;cms&lt;/strong&gt; with all the bells and whistles, while others seem to be focussing on feature sets and plugin modules. &lt;/p&gt;   &lt;p&gt;People are trying to rapidly deploy applications and with &lt;strong&gt;rails&lt;/strong&gt; as the promised magic potion for doing so, &lt;strong&gt;CMS&lt;/strong&gt; development is on the rise. Before I break down all the &lt;strong&gt;CMS&lt;/strong&gt; I'm aware of in the &lt;strong&gt;rails&lt;/strong&gt; community, I want to say this. I am dissapointed in seeing less cooperation between independent &lt;strong&gt;cms&lt;/strong&gt; projects. The one thing that did brighten my day was seeing that Ajax Scaffold and Streamlined are working together. If more people were making active contributions to these projects, and these project leaders were coordinating their efforts with eachother, a full featured and fleshed out &lt;strong&gt;rails&lt;/strong&gt; &lt;strong&gt;cms&lt;/strong&gt; would come about in an expontentially less amount of time than it is going to take at the current rate.&lt;/p&gt;   &lt;p&gt;And now.. drumroll... Here's a breakdown of some of the &lt;strong&gt;rails&lt;/strong&gt; &lt;strong&gt;cms&lt;/strong&gt; advertised as of August, 2006.&lt;/p&gt;   &lt;h3&gt;Radiant, the minimalistic &lt;strong&gt;CMS&lt;/strong&gt; for &lt;strong&gt;Rails&lt;/strong&gt;&lt;/h3&gt;   &lt;p&gt;&lt;a href="http://radiantcms.org/"&gt;Radiant&lt;/a&gt; is a no-fluff content management system designed for small teams. It's similar to Movable Type or Textpattern, but is more than a blogging engine. It's a Web developer's &lt;strong&gt;CMS&lt;/strong&gt; with just enough features to  make it worthwhile. We've intentionally left the kitchen sink out!&lt;/p&gt;   &lt;h3&gt;Radiant &lt;strong&gt;CMS&lt;/strong&gt; Features&lt;/h3&gt;   &lt;ul&gt;&lt;li&gt;An elegant user interface &lt;/li&gt;&lt;li&gt;The ability to arrange pages in a hierarchy &lt;/li&gt;&lt;li&gt;Flexible templating with layouts, snippets, page parts, and a custom tagging language (Radius: http://radius.rubyforge.org) &lt;/li&gt;&lt;li&gt;Special page-oriented plugins called behaviors &lt;/li&gt;&lt;li&gt;A simple user management/permissions system &lt;/li&gt;&lt;li&gt;Support for Markdown and Textile as well as traditional HTML      (it's easy to create other filters) &lt;/li&gt;&lt;li&gt;Operates in two modes: dev and production depending on the URL &lt;/li&gt;&lt;li&gt;A caching system which expires pages every 5 minutes &lt;/li&gt;&lt;li&gt;Built using Ruby on &lt;strong&gt;Rails&lt;/strong&gt; (which means that extending &lt;a href="http://radiantcms.org/"&gt;Radiant&lt;/a&gt; is      as easy as any other &lt;strong&gt;Rails&lt;/strong&gt; application) &lt;/li&gt;&lt;li&gt;Licensed under the MIT-License &lt;/li&gt;&lt;li&gt;And much more...&lt;/li&gt;&lt;/ul&gt;   &lt;p&gt;&lt;a href="http://radiantcms.org/demo/"&gt;Live demo of Radiant can be found here.&lt;/a&gt;  &lt;/p&gt;   &lt;h3&gt;Typo Blogware&lt;/h3&gt;   &lt;p&gt;&lt;a href="http://www.typosphere.org/"&gt;Typo&lt;/a&gt; is a blogging tool that can be used as a CMS with some minor hacking. It is designed out of the box as a blog that runs on ruby on rails and it even includes some helpful ajax libraries. It's under constant development as well, so give it a chance if you are looking for a very simple cms system with just articles. &lt;/p&gt;   &lt;h3&gt;Mephisto&lt;/h3&gt;   &lt;p&gt;&lt;a href="http://mephisto.stikipad.com/"&gt;Mephisto&lt;/a&gt; is another brand of blogware from rails written by technoweenie (that's his name). It seems more accustomed for sites that don't appear like blogs, but actually are! You know.. what are they called again.. websites! &lt;/p&gt;   &lt;p&gt;To download mephisto, you just do: &lt;/p&gt;   &lt;p&gt;     &lt;/p&gt;&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_default"&gt;svn co  http://svn.techno-weenie.net/projects/mephisto/trunk your_directory&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;      &lt;p&gt;A quick install of mephisto is as follows:&lt;/p&gt;   &lt;typo:code&gt;    Quick Install     1. Create a database named mephisto (or one of your choosing).    2. Copy config/database.example.yml to config/database.yml    3. Edit database.yml and set your database credentials.    4. Upload the entire mephisto directory to your webserver.    5. Create your log directory MEPHISTO/log    6. Run rake db:bootstrap from a terminal of some sorts    7. Login to your administration at http://domain.com/admin with the username: admin and password: test &lt;!-- typo:code--&gt;    &lt;/typo:code&gt;&lt;h3&gt;Streamlined for Rapid &lt;strong&gt;Rails&lt;/strong&gt; Deployment (cms tool, not a cms) &lt;/h3&gt;   &lt;a href="http://streamlined.relevancellc.com/"&gt;Streamlined&lt;/a&gt; is becoming increasingly powerful as people begin to understand better what it is. It is essentially a framework "ontop of the already existing &lt;strong&gt;Rails&lt;/strong&gt; framework" that assists in rapid deployment of your applications. Here's what the creators have to say about it:   &lt;blockquote&gt;&lt;a href="http://streamlined.relevancellc.com/"&gt;Streamlined&lt;/a&gt; is a framework for rapidly developing CRUD applications using Ruby and &lt;strong&gt;Rails&lt;/strong&gt;. With Streamlined, we are trying to accomplish:     &lt;ul&gt;&lt;li&gt; provide the same declarative ease-of-use to the view layer that ActiveRecord provides for the data layer &lt;/li&gt;&lt;li&gt; automatically manage relationships in the view layer so that users don't have to keep writing the same relationship management code &lt;/li&gt;&lt;li&gt; replace the default scaffolding of &lt;strong&gt;Rails&lt;/strong&gt; with more robust, useful and meaningful management screens &lt;/li&gt;&lt;li&gt; provide a meta-framework which allows you to assimilate different &lt;strong&gt;Rails&lt;/strong&gt; plugins and generators&lt;/li&gt;&lt;/ul&gt; If you already have a database schema, Streamlined's intent is to allow you to create a usable, robust, and above all, customizable administrative interface for it in five minutes or less. &lt;/blockquote&gt;   &lt;h3&gt; Rubricks - Ajax bells and whistles &lt;/h3&gt;   &lt;a href="http://rubricks.org/index_en.html"&gt;Rubricks&lt;/a&gt; is probably one of the most feature-enhanced publicly available &lt;strong&gt;rails&lt;/strong&gt; &lt;strong&gt;cms&lt;/strong&gt; I've seen. I played with it extensively and even used it on a project in its early stages. It has since then been continually developed by a team of 6 Japanese developers. The current version as of this post for Rubricks is 0.4.1. It includes english and japanese versions of the system and some of the documentation is in english also. &lt;h3&gt;Rubricks features include:&lt;/h3&gt;   &lt;ul&gt;&lt;li&gt;RSS Reader&lt;/li&gt;&lt;li&gt;News reader&lt;/li&gt;&lt;li&gt;&lt;strong&gt;CMS&lt;/strong&gt; Search System&lt;/li&gt;&lt;/ul&gt;   &lt;h3&gt;Ajax Scaffold Generator (cms tool, not a cms) &lt;/h3&gt;   &lt;ul&gt;&lt;li&gt; Generates a production ready, fully styled, interface for managing models &lt;/li&gt;&lt;li&gt; Generates valid XHTML and CSS. &lt;/li&gt;&lt;li&gt; Guaranteed to work on Firefox 1+, IE 6+ and Safari 2+ &lt;/li&gt;&lt;li&gt; Gracefully degrades when Javascript is not available &lt;/li&gt;&lt;li&gt; Designed to be used as a &lt;strong&gt;Rails&lt;/strong&gt; component so you can easily create an admin console by dropping in multiple scaffolds. &lt;/li&gt;&lt;li&gt; Released under the MIT License, the same one as &lt;strong&gt;Rails&lt;/strong&gt; itself, so you can use it freely in your commercial applications.&lt;/li&gt;&lt;/ul&gt;   &lt;p&gt;Check out &lt;a href="http://www.ajaxscaffold.com/"&gt;Ajax Scaffold here.&lt;/a&gt;&lt;/p&gt;   &lt;h3&gt;Eribium&lt;/h3&gt;   &lt;p&gt;I'm not completely clear on the features available in &lt;a href="http://www.eribium.org/eribium/"&gt;Eribium&lt;/a&gt; because I believe the website is poorly laid out. However, I am aware the author is working on some very interesting modules such as Juggernaut described later in this article. I will say that you should have a look at the&lt;a href="http://www.eribium.org/eribium/"&gt; Eribium &lt;strong&gt;CMS&lt;/strong&gt;&lt;/a&gt; site and see if it fits your needs.&lt;/p&gt;   &lt;h3&gt;RCMS-0.3&lt;/h3&gt;   &lt;p&gt;&lt;a href="http://rcms.oopen.de/Home/"&gt;RCMS &lt;/a&gt;is so early in its life, I'd almost venture to say, "be careful". That isn't to say it isn't worth trying out. Currently it's a very minimalistic &lt;strong&gt;cms&lt;/strong&gt; with theming capabilities. It's worth a look just to see what they've done so far.&lt;/p&gt;   &lt;h3&gt;Admin Pages &lt;strong&gt;CMS&lt;/strong&gt; with Tree Tiers&lt;/h3&gt;   &lt;p&gt;The &lt;a href="http://adminpages.flowdev.de/"&gt;Admin Pages &lt;strong&gt;CMS&lt;/strong&gt;&lt;/a&gt; (if that really is its name) is worth a look but hardly production worthy. It has some concepts that people may want to copy for their own but I really don't see this system up to par as something you could use without considerable work required. &lt;/p&gt;   &lt;h3&gt;Spread &lt;strong&gt;CMS&lt;/strong&gt;&lt;/h3&gt;   &lt;p&gt;The &lt;a href="http://www.spread-cms.org/"&gt;Spread &lt;strong&gt;CMS&lt;/strong&gt;&lt;/a&gt; looks very nice! From the screenshots that is. I couldn't find a downloadable version but that may change in the future. I think this &lt;strong&gt;CMS&lt;/strong&gt; has a ton of potential and I'd love to see more people help them further develop it. It really is designed nicely.&lt;/p&gt;   &lt;p&gt;Here is the &lt;a href="http://trac.spread-cms.org/trac.cgi"&gt;Spread &lt;strong&gt;CMS&lt;/strong&gt; Trac.&lt;/a&gt;&lt;/p&gt;   &lt;h3&gt;Pimpki - Personal Information Manager&lt;/h3&gt;   &lt;p&gt;&lt;a href="http://rubyforge.org/projects/pimki"&gt;Pimki 1.8&lt;/a&gt; is a PIM (Personal Information Manager) loosely based on Instiki's Wiki technology. This is the place to dump your brain, organise your thoughts and Get Things Done. The ease of use and immediacy of a wiki combined with extended view to slice and dice the data give you a unique power to store, manage and retrieve all loose bit of information in your life.&lt;/p&gt;   &lt;p&gt;There are a lot of features added over a regular Wiki, features that only make sense when you view it as a personal application and not so much as a group oriented application. See below for a full list of goodies.&lt;/p&gt;   &lt;h3&gt;RealApps &lt;strong&gt;CMS&lt;/strong&gt; - A Dead Simple &lt;strong&gt;CMS&lt;/strong&gt;&lt;/h3&gt;   &lt;p&gt;&lt;a href="http://rubyforge.org/projects/realapps-cms/"&gt;RealApps&lt;/a&gt; is a very simple design for a &lt;strong&gt;CMS&lt;/strong&gt; on &lt;strong&gt;Rails&lt;/strong&gt;. t's implemented as a plugin you can download, which then generates scaffolded code for administering your content. It's designed to be a starter system for small sites, and of course you can build on it as you want. It's also a good place to look if you want to see how generators and plugins are implemented. &lt;/p&gt;   &lt;h3&gt; &lt;strong&gt;CMS&lt;/strong&gt; Compontent - DateBocks 2.0&lt;/h3&gt;   &lt;p&gt;&lt;a href="http://datebocks.inimit.com/"&gt;DateBocks &lt;/a&gt; is growing very popular amongst rails users, as a pure JavaScript library using DHTML and advanced date parsing to generate the date based on the grammar passed. The purpose of DateBocks is to simplify the date entering process using common terms we are all familiar with.&lt;/p&gt;   &lt;p&gt;Ruby on &lt;strong&gt;Rails&lt;/strong&gt; is the development framework of choice. Future implementations in such core JavaScript libraries as the Dojo Toolkit, YUI, GWT, and others are likely to follow.&lt;/p&gt;   &lt;h3&gt; &lt;strong&gt;CMS&lt;/strong&gt; Component - ClockingIT&lt;/h3&gt;   &lt;p&gt;&lt;a href="http://www.clockingit.com/"&gt;ClockingIt&lt;/a&gt; is a task-listing, time-tracking web application built in Ruby on &lt;strong&gt;Rails&lt;/strong&gt;. Here you can download &lt;a href="http://www.clockingit.com/"&gt;ClockingI.&lt;/a&gt;&lt;/p&gt;   &lt;h3&gt;ClockingIT Features include:&lt;/h3&gt;   &lt;ul&gt;&lt;li&gt; unlimited projects, tasklists and tasks &lt;/li&gt;&lt;li&gt; milestones and due dates &lt;/li&gt;&lt;li&gt; time tracking and reports &lt;/li&gt;&lt;li&gt; project timeline &lt;/li&gt;&lt;li&gt; multiple user accounts &lt;/li&gt;&lt;li&gt; ajax and comet interface&lt;/li&gt;&lt;/ul&gt;   &lt;h3&gt;Juggernaut - A &lt;strong&gt;Rails&lt;/strong&gt; Plugin (not a cms) &lt;/h3&gt;   &lt;p&gt;&lt;a href="http://eribium.exacity.com/"&gt;Juggernaut&lt;/a&gt; for Ruby on &lt;strong&gt;Rails&lt;/strong&gt; initiates a flash xmlsocket between server and browser allowing real time communication between the two. This opens the door to all sorts of functionality such as chats and collaborative wikis/&lt;strong&gt;cms&lt;/strong&gt;. The open socket connection allows the server to 'push' base64 encoded javascript to the browser which is subsequently decoded and evaluated. &lt;strong&gt;Juggernaut &lt;/strong&gt; provides a Comet interface via flash to web-apps.&lt;/p&gt;   &lt;h3&gt;Juggernaut Features:&lt;/h3&gt;   &lt;ul&gt;&lt;li&gt;Allows a real time connection with a client - &lt;strong&gt;Rails&lt;/strong&gt; can literally  push javascript in real time to the client which is then evaluated. &lt;/li&gt;&lt;li&gt;Push server - written in Ruby. &lt;/li&gt;&lt;li&gt;Integrated, as a plugin, into &lt;strong&gt;Rails&lt;/strong&gt;. &lt;/li&gt;&lt;li&gt;Subscribers can subscribe to multiple channels, and broadcasters can broadcast to multiple channels. Channels are sent as a base64 encoded array - from the session. &lt;/li&gt;&lt;li&gt;Uses Flash 6 - installed on more than 95% of computers. &lt;/li&gt;&lt;li&gt;Supports all the major browsers (uses fscommand): Firefox 1+, IE  6+ and Safari 2+.&lt;/li&gt;&lt;/ul&gt;   &lt;h3&gt;Comatose - &lt;strong&gt;CMS&lt;/strong&gt; Plugin App&lt;/h3&gt;   &lt;p&gt;&lt;a href="http://mattmccray.com/"&gt;Comatose 0.6&lt;/a&gt; is out! Here’s a quick summary of the new stuff:&lt;/p&gt;   &lt;ul&gt;&lt;li&gt;ComatoseController has been split into ComatoseController and ComatoseAdminController &lt;/li&gt;&lt;li&gt;Both controllers extend your ApplicationController &lt;/li&gt;&lt;li&gt;The views, stylesheets, and javascripts have been updated and renamed to reflect the controller change &lt;/li&gt;&lt;li&gt;Configuration via Comatose::Options class &lt;/li&gt;&lt;li&gt;Liquid is the default text processor &lt;/li&gt;&lt;li&gt;Support for named routes &lt;/li&gt;&lt;li&gt;A Getting Started Guide &lt;/li&gt;&lt;li&gt;Pages now have a created_on field &lt;/li&gt;&lt;li&gt;Bug-fixes&lt;/li&gt;&lt;/ul&gt;   &lt;h3&gt;Conclusion of &lt;strong&gt;CMS&lt;/strong&gt; Breakdown&lt;/h3&gt;   &lt;p&gt;As you can see, there are a number of ongoing Ruby on &lt;strong&gt;Rails&lt;/strong&gt; &lt;strong&gt;CMS&lt;/strong&gt; projects. Some of them are moving along faster than others, and a few have not even got off the ground yet: &lt;a href="http://www.railfrog.com/"&gt;Railfrog &lt;/a&gt;or become public such as &lt;a href="http://www.rubish.org/"&gt;Rubish by Kyle Shank.&lt;/a&gt; That doesn't mean they won't however. &lt;/p&gt;   &lt;p&gt;One important thing to keep in mind when selecting your &lt;strong&gt;rails&lt;/strong&gt; &lt;strong&gt;CMS&lt;/strong&gt; is if you need a system that is going to be continually developed, or if you simply want their skeleton to build on. Some of these systems are being developed quickly such as Rubricks and Radiant and that is worth considering when you make your choice. &lt;/p&gt;   &lt;p&gt;There will always be new &lt;strong&gt;CMS&lt;/strong&gt; components and systems popping up. My final plea after writing this is that the developers working on these systems cooperate with one another and strive to share their goals and vision so that it can benefit the community as a whole and increase the maturation of Ruby on &lt;strong&gt;Rails&lt;/strong&gt; &lt;strong&gt;CMS&lt;/strong&gt; systems  into their next generation.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3059015612137649698-9061807568234333806?l=vpanchal.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vpanchal.blogspot.com/feeds/9061807568234333806/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3059015612137649698&amp;postID=9061807568234333806' title='31 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3059015612137649698/posts/default/9061807568234333806'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3059015612137649698/posts/default/9061807568234333806'/><link rel='alternate' type='text/html' href='http://vpanchal.blogspot.com/2007/07/top-20-ruby-on-rails-content-management.html' title='Top 20 Ruby on Rails Content Management Systems CMS Tools'/><author><name>Vijayta Panchal</name><uri>http://www.blogger.com/profile/04140284328285563574</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>31</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3059015612137649698.post-5775719523809172676</id><published>2007-07-08T23:07:00.001-07:00</published><updated>2007-07-08T23:07:44.204-07:00</updated><title type='text'>CMS blues</title><content type='html'>Somehow CMS systems always have disavantages (even the ones I wrote myself e.g. BackStream's ECMS :) ). They are always of one or more of too proprietary, too large, too strict, too flexible, not multilingual, without workflow, too data oriented (instead of task oriented), too hard to configure, too hard to program, too slow, too ugly URLs, too etc. etc.&lt;br /&gt;&lt;br /&gt;I am curerntly looking into a Ruby on Rails CMS called &lt;a href="http://radiantcms.org/"&gt;Radiant&lt;/a&gt;. So far it has the following pros:&lt;br /&gt;- it is nice to look at&lt;br /&gt;- it is still small&lt;br /&gt;- it pretty powerfull while still easy to follow (possible thanks to Ruby)&lt;br /&gt;&lt;br /&gt;It still needs a lot of work. For example there is currently not even support for images and stylesheets. Still the way things are structured make me think this CMS will come a long way towards the ultimate CMS. Lets spend some more time on this...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3059015612137649698-5775719523809172676?l=vpanchal.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vpanchal.blogspot.com/feeds/5775719523809172676/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3059015612137649698&amp;postID=5775719523809172676' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3059015612137649698/posts/default/5775719523809172676'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3059015612137649698/posts/default/5775719523809172676'/><link rel='alternate' type='text/html' href='http://vpanchal.blogspot.com/2007/07/cms-blues.html' title='CMS blues'/><author><name>Vijayta Panchal</name><uri>http://www.blogger.com/profile/04140284328285563574</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3059015612137649698.post-3920377651163444354</id><published>2007-07-08T22:12:00.001-07:00</published><updated>2007-07-08T22:37:14.344-07:00</updated><title type='text'>Radiant CMS</title><content type='html'>&lt;p&gt;One of the hardest parts of designing a website is figuring out how to manage the content – the text, images, graphics, and various other elements that make up a website. It’s usually a trade-off between “how easy can we make it” and “how powerful do we need it”. In the past, I’ve hacked blogging engines like &lt;a href="http://www.typosphere.org/"&gt;Typo&lt;/a&gt; and &lt;a href="http://www.wordpress.org/"&gt;WordPress&lt;/a&gt; into pretty good content management systems. But the problem with blogging engines is that they’re not meant for managing web pages – a problem when you have a site with lots of pages.&lt;/p&gt;    &lt;p&gt;Because of this, I’m on a constant quest to find a good content management system (CMS). Along the way I started a &lt;a href="http://artofmission.stikipad.com/cms/show/HomePage"&gt;&lt;span class="caps"&gt;CMS&lt;/span&gt; StikiPad&lt;/a&gt; to try to gather others’ opinions about which &lt;span class="caps"&gt;CMS&lt;/span&gt; systems are best suited for different purposes.  I even created my own &lt;span class="caps"&gt;CMS&lt;/span&gt; (albeit a very specialized one for missionaries) called &lt;a href="http://www.crossconnector.com/"&gt;CrossConnector&lt;/a&gt;&lt;/p&gt;    &lt;p&gt;But ever since I started using Ruby on Rails, I figured it would only be a matter of time before somebody comes out with a really good &lt;span class="caps"&gt;CMS&lt;/span&gt; written in Rails. I’ve been watching some very promising &lt;span class="caps"&gt;CMS&lt;/span&gt; projects, and I recently had the pleasure of taking &lt;strong&gt;&lt;a href="http://www.radiantcms.com/"&gt;Radiant&lt;/a&gt;&lt;/strong&gt; for a test drive with a real project.&lt;/p&gt;    &lt;p&gt;This an overview, albeit a fairly superficial one, of how I set up &lt;a href="http://www.hawkinscosmeticdentistry.com/home"&gt;Hawkins Cosmetic Dentistry&lt;/a&gt; using Radiant.&lt;/p&gt;    &lt;h2&gt;The family tree&lt;/h2&gt;    &lt;p&gt;&lt;img src="http://www.artofmission.com/files/radiant-index.jpg" alt="radiant-index.jpg" align="" border="0" height="265" width="450" /&gt;&lt;/p&gt;    &lt;p&gt;Radiant is very family-oriented, and follows a hierarchical model. Each page can have any number of children, and children can have their own children and so on. To add a new page, just find the parent level of the page you’d like to add, and click “Add Child”, and a new baby page comes out.&lt;/p&gt;    &lt;p&gt;All pages originate from a single top-level page, and properties of this great-grandparent page can propagate to all the children and grandchildren unless they are overridden by a particular page. If a property is overridden by a page, that page’s new properties will descend to its own children. Got that? It’s okay, I’ll explain more about that when I talk about Navigation.&lt;/p&gt;    &lt;p&gt;&lt;img src="http://www.artofmission.com/files/radiant-edit.jpg" alt="radiant-edit.jpg" border="0" height="370" width="450" /&gt;&lt;/p&gt;    &lt;h2&gt;Radius Tags&lt;/h2&gt;    &lt;p&gt;Radius tags take some getting used to, but really give you a lot of flexibility to build templates without exposing any programming code. Radius tags look a lot like &lt;span class="caps"&gt;XML&lt;/span&gt; tags, and if you can write or understand &lt;span class="caps"&gt;XHTML&lt;/span&gt; or &lt;span class="caps"&gt;XML&lt;/span&gt;, then you should have no trouble figuring out Radius. Very briefly (&lt;a href="http://dev.radiantcms.org/radiant/browser/trunk/radiant/app/models/page_context.rb"&gt;Radiant’s Trac repository&lt;/a&gt; has good documentation on Radius tags), Radius tags look like &lt;code&gt;&lt;r:something&gt;&lt;/r:something&gt;&lt;/code&gt;, where “something” is a command that is passed to the Radiant &lt;span class="caps"&gt;CMS&lt;/span&gt;. Notice that, like &lt;span class="caps"&gt;XML&lt;/span&gt;, the Radius tag has to be closed with a ”/” character. Similarly, Radius tags can enclose other tags, like this: &lt;code&gt;&lt;r:children:each&gt;&lt;r:link&gt;&lt;/r:link&gt;&lt;/r:children:each&gt;&lt;/code&gt;, which would output a list of links for a page’s children.&lt;/p&gt;    &lt;h2&gt;Page Layout&lt;/h2&gt;    &lt;p&gt;Radiant gives you a lot of flexibility to create different layouts for different purposes. For this site, I created two layouts: “Normal” and “Homepage”. Both are pretty similar, except that the Homepage layout has a different column configuration. I could probably have used just one layout to avoid repeating &lt;span class="caps"&gt;HTML&lt;/span&gt; code, but it’s very convenient to be able to choose which layout I want for each page. I could just as easily have created layouts called “two-column”, “three-column”, “upside-down”, and so on.&lt;/p&gt;    &lt;p&gt;&lt;img src="http://www.artofmission.com/files/radiant-layouts.jpg" alt="radiant-layouts.jpg" align="" border="0" height="204" width="450" /&gt;&lt;/p&gt;    &lt;h2&gt;Navigation&lt;/h2&gt;    &lt;p&gt;To create the navigation, I used a combination of Snippets and Page Parts.&lt;/p&gt;    &lt;h3&gt;Header Navigation&lt;/h3&gt;    &lt;p&gt;Take a look at &lt;strong&gt;Listing 1&lt;/strong&gt;, and notice the Radius code inside the &lt;span class="caps"&gt;CSS&lt;/span&gt; Style tag. For this site, we needed to highlight both the current page &lt;strong&gt;and&lt;/strong&gt; the current section. To do this, I created a Snippet called “screen.css”, which uses regular &lt;span class="caps"&gt;CSS&lt;/span&gt; mixed with Radius tags to define a special &lt;span class="caps"&gt;CSS&lt;/span&gt; style based on the current page. In addition, I created a page part called “top_menu” in each of the five main pages – “Home”, “About Us”, “Cosmetic Dentistry”, “General Dentistry”, and “Locations”.&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3059015612137649698-3920377651163444354?l=vpanchal.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vpanchal.blogspot.com/feeds/3920377651163444354/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3059015612137649698&amp;postID=3920377651163444354' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3059015612137649698/posts/default/3920377651163444354'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3059015612137649698/posts/default/3920377651163444354'/><link rel='alternate' type='text/html' href='http://vpanchal.blogspot.com/2007/07/radiant-cms.html' title='Radiant CMS'/><author><name>Vijayta Panchal</name><uri>http://www.blogger.com/profile/04140284328285563574</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3059015612137649698.post-2512329100252509706</id><published>2007-07-05T23:55:00.001-07:00</published><updated>2007-07-06T02:07:55.138-07:00</updated><title type='text'>Radiant Photo Gallery with lightbox Effect</title><content type='html'>Gallery&lt;br /&gt;&lt;br /&gt; Created by: Andrea Franz - bigchieflabs.com/blog/&lt;br /&gt; Version: 0.5.2&lt;br /&gt;&lt;br /&gt;The Gallery extension allows to manage galleries of images.&lt;br /&gt;Features:&lt;br /&gt;&lt;br /&gt;   * Image/file upload (or retrieving by url)&lt;br /&gt;   * Import (FTP)&lt;br /&gt;   * Images/files sorting (drag-n-drop)&lt;br /&gt;   * Automatic thumbnail generation for images.&lt;br /&gt;   * Image crop (ALPHA version)&lt;br /&gt;&lt;br /&gt;Installation&lt;br /&gt;&lt;br /&gt;Get the latest version of gallery extension with darcs:&lt;br /&gt;&lt;br /&gt;       darcs get http://darcs.bigchieflabs.com/radiant/extensions/gallery/&lt;br /&gt;&lt;br /&gt;…or download it in your vendor/extensions folder from here:&lt;br /&gt;&lt;br /&gt;       http://darcs.bigchieflabs.com/radiant/extensions/gallery/gallery.tar.gz&lt;br /&gt;&lt;br /&gt;From your Rails app root type theese commands:&lt;br /&gt;&lt;br /&gt;       rake radiant:extensions:gallery:install&lt;br /&gt;       rake radiant:extensions:gallery:example&lt;br /&gt;&lt;br /&gt;The second one creates an example of GalleryPage you can find at "your_site_url/gallery-example". Check it out after creating a new Gallery in your radiant administation panel.&lt;br /&gt;Dependencies&lt;br /&gt;&lt;br /&gt; Gallery extension requires RMagick&lt;br /&gt;&lt;br /&gt;Usage&lt;br /&gt;List all gallery in a Gallery page&lt;br /&gt;&lt;br /&gt;Create a new page and set Gallery as PageType.&lt;br /&gt;&lt;br /&gt; &lt;r:gallery:if_index&gt;&lt;br /&gt; &lt;/r:gallery:if_index&gt;&lt;h3&gt;Galleries&lt;/h3&gt;&lt;hr style="clear: left;"&gt;&lt;br /&gt;   &lt;r:gallery:unless_index&gt;&lt;/r:gallery:unless_index&gt;&lt;h3&gt;&lt;r:gallery:name&gt;&lt;/r:gallery:name&gt;&lt;/h3&gt;&lt;r:gallery:items:each&gt;&lt;/r:gallery:items:each&gt;List gallery items in a simple page&lt;br /&gt;&lt;br /&gt;You can list all the items of a gallery specifying its id:&lt;br /&gt;&lt;br /&gt; &lt;r:gallery id="5"&gt;&lt;/r:gallery&gt;&lt;h3&gt;&lt;r:gallery:name&gt;&lt;/r:gallery:name&gt;&lt;/h3&gt;&lt;r:gallery:items:each&gt;&lt;/r:gallery:items:each&gt;Direct access to gallery items&lt;br /&gt;&lt;br /&gt;You can access directly to a gallery item, but you must specify 2 attribute. The gallery id, and the position of the item:&lt;br /&gt;&lt;br /&gt; &lt;r:gallery:item:path id="1" position="1"&gt;&lt;br /&gt; &lt;r:gallery:item:link id="1" position="1"&gt;&lt;r:gallery:item:description id="1" position="1"&gt;&lt;r:gallery:item:name id="1" position="1"&gt;&lt;r:gallery:item:thumb id="1" position="first"&gt;&lt;r:gallery:item:thumb id="1" position="last"&gt;&lt;r:gallery:item:thumb id="1" position="1" width="small"&gt;&lt;r:gallery:item:thumb id="1" position="last" height="200"&gt;&lt;r:gallery:item:content_type id="1" position="last"&gt;Lightbox style&lt;br /&gt;&lt;br /&gt;In order for lightbox to work you have to include this Radiant tag in your layout HEAD section:&lt;br /&gt;&lt;br /&gt; &lt;r:gallery:lightbox_stuff&gt;&lt;br /&gt;&lt;br /&gt;Now you can use the &lt;r:gallery:lightbox&gt; tag in a simple page specifying the gallery id:&lt;br /&gt;&lt;br /&gt; &lt;r:gallery:lightbox id="1"&gt;&lt;br /&gt;&lt;br /&gt;…or in a Gallery page:&lt;br /&gt;&lt;br /&gt; &lt;r:gallery:if_index&gt;&lt;br /&gt;   &lt;/r:gallery:if_index&gt;&lt;/r:gallery:lightbox&gt;&lt;/r:gallery:lightbox&gt;&lt;/r:gallery:lightbox_stuff&gt;&lt;/r:gallery:item:content_type&gt;&lt;/r:gallery:item:thumb&gt;&lt;/r:gallery:item:thumb&gt;&lt;/r:gallery:item:thumb&gt;&lt;/r:gallery:item:thumb&gt;&lt;/r:gallery:item:name&gt;&lt;/r:gallery:item:description&gt;&lt;/r:gallery:item:link&gt;&lt;/r:gallery:item:path&gt;&lt;h3&gt;Galleries&lt;/h3&gt;&lt;r:galleries:each&gt;&lt;/r:galleries:each&gt;&lt;h4&gt;&lt;r:gallery:link&gt;&lt;/r:gallery:link&gt;&lt;/h4&gt;&lt;r:gallery:lightbox&gt;&lt;/r:gallery:lightbox&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Enjoy! &lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3059015612137649698-2512329100252509706?l=vpanchal.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vpanchal.blogspot.com/feeds/2512329100252509706/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3059015612137649698&amp;postID=2512329100252509706' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3059015612137649698/posts/default/2512329100252509706'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3059015612137649698/posts/default/2512329100252509706'/><link rel='alternate' type='text/html' href='http://vpanchal.blogspot.com/2007/07/radiant-photo-gallery-with-lightbox.html' title='Radiant Photo Gallery with lightbox Effect'/><author><name>Vijayta Panchal</name><uri>http://www.blogger.com/profile/04140284328285563574</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3059015612137649698.post-740908721238603278</id><published>2007-07-05T05:00:00.000-07:00</published><updated>2007-07-05T05:01:22.995-07:00</updated><title type='text'>What's New in Radiant 0.6</title><content type='html'>You may have heard through the grapevine that Radiant 0.6 is to be released this Saturday. If not, here’s your notice!&lt;br /&gt;&lt;br /&gt;UPDATE: OK, so we didn’t release yesterday. John and I were up late adding generators for extension models and controllers and trying to fix the fixtures issue. Hopefully we’ll release today (Sunday 4/22).&lt;br /&gt;&lt;br /&gt;Since there are a lot of changes since the release of 0.5.2 (250+ commits), I will summarize them for you here. Most of the changes affect developers more than end-users, but there are still some major differences that could slip you up when upgrading or building a new site.&lt;br /&gt;&lt;br /&gt;This is pretty long, so be prepared for a big read after the jump.&lt;br /&gt;Changes for End Users and Site Managers&lt;br /&gt;Installation/Upgrade&lt;br /&gt;&lt;br /&gt;    * script/setup_database is gone. To create a new Radiant site, go to the directory where you created an instance, and run rake production db:bootstrap. This will run the wizard that builds the database for you. Make sure you have edited or created config/database.yml already.&lt;br /&gt;    * If you are upgrading from an older version of Radiant, BACKUP YOUR DATABASE and then run rake db:migrate. If you used custom behaviors, try to find and install extension replacements for them before you attempt to upgrade.&lt;br /&gt;    * To upgrade an instance with the most current files, run rake radiant:update. This will copy the latest stuff from vendor/radiant or the gem.&lt;br /&gt;&lt;br /&gt;Database&lt;br /&gt;&lt;br /&gt;    * sqlite3 is now better supported; Postgresql and MS SQL Server should work too.&lt;br /&gt;&lt;br /&gt;Performance&lt;br /&gt;&lt;br /&gt;    * Radiant now supports “X-Sendfile” headers on cached pages, which should speed up the page delivery for some web servers in proxy configurations.&lt;br /&gt;    * Radiant now supports “304 Not Modified” status codes, which will prevent the client for downloading pages that have not changed from the version in the client-side cache. The client must support this status code, of course.&lt;br /&gt;&lt;br /&gt;Radius Tags&lt;br /&gt;&lt;br /&gt;    * r:children:each, r:children:first, and r:children:last now all accept the same ordering and limit attributes and have the same defaults.&lt;br /&gt;    * Snippets are now responsive to global context via the r:page tag. This means that any tags inside r:page will refer to the page currently being rendered, i.e. the page requested, not the local contextual page via tags like r:children:each, etc. This is most relevant to recursive snippets like the sitemapper example.&lt;br /&gt;    * r:navigation now uses the pipe character (”|”) to delimit URLs in the urls attribute rather than the semi-colon.&lt;br /&gt;    * r:date now accepts a “when” attribute that specifies which attribute of the page to render. Valid values of the attribute are published_at, updated_at, created_at, and now. now renders the current date/time, regardless of which page is being rendered.&lt;br /&gt;    * r:cycle is a new tag that creates or continues a global cycle in your page. A cycle basically emits text you define based on the number of times you’ve called it. This is nice for alternating the style of rows in a table, etc.&lt;br /&gt;&lt;br /&gt;Admin and Page-editing Interfaces&lt;br /&gt;&lt;br /&gt;    * Page parts/tabs are now preserved in the order you created them.&lt;br /&gt;    * Tag documentation – there’s a popup in the page-editing interface that will show what tags are available for the current page, and some descriptions of how to use them. The popup includes a live-search so you can find a certain tag definition by typing in the box.&lt;br /&gt;    * Filter documentation – there’s a popup in the page-editing interface that will show how to format your content for the currently selected filter.&lt;br /&gt;    * All items in the administration interface (users, pages, snippets, layouts) have optimistic locking. That is, if someone else saves something while you have it open, you will receive a warning to reload the item you are editing.&lt;br /&gt;&lt;br /&gt;Extensions&lt;br /&gt;&lt;br /&gt;    * Any installed extensions can be en/disabled and de/activated via the administration interface. Click “Extensions” next to “Users” if you’re an administrator.&lt;br /&gt;&lt;br /&gt;Changes for Developers&lt;br /&gt;Systemic / Base&lt;br /&gt;&lt;br /&gt;    * Radiant 0.6 is frozen to, and includes in its distribution, Rails 1.2.3 – you don’t have to have Rails already installed! This has many implications and I suggest you investigate the many articles that detail the differences between Rails 1.2 and 1.1.&lt;br /&gt;    * The loading/boot-up process for Rails has been dramatically changed to allow for extensions. Be wary about any changes you might have made to config/environment.rb in the past, or any changes made via plugins. Try to move your changes into extensions instead.&lt;br /&gt;    * The Radiant codebase can be run out of the vendor directory as well as from the gem. This means (only in instance mode):&lt;br /&gt;          o To keep up on the latest trunk or branch code, you should checkout into vendor/radiant rather than doing a plain checkout.&lt;br /&gt;          o To freeze to a specific version of Radiant, either checkout the revision you want, or use the rake radiant:freeze command, which comes in two flavors: radiant:freeze:gems and radiant:freeze:edge. radiant:freeze:edge works just like rails:freeze:edge, with support for TAG and REVISION.&lt;br /&gt;          o To return to fluid use of the system gems, run rake radiant:unfreeze.&lt;br /&gt;    * To quickly rollback and run all Radiant core migrations, use rake db:remigrate. THIS WILL DESTROY ANY DATA IN YOUR DATABASE! USE WITH CAUTION.&lt;br /&gt;    * Radiant::Config (useful in extensions) now supports boolean values. Add a question mark to the end of the key (e.g. Radiant::Config["boolean?"]) if it should return boolean values (true/false).&lt;br /&gt;&lt;br /&gt;Performance&lt;br /&gt;&lt;br /&gt;    * Caching no longer stores the headers and body in the same file. This allows Radiant to support X-SendFile headers.&lt;br /&gt;    * Cache files are stored in the /cache directory in your instance, not tmp/cache. (not sure if this was changed or the same, but good to know nonetheless).&lt;br /&gt;    * Pages can set a specific cache timeout via response.cache_timeout. This should probably be set in the process method.&lt;br /&gt;&lt;br /&gt;Assets&lt;br /&gt;&lt;br /&gt;    * All images and stylesheets that support the Radiant administration interface have moved to images/admin and stylesheets/admin respectively.&lt;br /&gt;&lt;br /&gt;Extensions&lt;br /&gt;&lt;br /&gt;This is it! The Big One. If you want to change the way Radiant works, use an extension. I’ve detailed some aspects of extensions in my previous presentation, but here’s the nitty-gritty.&lt;br /&gt;&lt;br /&gt;    * Extensions can be generated in instance mode. This is important if you want keep your install clean.&lt;br /&gt;    * Behaviors are no more. If you want to change the way a page behaves, subclass the Page model. Make sure your new subclass is accessible by naming the file it’s defined in using the Rails naming convention. You should probably also ‘declare’ it in the activate method of your extension to be sure it’s loaded. For example:&lt;br /&gt;&lt;br /&gt;# app/models/hello_world_page.rb&lt;br /&gt;  class HelloWorldPage &lt; Page&lt;br /&gt;    def render&lt;br /&gt;      "Hello, world!" &lt;br /&gt;    end&lt;br /&gt;  end&lt;br /&gt;&lt;br /&gt;# hello_world_extension.rb &lt;br /&gt;  def activate&lt;br /&gt;    HelloWorldPage&lt;br /&gt;  end&lt;br /&gt;&lt;br /&gt;    * Pages no longer have support for the ‘config’ part by default. If you need this functionality in your Page subclass, you must implement it yourself. You can look at MailerPage in the mailer extension for a sample implementation.&lt;br /&gt;    * You can add tabs to the administration interface using admin.tabs.add in the activate method of your extension. Here’s some examples:&lt;br /&gt;&lt;br /&gt;  admin.tabs.add "Assets", "/admin/assets", :after =&gt; "Layouts" &lt;br /&gt;  admin.tabs.add "Welcome", "/admin/help", :before =&gt; "Pages" &lt;br /&gt;  admin.tabs.add "LDAP", "/admin/ldap" &lt;br /&gt;&lt;br /&gt;    * Migrations defined in your extensions can be run via rake db:migrate:extensions to migrate all extensions, or rake radiant:extensions:extension_name:migrate for a specific extension named ‘extension_name’. Extension migrations are managed independently of the main Radiant migrations, having their own version numbers, etc.&lt;br /&gt;    * Extensions can define custom Rake tasks in lib/tasks. Some tasks are provided for you when you generate your extension.&lt;br /&gt;    * Extensions can override the way SiteController invokes page processing by overriding SiteController#process_page.&lt;br /&gt;&lt;br /&gt;Radius Tags&lt;br /&gt;&lt;br /&gt;    * Global tags are now defined in the Page model (the defaults via inclusion of StandardTags). To define your own global tags, open up the Page model and either define with a ‘tag’ block or include your own module that itself includes Radiant::Taggable. Example:&lt;br /&gt;&lt;br /&gt;# app/models/hello_world_tags.rb&lt;br /&gt;module HelloWorldTags&lt;br /&gt;  include Radiant::Taggable&lt;br /&gt;&lt;br /&gt;  tag "hello" do |tag|&lt;br /&gt;    "Hello, world!" &lt;br /&gt;  end&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;# hello_world_extension.rb&lt;br /&gt;  def activate&lt;br /&gt;    Page.class_eval { include HelloWorldTags }&lt;br /&gt;  end&lt;br /&gt;&lt;br /&gt;    * Tags now have their own documentation DSL. Precede the tag definition with desc %{ My tag documentation }. Your documentation will be formatted with Textile. See standard_tags.rb for examples.&lt;br /&gt;&lt;br /&gt;Testing&lt;br /&gt;&lt;br /&gt;    * Exceptions thrown inside Radius tag definitions now bubble up during tests.&lt;br /&gt;    * Tests work under sqlite3.&lt;br /&gt;    * Test tasks work in instance mode.&lt;br /&gt;    * Extensions can define their own “test helpers” in test/helpers. Test helpers are modules that can be easily mixed into your tests – with the test_helper :helper_name command – to add custom assertions, etc. There are a wealth of test helpers included with Radiant.&lt;br /&gt;    * Extensions can define their own fixtures in test/fixtures. Use extension_fixtures :model_names to use them in a test case.&lt;br /&gt;&lt;br /&gt;Last-minute stuff&lt;br /&gt;&lt;br /&gt;The core team has also been given until Saturday to commit any last minute changes. I’ll add them below as they come up. I will not include updates to individual extensions, so you’ll have to follow those yourself. As Gabriel Lamounier always says in his emails to the list, “Be Radiant!”&lt;br /&gt;&lt;br /&gt;    * r371 (Developers) – You can modify the ‘meta’ (more/less) area and the area just above the buttons on the page-editing interface. The ‘meta’ area can only display fields on the Page model and uses a specialized Hash format, but the buttons area can display any accessible partial. I called this changeset “facets-lite”.&lt;br /&gt;    * r372 (End users) – The slug/breadcrumb auto-updating should be responsive to mouse and other events as well as just typing.&lt;br /&gt;    * r373 (Bug fix)&lt;br /&gt;    * r374 (Bug fix)&lt;br /&gt;    * r377 (End users) Make r:date tag use “for” attribute instead of “when”.&lt;br /&gt;    * r378, 383 (Developers) Add extension controller generator.&lt;br /&gt;    * r379 Updated CONTRIBUTORS.&lt;br /&gt;    * r380, 383, 384, 387 – Add extension model generator.&lt;br /&gt;    * r381, 382, 385, 386, 393, 394, 395 (Developers) Fixing extension fixtures issues. The generated test_helper.rb should work out-of-the-box, but you may need to update existing extensions.&lt;br /&gt;    * r388-392 (End users) Fixed IE6 CSS bugs.&lt;br /&gt;    * r393-395 (Developers) Extensions use the standard fixtures command in tests now, rather than extension_fixtures. Generated tests and test helpers are adjusted to reflect this.&lt;br /&gt;    * r398 (End users) Denied page saves due to the optimistic locking feature should retain your changes in the interface rather than reloading.&lt;br /&gt;    * r400 (Developers) Extension tests can be run in instance mode.&lt;br /&gt;    * r403 (Developers) Extension controller and model generators can be run in instance mode.&lt;br /&gt;    * r404 (Developers) Extension tests are run in isolation rather than together.&lt;br /&gt;&lt;br /&gt;UPDATE 4/25: Those are all the significant changes up to the tagging of the 0.6 release. I’m sure there will be bug fixes in the near future as they are revealed.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3059015612137649698-740908721238603278?l=vpanchal.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vpanchal.blogspot.com/feeds/740908721238603278/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3059015612137649698&amp;postID=740908721238603278' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3059015612137649698/posts/default/740908721238603278'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3059015612137649698/posts/default/740908721238603278'/><link rel='alternate' type='text/html' href='http://vpanchal.blogspot.com/2007/07/whats-new-in-radiant-06.html' title='What&apos;s New in Radiant 0.6'/><author><name>Vijayta Panchal</name><uri>http://www.blogger.com/profile/04140284328285563574</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3059015612137649698.post-8890675097731143387</id><published>2007-07-05T04:52:00.000-07:00</published><updated>2007-07-05T04:53:26.964-07:00</updated><title type='text'>Why Radiant is better than Mephisto (and Typo) ?</title><content type='html'>I use Typo for my blog for some month now and before for other blogs. For its purpose of blogging it is a good tool, and written with Rails :). As Mephisto I think both inherit of the Rails’ fashion. The past week I tried to implement inside Typo a small poll system I have developed in standalone application. I really got surprised by the complexity of Typo, and the lack of interface for extension, then I tried quickly its brother and it was maybe better, but so complex. We are far from the 20’ blog’s demo. These two blogs are made by great people knowing very well Rails then I guess the code is good and can handle every situation, but can’t we do simpler ?&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Radiant 0.6.0&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;Radiant 0.6.0 is going out today. Don’t look at the version number (last stable was 0.5.2), this new version is a big change. I have tried it before but was not happy with the behavior system. Why add another concept to MVC? Why the basic content should be a page?&lt;br /&gt;&lt;br /&gt;In this new version the concept of behavior disappears, I let you check on the website what is different. “Instead” there is a great extension system. You have an interface between radiant and extension to declare it (that is IMO a minimum to make a good system) and then you can access the Radiant API to easily extend it, by example, add a new tab in admin interface (try this in Typo ;) ).&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;I like:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;    * a clear and simple coding&lt;br /&gt;    * a neat admin interface&lt;br /&gt;    * a great extension system!&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;I don’t like:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;    * the concept of Page, website is not only pages but many kind of contents as files, folders (or node). Even if extensions bring Assets, the top class should be Content instead of Page.&lt;br /&gt;    * the single level of snippets and layouts (only to complain about something :p)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3059015612137649698-8890675097731143387?l=vpanchal.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vpanchal.blogspot.com/feeds/8890675097731143387/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3059015612137649698&amp;postID=8890675097731143387' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3059015612137649698/posts/default/8890675097731143387'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3059015612137649698/posts/default/8890675097731143387'/><link rel='alternate' type='text/html' href='http://vpanchal.blogspot.com/2007/07/why-radiant-is-better-than-mephisto-and.html' title='Why Radiant is better than Mephisto (and Typo) ?'/><author><name>Vijayta Panchal</name><uri>http://www.blogger.com/profile/04140284328285563574</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3059015612137649698.post-5745840429317436154</id><published>2007-07-03T22:34:00.001-07:00</published><updated>2007-07-03T22:34:18.585-07:00</updated><title type='text'>Radiant extension vs rails plugin</title><content type='html'>Rails plugins are designed to extend or modify the Rails framework,&lt;br /&gt;Radiant extensions modify the Radiant application (which is a Rails&lt;br /&gt;app).  In a sense, they do similar things, extensions just have some&lt;br /&gt;easy hooks into Radiant and their initialization routines, etc, are&lt;br /&gt;quite different.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3059015612137649698-5745840429317436154?l=vpanchal.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vpanchal.blogspot.com/feeds/5745840429317436154/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3059015612137649698&amp;postID=5745840429317436154' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3059015612137649698/posts/default/5745840429317436154'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3059015612137649698/posts/default/5745840429317436154'/><link rel='alternate' type='text/html' href='http://vpanchal.blogspot.com/2007/07/radiant-extension-vs-rails-plugin.html' title='Radiant extension vs rails plugin'/><author><name>Vijayta Panchal</name><uri>http://www.blogger.com/profile/04140284328285563574</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3059015612137649698.post-2392022787758304769</id><published>2007-07-03T21:49:00.000-07:00</published><updated>2007-07-03T22:07:03.753-07:00</updated><title type='text'>Steps to Getting Started With Radiant CSM</title><content type='html'>Looks like it's time for another release of Radiant:&lt;br /&gt;&lt;br /&gt;    http://radiantcms.org/download/&lt;br /&gt;&lt;br /&gt;This is a minor update in the 0.6 series. The primary benefit to it is &lt;br /&gt;that people using Sean Cribb’s Page Attachements extension can now use &lt;br /&gt;it without running on edge.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;WHAT IS RADIANT CMS?&lt;br /&gt;&lt;br /&gt;Radiant is a no-fluff content management system made for designers and&lt;br /&gt;programmers and is ideal for use on small teams. It is similar to&lt;br /&gt;Movable Type or Textpattern, but is much more than a blogging engine.&lt;br /&gt;&lt;br /&gt;Radiant features:&lt;br /&gt;&lt;br /&gt;   * An elegant user interface&lt;br /&gt;   * The ability to arrange pages in a hierarchy&lt;br /&gt;   * Flexible templating with layouts, snippets, page parts, and a&lt;br /&gt;     custom tagging language (Radius: http://radius.rubyforge.org)&lt;br /&gt;   * A dynamic extension system&lt;br /&gt;   * A simple user management/permissions system&lt;br /&gt;   * Support for Markdown and Textile as well as traditional HTML&lt;br /&gt;     (it's easy to create other filters)&lt;br /&gt;   * Operates in two modes: dev and production depending on the URL&lt;br /&gt;   * A caching system which expires pages every 5 minutes&lt;br /&gt;   * Built using Ruby on Rails (which means that extending Radiant is&lt;br /&gt;     as easy as any other Rails application)&lt;br /&gt;   * Licensed under the MIT-License&lt;br /&gt;   * And much more...&lt;br /&gt;&lt;br /&gt;There's even a live demo over on the project Web site:&lt;br /&gt;&lt;br /&gt;    http://radiantcms.org/demo/&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;WHAT'S NEW IN THIS RELEASE?&lt;br /&gt;&lt;br /&gt;* Removed some of the database specific code from the ArchiveFinder&lt;br /&gt;   [Daniel Sheppard]&lt;br /&gt;* Fixed typo in extension model generator documentation&lt;br /&gt;* Reworked the way the generator extension is loaded (closing #500)&lt;br /&gt;   [Keita]&lt;br /&gt;* Fixed failing unit tests in instance mode [Daniel Shephard]&lt;br /&gt;* Modified the page edit form to use multipart/form-data (useful for an&lt;br /&gt;   upload extension) [Sean Cribbs]&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;INSTALLATION&lt;br /&gt;&lt;br /&gt;We've worked hard to make it easy to install Radiant. For starters you&lt;br /&gt;can download it with Ruby Gems:&lt;br /&gt;&lt;br /&gt;% gem install --include-dependencies radiant&lt;br /&gt;&lt;br /&gt;Once the Radiant gem is installed you have access to the `radiant`&lt;br /&gt;command. The `radiant` command is similar to the `rails` command (if you&lt;br /&gt;are from the Rails world. It's how you generate a new Radiant project&lt;br /&gt;for a website. So `cd` to the directory where you would like your&lt;br /&gt;instance to be installed and type:&lt;br /&gt;&lt;br /&gt;% radiant -d [mysql|postgres|sqlite3] .&lt;br /&gt;&lt;br /&gt;Next, edit config/database.yml to taste. Then run the rake bootstrap task:&lt;br /&gt;&lt;br /&gt;% rake production db:bootstrap&lt;br /&gt;&lt;br /&gt;And start up the test server:&lt;br /&gt;&lt;br /&gt;% script/server -e production&lt;br /&gt;&lt;br /&gt;Finally, hit the /admin/ URL and you should be off to the races. See the&lt;br /&gt;README file in the release for additional details.&lt;br /&gt;&lt;br /&gt;If you are interested in other download options, visit the download&lt;br /&gt;page: http://radiantcms.org/download/.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;UPGRADING FROM 0.6.x&lt;br /&gt;&lt;br /&gt;1. Update the Radiant gem:&lt;br /&gt;&lt;br /&gt;    % gem update radiant&lt;br /&gt;&lt;br /&gt;2. Change the RADIANT_GEM_VERSION constant in config/environment.rb&lt;br /&gt;    to "0.6.1".&lt;br /&gt;&lt;br /&gt;3. Run the update rake task:&lt;br /&gt;&lt;br /&gt;    rake radiant:update&lt;br /&gt;&lt;br /&gt;4. Restart the server&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;UPGRADING FROM 0.5.x&lt;br /&gt;&lt;br /&gt;The upgrade process changed significantly from last release, so listen&lt;br /&gt;up! To upgrade an existing installation, BACKUP YOUR DATABASE, update&lt;br /&gt;the gem, and create a new Radiant project using the instructions above.&lt;br /&gt;Then point Radiant to the right database by editing config/database.yml&lt;br /&gt;and execute the following command in your project directory:&lt;br /&gt;&lt;br /&gt;% rake db:migrate&lt;br /&gt;&lt;br /&gt;If you have problems during the upgrade, please let us know.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;CONTRIBUTORS&lt;br /&gt;&lt;br /&gt;Radiant wouldn't be possible without the help of some fine people. The&lt;br /&gt;following people have made contributions to this release:&lt;br /&gt;&lt;br /&gt;* Daniel Sheppard         * Sean Cribbs     * Keita&lt;br /&gt;&lt;br /&gt;Thanks guys! If you'd like to hop on the development band wagon head on&lt;br /&gt;over to our dev site (http://dev.radiantcms.org/).&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;SUPPORT&lt;br /&gt;&lt;br /&gt;The best place to get support is definitely on the Radiant mailing list.&lt;br /&gt;There's a crowd of people there who have been hanging around for many&lt;br /&gt;moons now. Newbie questions are welcome! To sign up, go to:&lt;br /&gt;&lt;br /&gt;http://radiantcms.org/mailing-list/&lt;br /&gt;&lt;br /&gt;The Radiant mailing list is also accessible via Ruby forum:&lt;br /&gt;&lt;br /&gt;http://www.ruby-forum.com/forum/21&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Enjoy!&lt;br /&gt;&lt;br /&gt;Vijayta Panchal&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3059015612137649698-2392022787758304769?l=vpanchal.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vpanchal.blogspot.com/feeds/2392022787758304769/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3059015612137649698&amp;postID=2392022787758304769' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3059015612137649698/posts/default/2392022787758304769'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3059015612137649698/posts/default/2392022787758304769'/><link rel='alternate' type='text/html' href='http://vpanchal.blogspot.com/2007/07/steps-to-getting-started-with-radiant.html' title='Steps to Getting Started With Radiant CSM'/><author><name>Vijayta Panchal</name><uri>http://www.blogger.com/profile/04140284328285563574</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3059015612137649698.post-9146503069096308558</id><published>2007-07-03T04:48:00.000-07:00</published><updated>2007-07-03T04:49:37.451-07:00</updated><title type='text'>What are “extensions” (in Radiant)?</title><content type='html'>Part of what makes RadiantCMS great, in my opinion, is that it fulfills the need for most content-management scenarios with pages, layouts and snippets. It’s flexible and puts minimal restriction on the structure of the output. It reaches the 80% window. However there are those cases in the missing 20% where you might have other needs, for example:&lt;br /&gt;&lt;br /&gt;    * Integration with some back-end data service&lt;br /&gt;    * Management of a complex data structure that doesn’t fit into the Radiant page-layout-snippet structure (or fits poorly)&lt;br /&gt;    * Receiving and processing input from the website visitor through forms or other means&lt;br /&gt;    * Complex manipulation of content information that would be impossible or too cumbersome using Radius&lt;br /&gt;&lt;br /&gt;In 0.5.2 and before, page “behaviors” fulfilled many of these concerns. For example, the Mailer behavior processes form-to-email submissions, and the RSS Behavior inserts the headlines from a news feed into a page. However, “behaviors” are focused on processing individual pages and are not well suited to, say, manipulating other models in an administration interface. This is where “extensions” come in.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3059015612137649698-9146503069096308558?l=vpanchal.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vpanchal.blogspot.com/feeds/9146503069096308558/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3059015612137649698&amp;postID=9146503069096308558' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3059015612137649698/posts/default/9146503069096308558'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3059015612137649698/posts/default/9146503069096308558'/><link rel='alternate' type='text/html' href='http://vpanchal.blogspot.com/2007/07/what-are-extensions.html' title='What are “extensions” (in Radiant)?'/><author><name>Vijayta Panchal</name><uri>http://www.blogger.com/profile/04140284328285563574</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3059015612137649698.post-3519104879941340585</id><published>2007-07-02T22:29:00.000-07:00</published><updated>2007-07-02T22:31:13.319-07:00</updated><title type='text'>Ruby &amp; Rails</title><content type='html'>&lt;span style="font-weight:bold;"&gt;What is Ruby?&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;Ruby is a pure object-oriented programming language with a super-clean syntax that makes programming elegant and fun. Ruby successfully combines Smalltalk's conceptual elegance, Python's ease of use and learning, and Perl's pragmatism. Ruby originated in Japan in the early 1990s. It has become popular worldwide in the past few years as more English-language books and documentation have become available (and its popularity has really taken off since the introduction of Rails!).&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;What is Rails?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Rails is an open source Ruby framework for developing web-based, database-driven applications. What's special about that? There are dozens of frameworks out there, and most of them have been around much longer than Rails. Why should you care about yet another framework?&lt;br /&gt;&lt;br /&gt;What would you think if I told you that you can develop a web application at least ten times faster with Rails than you can with a typical Java framework? You can--without making any sacrifices in the quality of your application! How is this possible?&lt;br /&gt;&lt;br /&gt;Part of the answer lies in the Ruby programming language. Rails takes full advantage of Ruby. The rest of the answer is in two of Rails' guiding principles: less software and convention over configuration.&lt;br /&gt;&lt;br /&gt;Less software means you write fewer lines of code to implement your application. Keeping your code small means faster development and fewer bugs, which makes your code easier to understand, maintain, and enhance. Very shortly, you will see how Rails cuts your code burden.&lt;br /&gt;&lt;br /&gt;Convention over configuration means an end to verbose XML configuration files--there aren't any in Rails! Instead of configuration files, a Rails application uses a few simple programming conventions that allow it to figure out everything through reflection and discovery. Your application code and your running database already contain everything that Rails needs to know!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3059015612137649698-3519104879941340585?l=vpanchal.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vpanchal.blogspot.com/feeds/3519104879941340585/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3059015612137649698&amp;postID=3519104879941340585' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3059015612137649698/posts/default/3519104879941340585'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3059015612137649698/posts/default/3519104879941340585'/><link rel='alternate' type='text/html' href='http://vpanchal.blogspot.com/2007/07/ruby-rails.html' title='Ruby &amp; Rails'/><author><name>Vijayta Panchal</name><uri>http://www.blogger.com/profile/04140284328285563574</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3059015612137649698.post-957614042835520819</id><published>2007-07-02T05:06:00.000-07:00</published><updated>2007-07-02T05:07:58.931-07:00</updated><title type='text'>Pseudo Elements</title><content type='html'>p:first-letter {&lt;br /&gt; font-size: 3em;&lt;br /&gt; float: left;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;p:first-line {&lt;br /&gt; font-weight: bold;&lt;br /&gt;}&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3059015612137649698-957614042835520819?l=vpanchal.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vpanchal.blogspot.com/feeds/957614042835520819/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3059015612137649698&amp;postID=957614042835520819' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3059015612137649698/posts/default/957614042835520819'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3059015612137649698/posts/default/957614042835520819'/><link rel='alternate' type='text/html' href='http://vpanchal.blogspot.com/2007/07/pseudo-elements.html' title='Pseudo Elements'/><author><name>Vijayta Panchal</name><uri>http://www.blogger.com/profile/04140284328285563574</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3059015612137649698.post-8446338180034056312</id><published>2007-07-02T05:04:00.000-07:00</published><updated>2007-07-02T05:09:31.885-07:00</updated><title type='text'>Pseudo Elements (Use of Before and after in CSS)</title><content type='html'>blockquote:before {&lt;br /&gt; content: open-quote;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;blockquote:after {&lt;br /&gt; content: close-quote;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;li:before {&lt;br /&gt; content: "POW: "&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;p:before {&lt;br /&gt; content: url(images/jam.jpg)&lt;br /&gt;}&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3059015612137649698-8446338180034056312?l=vpanchal.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vpanchal.blogspot.com/feeds/8446338180034056312/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3059015612137649698&amp;postID=8446338180034056312' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3059015612137649698/posts/default/8446338180034056312'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3059015612137649698/posts/default/8446338180034056312'/><link rel='alternate' type='text/html' href='http://vpanchal.blogspot.com/2007/07/use-of-before-and-after-in-css.html' title='Pseudo Elements (Use of Before and after in CSS)'/><author><name>Vijayta Panchal</name><uri>http://www.blogger.com/profile/04140284328285563574</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3059015612137649698.post-974334354994089081</id><published>2007-07-02T04:59:00.000-07:00</published><updated>2007-07-02T05:00:17.396-07:00</updated><title type='text'>3 Column Layout: Step by Step: Using CSS</title><content type='html'>To start, let's make a simple three column layout with gaps between the columns, with the center column content dictating the height of the entire document. We will start with four DIVs and their respective style declarations.&lt;br /&gt;&lt;br /&gt;   1. First we set the margin and padding from the body element with the following code to give the desired appearance. Notice that we need to set the padding because Opera's default is not zero. Also, we set the background color to white, because Netscape 6 for the Macintosh defaults to a background color of gray.&lt;br /&gt;&lt;br /&gt;      body {&lt;br /&gt;          margin:9px 9px 0 9px;&lt;br /&gt;          padding:0;&lt;br /&gt;          background:#FFF;&lt;br /&gt;      }&lt;br /&gt;&lt;br /&gt;   2. Now we define our first element, a DIV that we will give an id attribute value to "level0." The only style definition for this element will be a background color, the color we want for the left column. Take a look&lt;br /&gt;&lt;br /&gt;      #level0 {&lt;br /&gt;           background:#FC0;&lt;br /&gt;      }&lt;br /&gt;&lt;br /&gt;   3. We nest a second DIV inside "level0" and give it the id "level1" thus.&lt;br /&gt;&lt;br /&gt;      #level1 {&lt;br /&gt;          margin-left:143px;&lt;br /&gt;          padding-left:9px;&lt;br /&gt;          background:#FFF;&lt;br /&gt;      }&lt;br /&gt;&lt;br /&gt;      This new DIV is going to make the space for the left column and left separator. The left column area will be reserved using a left margin for "level1" and the separator using a left padding, so we will need to set the background color from "level1" to the desired color for the separator. Take a look&lt;br /&gt;   4. We nest inside "level1" a DIV with id "level2".&lt;br /&gt;&lt;br /&gt;      #level2 {&lt;br /&gt;          background:#FFF3AC;&lt;br /&gt;      }&lt;br /&gt;&lt;br /&gt;      We only change the background color of this new DIV. Now we can see clearly the left column and its separator. Take a look&lt;br /&gt;   5. We use the same technique, nest a "level3" DIV inside "level2" to get the visual layout for the right column.&lt;br /&gt;&lt;br /&gt;      #level3 {&lt;br /&gt;          margin-right:143px;&lt;br /&gt;          padding-right:9px;&lt;br /&gt;          background:#FFF;&lt;br /&gt;      }&lt;br /&gt;      #main {&lt;br /&gt;          background:#CCC;&lt;br /&gt;      }&lt;br /&gt;&lt;br /&gt;      This time we will nest another DIV called "main" just to set its background color different from transparent, and so we can highlight the columns and the separators&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3059015612137649698-974334354994089081?l=vpanchal.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vpanchal.blogspot.com/feeds/974334354994089081/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3059015612137649698&amp;postID=974334354994089081' title='8 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3059015612137649698/posts/default/974334354994089081'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3059015612137649698/posts/default/974334354994089081'/><link rel='alternate' type='text/html' href='http://vpanchal.blogspot.com/2007/07/3-column-layout-step-by-step-using-css.html' title='3 Column Layout: Step by Step: Using CSS'/><author><name>Vijayta Panchal</name><uri>http://www.blogger.com/profile/04140284328285563574</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3059015612137649698.post-1435038889267939465</id><published>2007-06-29T05:23:00.000-07:00</published><updated>2008-12-11T09:27:09.947-08:00</updated><title type='text'>More about Radiant</title><content type='html'>More about Radiant&lt;br /&gt;• The ability to arrange pages in a hierarchy&lt;br /&gt;• Layouts that can be used to apply a common look to a Web site&lt;br /&gt;• Snippets that are similar to partials or includes&lt;br /&gt;• Pages which are defined in multiple parts (body, extended, sidebar, etc…)&lt;br /&gt;• A custom tagging language (radius)&lt;br /&gt;• Special page-oriented plugins called behaviors&lt;br /&gt;• A simple user management/permissions system&lt;br /&gt;• Several domain specific languages which make it easy to write plugins&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_hQFVzimvQwA/RoT6BoaKE9I/AAAAAAAAABM/CwB5QjBCg1A/s1600-h/vij10003.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://3.bp.blogspot.com/_hQFVzimvQwA/RoT6BoaKE9I/AAAAAAAAABM/CwB5QjBCg1A/s320/vij10003.jpg"   border="0" alt=""id="BLOGGER_PHOTO_ID_5081461185514705874" height="120" width="120" /&gt;&lt;/a&gt;&lt;br /&gt;Radiant Gal&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3059015612137649698-1435038889267939465?l=vpanchal.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vpanchal.blogspot.com/feeds/1435038889267939465/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3059015612137649698&amp;postID=1435038889267939465' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3059015612137649698/posts/default/1435038889267939465'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3059015612137649698/posts/default/1435038889267939465'/><link rel='alternate' type='text/html' href='http://vpanchal.blogspot.com/2007/06/more-about-radiant.html' title='More about Radiant'/><author><name>Vijayta Panchal</name><uri>http://www.blogger.com/profile/04140284328285563574</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_hQFVzimvQwA/RoT6BoaKE9I/AAAAAAAAABM/CwB5QjBCg1A/s72-c/vij10003.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3059015612137649698.post-2556921538062843089</id><published>2007-06-27T21:26:00.000-07:00</published><updated>2007-07-04T02:34:46.628-07:00</updated><title type='text'>Comparision between Radiant &amp; Goldberg</title><content type='html'>&lt;table width="100%" &gt;&lt;tbody&gt;&lt;tr&gt;&lt;br /&gt;&lt;td&gt;&lt;span style="font-weight: bold;"&gt;Features&lt;/span&gt;&lt;/td&gt;&lt;br /&gt;&lt;td&gt;&lt;span style="font-weight: bold;"&gt;Radiant&lt;/span&gt;&lt;/td&gt;&lt;br /&gt;&lt;td&gt;&lt;span style="font-weight: bold;"&gt;Goldberg&lt;/span&gt;&lt;/td&gt;&lt;br /&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr&gt;&lt;br /&gt;&lt;td style="font-weight: bold;"&gt;UI implementation&lt;/td&gt;&lt;br /&gt;&lt;td&gt;Using radius&lt;/td&gt;&lt;br /&gt;&lt;td&gt;Using Rails&lt;/td&gt;&lt;br /&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr&gt;&lt;br /&gt;&lt;td style="font-weight: bold;"&gt;Content management&lt;/td&gt;&lt;br /&gt;&lt;td&gt;HTML + Text + Radius&lt;/td&gt;&lt;br /&gt;&lt;td&gt;HTML + Text + FCKeditor&lt;/td&gt;&lt;br /&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr&gt;&lt;br /&gt;&lt;td style="font-weight: bold;"&gt;Content visibility management&lt;/td&gt;&lt;br /&gt;&lt;td&gt;Status based&lt;/td&gt;&lt;br /&gt;&lt;td&gt;User role based&lt;/td&gt;&lt;br /&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr&gt;&lt;br /&gt;&lt;td style="font-weight: bold;"&gt;User / Role Management&lt;/td&gt;&lt;br /&gt;&lt;td&gt;Basic&lt;/td&gt;&lt;br /&gt;&lt;td&gt;Advanced&lt;/td&gt;&lt;br /&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr&gt;&lt;br /&gt;&lt;td style="font-weight: bold;"&gt;Navigation&lt;/td&gt;&lt;br /&gt;&lt;td&gt;Automatic&lt;/td&gt;&lt;br /&gt;&lt;td&gt;Menu Editor&lt;/td&gt;&lt;br /&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr&gt;&lt;br /&gt;&lt;td style="font-weight: bold;"&gt;Extensible&lt;/td&gt;&lt;br /&gt;&lt;td&gt;Add on (Behavior &amp; Extensions)&lt;/td&gt;&lt;br /&gt;&lt;td&gt;Easy integration of rails code&lt;/td&gt;&lt;br /&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr&gt;&lt;br /&gt;&lt;td style="font-weight: bold;"&gt;Default templates&lt;/td&gt;&lt;br /&gt;&lt;td&gt;None&lt;/td&gt;&lt;br /&gt;&lt;td&gt;Bundled&lt;/td&gt;&lt;br /&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr&gt;&lt;br /&gt;&lt;td style="font-weight: bold;"&gt;Welcome email&lt;/td&gt;&lt;br /&gt;&lt;td&gt;None&lt;/td&gt;&lt;br /&gt;&lt;td&gt;Can be configured&lt;/td&gt;&lt;br /&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr&gt;&lt;br /&gt;&lt;td style="font-weight: bold;"&gt;Technical knowledge required&lt;/td&gt;&lt;br /&gt;&lt;td&gt;Basic to medium&lt;/td&gt;&lt;br /&gt;&lt;td&gt;Medium to advanced&lt;/td&gt;&lt;br /&gt;&lt;/tr&gt;&lt;br /&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3059015612137649698-2556921538062843089?l=vpanchal.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vpanchal.blogspot.com/feeds/2556921538062843089/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3059015612137649698&amp;postID=2556921538062843089' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3059015612137649698/posts/default/2556921538062843089'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3059015612137649698/posts/default/2556921538062843089'/><link rel='alternate' type='text/html' href='http://vpanchal.blogspot.com/2007/06/comparision-between-radiant-goldberg.html' title='Comparision between Radiant &amp; Goldberg'/><author><name>Vijayta Panchal</name><uri>http://www.blogger.com/profile/04140284328285563574</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3059015612137649698.post-6594285379130999705</id><published>2007-06-27T21:08:00.000-07:00</published><updated>2007-06-27T21:26:37.413-07:00</updated><title type='text'>Radian  vs. Goldberg</title><content type='html'>Radiant uses radius for implementing user interface, which is actually a tag based template language. May it be a designer with basic technical knowledge or advanced rails developer, both will have to learn using radius. And in Goldberg, normal rails layouts are used for user interface of the website.&lt;br /&gt;&lt;br /&gt;Radiant only has direct input of markup or text content that may also radius tags. In Goldberg, user may provide HTML content directly or use FCKeditor that is a web based text formatting utility that can be easily integrated in Goldberg.&lt;br /&gt;&lt;br /&gt;Note: If radius code is used while adding content then a non technical client might not be able to edit the content easily. But in Goldberg, use of FCKeditor makes it simple to edit the content without much of technical knowledge.&lt;br /&gt;&lt;br /&gt;Goldberg has an advanced user and role management system as compared to Radiant. With Goldberg it’s very simple to manage what kind of users can do what all things.&lt;br /&gt;&lt;br /&gt;As you keep adding pages in Radiant it automatically maintains a hierarchy of pages, which may be used in displaying a menu. In Goldberg there is a fully featured menu editor using which pages can be positioned as required and managed efficiently.&lt;br /&gt;&lt;br /&gt;Both Goldberg and Radiant are extensible to other applications and features. Radiant has special kind of add-ons called extensions and for adding features on a page there are behaviors.&lt;br /&gt;&lt;br /&gt;Radiant requires less technical knowledge as compared to Goldberg and also requires less time to get it up and running. A Radiant solution may also be upgraded later to Goldberg depending on the requirement at reasonable cost. If requirements as foreseen can be satisfied by Radiant then it suggested going ahead with it.&lt;br /&gt;&lt;br /&gt;But for more than just a static website, like when we need features like role management, content access control then it is suggested to go for Goldberg as it already provide certain advanced features which satisfy needs of more than just static websites.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3059015612137649698-6594285379130999705?l=vpanchal.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vpanchal.blogspot.com/feeds/6594285379130999705/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3059015612137649698&amp;postID=6594285379130999705' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3059015612137649698/posts/default/6594285379130999705'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3059015612137649698/posts/default/6594285379130999705'/><link rel='alternate' type='text/html' href='http://vpanchal.blogspot.com/2007/06/radian-vs-goldberg.html' title='Radian  vs. Goldberg'/><author><name>Vijayta Panchal</name><uri>http://www.blogger.com/profile/04140284328285563574</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3059015612137649698.post-8373884034304909958</id><published>2007-06-25T00:00:00.001-07:00</published><updated>2007-06-25T00:03:13.923-07:00</updated><title type='text'>Why we use CSS to our website</title><content type='html'>&lt;span style="font-weight:bold;"&gt;5 Reasons To Use CSS&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;1. The content is separated from the design&lt;br /&gt;&lt;br /&gt;Because you are able to create a separate Stylesheet and link it to all your webdocuments, you have great control over how your website looks. So if you want to change a certain aspect of your page, you only need to alter one file: your Stylesheet!&lt;br /&gt;&lt;br /&gt;This Of course, generates some great flexibility. This flexibility is not available when your website is using tables for layout, inline font tags or inline defined colors.&lt;br /&gt;&lt;br /&gt;A single CSS file can contain positioning, layout, font, colors and style information for an entire web site.&lt;br /&gt;&lt;br /&gt;2. You site uses less bandwidth and loads faster&lt;br /&gt;&lt;br /&gt;Because stylesheets are so lightweight, your website will load much faster. The main reason is because you do not need table layouts anymore for the positioning of elements. Since text loads really really fast your website will be visible in a flash.&lt;br /&gt;&lt;br /&gt;This means that visitors will be happier when surfing your website. They only have to download the Stylesheet once, and it's automatically reused for every page. So the only thing that needs to be loaded is the actual content.&lt;br /&gt;&lt;br /&gt;On average a website will load five to ten times faster if it makes use of cascading style sheets.&lt;br /&gt;&lt;br /&gt;3. Your website will automatically gain better search engine results&lt;br /&gt;&lt;br /&gt;With CSS, you can position any element, anywhere you want. So if your menu is at the bottom of your HTML document, you can bring it up using absolute positioning. The reason this is useful is to make sure the search engine spiders pick up the main content first.&lt;br /&gt;&lt;br /&gt;Another advantage you automatically gain is that your HTML code is much cleaner. So the search engine spider will not have to separate the junk code from the real content.&lt;br /&gt;&lt;br /&gt;So make sure you put your logo text and your menu at the bottom of your HTML document at put it at the top using CSS!&lt;br /&gt;&lt;br /&gt;4. CSS is compatible with newer browsers&lt;br /&gt;&lt;br /&gt;Because more and more browsers are used other than Internet Explorer on a Windows machine, you need to be sure that your website is accessible by all major and newer browsers.&lt;br /&gt;&lt;br /&gt;By using webstandards, defined by the w3c, you are making sure your content is viewable in the future.&lt;br /&gt;&lt;br /&gt;Because there are so many browsers these days, it is impossible to test your website in all these browsers on different configurations. Coding to standards is then the only practical solution.&lt;br /&gt;&lt;br /&gt;5. CSS can be used to display the same content on different media.&lt;br /&gt;&lt;br /&gt;Because you are able to define different stylesheets for different media you have great flexibility in presenting your content.&lt;br /&gt;&lt;br /&gt;The printer for example, is a medium on itself. If someone prints out your website, you will be able to modify the look of it. Add an extra black and white logo, remove the advertisements and change the colors to black and white values. It's all done easily by using cascading stylesheets. And the best thing is, visitors do not even have to know you created a new Stylesheet especially for the printer.&lt;br /&gt;&lt;br /&gt;Stylesheets can also be created specifically for PDA's and such. As you will understand, this adds some great flexibility to the presentation of your web document.&lt;br /&gt;&lt;br /&gt;Conclusion&lt;br /&gt;&lt;br /&gt;Cascading Style Sheets are created to make things easier. It gives you great control of your website and makes your visitors happy when they are surfing your website.&lt;br /&gt;&lt;br /&gt;You are prepared for the future and will gain better search engine results automatically. Start using CSS to its full potential today! It will suit you well.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3059015612137649698-8373884034304909958?l=vpanchal.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vpanchal.blogspot.com/feeds/8373884034304909958/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3059015612137649698&amp;postID=8373884034304909958' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3059015612137649698/posts/default/8373884034304909958'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3059015612137649698/posts/default/8373884034304909958'/><link rel='alternate' type='text/html' href='http://vpanchal.blogspot.com/2007/06/why-we-use-css-to-our-website.html' title='Why we use CSS to our website'/><author><name>Vijayta Panchal</name><uri>http://www.blogger.com/profile/04140284328285563574</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3059015612137649698.post-2363028940211369154</id><published>2007-06-22T00:57:00.000-07:00</published><updated>2007-06-22T01:03:23.105-07:00</updated><title type='text'>Rubricks (rails CMS)</title><content type='html'>&lt;span style="font-weight:bold;"&gt;System Management Component&lt;/span&gt;&lt;br /&gt;          &lt;ul&gt;&lt;li&gt; User Management&lt;/li&gt;&lt;br /&gt;                &lt;ul&gt; &lt;li&gt; User Management&lt;/li&gt;&lt;br /&gt;                &lt;li&gt;Group Management&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;          &lt;li&gt; Component Management&lt;/li&gt;&lt;br /&gt;          &lt;li&gt;Design Management&lt;/li&gt;&lt;br /&gt;              &lt;ul&gt;&lt;li&gt;Block Management&lt;/li&gt;&lt;br /&gt;                &lt;li&gt;Menu Management&lt;/li&gt;&lt;br /&gt;                &lt;li&gt;Dashboard Management&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;          &lt;li&gt;Access Control&lt;/li&gt;&lt;br /&gt;          &lt;li&gt;Contents Approval&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://rubricks.org/index_en.html"&gt;http://rubricks.org/index_en.html&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3059015612137649698-2363028940211369154?l=vpanchal.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vpanchal.blogspot.com/feeds/2363028940211369154/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3059015612137649698&amp;postID=2363028940211369154' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3059015612137649698/posts/default/2363028940211369154'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3059015612137649698/posts/default/2363028940211369154'/><link rel='alternate' type='text/html' href='http://vpanchal.blogspot.com/2007/06/rubricks-rails-cms.html' title='Rubricks (rails CMS)'/><author><name>Vijayta Panchal</name><uri>http://www.blogger.com/profile/04140284328285563574</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3059015612137649698.post-7269553429142302261</id><published>2007-06-21T23:04:00.001-07:00</published><updated>2008-12-11T09:27:10.165-08:00</updated><title type='text'>About Me</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_hQFVzimvQwA/RntnYYIQXMI/AAAAAAAAABE/M0MrzDmIhqg/s1600-h/vij.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;" src="http://3.bp.blogspot.com/_hQFVzimvQwA/RntnYYIQXMI/AAAAAAAAABE/M0MrzDmIhqg/s320/vij.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5078766673281965250" /&gt;&lt;/a&gt;&lt;br /&gt;Myself Vijayta Panchal from Delhi, India. I have more than four years of web designing experience. I work with Vinayak Solutions Pvt. Ltd.New Delhi , India.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3059015612137649698-7269553429142302261?l=vpanchal.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vpanchal.blogspot.com/feeds/7269553429142302261/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3059015612137649698&amp;postID=7269553429142302261' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3059015612137649698/posts/default/7269553429142302261'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3059015612137649698/posts/default/7269553429142302261'/><link rel='alternate' type='text/html' href='http://vpanchal.blogspot.com/2007/06/about-me.html' title='About Me'/><author><name>Vijayta Panchal</name><uri>http://www.blogger.com/profile/04140284328285563574</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_hQFVzimvQwA/RntnYYIQXMI/AAAAAAAAABE/M0MrzDmIhqg/s72-c/vij.jpg' height='72' width='72'/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3059015612137649698.post-7339031982840127725</id><published>2007-06-20T21:46:00.000-07:00</published><updated>2007-06-21T21:54:22.904-07:00</updated><title type='text'>Goldberg Description</title><content type='html'>Goldberg is a web deployment environment for your Rails apps. Goldberg provides you with: A login system. Comprehensive yet easy to configure security, featuring roles and their associated permissions. When you set up users you assign each a role. Roles can inherit from other roles recursively. Site navigation through a menu system. The menu items are linked either to controller actions or to pages of content. What menu items a user can see is determined by that user’s permissions. A basic content management system, so you can type up pages and put them in your web site—either in the menu, or linked from other pages.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://goldberg.240gl.org/"&gt;http://goldberg.240gl.org/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3059015612137649698-7339031982840127725?l=vpanchal.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vpanchal.blogspot.com/feeds/7339031982840127725/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3059015612137649698&amp;postID=7339031982840127725' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3059015612137649698/posts/default/7339031982840127725'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3059015612137649698/posts/default/7339031982840127725'/><link rel='alternate' type='text/html' href='http://vpanchal.blogspot.com/2007/06/goldberg-description.html' title='Goldberg Description'/><author><name>Vijayta Panchal</name><uri>http://www.blogger.com/profile/04140284328285563574</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3059015612137649698.post-8710139755256698186</id><published>2007-06-20T21:23:00.000-07:00</published><updated>2007-06-21T03:25:52.853-07:00</updated><title type='text'>My Radiant Project</title><content type='html'>Hi Friends&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.pivotinc.com/"&gt;http://www.pivotinc.com/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;The above site is my latest work on Radian CMS and I really enjoy working on it.&lt;br /&gt;It really superb for those who wants to work on ruby on rails but not very much familiar with it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3059015612137649698-8710139755256698186?l=vpanchal.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vpanchal.blogspot.com/feeds/8710139755256698186/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3059015612137649698&amp;postID=8710139755256698186' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3059015612137649698/posts/default/8710139755256698186'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3059015612137649698/posts/default/8710139755256698186'/><link rel='alternate' type='text/html' href='http://vpanchal.blogspot.com/2007/06/my-radiant-project.html' title='My Radiant Project'/><author><name>Vijayta Panchal</name><uri>http://www.blogger.com/profile/04140284328285563574</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3059015612137649698.post-3362769445619330005</id><published>2007-06-20T21:21:00.000-07:00</published><updated>2007-06-20T21:22:38.813-07:00</updated><title type='text'>Goldberg CMS</title><content type='html'>&lt;p&gt;The Goldberg plugin is an example of a high level generator that includes both authorization and authentication. It's like a framework built on top of the Rails framework, but actually sits beside it because you continue to develop your Rails app as usual, Goldberg does not interfere. You don't have to write any Goldberg-specific code in your application or use its API.&lt;/p&gt;  &lt;p&gt;You define Roles (which can be has subgroup hierarchy), and assign permissions to the roles. A permssion is a controller/action that the role may access. Then you assign users to roles. &lt;/p&gt;  &lt;p&gt;Goldberg installs as application-wide before-filters (if not exactly, at least conceptually) that examines the routed controller/action against its database of permissions ("credentials") for the current logged in user. Credentials are stored in the current session minimizing the need for database access between page loads. &lt;/p&gt;  &lt;p&gt;That's just the beginning. Goldberg also provides a little hierarchical page manager (approaching a CMS) for static content; a menu manager for redirecting to pages or any arbitrary controller/action; and a theme system for dynamically re-skinning your application. It does not impose a specific markup on you, however. Finally there is an API for custom access control within your application. &lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3059015612137649698-3362769445619330005?l=vpanchal.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vpanchal.blogspot.com/feeds/3362769445619330005/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3059015612137649698&amp;postID=3362769445619330005' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3059015612137649698/posts/default/3362769445619330005'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3059015612137649698/posts/default/3362769445619330005'/><link rel='alternate' type='text/html' href='http://vpanchal.blogspot.com/2007/06/goldberg-cms.html' title='Goldberg CMS'/><author><name>Vijayta Panchal</name><uri>http://www.blogger.com/profile/04140284328285563574</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3059015612137649698.post-6554629335088017098</id><published>2007-06-20T21:20:00.000-07:00</published><updated>2007-06-21T22:00:02.143-07:00</updated><title type='text'>Radiant CMS (Content Management System)</title><content type='html'>&lt;p&gt;Radiant is a no-fluff, open source content management system designed for small teams.&lt;/p&gt;  &lt;p&gt;Radiant features:&lt;/p&gt;  &lt;p&gt;    * An elegant user interface&lt;br /&gt;    * Flexible templating with layouts, snippets, page parts, and a custom tagging language&lt;br /&gt;    * Special page-oriented plugins called behaviors&lt;br /&gt;    * A simple user management/rights system &lt;/p&gt;&lt;br /&gt;&lt;a href="http://dev.radiantcms.org/"&gt;http://dev.radiantcms.org/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3059015612137649698-6554629335088017098?l=vpanchal.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vpanchal.blogspot.com/feeds/6554629335088017098/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3059015612137649698&amp;postID=6554629335088017098' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3059015612137649698/posts/default/6554629335088017098'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3059015612137649698/posts/default/6554629335088017098'/><link rel='alternate' type='text/html' href='http://vpanchal.blogspot.com/2007/06/radiant-cms-content-management-system.html' title='Radiant CMS (Content Management System)'/><author><name>Vijayta Panchal</name><uri>http://www.blogger.com/profile/04140284328285563574</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3059015612137649698.post-5904214155787731434</id><published>2007-06-07T22:42:00.000-07:00</published><updated>2007-06-07T22:44:12.472-07:00</updated><title type='text'>Radiant</title><content type='html'>Now a days i am working on Radiant CMS and cant explore Login feature here..&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3059015612137649698-5904214155787731434?l=vpanchal.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vpanchal.blogspot.com/feeds/5904214155787731434/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3059015612137649698&amp;postID=5904214155787731434' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3059015612137649698/posts/default/5904214155787731434'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3059015612137649698/posts/default/5904214155787731434'/><link rel='alternate' type='text/html' href='http://vpanchal.blogspot.com/2007/06/radiant.html' title='Radiant'/><author><name>Vijayta Panchal</name><uri>http://www.blogger.com/profile/04140284328285563574</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
