Skip to content

Classe Odin_Post_Form

Mário Valney edited this page Jul 21, 2017 · 3 revisions

Você não precisa mais utilizar plugins para criar formulários de publicação no Odin. Utilize a classe Odin_Post_Form que será capaz de gerar o formulário e ainda validar os campos por HTML5 e PHP antes deles serem salvos, sanitizar o que for preciso e incluir também termos de taxonomias e custom fields.

Instalação:

Adicione as seguintes linhas em seu functions.php:

require_once get_template_directory() . '/core/classes/abstracts/abstract-front-end-form.php';
require_once get_template_directory() . '/core/classes/class-post-form.php';

Criando um formulário de publicação:

Devemos instanciar a classe Odin_Post_Form para criar o Formulário:

function odin_post_form() {
    $form = new Odin_Post_Form(
        'form_id', // ID do formulário
        'post', // Tipo de post a ser criado. Padrão: 'post'
        'draft', // Status do post ao ser criado. Padrão: 'draft'
        array( 'class' => 'form' ) // Atributos do formulário. Padrão: 'array()'
    );

    return $form;
}

add_action( 'init', array( odin_post_form(), 'init' ), 1 );

Isso apenas cria a instância do formulário! Você ainda precisa adicionar os campos e também exibir ele no tema.

Adicionando campos no formulário de contato:

Adicione os campos utilizando o método set_fields() como por exemplo:

$form->set_fields(
    array(
        array(
            'fields' => array(
                array(
                    'id'          => 'post_title', // Obrigatório
                    'label'       => array(
                        'text'  => __( 'Título do Post', 'odin' ), // Obrigatório
                        'class' => 'example-class example-class-2'
                    ),
                    'type'        => 'text', // Obrigatório
                    'required'    => true, // Opcional (bool)
                    'attributes'  => array( // Opcional (html input elements)
                        'placeholder' => __( 'Digite o título do post' )
                    )
                ),
                array(
                    'id'          => 'post_content', // Obrigatório
                    'label'       => array(
                        'text'  => __( 'Conteúdo do Post', 'odin' ), // Obrigatório
                        'class' => 'example-class example-class-2'
                    ),
                    'type'        => 'textarea', // Obrigatório
                    'required'    => true, // Opcional (bool)
                ),
            )
        ),
    )
);

Como é possível ver no exemplo, é necessário criar um array que funcionará como fiedset e dentro dele outro array que terá campos do nosso formulário de contato.

Grupos de campos/fieldset:

O fieldset poderá ter três parâmetros:

$form->set_fields(
    array(
        array(
            'legend' => __( 'Legenda do grupo' ), // Opcional
            'attributes' => array( // Opcional (atributos que pode ter em um fieldset em html)
                'class' => 'some-css-class'
            ),
            'fields' => array( // Obrigatório
                // Aqui vão os campos do fieldset
            )
        )
    )
);

Tipos de campo:

text

Cria um campo comum de texto:

array(
    'id'          => 'text_example', // Obrigatório
    'label'       => array(
        'text'  => __( 'Text Example', 'odin' ), // Obrigatório
        'class' => 'example-class example-class-2'
    ),
    'type'        => 'text', // Obrigatório
    'required'    => true, // Campo obrigatório (true/false) Opcional
    'attributes'  => array( // Opcional (atributos para input HTML/HTML5)
        'placeholder' => __( 'Some text here!' )
    ),
    'default'     => 'Default text', // Opcional
    'description' => __( 'Description Example', 'odin' ), // Opcional
)

email

Cria um campo de e-mail.

array(
    'id'          => 'email_example', // Obrigatório
    'label'       => array(
        'text'  => __( 'Email Example', 'odin' ), // Obrigatório
        'class' => 'example-class example-class-2'
    ),
    'type'        => 'email', // Obrigatório
    'required'    => true, // Campo obrigatório (true/false) Opcional
    'attributes'  => array( // Opcional (atributos para input HTML/HTML5)
        'placeholder' => __( 'Some text here!' )
    ),
    'default'     => 'Default text', // Opcional
    'description' => __( 'Description Example', 'odin' ), // Opcional
)

file

Cria um campo de arquivo.

