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

Ajax

开发平台:

Others

  1. require 'base64'
  2. module Admin; end
  3. class Admin::ContentController < Admin::BaseController
  4.   layout "administration", :except => [:show, :autosave]
  5.   cache_sweeper :blog_sweeper
  6.   def auto_complete_for_article_keywords
  7.     @items = Tag.find_with_char params[:article][:keywords].strip
  8.     render :inline => "<%= auto_complete_result @items, 'name' %>"
  9.   end
  10.   def index
  11.     @search = params[:search] ? params[:search] : {}
  12.     @articles = Article.search_no_draft_paginate(@search, :page => params[:page], :per_page => this_blog.admin_display_elements)
  13.     if request.xhr?
  14.       render :partial => 'article_list', :object => @articles
  15.     else
  16.       @article = Article.new(params[:article])
  17.     end
  18.   end
  19.   def new
  20.     new_or_edit
  21.   end
  22.   def edit
  23.     @article = Article.find(params[:id])
  24.     unless @article.access_by? current_user
  25.       redirect_to :action => 'index'
  26.       flash[:error] = _("Error, you are not allowed to perform this action")
  27.       return
  28.     end
  29.     new_or_edit
  30.   end
  31.   def destroy
  32.     @article = Article.find(params[:id])
  33.     unless @article.access_by?(current_user)
  34.       redirect_to :action => 'index'
  35.       flash[:error] = _("Error, you are not allowed to perform this action")
  36.       return
  37.     end
  38.     if request.post?
  39.       @article.destroy
  40.       redirect_to :action => 'index'
  41.       return
  42.     end
  43.   end
  44.   def insert_editor
  45.     return unless params[:editor].to_s =~ /simple|visual/
  46.     current_user.editor = params[:editor].to_s
  47.     current_user.save!
  48.     render :partial => "#{params[:editor].to_s}_editor"
  49.   end
  50.   def category_add; do_add_or_remove_fu; end
  51.   alias_method :resource_add,    :category_add
  52.   alias_method :resource_remove, :category_add
  53.   def attachment_box_add
  54.     render :update do |page|
  55.       page["attachment_add_#{params[:id]}"].remove
  56.       page.insert_html :bottom, 'attachments',
  57.           :partial => 'admin/content/attachment',
  58.           :locals => { :attachment_num => params[:id], :hidden => true }
  59.       page.visual_effect(:toggle_appear, "attachment_#{params[:id]}")
  60.     end
  61.   end
  62.   def attachment_save(attachment)
  63.     begin
  64.       Resource.create(:filename => attachment.original_filename,
  65.                       :mime => attachment.content_type.chomp, :created_at => Time.now).write_to_disk(attachment)
  66.     rescue => e
  67.       logger.info(e.message)
  68.       nil
  69.     end
  70.   end
  71.   def autosave
  72.     get_or_build_article
  73.     # This is ugly, but I have to check whether or not the article is
  74.     # published to create the dummy draft I'll replace later so that the
  75.     # published article doesn't get overriden on the front
  76.     if @article.published
  77.       parent_id = @article.id
  78.       @article = Article.drafts.child_of(parent_id).first || Article.new
  79.       @article.allow_comments = this_blog.default_allow_comments
  80.       @article.allow_pings    = this_blog.default_allow_pings
  81.       @article.text_filter    = (current_user.editor == 'simple') ? current_user.text_filter : 1
  82.       @article.parent_id      = parent_id
  83.     end
  84.     params[:article] ||= {}
  85.     @article.attributes = params[:article]
  86.     @article.published = false
  87.     set_article_author
  88.     save_attachments
  89.     set_article_title_for_autosave
  90.     @article.state = "draft" unless @article.state == "withdrawn"
  91.     if @article.save
  92.       render(:update) do |page|
  93.         page.replace_html('autosave', hidden_field_tag('id', @article.id))
  94.         page.replace_html('permalink', text_field('article', 'permalink', {:class => 'small medium'}))
  95.         page.replace_html('preview_link', link_to(_("Preview"), {:controller => '/articles', :action => 'preview', :id => @article.id}, {:target => 'new'}))
  96.       end
  97.       return true
  98.     end
  99.     render :text => nil
  100.   end
  101.   protected
  102.   attr_accessor :resources, :categories, :resource, :category
  103.   def do_add_or_remove_fu
  104.     attrib, action = params[:action].split('_')
  105.     @article = Article.find(params[:id])
  106.     self.send("#{attrib}=", self.class.const_get(attrib.classify).find(params["#{attrib}_id"]))
  107.     send("setup_#{attrib.pluralize}")
  108.     @article.send(attrib.pluralize).send(real_action_for(action), send(attrib))
  109.     @article.save
  110.     render :partial => "show_#{attrib.pluralize}"
  111.   end
  112.   def real_action_for(action); { 'add' => :<<, 'remove' => :delete}[action]; end
  113.   def new_or_edit
  114.     get_or_build_article
  115.     @macros = TextFilter.available_filters.select { |filter| TextFilterPlugin::Macro > filter }
  116.     @article.published = true
  117.     # TODO Test if we can delete the next line. It's delete on nice_permalinks branch
  118.     params[:article] ||= {}
  119.     @resources = Resource.find(:all, :conditions => "mime NOT LIKE '%image%'", :order => 'filename')
  120.     @images = Resource.paginate :page => params[:page], :conditions => "mime LIKE '%image%'", :order => 'created_at DESC', :per_page => 10
  121.     @article.attributes = params[:article]
  122.     if request.post?
  123.       set_article_author
  124.       save_attachments
  125.       @article.state = "draft" if @article.draft
  126.       if @article.save
  127.         destroy_the_draft unless @article.draft
  128.         set_article_categories
  129.         set_the_flash
  130.         redirect_to :action => 'index'
  131.         return
  132.       end
  133.     end
  134.     render :action => 'new'
  135.   end
  136.   def set_the_flash
  137.     case params[:action]
  138.     when 'new'
  139.       flash[:notice] = _('Article was successfully created')
  140.     when 'edit'
  141.       flash[:notice] = _('Article was successfully updated.')
  142.     else
  143.       raise "I don't know how to tidy up action: #{params[:action]}"
  144.     end
  145.   end
  146.   def destroy_the_draft
  147.     Article.all(:conditions => { :parent_id => @article.id }).map(&:destroy)
  148.   end
  149.   def set_article_author
  150.     return if @article.author
  151.     @article.author = current_user.login
  152.     @article.user   = current_user
  153.   end
  154.   def set_article_title_for_autosave
  155.     if @article.title.blank?
  156.       lastid = Article.find(:first, :order => 'id DESC').id
  157.       @article.title = "Draft article " + lastid.to_s
  158.     end
  159.     unless @article.parent_id and Article.find(@article.parent_id).published
  160.       @article.permalink = @article.stripped_title
  161.     end
  162.   end
  163.   def save_attachments
  164.     return if params[:attachments].nil?
  165.     params[:attachments].each do |k,v|
  166.       a = attachment_save(v)
  167.       @article.resources << a unless a.nil?
  168.     end
  169.   end
  170.   def set_article_categories
  171.     @article.categorizations.clear
  172.     if params[:categories]
  173.       Category.find(params[:categories]).each do |cat|
  174.         @article.categories << cat
  175.       end
  176.     end
  177.   end
  178.   def def_build_body
  179.     if @article.body =~ /<!--more-->/
  180.       body = @article.body.split('<!--more-->')
  181.       @article.body = body[0]
  182.       @article.extended = body[1]
  183.     end
  184.   end
  185.   def get_or_build_article
  186.     @article = case params[:id]
  187.              when nil
  188.                returning(Article.new) do |art|
  189.                  art.allow_comments = this_blog.default_allow_comments
  190.                  art.allow_pings    = this_blog.default_allow_pings
  191.                  art.text_filter    = (current_user.editor == 'simple') ? current_user.text_filter : 1
  192.                end
  193.             else
  194.               Article.find(params[:id])
  195.             end
  196.   end
  197.   def setup_resources
  198.     @resources = Resource.find(:all, :order => 'created_at DESC')
  199.   end
  200. end