On Sat, Jul 12, 2008 at 7:29 PM, Andrew Gehring
<[EMAIL PROTECTED]> wrote:
>
> Are there any docs, anywhere, on creating an extension beyond the tag
> example under the "summer reboot".
>
> I've created my extension, but can't find anything on building a admin
> interface.
>
> The instructions for creating a admin interface on the wiki don't work 
> (aged)...
>
> Thanks,
> Andrew

I don't know of any particular examples per se, but I took a peek at
the code for a few different extensions to get an idea of how it's
done. I made a very simple extension to manage a website directory
(just one model, one controller, and two views--index and edit). The
key is using Radiant's Admin::AbstractModelController.

I would post the extension on GitHub, but it seems to be down for
maintenance at the moment. Here's the code for the whole extension:

# ./site_directory_extension.rb
class SiteDirectoryExtension < Radiant::Extension
  version "1.0"
  description "Adds a website directory to Radiant"
  url "http://nams-cms.org";

  define_routes do |map|
    map.namespace(:admin) do |admin|
      admin.resources :sites
    end
    map.with_options(:controller => 'sites') do |sites|
      sites.search_sites   'sites/search',               :action => 'search'
      sites.sites          'sites',                      :action => 'index'
    end
  end

  def activate
    admin.tabs.add "Sites", "/admin/sites", :after => "Layouts",
:visibility => [:all]
  end

  def deactivate
    admin.tabs.remove "Sites"
  end

end

# ./db/migrate/001_create_sites.rb
class CreateSites < ActiveRecord::Migration
  def self.up
    create_table :sites, :force => true do |t|
      t.string :title, :url, :null => false
      t.string :description

      t.timestamps
    end
    # this part loads data from a fixture... like a bulk import of defaults
    yml = 
YAML.load_file("#{RAILS_ROOT}/vendor/extensions/site_directory/db/bootstrap/sites.yml")
    yml.keys.each do |key|
      Site.find_or_create_by_title({
        :title => yml[key]['title'],
        :url => yml[key]['url'],
        :description => yml[key]['description']
      })
    end
  end

  def self.down
    drop_table :sites
  end
end

# ./app/controllers/admin/sites_controller.rb
class Admin::SiteController < Admin::AbstractModelController
  model_class Site
  only_allow_access_to :new, :edit, :remove, :upload,
    :when => [:developer, :admin],
    :denied_url => { :controller => 'sites', :action => 'index' },
    :denied_message => 'You must have developer or administrator
privileges to perform this action.'

  def index
    # this depends on the will_paginate plugin... I included it as a
submodule using git submodule add
git://github.com/mislav/will_paginate.git
/vendor/plugins/will_paginate
    # I executed that git command from the site_directory extension's
root, so will_paginate is a submodule of the extension, not of the
radiant install
    @sites = Site.paginate :all, :page => params[:page], :order =>
(params[:order_by].nil? ? 'title ASC' : params[:order_by])
  end

end

# ./app/models/site.rb
class Site < ActiveRecord::Base
  acts_as_ferret :fields => [:title, :url, :description]
end

# ./app/views/admin/sites/index.html.haml
- content_for 'page_css' do
  :sass
    .pagination
      margin: 25px 0
// more CSS removed for brevity

%h1 Sites

= will_paginate @sites

%table#snippets.index{:cellspacing=>"0", :border=>"0", :cellpadding=>"0"}
  %thead
    %tr
      %th.user= link_to_unless_current('Title', site_index_url) {
link_to_unless_current('Title', :order_by => 'url DESC') }
      %th.user= link_to_unless_current('URL', :order_by => 'url ASC')
{ link_to_unless_current('URL', :order_by => 'url DESC') }
      %th.modify Modify
  %tbody
    - @sites.each do |site|
      %tr.node.level-1
        %td.user= link_to site.title, site_edit_url(:id => site)
        %td.user= link_to site.url, site_edit_url(:id => site)
        %td.remove
          = link_to image('remove', :alt => 'Delete Site'),
site_remove_url(:id => site)

= will_paginate @sites

%p
  = link_to 'New Site', site_new_url

# ./app/views/sites/edit.html.erb
# this is in ERB because I get a undefined method error when I try to
use HAML... don't know why
<h1><%= @site.new_record? ? 'New' : 'Editing' %> Site</h1>

<% form_for(@site, :url => admin_sites_path) do |f| %>
  <table class="fieldset">
    <tbody>
      <tr>
        <th class="label">
          <%= label 'site', 'title' %>
        </th>
        <td class="field">
          <%= text_field 'site', 'title', :class => "textbox" %>
        </td>
        <td class="help">
          The title text will appear first as the blue link to the site
        </td>
      </tr>
      <tr>
        <th class="label">
          <%= label 'site', 'url' %>
        </th>
        <td class="field">
          <%= text_field 'site', 'url', :class => "textbox" %>
        </td>
        <td class="help">
          The url will appear in green at the bottom of the site's listing
        </td>
      </tr>
      <tr>
        <th class="label">
          <%= label 'site', 'description' %>
        </th>
        <td class="field">
          <%= text_area 'site', 'description', :style => "width:
100%;", :rows => "3" %>
        </td>
        <td class="help">
          The description will appear in black between the title and URL.
        </td>
      </tr>
    </tbody>
  </table>
  <%= updated_stamp @site %>
  <p class="buttons">
    <%= save_model_button(@site) %>
    <%= save_model_and_continue_editing_button(@site) %>
    or
    <%= link_to "Cancel", site_index_url %>
  </p>
<% end %>




Hopefully that should be enough to get you started.

--
Tim
_______________________________________________
Radiant mailing list
Post:   Radiant@radiantcms.org
Search: http://radiantcms.org/mailing-list/search/
Site:   http://lists.radiantcms.org/mailman/listinfo/radiant

Reply via email to