cargar los campos desde la plantilla
This commit is contained in:
parent
47e149b1c9
commit
17d6d01aeb
2 changed files with 60 additions and 8 deletions
|
@ -180,7 +180,7 @@ class Post
|
|||
# enviamos actualizaciones al front matter, debería traer el contenido
|
||||
# del post sin cambios
|
||||
def content
|
||||
@content ||= @post.try(:content) || @template.try(:content)
|
||||
@content ||= @post.try(:content) || template.try(:content)
|
||||
end
|
||||
|
||||
# imita Model.update_attributes de ActiveRecord
|
||||
|
@ -214,15 +214,22 @@ class Post
|
|||
@front_matter.dig(name.to_s)
|
||||
end
|
||||
|
||||
# Trae el template a partir del layout
|
||||
def template_from_layout
|
||||
@site.templates.find do |t|
|
||||
t.get_front_matter('slug') == get_front_matter('layout')
|
||||
end
|
||||
end
|
||||
|
||||
def template_fields
|
||||
@template_fields ||= @template.front_matter.reject do |key, _|
|
||||
@template_fields ||= template.front_matter.reject do |key, _|
|
||||
REJECT_FROM_TEMPLATE.include? key
|
||||
end.keys
|
||||
end
|
||||
|
||||
# Obtiene el tipo de campo para la plantilla
|
||||
def template_form_type_for(field)
|
||||
return if (tt = @template.get_front_matter(field)).nil?
|
||||
return if (tt = template.get_front_matter(field)).nil?
|
||||
|
||||
case
|
||||
when tt == 'string'
|
||||
|
@ -238,20 +245,63 @@ class Post
|
|||
type
|
||||
end
|
||||
|
||||
def template_multiple_values?(field)
|
||||
template.get_front_matter(field).is_a? Array
|
||||
end
|
||||
|
||||
# Obtiene los valores posibles para el campo de la plantilla
|
||||
def template_values_for(field)
|
||||
return '' if %w[string text].include? @template.get_front_matter(field)
|
||||
@template.get_front_matter(field)
|
||||
return '' if %w[string text].include? template.get_front_matter(field)
|
||||
|
||||
# Para obtener los valores posibles, hay que procesar la string y
|
||||
# convertirla a parametros
|
||||
#
|
||||
# XXX Prestar atención a no enviar metodos privados
|
||||
|
||||
value = template.get_front_matter(field)
|
||||
|
||||
# Si es una array de un solo elemento, es un indicador de que
|
||||
# tenemos que rellenarla con los valores que indica
|
||||
if value.is_a?(Array) && value.count == 1
|
||||
values = value.first
|
||||
else
|
||||
values = value
|
||||
end
|
||||
|
||||
# Procesar el valor
|
||||
if values.is_a?(String)
|
||||
value = values.split(':', 2).map do |v|
|
||||
collection, attr = v.split('/', 2)
|
||||
|
||||
if collection == 'site'
|
||||
# TODO puede ser peligroso permitir acceder a cualquier
|
||||
# atributo de site? No estamos trayendo nada fuera de
|
||||
# lo normal
|
||||
@site.send(attr.to_sym)
|
||||
else
|
||||
@site.everything_of(attr, lang: collection)
|
||||
end
|
||||
end
|
||||
|
||||
value = value.last.zip value.first
|
||||
end
|
||||
|
||||
# En última instancia, traer el valor por defecto
|
||||
value
|
||||
end
|
||||
|
||||
def template
|
||||
@template ||= template_from_layout
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
# Completa el front_matter a partir de las variables de otro
|
||||
def front_matter_from_template
|
||||
return {} unless @template
|
||||
return {} unless template
|
||||
|
||||
# Convertimos el slug en layout
|
||||
ft = @template.front_matter.dup
|
||||
ft = template.front_matter.dup
|
||||
ft['layout'] = ft.delete('slug')
|
||||
|
||||
ft
|
||||
|
|
|
@ -91,6 +91,8 @@
|
|||
- when 'check_box'
|
||||
= check_box_tag name, value: value, class: 'form-control'
|
||||
- when 'select'
|
||||
= select_tag name, value, { class: 'form-control' }
|
||||
= select_tag name, options_for_select(value, @post.get_front_matter(template)),
|
||||
{ class: 'form-control select2',
|
||||
multiple: @post.template_multiple_values?(template) }
|
||||
.form-group
|
||||
= submit_tag t('posts.save'), class: 'btn btn-success'
|
||||
|
|
Loading…
Reference in a new issue