<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Motanet &#187; web2py</title>
	<atom:link href="http://www.motanet.com.br/category/web2py/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.motanet.com.br</link>
	<description>Por uma web mais segura</description>
	<lastBuildDate>Mon, 21 Nov 2011 18:14:55 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>Form wizard com web2py</title>
		<link>http://www.motanet.com.br/python/form-wizard-com-web2py/</link>
		<comments>http://www.motanet.com.br/python/form-wizard-com-web2py/#comments</comments>
		<pubDate>Mon, 21 Feb 2011 19:14:50 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Python]]></category>
		<category><![CDATA[web2py]]></category>
		<category><![CDATA[custom form]]></category>
		<category><![CDATA[form wizard]]></category>
		<category><![CDATA[python]]></category>

		<guid isPermaLink="false">http://motanet.com.br/?p=320</guid>
		<description><![CDATA[Quem nunca precisou fazer um form wizard com web2py?, não?, então se prepare pois algum dia vai precisar, e quando precisar talvez você passe pelos mesmos problemas que passei ou pior. Felizmente eu sempre compartilho as soluções dos meus problemas pois certamente isso pode ajudar a muitos. Para este exemplo, vamos supor que você queira]]></description>
			<content:encoded><![CDATA[<p>Quem nunca precisou fazer um form wizard com web2py?, não?, então se prepare pois algum dia vai precisar, e quando precisar talvez você passe pelos mesmos problemas que passei ou pior.</p>
<p>Felizmente eu sempre compartilho as soluções dos meus problemas pois certamente isso pode ajudar a muitos.</p>
<p>Para este exemplo, vamos supor que você queira fazer um cadastro com dois ou mais passos (form wizard), com 4 campos (irei aproveitar a tabela padrão &#8220;auth_user&#8221;), são eles: &#8220;username, email, first_name, last_name&#8221; sendo que no primeiro passo teremos os campos username e email e no segundo passo os campos first_name e last_name.</p>
<h2>Controllers:</h2>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">def</span> step1<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>:
    form=SQLFORM<span style="color: black;">&#40;</span>db.<span style="color: black;">auth_user</span>,fields=<span style="color: black;">&#91;</span><span style="color: #483d8b;">'username'</span>,<span style="color: #483d8b;">'email'</span><span style="color: black;">&#93;</span><span style="color: black;">&#41;</span>
    <span style="color: #ff7700;font-weight:bold;">if</span> form.<span style="color: black;">accepts</span><span style="color: black;">&#40;</span>request.<span style="color: #008000;">vars</span>, dbio=<span style="color: #008000;">False</span><span style="color: black;">&#41;</span>:
        session.<span style="color: black;">step1</span>=request.<span style="color: #008000;">vars</span>
        redirect<span style="color: black;">&#40;</span><span style="color: #483d8b;">'step2'</span><span style="color: black;">&#41;</span>
    <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">dict</span><span style="color: black;">&#40;</span>form=form<span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">def</span> step2<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>:
    form=SQLFORM<span style="color: black;">&#40;</span>db.<span style="color: black;">auth_user</span>,fields=<span style="color: black;">&#91;</span><span style="color: #483d8b;">'username'</span>,<span style="color: #483d8b;">'email'</span>,<span style="color: #483d8b;">'first_name'</span>,<span style="color: #483d8b;">'last_name'</span><span style="color: black;">&#93;</span><span style="color: black;">&#41;</span>    
    <span style="color: #ff7700;font-weight:bold;">if</span> request.<span style="color: black;">post_vars</span>:
        request.<span style="color: #008000;">vars</span>.<span style="color: black;">update</span><span style="color: black;">&#40;</span>session.<span style="color: black;">step1</span><span style="color: black;">&#41;</span>    
    <span style="color: #ff7700;font-weight:bold;">if</span> form.<span style="color: black;">accepts</span><span style="color: black;">&#40;</span>request.<span style="color: #008000;">vars</span><span style="color: black;">&#41;</span>:
        session.<span style="color: black;">flash</span>=T<span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;Dados gravados&quot;</span><span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">return</span> redirect<span style="color: black;">&#40;</span><span style="color: #483d8b;">'index'</span><span style="color: black;">&#41;</span>
    <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">dict</span><span style="color: black;">&#40;</span>form=form<span style="color: black;">&#41;</span></pre></div></div>

<h2>Views:</h2>
<h3>Step1</h3>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #009900;">&#123;</span><span style="color: #009900;">&#123;</span>extend <span style="color: #0000ff;">'layout.html'</span><span style="color: #009900;">&#125;</span><span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #339933;">&lt;</span>fieldset<span style="color: #339933;">&gt;</span>
<span style="color: #339933;">&lt;</span>legend<span style="color: #339933;">&gt;</span>Passo <span style="color: #cc66cc;">1</span><span style="color: #339933;">&lt;/</span>legend<span style="color: #339933;">&gt;</span>
&nbsp;
    <span style="color: #009900;">&#123;</span><span style="color: #009900;">&#123;</span><span style="color: #339933;">=</span>form<span style="color: #339933;">.</span>custom<span style="color: #339933;">.</span>begin<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #339933;">&lt;</span>div<span style="color: #339933;">&gt;</span>
        <span style="color: #339933;">&lt;</span>label<span style="color: #339933;">&gt;</span>Username<span style="color: #339933;">&lt;/</span>label<span style="color: #339933;">&gt;</span>
        <span style="color: #009900;">&#123;</span><span style="color: #009900;">&#123;</span><span style="color: #339933;">=</span>form<span style="color: #339933;">.</span>custom<span style="color: #339933;">.</span>widget<span style="color: #339933;">.</span>username<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#125;</span>
    <span style="color: #339933;">&lt;/</span>div<span style="color: #339933;">&gt;</span>
&nbsp;
    <span style="color: #339933;">&lt;</span>div<span style="color: #339933;">&gt;</span>
        <span style="color: #339933;">&lt;</span>label<span style="color: #339933;">&gt;</span>Email<span style="color: #339933;">&lt;/</span>label<span style="color: #339933;">&gt;</span>
        <span style="color: #009900;">&#123;</span><span style="color: #009900;">&#123;</span><span style="color: #339933;">=</span>form<span style="color: #339933;">.</span>custom<span style="color: #339933;">.</span>widget<span style="color: #339933;">.</span>email<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#125;</span>
    <span style="color: #339933;">&lt;/</span>div<span style="color: #339933;">&gt;</span>
&nbsp;
    <span style="color: #339933;">&lt;</span>div<span style="color: #339933;">&gt;</span>
    <span style="color: #009900;">&#123;</span><span style="color: #009900;">&#123;</span><span style="color: #339933;">=</span>form<span style="color: #339933;">.</span>custom<span style="color: #339933;">.</span>submit<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#125;</span>
    <span style="color: #339933;">&lt;/</span>div<span style="color: #339933;">&gt;</span>
    <span style="color: #009900;">&#123;</span><span style="color: #009900;">&#123;</span><span style="color: #339933;">=</span>form<span style="color: #339933;">.</span>custom<span style="color: #339933;">.</span><span style="color: #990000;">end</span><span style="color: #009900;">&#125;</span><span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #339933;">&lt;/</span>fieldset<span style="color: #339933;">&gt;</span></pre></div></div>

<h3>Step2</h3>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #009900;">&#123;</span><span style="color: #009900;">&#123;</span>extend <span style="color: #0000ff;">'layout.html'</span><span style="color: #009900;">&#125;</span><span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #339933;">&lt;</span>fieldset<span style="color: #339933;">&gt;</span>
<span style="color: #339933;">&lt;</span>legend<span style="color: #339933;">&gt;</span>Passo <span style="color: #cc66cc;">2</span><span style="color: #339933;">&lt;/</span>legend<span style="color: #339933;">&gt;</span>
&nbsp;
    <span style="color: #009900;">&#123;</span><span style="color: #009900;">&#123;</span><span style="color: #339933;">=</span>form<span style="color: #339933;">.</span>custom<span style="color: #339933;">.</span>begin<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #339933;">&lt;</span>div<span style="color: #339933;">&gt;</span>
        <span style="color: #339933;">&lt;</span>label<span style="color: #339933;">&gt;</span>First name<span style="color: #339933;">&lt;/</span>label<span style="color: #339933;">&gt;</span>
        <span style="color: #009900;">&#123;</span><span style="color: #009900;">&#123;</span><span style="color: #339933;">=</span>form<span style="color: #339933;">.</span>custom<span style="color: #339933;">.</span>widget<span style="color: #339933;">.</span>first_name<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#125;</span>
    <span style="color: #339933;">&lt;/</span>div<span style="color: #339933;">&gt;</span>
&nbsp;
    <span style="color: #339933;">&lt;</span>div<span style="color: #339933;">&gt;</span>
        <span style="color: #339933;">&lt;</span>label<span style="color: #339933;">&gt;</span>Last name<span style="color: #339933;">&lt;/</span>label<span style="color: #339933;">&gt;</span>
        <span style="color: #009900;">&#123;</span><span style="color: #009900;">&#123;</span><span style="color: #339933;">=</span>form<span style="color: #339933;">.</span>custom<span style="color: #339933;">.</span>widget<span style="color: #339933;">.</span>last_name<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#125;</span>
    <span style="color: #339933;">&lt;/</span>div<span style="color: #339933;">&gt;</span>
&nbsp;
    <span style="color: #339933;">&lt;</span>div<span style="color: #339933;">&gt;</span>
    <span style="color: #009900;">&#123;</span><span style="color: #009900;">&#123;</span><span style="color: #339933;">=</span>form<span style="color: #339933;">.</span>custom<span style="color: #339933;">.</span>submit<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#125;</span>
    <span style="color: #339933;">&lt;/</span>div<span style="color: #339933;">&gt;</span>
    <span style="color: #009900;">&#123;</span><span style="color: #009900;">&#123;</span><span style="color: #339933;">=</span>form<span style="color: #339933;">.</span>custom<span style="color: #339933;">.</span><span style="color: #990000;">end</span><span style="color: #009900;">&#125;</span><span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #339933;">&lt;/</span>fieldset<span style="color: #339933;">&gt;</span></pre></div></div>

<h2>Realmente é bem simples, a mágica aqui é a seguinte:</h2>
<p>- No step1, definimos apenas os fields=['username','email'] para o SQLFORM e dbio=False para o form.accepts, desta forma iremos exibir apenas os dois campos descritos em fields e quando o formulário for submetido, os dados não serão salvos pois o dbio está definido como False.</p>
<p>- Criei também uma variável de sessão session.step1 e atribui o request.vars para ela, é desta forma que os dados serão passados para o segundo método (step2) através do método redirect(&#8216;step2&#8242;).</p>
<p>- Outro detalhe importante  que no step2, definimos todos os fields=['username','email','first_name','last_name'], sendo que os dois primeiros, já estarão preenchidos pois o usuário fez isso no passo um. O mais importante aqui é não exibir estes campos na view.</p>
<p>- Como os dados submetidos pelo step1 estão na sessão, lembra?, iremos atualizar o request.vars com estes dados, mas somente quando o usuário submeter no step2, fizemos isso através do comando</p>
<pre>
if request.post_vars:
        request.vars.update(session.step1)
</pre>
<p>- E para finalizar, o comando form.accepts do step2 se encarrega de fazer toda a validação e também gravar os dados no banco, veja que não definimos o dbio e o padrão dele é True (gravar no db).</p>
<p>Espero que seja útil, até a próxima.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.motanet.com.br/python/form-wizard-com-web2py/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

