Development

Changeset 6946

You must first sign up to be able to contribute.

Changeset 6946

Show
Ignore:
Timestamp:
01/05/08 16:55:02 (1 year ago)
Author:
fabien
Message:

fixed date and time widget fill-in with invalid input values

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • branches/1.1/lib/widget/sfWidgetFormDate.class.php

    r6327 r6946  
    5050  public function render($name, $value = null, $attributes = array(), $errors = array()) 
    5151  { 
    52     // convert value to a timestamp 
     52    // convert value to an array 
    5353    if (is_array($value)) 
    5454    { 
    55       $value = $this->convertDateArrayToTimestamp($value); 
     55      $value = array_merge(array('year' => null, 'month' => null, 'day' => null), $value); 
    5656    } 
    5757    else 
    5858    { 
    5959      $value = ctype_digit($value) ? (integer) $value : strtotime($value); 
     60      $value = array('year' => date('Y', $value), 'month' => date('n', $value), 'day' => date('j', $value)); 
    6061    } 
    6162 
     
    6566    // days 
    6667    $widget = new sfWidgetFormSelect(array('choices' => $this->getOption('can_be_empty') ? array('' => $emptyValues['day']) + $this->getOption('days') : $this->getOption('days'))); 
    67     $date['%day%'] = $widget->render($name.'[day]', $value ? date('j', $value) : ''); 
     68    $date['%day%'] = $widget->render($name.'[day]', $value['day']); 
    6869 
    6970    // months 
    7071    $widget = new sfWidgetFormSelect(array('choices' => $this->getOption('can_be_empty') ? array('' => $emptyValues['month']) + $this->getOption('months') : $this->getOption('months'))); 
    71     $date['%month%'] = $widget->render($name.'[month]', $value ? date('n', $value) : ''); 
     72    $date['%month%'] = $widget->render($name.'[month]', $value['month']); 
    7273 
    7374    // years 
    7475    $widget = new sfWidgetFormSelect(array('choices' => $this->getOption('can_be_empty') ? array('' => $emptyValues['year']) + $this->getOption('years') : $this->getOption('years'))); 
    75     $date['%year%'] = $widget->render($name.'[year]', $value ? date('Y', $value) : ''); 
     76    $date['%year%'] = $widget->render($name.'[year]', $value['year']); 
    7677 
    7778    return strtr($this->getOption('format'), $date); 
    7879  } 
    79  
    80   /** 
    81    * Converts an array representing a date to a timestamp. 
    82    * 
    83    * The array can contains the following keys: year, month, day, hour, minute, second 
    84    * 
    85    * @param  array   An array of date elements 
    86    * 
    87    * @return integer A timestamp 
    88    */ 
    89   protected function convertDateArrayToTimestamp($value) 
    90   { 
    91     $clean = mktime(isset($value['hour']) ? $value['hour'] : 0, isset($value['minute']) ? $value['minute'] : 0, isset($value['second']) ? $value['second'] : 0, $value['month'], $value['day'], $value['year']); 
    92  
    93     return false === $clean ? null : $clean; 
    94   } 
    9580} 
  • branches/1.1/lib/widget/sfWidgetFormTime.class.php

    r6327 r6946  
    5353  public function render($name, $value = null, $attributes = array(), $errors = array()) 
    5454  { 
    55     // convert value to a timestamp 
     55    // convert value to an array 
    5656    if (is_array($value)) 
    5757    { 
    58       $value = $this->convertDateArrayToTimestamp($value); 
     58      $value = array_merge(array('hour' => null, 'minute' => null, 'second' => null), $value); 
    5959    } 
    6060    else 
    6161    { 
    6262      $value = ctype_digit($value) ? (integer) $value : strtotime($value); 
     63      $value = array('hour' => date('G', $value), 'minute' => date('i', $value), 'second' => date('s', $value)); 
    6364    } 
    6465 
     
    6869    // hours 
    6970    $widget = new sfWidgetFormSelect(array('choices' => $this->getOption('can_be_empty') ? array('' => $emptyValues['hour']) + $this->getOption('hours') : $this->getOption('hours'))); 
    70     $time['%hour%'] = $widget->render($name.'[hour]', $value ? date('G', $value) : ''); 
     71    $time['%hour%'] = $widget->render($name.'[hour]', $value['hour']); 
    7172 
    7273    // minutes 
    7374    $widget = new sfWidgetFormSelect(array('choices' => $this->getOption('can_be_empty') ? array('' => $emptyValues['minute']) + $this->getOption('minutes') : $this->getOption('minutes'))); 
    74     $time['%minute%'] = $widget->render($name.'[minute]', $value ? date('i', $value) : ''); 
     75    $time['%minute%'] = $widget->render($name.'[minute]', $value['minute']); 
    7576 
    7677    if ($this->getOption('with_seconds')) 
     
    7879      // seconds 
    7980      $widget = new sfWidgetFormSelect(array('choices' => $this->getOption('can_be_empty') ? array('' => $emptyValues['second']) + $this->getOption('seconds') : $this->getOption('seconds'))); 
    80       $time['%second%'] = $widget->render($name.'[second]', $value ? date('s', $value) : ''); 
     81      $time['%second%'] = $widget->render($name.'[second]', $value['second']); 
    8182    } 
    8283 
    8384    return strtr($this->getOption('with_seconds') ? $this->getOption('format') : $this->getOption('format_without_seconds'), $time); 
    8485  } 
    85  
    86   /** 
    87    * Converts an array representing a date to a timestamp. 
    88    * 
    89    * The array can contains the following keys: hour, minute, second 
    90    * 
    91    * @param  array   An array of date elements 
    92    * 
    93    * @return integer A timestamp 
    94    */ 
    95   protected function convertDateArrayToTimestamp($value) 
    96   { 
    97     $clean = mktime(isset($value['hour']) ? $value['hour'] : 0, isset($value['minute']) ? $value['minute'] : 0, isset($value['second']) ? $value['second'] : 0); 
    98  
    99     return false === $clean ? null : $clean; 
    100   } 
    10186} 
  • branches/1.1/test/unit/widget/sfWidgetFormDateTest.php

    r6340 r6946  
    1111require_once(dirname(__FILE__).'/../../bootstrap/unit.php'); 
    1212 
    13 $t = new lime_test(29, new lime_output_color()); 
     13$t = new lime_test(32, new lime_output_color()); 
    1414 
    1515$w = new sfWidgetFormDate(); 
     
    3636} 
    3737 
     38// date as an array 
     39$t->diag('date as an array'); 
    3840$values = array('year' => 2005, 'month' => 10, 'day' => 15); 
    3941$dom->loadHTML($w->render('foo', $values)); 
    4042$css = new sfDomCssSelector($dom); 
    41  
    42 // selected date 
    4343$t->is($css->matchSingle('#foo_year option[value="'.$values['year'].'"][selected="selected"]')->getValue(), $values['year'], '->render() renders a select tag for the year'); 
    4444$t->is($css->matchSingle('#foo_month option[value="'.$values['month'].'"][selected="selected"]')->getValue(), $values['month'], '->render() renders a select tag for the month'); 
    4545$t->is($css->matchSingle('#foo_day option[value="'.$values['day'].'"][selected="selected"]')->getValue(), $values['day'], '->render() renders a select tag for the day'); 
    4646 
     47// invalid date 
     48$t->diag('invalid date'); 
     49$dom->loadHTML($w->render('foo', array('year' => null, 'month' => 10))); 
     50$css = new sfDomCssSelector($dom); 
     51$t->is($css->matchAll('#foo_year option[value="'.$values['year'].'"][selected="selected"]')->getNodes(), array(), '->render() renders a select tag for the year'); 
     52$t->is($css->matchSingle('#foo_month option[value="'.$values['month'].'"][selected="selected"]')->getValue(), 10, '->render() renders a select tag for the month'); 
     53$t->is($css->matchAll('#foo_day option[value="'.$values['day'].'"][selected="selected"]')->getNodes(), array(), '->render() renders a select tag for the day'); 
     54 
     55// number of options in each select 
     56$t->diag('number of options in each select'); 
    4757$dom->loadHTML($w->render('foo', '2005-10-15')); 
    4858$css = new sfDomCssSelector($dom); 
    49  
    50 // number of options in each select 
    5159$t->is(count($css->matchAll('#foo_year option')->getNodes()), 12, '->render() renders a select tag for the 10 years around the current one'); 
    5260$t->is(count($css->matchAll('#foo_month option')->getNodes()), 13, '->render() renders a select tag for the 12 months in a year'); 
  • branches/1.1/test/unit/widget/sfWidgetFormTimeTest.php

    r6340 r6946  
    1111require_once(dirname(__FILE__).'/../../bootstrap/unit.php'); 
    1212 
    13 $t = new lime_test(29, new lime_output_color()); 
     13$t = new lime_test(32, new lime_output_color()); 
    1414 
    1515$w = new sfWidgetFormTime(array('with_seconds' => true)); 
     
    3535} 
    3636 
     37// time as an array 
     38$t->diag('time as an array'); 
    3739$values = array('hour' => 12, 'minute' => '30', 'second' => 35); 
    3840$dom->loadHTML($w->render('foo', $values)); 
    3941$css = new sfDomCssSelector($dom); 
    40  
    41 // selected date 
    4242$t->is($css->matchSingle('#foo_hour option[value="12"][selected="selected"]')->getValue(), 12, '->render() renders a select tag for the hour'); 
    4343$t->is($css->matchSingle('#foo_minute option[value="30"][selected="selected"]')->getValue(), 30, '->render() renders a select tag for the minute'); 
    4444$t->is($css->matchSingle('#foo_second option[value="35"][selected="selected"]')->getValue(), 35, '->render() renders a select tag for the second'); 
    4545 
     46// invalid time 
     47$t->diag('time as an array'); 
     48$values = array('hour' => null, 'minute' => 30); 
     49$dom->loadHTML($w->render('foo', $values)); 
     50$css = new sfDomCssSelector($dom); 
     51$t->is($css->matchAll('#foo_hour option[value="12"][selected="selected"]')->getNodes(), array(), '->render() renders a select tag for the hour'); 
     52$t->is($css->matchSingle('#foo_minute option[value="30"][selected="selected"]')->getValue(), 30, '->render() renders a select tag for the minute'); 
     53$t->is($css->matchAll('#foo_second option[value="35"][selected="selected"]')->getNodes(), array(), '->render() renders a select tag for the second'); 
     54 
     55// number of options in each select 
     56$t->diag('number of options in each select'); 
    4657$dom->loadHTML($w->render('foo', '12:30:35')); 
    4758$css = new sfDomCssSelector($dom); 
    48  
    49 // number of options in each select 
    5059$t->is(count($css->matchAll('#foo_hour option')->getNodes()), 25, '->render() renders a select tag for the 24 hours in a day'); 
    5160$t->is(count($css->matchAll('#foo_minute option')->getNodes()), 61, '->render() renders a select tag for the 60 minutes in an hour'); 

The Sensio Labs Network

Since 1998, Sensio Labs has been promoting the Open-Source software movement by providing quality web application development, training, consulting, and supporting several large Open-Source projects.