Todd: I'd make a few tweaks so you don't have problems:

 (Answerbookpage.content_columns.dup).each do |column|
   tag "faq:#{column.name}" do |tag|
     tag.locals.answer.send(column.name).to_s if tag.locals.answer
   end
end
  [snip]

 tag "faq:each" do |tag|
   result = ""
   Answerbookpage.find(:all).each do |item|
     tag.locals.answer = item
     result << tag.expand
end result
 end

Let me explain why I suggest these.
1) Unless you want to display things like foreign keys, you probably don't want ALL of the columns from your Answerbookpage model -- just the ones that have actual useful content. 2) Scoping the tag under "faq" will prevent tags like <r:answername /> from working under any invalid context. 3) In both "faq:each" and the dynamically created tags, it's best to define your own local rather than overwriting page. tags.locals.page should always refer to the currently rendering page (including contextual ones). I'm assuming you just grabbed some code from "children:each". Besides "tag.locals.answer" says better what you're passing around. 4) I added ".to_s if tag.locals.answer" at the end of your line for a little safety. First, sometimes objects that you could get from a model could return some ugly inspect string instead of a real representation, and also, if somehow your tag gets out of context or gets 'nil' in tag.locals.answer, you won't output anything ugly. 5) Everything you are outputting is a string , so 'result' in "faq:each" should be a string.

Hope this helps!

Cheers,
Sean Cribbs

Todd McGrath wrote:
Well, that is exactly what I needed.  Thanks again, Jamie!

I can't say if the following code is the best, most efficient way, but here it
is for posterity sake-

module FaqTag
  include Radiant::Taggable

  class TagError < StandardError; end
# <r:answername />
  # <r:summary />
  # etc...
  #
  (Answerbookpage.column_names.dup).each do |method|
    tag(method.to_s) do |tag|
      tag.locals.page.send(method)
    end
end tag "faq" do |tag|
    tag.expand
  end
tag "faq:each" do |tag|
    result = []
    Answerbookpage.find(:all).each do |item|
      tag.locals.child = item
      tag.locals.page = item
      result << tag.expand
end result
  end
end



Quoting Jamie Wilkinson <[EMAIL PROTECTED]>:

Howdy Todd,

A combination of cloning the <r:children:each> tag (slightly lower in the same file) and the metamethod you pointed out should work just fine. So it would look more like:

<r:faq:each>
        <r:answername />
        <r:summary />
</r:faq:each>

-jamie

On Jan 10, 2007, at 7:46 AM, Todd McGrath wrote:

Hello again,

I'm making some progress on extensions and now I'm looking for a little push in
the right direction.

I'm working on an extension for displaying data from database for the FAQ
section of a site using tags (mental branch).

* Created a FaqExtension and include the tag:

  def activate
    Page.send :include, FaqTag
  end

* in lib/faq_tag.rb:
module FaqTag
  include Radiant::Taggable

  class TagError < StandardError; end

  tag "faq" do |tag|
    faq = Answerbookpages.find(:all)
    raise TagError.new("Faq cannot be found") unless faq
    tag.locals.faq = faq
    tag.expand
  end

  tag "faqhello" do |tag|
    "Hello #{tag.attr['name'] || 'mundo'}!"
  end

end

* "faqhello" (<r:faqhello/>) works and "faq" tag is retrieving from db.
(Obviously, I have an Answerbookpages class

I'm looking for some insight to take it further.

In my FAQ page, I'd like to use something like the following:

<r:faq>
  <r:answername />
  <r:summary />
</r:faq>

where "answername" and "summary" are fields in the answerbookpages table.

Not sure where to begin..

In the StandardTags class, I see:
  #
  # <r:url />
  # <r:title />
  # etc...
  #
  ((Page.column_names.dup << 'url') - ['class_name', 'created_by',
'updated_by']).each do |method|
    tag(method.to_s) do |tag|
      tag.locals.page.send(method)
    end

Maybe the answer I'm looking for is something similar to this?

Any thoughts or suggestions are really appreciated

Thank you,
Todd

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



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


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

Reply via email to