array(
    'id'          => 'file_example', // Obrigatório
    'label'       => array(
        'text'  => __( 'File Example', 'odin' ), // Obrigatório
        'class' => 'example-class example-class-2'
    ),
    'type'        => 'file', // Obrigatório
    'required'    => true, // Campo obrigatório (true/false) Opcional
    'attributes'  => array( // Opcional (atributos para input HTML/HTML5)
        'placeholder' => __( 'Some text here!' )
    ),
    'default'     => 'Default text', // Opcional
    'description' => __( 'Description Example', 'odin' ), // Opcional
)

input

Cria um campo input em HTML que aceita os tipos do HTML5.

array(
    'id'          => 'html5_input_example', // Obrigatório
    'label'       => array(
        'text'  => __( 'HTML5 input Example', 'odin' ), // Obrigatório
        'class' => 'example-class example-class-2'
    ),
    'type'        => 'input', // Obrigatório
    'required'    => true, // Campo obrigatório (true/false) Opcional
    'attributes'  => array( // Opcional (atributos para input HTML/HTML5)
        'type'     => 'color',
        'required' => 'required',
        'class'    => 'regular-text',
        'styles'   => 'background: #444;'
    ),
    'default'     => '#ffffff', // Opcional
    'description' => __( 'Description Example', 'odin' ), // Opcional
)

textarea

Cria um campo de múltiplas linhas de texto.

array(
    'id'          => 'textarea_example', // Obrigatório
    'label'       => array(
        'text'  => __( 'Textarea Example', 'odin' ), // Obrigatório
        'class' => 'example-class example-class-2'
    ),
    'type'        => 'textarea', // Obrigatório
    'required'    => true, // Campo obrigatório (true/false) Opcional
    'attributes'  => array( // Opcional (atributos para input HTML/HTML5)
        'placeholder' => __( 'Some text here!' )
    ),
    'default'     => 'Default text', // Opcional
    'description' => __( 'Description Example', 'odin' ), // Opcional
)

checkbox

Cria um campo de checkbox.

array(
    'id'          => 'checkbox_example', // Obrigatório
    'label'       => array(
        'text'  => __( 'Checkbox Example', 'odin' ), // Obrigatório
        'class' => 'example-class example-class-2'
    ),
    'type'        => 'checkbox', // Obrigatório
    'required'    => true, // Campo obrigatório (true/false) Opcional
    // 'attributes' => array(), // Opcional (atributos para input HTML/HTML5)
    'default'     => '', // Opcional (utilize 1 para deixar marcado como padrão)
    'description' => __( 'Description Example', 'odin' ), // Opcional
)

select

Cria um campo de select.

array(
    'id'            => 'select_example', // Obrigatório
    'label'       => array(
        'text'  => __( 'Select Example', 'odin' ), // Obrigatório
        'class' => 'example-class example-class-2'
    ),
    'type'          => 'select', // Obrigatório
    'required'    => true, // Campo obrigatório (true/false) Opcional
    // 'attributes' => array(), // Opcional (atributos para input HTML/HTML5)
    'default'       => 'three', // Opcional
    'description'   => __( 'Description Example', 'odin' ), // Opcional
    'options'       => array( // Obrigatório (adicione aque os ids e títulos)
        'one'   => 'One',
        'two'   => 'Two',
        'three' => 'Three',
        'four'  => 'Four'
    ),
)

radio

Cria um campo de radio.

array(
    'id'          => 'radio_example', // Obrigatório
    'label'       => array(
        'text'  => __( 'Radio Example', 'odin' ), // Obrigatório
        'class' => 'example-class example-class-2'
    ),
    'type'        => 'radio', // Obrigatório
    'required'    => true, // Campo obrigatório (true/false) Opcional
    // 'attributes' => array(), // Opcional (atributos para input HTML/HTML5)
    'default'     => 'three', // Opcional
    'description' => __( 'Description Example', 'odin' ), // Opcional
    'options'     => array( // Obrigatório (adicione aque os ids e títulos)
        'one'   => 'One',
        'two'   => 'Two',
        'three' => 'Three',
        'four'  => 'Four'
    ),
)

Configurando o título e o conteúdo do post:

Para indicar qual será o campo responsável pelo título e pelo conteúdo do post utilize os métodos set_title_field() e set_content_field():

$form->set_title_field( 'post_title' );
$form->set_content_field( 'post_content' );

Configurando content fields para o post:

Para indicar quais serão os campos com conteúdo extra para o post utilize o método set_content_field():

$form->set_custom_fields( array(
	'custom_field_text',
	'custom_field_url',
	'custom_field_image',
) );

Irá receber uma array com o ID de cada field.

Configurando termos de taxonomias para o post:

