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