Alan Hicks wrote:
Barry Hoggard wrote:I have some datetime elements in my current project. I've looked at the HTML::FormFu::Element::Date object for the dates, but can someone point me to the best way to take care of hour/minute/AMPM stuff? Should I use Multi for that?I'm currently using a Time class based on the HTML::FormFu::Element::Date object that you are welcome to try. Alas there are still tests to write.It was put together fairly quickly so I'm sure there will be many better and easier ways of doing dates.Enjoy, Alan
Test are a good thing unlike my flawed coding...After putting together an Element::Time it generally works ok, though I am unable to get a default value for '00' times.
Any pointers would be helpful as well as how to extend validation for invalid times other than just not being there.
Even better if Barry's question brings a more elegant solution. Thanks Alan
Time.pm
Description: Perl program
use strict; use warnings; use Test::More tests => 18; use HTML::FormFu; use DateTime; my $dt = DateTime->new( year => 2007, hour => 7, minute => 15, second => 40); my $form = HTML::FormFu->new; $form->element('Time')->name('foo')->strftime("%H:%M:%S")->hour( { prefix => '-- Hour --', } )->minute( { prefix => '-- Minute --', } )->second( { prefix => '-- Seconds --', multiple => 10} )->default($dt)->auto_inflate(1)->constraint('Required'); is( "$form", <<HTML ); <form action="" method="post"> <span class="time time"> <span class="elements"> <select name="foo.hour"> <option value="">-- Hour --</option> <option value="0">0</option> <option value="1">1</option> <option value="2">2</option> <option value="3">3</option> <option value="4">4</option> <option value="5">5</option> <option value="6">6</option> <option value="7" selected="selected">7</option> <option value="8">8</option> <option value="9">9</option> <option value="10">10</option> <option value="11">11</option> <option value="12">12</option> <option value="13">13</option> <option value="14">14</option> <option value="15">15</option> <option value="16">16</option> <option value="17">17</option> <option value="18">18</option> <option value="19">19</option> <option value="20">20</option> <option value="21">21</option> <option value="22">22</option> <option value="23">23</option> </select> <select name="foo.minute"> <option value="">-- Minute --</option> <option value="00">00</option> <option value="05">05</option> <option value="10">10</option> <option value="15" selected="selected">15</option> <option value="20">20</option> <option value="25">25</option> <option value="30">30</option> <option value="35">35</option> <option value="40">40</option> <option value="45">45</option> <option value="50">50</option> <option value="55">55</option> </select> <select name="foo.second"> <option value="">-- Seconds --</option> <option value="00">00</option> <option value="10">10</option> <option value="20">20</option> <option value="30">30</option> <option value="40" selected="selected">40</option> <option value="50">50</option> </select> </span> </span> </form> HTML $form->process( { 'foo.hour', 23, 'foo.minute', 25, 'foo.second', 0, } ); ok( $form->submitted_and_valid ); isa_ok( $form->params->{foo}, 'DateTime' ); is( $form->params->{foo}, "23:25:00" ); like( $form->get_field('foo'), qr/\Q<option value="23" selected="selected">/, 'hour value is ok' ); like( $form->get_field('foo'), qr/\Q<option value="25" selected="selected">/, 'minute value is ok' ); like( $form->get_field('foo'), qr/\Q<option value="00" selected="selected">/, 'second value is ok' ); $form = HTML::FormFu->new; $form->element('Time')->name('bar')->default('19:30:00'); is( "$form", <<HTML ); <form action="" method="post"> <span class="time time"> <span class="elements"> <select name="bar.hour"> <option value="0">0</option> <option value="1">1</option> <option value="2">2</option> <option value="3">3</option> <option value="4">4</option> <option value="5">5</option> <option value="6">6</option> <option value="7">7</option> <option value="8">8</option> <option value="9">9</option> <option value="10">10</option> <option value="11">11</option> <option value="12">12</option> <option value="13">13</option> <option value="14">14</option> <option value="15">15</option> <option value="16">16</option> <option value="17">17</option> <option value="18">18</option> <option value="19" selected="selected">19</option> <option value="20">20</option> <option value="21">21</option> <option value="22">22</option> <option value="23">23</option> </select> <select name="bar.minute"> <option value="00">00</option> <option value="05">05</option> <option value="10">10</option> <option value="15">15</option> <option value="20">20</option> <option value="25">25</option> <option value="30" selected="selected">30</option> <option value="35">35</option> <option value="40">40</option> <option value="45">45</option> <option value="50">50</option> <option value="55">55</option> </select> <select name="bar.second"> <option value="00" selected="selected">00</option> <option value="01">01</option> <option value="02">02</option> <option value="03">03</option> <option value="04">04</option> <option value="05">05</option> <option value="06">06</option> <option value="07">07</option> <option value="08">08</option> <option value="09">09</option> <option value="10">10</option> <option value="11">11</option> <option value="12">12</option> <option value="13">13</option> <option value="14">14</option> <option value="15">15</option> <option value="16">16</option> <option value="17">17</option> <option value="18">18</option> <option value="19">19</option> <option value="20">20</option> <option value="21">21</option> <option value="22">22</option> <option value="23">23</option> <option value="24">24</option> <option value="25">25</option> <option value="26">26</option> <option value="27">27</option> <option value="28">28</option> <option value="29">29</option> <option value="30">30</option> <option value="31">31</option> <option value="32">32</option> <option value="33">33</option> <option value="34">34</option> <option value="35">35</option> <option value="36">36</option> <option value="37">37</option> <option value="38">38</option> <option value="39">39</option> <option value="40">40</option> <option value="41">41</option> <option value="42">42</option> <option value="43">43</option> <option value="44">44</option> <option value="45">45</option> <option value="46">46</option> <option value="47">47</option> <option value="48">48</option> <option value="49">49</option> <option value="50">50</option> <option value="51">51</option> <option value="52">52</option> <option value="53">53</option> <option value="54">54</option> <option value="55">55</option> <option value="56">56</option> <option value="57">57</option> <option value="58">58</option> <option value="59">59</option> </select> </span> </span> </form> HTML $form->process( { 'bar.hour', 17, 'bar.minute', 15, 'bar.second', 30, } ); ok( $form->submitted_and_valid ); ok( !ref $form->params->{bar}, 'Params are available to valid form' ); is( $form->params->{bar}, "17:15:30", 'Form paramater matches input time' ); like( $form->get_field('bar'), qr/\Q<option value="17" selected="selected">/, 'hour value is ok' ); like( $form->get_field('bar'), qr/\Q<option value="15" selected="selected">/, 'minute value is ok' ); like( $form->get_field('bar'), qr/\Q<option value="30" selected="selected">/, 'second value is ok' ); # missing time $form = HTML::FormFu->new; $form->element('Time')->name('bar')->default('19:30:00')->constraint('Required'); $form->process( { 'foo.hour', 0, 'foo.minute', 0, 'bar.second', 0, } ); ok( $form->submitted , 'Form has beeen submitted'); ok( $form->has_errors , 'Form has identified missing field'); ok( !defined $form->params->{foo}, 'Form params not available to form with errors' ); is( "$form", <<HTML_ERRORS ); <form action="" method="post"> <span class="time error error_constraint_required time error error_constraint_required"> <span class="error_message error_constraint_required">This field is required</span> <span class="elements"> <select name="bar.hour"> <option value="0">0</option> <option value="1">1</option> <option value="2">2</option> <option value="3">3</option> <option value="4">4</option> <option value="5">5</option> <option value="6">6</option> <option value="7">7</option> <option value="8">8</option> <option value="9">9</option> <option value="10">10</option> <option value="11">11</option> <option value="12">12</option> <option value="13">13</option> <option value="14">14</option> <option value="15">15</option> <option value="16">16</option> <option value="17">17</option> <option value="18">18</option> <option value="19">19</option> <option value="20">20</option> <option value="21">21</option> <option value="22">22</option> <option value="23">23</option> </select> <select name="bar.minute"> <option value="00">00</option> <option value="05">05</option> <option value="10">10</option> <option value="15">15</option> <option value="20">20</option> <option value="25">25</option> <option value="30">30</option> <option value="35">35</option> <option value="40">40</option> <option value="45">45</option> <option value="50">50</option> <option value="55">55</option> </select> <select name="bar.second"> <option value="00">00</option> <option value="01">01</option> <option value="02">02</option> <option value="03">03</option> <option value="04">04</option> <option value="05">05</option> <option value="06">06</option> <option value="07">07</option> <option value="08">08</option> <option value="09">09</option> <option value="10">10</option> <option value="11">11</option> <option value="12">12</option> <option value="13">13</option> <option value="14">14</option> <option value="15">15</option> <option value="16">16</option> <option value="17">17</option> <option value="18">18</option> <option value="19">19</option> <option value="20">20</option> <option value="21">21</option> <option value="22">22</option> <option value="23">23</option> <option value="24">24</option> <option value="25">25</option> <option value="26">26</option> <option value="27">27</option> <option value="28">28</option> <option value="29">29</option> <option value="30">30</option> <option value="31">31</option> <option value="32">32</option> <option value="33">33</option> <option value="34">34</option> <option value="35">35</option> <option value="36">36</option> <option value="37">37</option> <option value="38">38</option> <option value="39">39</option> <option value="40">40</option> <option value="41">41</option> <option value="42">42</option> <option value="43">43</option> <option value="44">44</option> <option value="45">45</option> <option value="46">46</option> <option value="47">47</option> <option value="48">48</option> <option value="49">49</option> <option value="50">50</option> <option value="51">51</option> <option value="52">52</option> <option value="53">53</option> <option value="54">54</option> <option value="55">55</option> <option value="56">56</option> <option value="57">57</option> <option value="58">58</option> <option value="59">59</option> </select> </span> </span> </form> HTML_ERRORS TODO: { local $TODO = 'To be implemented'; $form = HTML::FormFu->new; $form->element('Time')->name('bar')->default('19:30:00')->constraint('Required'); $form->process( { 'bar.hour', 30, 'bar.minute', 300, 'bar.second', 'abd', } ); #Test for an invalid date }
_______________________________________________ HTML-FormFu mailing list HTML-FormFu@lists.scsys.co.uk http://lists.scsys.co.uk/cgi-bin/mailman/listinfo/html-formfu