110 lines
2.4 KiB
Ruby
110 lines
2.4 KiB
Ruby
|
# Representa los distintos tipos de campos que pueden venir de una
|
||
|
# plantilla compleja
|
||
|
class Post
|
||
|
class TemplateField
|
||
|
attr_reader :post, :contents, :key
|
||
|
|
||
|
def initialize(post, key, contents)
|
||
|
@post = post
|
||
|
@key = key
|
||
|
@contents = contents
|
||
|
end
|
||
|
|
||
|
def type
|
||
|
return @type if @type
|
||
|
return unless simple?
|
||
|
|
||
|
case
|
||
|
when contents == 'string'
|
||
|
@type = 'text'
|
||
|
when contents == 'text'
|
||
|
@type = 'text_area'
|
||
|
when contents.is_a?(String) && contents.split('/', 2).count == 2
|
||
|
@type = 'select'
|
||
|
when contents.is_a?(Array)
|
||
|
@type = 'select'
|
||
|
when contents.is_a?(FalseClass) || contents.is_a?(TrueClass)
|
||
|
@type = 'check_box'
|
||
|
end
|
||
|
|
||
|
@type
|
||
|
end
|
||
|
|
||
|
# Si la plantilla es simple no está admitiendo Hashes como valores
|
||
|
def simple?
|
||
|
!complex?
|
||
|
end
|
||
|
|
||
|
def complex?
|
||
|
contents.is_a? Hash
|
||
|
end
|
||
|
|
||
|
# XXX Retrocompatibilidad
|
||
|
def to_s
|
||
|
key
|
||
|
end
|
||
|
|
||
|
def to_param
|
||
|
if array?
|
||
|
{ key.to_sym => [] }
|
||
|
else
|
||
|
key.to_sym
|
||
|
end
|
||
|
end
|
||
|
|
||
|
def array?
|
||
|
@contents.is_a? Array
|
||
|
end
|
||
|
|
||
|
# TODO detectar cuando es complejo y tomar el valor de :multiple
|
||
|
def multiple?
|
||
|
array?
|
||
|
end
|
||
|
|
||
|
def value
|
||
|
@contents
|
||
|
end
|
||
|
|
||
|
# Obtiene los valores posibles para el campo de la plantilla
|
||
|
def values
|
||
|
return '' if %w[string text].include? value
|
||
|
|
||
|
# Para obtener los valores posibles, hay que procesar la string y
|
||
|
# convertirla a parametros
|
||
|
#
|
||
|
# XXX Prestar atención a no enviar metodos privados
|
||
|
|
||
|
# 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
|
||
|
post.site.send(attr.to_sym)
|
||
|
else
|
||
|
post.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
|
||
|
|
||
|
end
|
||
|
end
|