Как добавить поле в сниппет в Comfortable Mexican Sofa

Я планирую использовать сниппеты в Comfortable Mexican Sofa для хранения шаблонов писем. Но есть ли способ добавить поле во фрагмент. Я бы использовал его для хранения темы письма. Было бы хорошо иметь тему в cms, чтобы наши редакторы могли изменить ее, если захотят.

По умолчанию фрагменты содержат только два поля «Ярлык» и «Идентификатор». И, конечно же, «Контент». Я хотел бы добавить также строку «Тема» в поля.


person Mika    schedule 05.09.2014    source источник
comment
Почему бы вам не использовать «Ярлык» для установки темы электронного письма? Таким образом, вам не придется модифицировать CMS.   -  person Albert    schedule 22.10.2014
comment
Первоначально я думал, что когда я меняю метку, он также меняет идентификатор, но, похоже, это так только до того, как фрагмент будет сохранен в первый раз. Я думаю, что мог бы использовать ярлык. Спасибо!   -  person Mika    schedule 23.10.2014


Ответы (1)


Простой трехэтапный процесс:

1:

rails g migration AddSubjectToComfyCmsSnippets subject:string

2:

rake db:migrate

3:

создайте app/views/comfy/admin/cms/snippets/_form.html.haml со следующим содержимым:

- content_for :right_column do
  = render 'comfy/admin/cms/files/index'
= render :partial => 'comfy/admin/cms/partials/snippet_form_before', :object => form
= form.text_field :label, :data => {:slugify => @snippet.new_record?}
= form.text_field :identifier, :data => {:slug => true}
= form.text_field :subject
= form.text_area :content, :data => {'cms-rich-text' => true}
= render :partial => 'comfy/admin/cms/categories/form', :object => form
= render :partial => 'comfy/admin/cms/partials/snippet_form_after', :object => form
= form.form_group :class => 'form-actions' do
  = form.submit t(@snippet.new_record?? '.create' : '.update'), :class => 'btn btn-primary'
  = link_to t('.cancel'), comfy_admin_cms_site_snippets_path, :class => 'btn btn-link'

Теперь вы можете ссылаться на тему в своем приложении следующим образом:

Subject: #{@snippet.subject}

Патч Monkey для работы приборов:

создайте config/initializers/cms_monkey_patch.rb со следующим содержимым:

ComfortableMexicanSofa::Fixture::Snippet::Importer.class_eval do
    def import!
      Dir["#{self.path}*/"].each do |path|
        identifier = path.split('/').last
        snippet = self.site.snippets.find_or_initialize_by(:identifier => identifier)

        # setting attributes
        categories = []
        if File.exists?(attrs_path = File.join(path, 'attributes.yml'))
          if fresh_fixture?(snippet, attrs_path)
            attrs = get_attributes(attrs_path)

            snippet.label = attrs['label']
            snippet.subject = attrs['subject']
            categories    = attrs['categories']
          end
        end

        # setting content
        %w(html haml).each do |extension|
          if File.exists?(content_path = File.join(path, "content.#{extension}"))
            if fresh_fixture?(snippet, content_path)
              snippet.content = extension == "html" ? 
                ::File.open(content_path).read : 
                Haml::Engine.new(::File.open(content_path).read).render.rstrip
            end
          end
        end

        # saving
        if snippet.changed? || self.force_import
          if snippet.save
            save_categorizations!(snippet, categories)
            ComfortableMexicanSofa.logger.info("[FIXTURES] Imported Snippet \t #{snippet.identifier}")
          else
            ComfortableMexicanSofa.logger.warn("[FIXTURES] Failed to import Snippet \n#{snippet.errors.inspect}")
          end
        end

        self.fixture_ids << snippet.id
      end

      # cleaning up
      self.site.snippets.where('id NOT IN (?)', fixture_ids).each{ |s| s.destroy }
    end
  end
end

ComfortableMexicanSofa::Fixture::Snippet::Exporter.class_eval do
    def export!
      prepare_folder!(self.path)

      self.site.snippets.each do |snippet|
        snippet_path = File.join(self.path, snippet.identifier)
        FileUtils.mkdir_p(snippet_path)

        # writing attributes
        open(File.join(snippet_path, 'attributes.yml'), 'w') do |f|
          f.write({
            'label'       => snippet.label,
            'subject'       => snippet.subject,
            'categories'  => snippet.categories.map{|c| c.label}
          }.to_yaml)
        end

        # writing content
        open(File.join(snippet_path, 'content.html'), 'w') do |f|
          f.write(snippet.content)
        end

        ComfortableMexicanSofa.logger.info("[FIXTURES] Exported Snippet \t #{snippet.identifier}")
      end
    end
end
person laertiades    schedule 06.09.2014
comment
Один большой недостаток при попытке это. При экспорте cms в приборы с помощью rake comfortable_mexican_sofa:fixtures:export поле темы не экспортируется из базы данных. Будет ли такой же простой шаг, чтобы заставить команду экспорта включать пользовательские столбцы базы данных? И то же самое для импорта? Мы используем приспособления для публикации сайта от постановки до производства. - person Mika; 08.09.2014
comment
@Мика. Я добавил решение, которое, как я уверен, заставит приборы работать. Я не проверял это. Если вы попробуете это, и это не сработает, пожалуйста, дайте мне знать. Я просто добавил две строки в этот< /а> код - person laertiades; 08.09.2014
comment
Кстати, я чувствую, что мое предложение выше становится немного деспотичным. Лично я бы старался избегать таких модификаций, когда это возможно. Если вы реализуете это, и это работает, вы можете просто проявлять бдительность при обновлении драгоценного камня cms. - person laertiades; 08.09.2014
comment
Спасибо. Это, безусловно, выглядит как возможный путь. Мое текущее решение состоит в том, чтобы иметь отдельный фрагмент для темы. Хотя он работает без изменений кода CMS, вскоре он становится немного запутанным в разделе фрагментов. Мне нужно будет вернуться к этому после того, как я закончу некоторые задачи с более высоким приоритетом. - person Mika; 09.09.2014