Para indicar quais serão os termos de taxonomias para o post utilize o método set_terms():

$form->set_terms( array(
	'category' => 'category_field',
	'post_tag' => 'post_tag_field',
) );

Irá receber uma array com as chaves sendo a taxonomia e os valores o ID de cada field.

Exibindo Formulário de Contato no tema:

Com tudo configurado você já poderá exibir o formulário de contato no seu tema utilizando o método render(). Veja um exemplo com a função que chamamos de odin_contact_form():

echo odin_contact_form()->render();

Exemplo completo:

Formulário simples com Título do Post, Conteúdo do Post, Categoria, Tags, Nome do Autor e E-mail do Autor:

require_once get_template_directory() . '/core/classes/abstracts/abstract-front-end-form.php';
require_once get_template_directory() . '/core/classes/class-contact-form.php';

function odin_post_form() {
    $form = new Odin_Post_Form(
        'form_id', // ID do formulário
        'post', // Tipo de post a ser criado. Padrão: 'post'
        'draft', // Status do post ao ser criado. Padrão: 'draft'
        array( 'class' => 'form' ) // Atributos do formulário. Padrão: 'array()'
    );

    $form->set_title_field( 'post_title' );
    $form->set_content_field( 'post_content' );
    $form->set_terms( array(
    	'category' => 'category_field',
    	'post_tag' => 'post_tag_field',
    ) );
    $form->set_custom_fields( array(
    	'author_name',
    	'author_mail',
    ) );

    $form->set_fields(
	    array(
	        array(
	            'fields' => array(
	                array(
	                    'id'          => 'post_title', // Obrigatório
	                    'label'       => array(
	                        'text'  => __( 'Título do Post', 'odin' ), // Obrigatório
	                        'class' => 'example-class example-class-2'
	                    ),
	                    'type'        => 'text', // Obrigatório
	                    'required'    => true, // Opcional (bool)
	                    'attributes'  => array( // Opcional (html input elements)
	                        'placeholder' => __( 'Digite o título do post' )
	                    )
	                ),
	                array(
	                    'id'          => 'post_content', // Obrigatório
	                    'label'       => array(
	                        'text'  => __( 'Conteúdo do Post', 'odin' ), // Obrigatório
	                        'class' => 'example-class example-class-2'
	                    ),
	                    'type'        => 'textarea', // Obrigatório
	                    'required'    => true, // Opcional (bool)
	                ),
	            )
	        ),
	        array(
	            'fields' => array(
	                array(
	                    'id'          => 'category_field', // Obrigatório
	                    'label'       => array(
	                        'text'  => __( 'Categoria do Post', 'odin' ), // Obrigatório
	                        'class' => 'example-class example-class-2',
	                    ),
	                    'type'        => 'select', // Obrigatório
	                    'required'    => true, // Opcional (bool)
	                    'default'	  => '1',
	                    'options'	  => get_terms( array(
					    	'taxonomy'		=> 'category',
					    	'hide_empty'	=> false,
					    	'fields'		=> 'id=>name',
					    ) ),
	                ),
	                array(
	                    'id'          => 'post_tag_field', // Obrigatório
	                    'label'       => array(
	                        'text'  => __( 'Tags do Post', 'odin' ), // Obrigatório
	                        'class' => 'example-class example-class-2',
	                    ),
	                    'type'        => 'text', // Obrigatório
	                    'required'    => true, // Opcional (bool)
	                ),
	                array(
	                    'id'          => 'author_name', // Obrigatório
	                    'label'       => array(
	                        'text'  => __( 'Nome do Autor', 'odin' ), // Obrigatório
	                        'class' => 'example-class example-class-2',
	                    ),
	                    'type'        => 'text', // Obrigatório
	                    'required'    => true, // Opcional (bool)
	                ),
	                array(
	                    'id'          => 'author_mail', // Obrigatório
	                    'label'       => array(
	                        'text'  => __( 'E-mail do Autor', 'odin' ), // Obrigatório
	                        'class' => 'example-class example-class-2',
	                    ),
	                    'type'        => 'email', // Obrigatório
	                    'required'    => true, // Opcional (bool)
	                ),
	            )
	        )
	    )
	);

    return $form;
}

add_action( 'init', array( odin_post_form(), 'init' ), 1 );

Depois no tema basta adicionar a seguinte linha para mostrar o formulário

echo odin_post_form()->render();

Código fonte:

Odin_Post_Form esta localizado em core/classes/class-post-form.php.

top