Placeholders em Campos de SQLFORM

Olá, nesse post mostraremos uma forma simples mas bem útil de adicionar placeholders em SQLFORMs no web2py.

Um placeholder é aquela dica que fica dentro do input.

<input type="text" name="xyz" placeholder="Diga seu nome" />

Eles servem para auxiliar o usuário, há casos onde usar labels como complemento não fica legal, ou ocupa espaço. Então os placeholders entram como um auxiliar.

Uma maneira mais profissional e que está diretamente ligada no construtor Field de define_table são criar widgets customizados.

def widget(**kwargs):
    return lambda field, value, kwargs=kwargs: SQLFORM.widgets[field.type].widget(field, value, **kwargs)|
db.define_table('reference',
    Field('is_enabled', 'boolean', default=True, label=T('Enabled')),
    Field('name', 'string', required=True,length=256, label=T('Name'),widget=widget(_placeholder='One-two word description', _readonly=False)),
    Field('title', 'string', required=True, length=512, label=T('Title'),widget=widget(_placeholder='e.g. Database Abstraction layer ', _readonly=False)) ,
    Field('subtitle', 'string', length=512, label=T('Subtitle'),widget=widget(_placeholder='File name (.w2p) or short description', _readonly=False)),
    format='%(name)s'  #' - '  '%(title)s 
)
Mas uma outra forma simples a nível de controller é usar o form.element.
form.element(_id='...')['_placeholder']='...'

Imagine que você já tem toda uma estrutura criada, ou não é possível acessar o fonte do construtor de tabela. Logo a unica saída que resta é fazer o trabalho sujo no controller. Por isso a classe FORM do web2py nos disponibiliza um complemento, chamado form.element para acessarmos o DOM.

Ele serve para acessarmos elementos DOM do formulário depois de ele ter sido construído. 
Vejamos tome como exemplo o código abaixo.

form = SQLFORM(db.reference)

Se quisermos acessar o campo nome dessa tabela precisamos usar:
form.element(_name='name')['_class'] = 'form-control text'

Dessa forma podemos acessar qualquer elemento de HTML a partir do form.

E o placeholder????


form.element(_name='name')['_placeholder'] = 'Seu nome completo'

Veja os elementos DOM são acessados por um dicionário sempre seguidos de um '_' antes do nome do elemento DOM, ele serve para diferenciarmos classes do web2py/python de HTML.

Um exemplo prático de como podemos adicionar isso de forma automatizada é o loop abaixo:

for e in db.reference.fields:
    form.element(_name=e)['_placeholder'] = db.reference[e].label

Comentários

Postagens mais visitadas deste blog

Configurar o web2py no Apache e Ubuntu LTS

Usando multiplos templates web2py