Загрузка...

Ruby & Rails: веб-разработка с удовольствием

Ruby on Rails — фреймворк для создания веб-приложений. Является открытым программным обеспечением (лицензия MIT). Здесь мы обсуждаем новости RoR, делимся учебными материалами и интересными находками С RoR даже сложные веб-приложения могут быть написаны за считанные дни. Это действительно разработка с удовольствием!
     

Expandable block

30.04.09, 22:38
Автор artem.voroztsov

Вдогонку к предыдущему посту небольшой хелпер-метод, для создания раскрываемых/сворачиваемых блоков. Код не идеальный, но может кому-нибудь будет интересен.

  # Creates div element which can be expanded and shrinked/closed.
  # The first argument is the text for expand link (when block is shrinked).
  # Content between < % do %> and < % end %> is contents for expanded div.
  #
  # Use option :noshrink => true for popups (messages) to make block closable
  # (not shrinkable)
  #
  # Privide block arguments if you want to be responsible for shrink/close 
  # link.
  # The first argument is shrink(close) link which you can place anywhere 
  # inside your block.
  # The second argument is javascript to close/shrink block (you can use it
  # as second argument for link_to_function method).
  #
  # Max number of block arguments is 4:
  #  * close_link - link to close buttom
  #  * close_js - only java script that shrinks(closes) block
  #  * open_id - id of HTML 'div' element for opened state  block
  #  * close_id - id of HTML 'div' element for shrinked state block
  #
  # Use the first if standard shrink(close)-button is ok for you.
  # Use the second if you want to use your own disign of shrink(close)-button.
  #
  # If ruby-block has no arguments then shrink(close)-button is standard "[x]",
  # which is placed at the right top corner.
  #
  # Example 1:
  # < % expandable_block('expand>>') do |close_link,js_close,open_id,close_id| -%>
  #   < div class="my_frame_box">
  #     < div align="right">
  #       < %= link_to_function(image_tag('close.png'), js_close) %>
  #     < /div>
  #     Content of block
  #   < /div>
  # < % end -%>
  #
  # Example 2:
  # < % expandable_block('expand_me>>', :noshrink => true) do |close_link| -%>
  #   < div class="bottom">< %= close_link %>< /div>
  #    Message text
  # < % end -%>
  #
  def expandable_block(text='>>', options={}, &block)
    raise ArgumentError, "Missing block" unless block_given?
    add_class = options.delete(:class)||''
    @block_id ||= 0
    @block_id += 1
    o_id = "_o_#{@block_id}"
    c_id = "_c_#{@block_id}"
    close_link_class = options[:close_link_class]
    expanded = options[:expanded] || options[:noshrink]
    closing_javascript = "$('#{o_id}').hide();$('#{c_id}').show()"
    closing_link = link_to_function(
      options[:icon_close] || (respond_to?(:icon_close)&&icon_close) || '[x]',
      closing_javascript,
      :alt => options[:close_alt] || 'close block',
      :class => "expblock_close_link #{close_link_class}"
    )
    content = ''
    arity = block.arity || 0
    arity = 4 if arity < -1
    if arity > 0
      content = capture(
        *[closing_link,closing_javascript,o_id,c_id][0..arity],  &block
      )
      closing_link = ''
    else
      content = capture(&block)
    end
    unless options[:noshrink]
      concat(
        content_tag('div',
          link_to_function( text, "$('#{o_id}').show();$('#{c_id}').hide()"),
          {:id    => '_c_' + @block_id.to_s,
          :class  => "expblock_closed #{add_class}"}.merge!(options)
        ),
        block.binding
      )
    end
    concat(
      content_tag('div',
        closing_link +  content,
        {:id    => '_o_' + @block_id.to_s,
        :class  => "expblock_opened #{add_class}"}.merge!(options)
      ),
      block.binding
    )
    unless expanded
      concat("< mce:script type="text/javascript">< /mce:script>", block.binding)
      end
    end
  end

Комментарии

местный редактор корежит код:
1) mce:script → script
2) И еще он добавляет незапланированные переносы.

Войдите, чтобы оставить комментарий