Re: More thoughts on Forge->Formo conversion

Shad Laws <shad-xpYdmXCiSuZWk0Htik3J/[email protected]> Mon, 29 Apr 2013 00:03:37 +0200
Newsgroups gmane.comp.web.gallery.devel
Message-ID <CA+z51A63rYzh3==sEfLJRcW2jxYEFuQv3+LMY-H4Uztj0EssRA@mail.gmail.com>
--===============0385595154089887773==
Content-Type: multipart/alternative; boundary=089e013d173ae5b3ac04db72f17c

--089e013d173ae5b3ac04db72f17c
Content-Type: text/plain; charset=UTF-8

Alright, I think I have one complete example finished up - the login
controller works!  I squashed four routes (login/ajax, login/auth_ajax,
login/html, login/auth_html) into one (login).  Also, I made some tweaks to
Formo so we could keep all of our labels/errors inline (as opposed to in
external message files) and automatically stick in our CSRF token.

Next step - work on the formatting.  It seems that Gallery's old template
used <li> elements for each input with a <fieldset> for each group.  By
default, Formo's templates use a <div> on everything.  Before I rewrite
them all, I thought I'd ask: is there a reason why we should prefer one or
the other?  Using li/fieldset seems better for backward compatibility, but
using divs seems more flexible for theming... thoughts?

Take care,
Shad


On 24 April 2013 18:42, Bharat Mediratta <[email protected]> wrote:

>
> Fantastic.  I never liked the way we had this split up before so it's nice
> to see that Formo can streamline it for us.
>
> I've also never been happy with our form/{add,edit}/ routing - that was a
> framework put in place before it was clear what the true need would be and
> it's only used in 9 places.  I'd be happy to see that routing go away and
> let each controller do it in a more ad hoc approach.  Take a look at that
> while you're in there and let me know what you think.
>
> -Bharat
>
>
> On Wed, Apr 24, 2013 at 1:13 AM, Shad Laws <shad-xpYdmXCiSuZWk0Htik3J/[email protected]> wrote:
>
>> Hey everyone,
>>
>> I'm working on getting acquainted with Formo a bit more, and it seems
>> like the default, expected actions of Formo is a bit different than how we
>> were using Forge in Gallery 3.0.x.
>>
>> Before, we usually (but not always) had a separate controller action for
>> showing a form vs. validating a form (e.g. action_edit() and
>> action_save()).  Also, it was common to have a third function generate the
>> form for us, so we ended handling the form in three places.
>>
>> It seems that the default, expected behavior of Formo is to do this in
>> one place with one action.  It's smart enough to figure out if we have post
>> data or not, and therefore if we are in "edit" or "save" mode (following
>> the example).  An example:
>>
>> public function action_edit() {
>>   $form = Formo::form(...)
>>           ->....; // build form, load with default values.
>>
>>   if ($form->load()->validate()) {
>>     // load() gets the values from post/files and fills the values,
>>     // then validate() checks stuff and does nothing if the form isn't
>>     // yet sent (nothing loaded) or adds errors if it was.
>>
>>     // Do some more stuff... then:
>>     Message::success(t("Done!"));
>>     // And/or:
>>     $this->redirect("somewhere/else");
>>   }
>>
>>   $view = .....;
>>   $view->form = $form;
>>
>>   $this->response->body($view);
>> }
>>
>> I can overload a couple Formo classes to ensure that each form contains
>> and validates our csrf, similar to what we did with Forge.
>>
>> Does this seem like a reasonable approach?  Is there some other reason
>> why we intentionally divided these up into multiple actions before?
>>
>> Take care,
>> Shad
>>
>>
>> ------------------------------------------------------------------------------
>> Try New Relic Now & We'll Send You this Cool Shirt
>> New Relic is the only SaaS-based application performance monitoring
>> service
>> that delivers powerful full stack analytics. Optimize and monitor your
>> browser, app, & servers with just a few lines of code. Try New Relic
>> and get this awesome Nerd Life shirt!
>> http://p.sf.net/sfu/newrelic_d2d_apr
>> __[ g a l l e r y - d e v e l ]_________________________
>>
>> [ list info/archive --> http://gallery.sf.net/lists.php ]
>> [ gallery info/FAQ/download --> http://gallery.sf.net ]
>>
>
>

--089e013d173ae5b3ac04db72f17c
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: quoted-printable

<div dir=3D"ltr">Alright, I think I have one complete example finished up -=
 the login controller works! =C2=A0I squashed four routes (login/ajax, logi=
n/auth_ajax, login/html, login/auth_html) into one (login). =C2=A0Also, I m=
ade some tweaks to Formo so we could keep all of our labels/errors inline (=
as opposed to in external message files) and automatically stick in our CSR=
F token.<div>

<br></div><div style>Next step - work on the formatting. =C2=A0It seems tha=
t Gallery&#39;s old template used &lt;li&gt; elements for each input with a=
 &lt;fieldset&gt; for each group. =C2=A0By default, Formo&#39;s templates u=
se a &lt;div&gt; on everything. =C2=A0Before I rewrite them all, I thought =
I&#39;d ask: is there a reason why we should prefer one or the other? =C2=
=A0Using li/fieldset seems better for backward compatibility, but using div=
s seems more flexible for theming... thoughts?</div>

<div style><br></div><div style>Take care,</div><div style>Shad</div></div>=
<div class=3D"gmail_extra"><br><br><div class=3D"gmail_quote">On 24 April 2=
013 18:42, Bharat Mediratta <span dir=3D"ltr">&lt;<a href=3D"mailto:bharat@=
menalto.com" target=3D"_blank">[email protected]</a>&gt;</span> wrote:<br>

<blockquote class=3D"gmail_quote" style=3D"margin:0 0 0 .8ex;border-left:1p=
x #ccc solid;padding-left:1ex"><div dir=3D"ltr"><br><div>Fantastic. =C2=A0I=
 never liked the way we had this split up before so it&#39;s nice to see th=
at Formo can streamline it for us.</div>

<div><br></div><div>I&#39;ve also never been happy with our form/{add,edit}=
/ routing - that was a framework put in place before it was clear what the =
true need would be and it&#39;s only used in 9 places. =C2=A0I&#39;d be hap=
py to see that routing go away and let each controller do it in a more ad h=
oc approach. =C2=A0Take a look at that while you&#39;re in there and let me=
 know what you think.</div>



<div><br></div><div>-Bharat</div></div><div class=3D"gmail_extra"><br><br><=
div class=3D"gmail_quote">On Wed, Apr 24, 2013 at 1:13 AM, Shad Laws <span =
dir=3D"ltr">&lt;<a href=3D"mailto:shad-xpYdmXCiSuZWk0Htik3J/[email protected]" target=3D"_blank">shad=
@shadlaws.com</a>&gt;</span> wrote:<br>



<blockquote class=3D"gmail_quote" style=3D"margin:0 0 0 .8ex;border-left:1p=
x #ccc solid;padding-left:1ex"><div dir=3D"ltr">Hey everyone,<div><br></div=
><div>I&#39;m working on getting acquainted with Formo a bit more, and it s=
eems like the default, expected actions of Formo is a bit different than ho=
w we were using Forge in Gallery 3.0.x.</div>





<div><br></div><div>Before, we usually (but not always) had a separate cont=
roller action for showing a form vs. validating a form (e.g. action_edit() =
and action_save()). =C2=A0Also, it was common to have a third function gene=
rate the form for us, so we ended handling the form in three places.</div>





<div><br></div><div>It seems that the default, expected behavior of Formo i=
s to do this in one place with one action. =C2=A0It&#39;s smart enough to f=
igure out if we have post data or not, and therefore if we are in &quot;edi=
t&quot; or &quot;save&quot; mode (following the example). =C2=A0An example:=
</div>





<div><br></div><div><font face=3D"courier new, monospace">public function a=
ction_edit() {</font></div><div><font face=3D"courier new, monospace">=C2=
=A0 $form =3D Formo::form(...)</font></div><div><font face=3D"courier new, =
monospace">=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 -&gt;....; // build form, loa=
d with default values.</font></div>





<div><font face=3D"courier new, monospace"><br></font></div><div><font face=
=3D"courier new, monospace">=C2=A0 if ($form-&gt;load()-&gt;validate()) {</=
font></div><div><font face=3D"courier new, monospace">=C2=A0 =C2=A0 // load=
() gets the values from post/files and fills the values,</font></div>





<div><font face=3D"courier new, monospace">=C2=A0 =C2=A0 // then validate()=
 checks stuff and does nothing if the form isn&#39;t</font></div><div><font=
 face=3D"courier new, monospace">=C2=A0 =C2=A0 // yet sent (nothing loaded)=
 or adds errors if it was.</font></div>





<div><font face=3D"courier new, monospace"><br></font></div><div><font face=
=3D"courier new, monospace">=C2=A0 =C2=A0 // Do some more stuff... then:</f=
ont></div><div><font face=3D"courier new, monospace">=C2=A0 =C2=A0=C2=A0Mes=
sage::success(t(&quot;Done!&quot;));</font></div>





<div><font face=3D"courier new, monospace">=C2=A0 =C2=A0 // And/or:</font><=
/div><div><font face=3D"courier new, monospace">=C2=A0 =C2=A0 $this-&gt;red=
irect(&quot;somewhere/else&quot;);</font></div><div><font face=3D"courier n=
ew, monospace">=C2=A0 }</font></div>





<div><font face=3D"courier new, monospace">=C2=A0=C2=A0</font></div><div><f=
ont face=3D"courier new, monospace">=C2=A0 $view =3D .....;</font></div><di=
v><font face=3D"courier new, monospace">=C2=A0 $view-&gt;form =3D $form;</f=
ont></div>

<div><font face=3D"courier new, monospace"><br></font></div><div><font face=
=3D"courier new, monospace">=C2=A0 $this-&gt;response-&gt;body($view);</fon=
t></div><div><font face=3D"courier new, monospace">}</font></div>

<div><br></div><div>I can overload a couple Formo classes to ensure that ea=
ch form contains and validates our csrf, similar to what we did with Forge.=
<br></div><div><br></div><div>Does this seem like a reasonable approach? =
=C2=A0Is there some other reason why we intentionally divided these up into=
 multiple actions before?</div>





<div><br></div><div>Take care,</div><div>Shad</div></div>
<br>-----------------------------------------------------------------------=
-------<br>
Try New Relic Now &amp; We&#39;ll Send You this Cool Shirt<br>
New Relic is the only SaaS-based application performance monitoring service=
<br>
that delivers powerful full stack analytics. Optimize and monitor your<br>
browser, app, &amp; servers with just a few lines of code. Try New Relic<br=
>
and get this awesome Nerd Life shirt! <a href=3D"http://p.sf.net/sfu/newrel=
ic_d2d_apr" target=3D"_blank">http://p.sf.net/sfu/newrelic_d2d_apr</a><br>_=
_[ g a l l e r y - d e v e l ]_________________________<br>
<br>
[ list info/archive --&gt; <a href=3D"http://gallery.sf.net/lists.php" targ=
et=3D"_blank">http://gallery.sf.net/lists.php</a> ]<br>
[ gallery info/FAQ/download --&gt; <a href=3D"http://gallery.sf.net" target=
=3D"_blank">http://gallery.sf.net</a> ]<br></blockquote></div><br></div>
</blockquote></div><br></div>

--089e013d173ae5b3ac04db72f17c--


--===============0385595154089887773==
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

------------------------------------------------------------------------------
Try New Relic Now & We'll Send You this Cool Shirt
New Relic is the only SaaS-based application performance monitoring service 
that delivers powerful full stack analytics. Optimize and monitor your
browser, app, & servers with just a few lines of code. Try New Relic
and get this awesome Nerd Life shirt! http://p.sf.net/sfu/newrelic_d2d_apr
--===============0385595154089887773==
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

__[ g a l l e r y - d e v e l ]_________________________

[ list info/archive --> http://gallery.sf.net/lists.php ]
[ gallery info/FAQ/download --> http://gallery.sf.net ]
--===============0385595154089887773==--