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
|
# enviamos actualizaciones al front matter, debería traer el contenido
|
||||||
# del post sin cambios
|
# del post sin cambios
|
||||||
def content
|
def content
|
||||||
@content ||= @post.try(:content) || @template.try(:content)
|
@content ||= @post.try(:content) || template.try(:content)
|
||||||
end
|
end
|
||||||
|
|
||||||
# imita Model.update_attributes de ActiveRecord
|
# imita Model.update_attributes de ActiveRecord
|
||||||
|
@ -214,15 +214,22 @@ class Post
|
||||||
@front_matter.dig(name.to_s)
|
@front_matter.dig(name.to_s)
|
||||||
end
|
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
|
def template_fields
|
||||||
@template_fields ||= @template.front_matter.reject do |key, _|
|
@template_fields ||= template.front_matter.reject do |key, _|
|
||||||
REJECT_FROM_TEMPLATE.include? key
|
REJECT_FROM_TEMPLATE.include? key
|
||||||
end.keys
|
end.keys
|
||||||
end
|
end
|
||||||
|
|
||||||
# Obtiene el tipo de campo para la plantilla
|
# Obtiene el tipo de campo para la plantilla
|
||||||
def template_form_type_for(field)
|
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
|
case
|
||||||
when tt == 'string'
|
when tt == 'string'
|
||||||
|
@ -238,20 +245,63 @@ class Post
|
||||||
type
|
type
|
||||||
end
|
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
|
# Obtiene los valores posibles para el campo de la plantilla
|
||||||
def template_values_for(field)
|
def template_values_for(field)
|
||||||
return '' if %w[string text].include? @template.get_front_matter(field)
|
return '' if %w[string text].include? template.get_front_matter(field)
|
||||||
@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
|
end
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
# Completa el front_matter a partir de las variables de otro
|
# Completa el front_matter a partir de las variables de otro
|
||||||
def front_matter_from_template
|
def front_matter_from_template
|
||||||
return {} unless @template
|
return {} unless template
|
||||||
|
|
||||||
# Convertimos el slug en layout
|
# Convertimos el slug en layout
|
||||||
ft = @template.front_matter.dup
|
ft = template.front_matter.dup
|
||||||
ft['layout'] = ft.delete('slug')
|
ft['layout'] = ft.delete('slug')
|
||||||
|
|
||||||
ft
|
ft
|
||||||
|
|
|
@ -91,6 +91,8 @@
|
||||||
- when 'check_box'
|
- when 'check_box'
|
||||||
= check_box_tag name, value: value, class: 'form-control'
|
= check_box_tag name, value: value, class: 'form-control'
|
||||||
- when 'select'
|
- 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
|
.form-group
|
||||||
= submit_tag t('posts.save'), class: 'btn btn-success'
|
= submit_tag t('posts.save'), class: 'btn btn-success'
|
||||||
|
|
Loading…
Reference in a new issue