articles_controller.rb
上传用户:netsea168
上传日期:2022-07-22
资源大小:4652k
文件大小:9k
源码类别:

Ajax

开发平台:

Others

  1. class ArticlesController < ContentController
  2.   before_filter :login_required, :only => [:preview]
  3.   before_filter :auto_discovery_feed, :only => [:show, :index]
  4.   before_filter :verify_config
  5.   
  6.   layout :theme_layout, :except => [:comment_preview, :trackback]
  7.   cache_sweeper :blog_sweeper
  8.   caches_page :index, :read, :archives, :view_page, :redirect, :if => Proc.new {|c|
  9.     c.request.query_string == ''
  10.   }
  11.   helper :'admin/base'
  12.   def index
  13.     respond_to do |format|
  14.       format.html { @limit = this_blog.limit_article_display }
  15.       format.rss { @limit = this_blog.limit_rss_display }
  16.       format.atom { @limit = this_blog.limit_rss_display }
  17.     end
  18.     
  19.     unless params[:year].blank?
  20.       @noindex = 1
  21.       @articles = Article.paginate :page => params[:page], :conditions => { :published_at => time_delta(*params.values_at(:year, :month, :day)), :published => true }, :order => 'published_at DESC', :per_page => @limit
  22.     else
  23.       @noindex = 1 unless params[:page].blank?
  24.       @articles = Article.paginate :page => params[:page], :conditions => ['published = ? AND published_at < ?', true, Time.now], :order => 'published_at DESC', :per_page => @limit
  25.     end
  26.     
  27.     @page_title = index_title
  28.     @description = index_description
  29.     @keywords = (this_blog.meta_keywords.empty?) ? "" : this_blog.meta_keywords
  30.     
  31.     respond_to do |format|
  32.       format.html { render_paginated_index }
  33.       format.atom do
  34.         send_feed('atom')
  35.       end
  36.       format.rss do
  37.         auto_discovery_feed(:only_path => false)
  38.         send_feed('rss20')
  39.       end
  40.     end
  41.   end
  42.   def search
  43.     @articles = this_blog.articles_matching(params[:q], :page => params[:page], :per_page => @limit)
  44.     return error(_("No posts found..."), :status => 200) if @articles.empty?
  45.     respond_to do |format|
  46.       format.html { render :action => 'search' }
  47.       format.rss { render :partial => "articles/rss20_feed", :object => @articles }
  48.       format.atom { render :partial => "articles/atom_feed", :object => @articles }
  49.     end
  50.   end
  51.   def live_search
  52.     @search = params[:q]
  53.     @articles = Article.search(@search)
  54.     render :layout => false, :action => :live_search
  55.   end
  56.   def preview
  57.     @article = Article.last_draft(params[:id])
  58.     render :action => 'read'
  59.   end
  60.   def redirect
  61.     part = this_blog.permalink_format.split('/')
  62.     part.delete('') # delete all par of / where no data. Avoid all // or / started
  63.     params[:from].delete('')
  64.     if params[:from].last =~ /.atom$/
  65.       params[:format] = 'atom'
  66.       params[:from].last.gsub!(/.atom$/, '')
  67.     elsif params[:from].last =~ /.rss$/
  68.       params[:format] = 'rss'
  69.       params[:from].last.gsub!(/.rss$/, '')
  70.     end
  71.     zip_part = part.zip(params[:from])
  72.     article_params = {}
  73.     zip_part.each do |asso|
  74.       ['%year%', '%month%', '%day%', '%title%'].each do |format_string|
  75.         if asso[0] =~ /(.*)#{format_string}(.*)/
  76.           before_format = $1
  77.           after_format = $2
  78.           next if asso[1].nil?
  79.           result =  asso[1].gsub(before_format, '')
  80.           result.gsub!(after_format, '')
  81.           article_params[format_string.gsub('%', '').to_sym] = result
  82.         end
  83.       end
  84.     end
  85.     begin
  86.       @article = this_blog.requested_article(article_params)
  87.     rescue
  88.       #Not really good. 
  89.       # TODO :Check in request_article type of DATA made in next step
  90.     end
  91.     return show_article if @article
  92.     # Redirect old version with /:year/:month/:day/:title to new format.
  93.     # because it's change
  94.     ["%year%/%month%/%day%/%title%".split('/'), "articles/%year%/%month%/%day%/%title%".split('/')].each do |part|
  95.       part.delete('') # delete all par of / where no data. Avoid all // or / started
  96.       params[:from].delete('')
  97.       zip_part = part.zip(params[:from])
  98.       article_params = {}
  99.       zip_part.each do |asso|
  100.         ['%year%', '%month%', '%day%', '%title%'].each do |format_string|
  101.           if asso[0] =~ /(.*)#{format_string}(.*)/
  102.             before_format = $1
  103.             after_format = $2
  104.             next if asso[1].nil?
  105.             result =  asso[1].gsub(before_format, '')
  106.             result.gsub!(after_format, '')
  107.             article_params[format_string.gsub('%', '').to_sym] = result
  108.           end
  109.         end
  110.       end
  111.       begin
  112.         @article = this_blog.requested_article(article_params)
  113.       rescue
  114.         #Not really good. 
  115.         # TODO :Check in request_article type of DATA made in next step
  116.       end
  117.       if @article
  118.         redirect_to @article.permalink_url, :status => 301
  119.         return
  120.       end
  121.     end
  122.     # see how manage all by this redirect to redirect in different possible
  123.     # way maybe define in a controller in admin part in insert in this table
  124.     r = Redirect.find_by_from_path(params[:from].join("/"))
  125.     if(r)
  126.       path = r.to_path
  127.       url_root = self.class.relative_url_root
  128.       path = url_root + path unless url_root.nil? or path[0,url_root.length] == url_root
  129.       redirect_to path, :status => 301
  130.     else
  131.       render :text => "Page not found", :status => 404
  132.     end
  133.   end
  134.   ### Deprecated Actions ###
  135.   def archives
  136.     @articles = Article.find_published
  137.     @page_title = "#{_('Archives for')} #{this_blog.blog_name}"
  138.     @keywords = (this_blog.meta_keywords.empty?) ? "" : this_blog.meta_keywords
  139.     @description = "#{_('Archives for')} #{this_blog.blog_name} - #{this_blog.blog_subtitle}"
  140.   end
  141.   def comment_preview
  142.     if (params[:comment][:body].blank? rescue true)
  143.       render :nothing => true
  144.       return
  145.     end
  146.     set_headers
  147.     @comment = Comment.new(params[:comment])
  148.     @controller = self
  149.   end
  150.   def category
  151.     redirect_to categories_path, :status => 301
  152.   end
  153.   def tag
  154.     redirect_to tags_path, :status => 301
  155.   end
  156.   def view_page
  157.     if(@page = Page.find_by_name(params[:name].map { |c| c }.join("/"))) && @page.published?
  158.       @page_title = @page.title
  159.     else
  160.       render :nothing => true, :status => 404
  161.     end
  162.   end
  163.   def markup_help
  164.     render :text => TextFilter.find(params[:id]).commenthelp
  165.   end
  166.   private
  167.   def verify_config
  168.     if  ! this_blog.configured?
  169.       redirect_to :controller => "setup", :action => "index"
  170.     elsif User.count == 0
  171.       redirect_to :controller => "accounts", :action => "signup"
  172.     else
  173.       return true
  174.     end
  175.   end
  176.   
  177.   # See an article We need define @article before
  178.   def show_article
  179.     @comment      = Comment.new
  180.     @page_title   = @article.title
  181.     article_meta
  182.     
  183.     auto_discovery_feed
  184.     respond_to do |format|
  185.       format.html { render :template => '/articles/read' }
  186.       format.atom { render_feed('atom') }
  187.       format.rss  { render_feed('rss20') }
  188.       format.xml  { render_feed('atom') }
  189.     end
  190.   rescue ActiveRecord::RecordNotFound
  191.     error("Post not found...")
  192.   end
  193.   def article_meta
  194.     @keywords = ""
  195.     @keywords << @article.categories.map { |c| c.name }.join(", ") << ", " unless @article.categories.empty?
  196.     @keywords << @article.tags.map { |t| t.name }.join(", ") unless @article.tags.empty?  
  197.     @description = "#{@article.title}, " 
  198.     @description << @article.categories.map { |c| c.name }.join(", ") << ", " unless @article.categories.empty?
  199.     @description << @article.tags.map { |t| t.name }.join(", ") unless @article.tags.empty?
  200.     @description << " #{this_blog.blog_name}"
  201.   end
  202.   def send_feed(format)
  203.     if this_blog.feedburner_url.empty? or request.env["HTTP_USER_AGENT"] =~ /FeedBurner/i
  204.       render :partial => "articles/#{format}_feed", :object => @articles
  205.     else
  206.       redirect_to "http://feeds2.feedburner.com/#{this_blog.feedburner_url}"
  207.     end
  208.   end
  209.   
  210.   # TODO: Merge with send_feed?
  211.   def render_feed(type)
  212.     render :partial => "/articles/#{type}_feed", :object => @article.published_feedback 
  213.   end
  214.   def set_headers
  215.     headers["Content-Type"] = "text/html; charset=utf-8"
  216.   end
  217.   def render_paginated_index(on_empty = _("No posts found..."))
  218.     return error(on_empty, :status => 200) if @articles.empty?
  219.     if this_blog.feedburner_url.empty?
  220.       auto_discovery_feed(:only_path => false)
  221.     else
  222.       @auto_discovery_url_rss = "http://feeds2.feedburner.com/#{this_blog.feedburner_url}"
  223.       @auto_discovery_url_atom = "http://feeds2.feedburner.com/#{this_blog.feedburner_url}"
  224.     end
  225.     render :action => 'index'
  226.   end
  227.   def index_title
  228.     returning('') do |page_title|
  229.       page_title << formatted_date_selector(_('Archives for '))
  230.       if params[:page]
  231.         page_title << 'Older posts' if page_title.blank?
  232.         page_title << ", page " << params[:page]
  233.       end
  234.     end
  235.   end
  236.   
  237.   def index_description
  238.     returning('') do |page_description|
  239.       if this_blog.meta_description.empty?
  240.       page_description << "#{this_blog.blog_name} #{this_blog.blog_subtitle}" 
  241.       else
  242.         page_description << this_blog.meta_description
  243.       end
  244.       
  245.       page_description << formatted_date_selector(_(', Articles for '))
  246.       
  247.       if params[:page]
  248.         page_description << ", page " << params[:page]
  249.       end
  250.     end
  251.   end
  252.   
  253.   def time_delta(year, month = nil, day = nil)
  254.     from = Time.mktime(year, month || 1, day || 1)
  255.     to = from.next_year
  256.     to = from.next_month unless month.blank?
  257.     to = from + 1.day unless day.blank?
  258.     to = to - 1 # pull off 1 second so we don't overlap onto the next day
  259.     return from..to
  260.   end
  261.     
  262.   def formatted_date_selector(prefix = '')
  263.     return '' unless params[:year]
  264.     format = prefix
  265.     format << '%A %d ' if params[:day]
  266.     format << '%B ' if params[:month]
  267.     format << '%Y' if params[:year]
  268.     return(Time.mktime(*params.values_at(:year, :month, :day)).strftime(format))
  269.   end
  270. end