Use a client-side setDetachedAttributes() to do needed data changes for dates.

This commit is contained in:
Nathan Gray 2014-10-06 20:43:46 +00:00
parent e4e869953f
commit aeefd2823a
2 changed files with 83 additions and 20 deletions

View File

@ -65,30 +65,62 @@ class etemplate_widget_date extends etemplate_widget_transformer
$form_name = self::form_name($cname, $this->id, $expand);
$value =& self::get_array(self::$request->content, $form_name, false, true);
if($this->type != 'date-duration' && $value)
{
// string with formatting letters like for php's date() method
if ($this->attrs['dataformat'] && !is_numeric($value))
{
$date = date_create_from_format($this->attrs['dataformat'], $value, egw_time::$user_timezone);
}
else
{
$date = new egw_time($value);
}
if($this->type == 'date-timeonly')
{
$date->setDate(1970, 1, 1);
}
if($date)
{
// postfix date-string with "Z" so javascript doesn't add/subtract anything
$value = $date->format('Y-m-d\TH:i:s\Z');
}
$value = $this->format_date($value);
}
}
/**
* Perform any needed data manipulation on each row
* before sending it to client.
*
* This is used by etemplate_widget_nextmatch on each row to do any needed
* adjustments. If not needed, don't implement it.
*
* @param type $cname
* @param array $expand
* @param array $data Row data
* @return type
*/
public function set_row_value($cname, Array $expand, Array &$data)
{
if($this->type == 'date-duration') return;
$form_name = self::form_name($cname, $this->id, $expand);
$value =& $this->get_array($data, $form_name, true);
$value = $this->format_date($value);
}
/**
* Put date in the proper format for sending to client
* @param string|int $value
* @param string $format
*/
public function format_date($value)
{
if ($this->attrs['dataformat'] && !is_numeric($value))
{
$date = date_create_from_format($this->attrs['dataformat'], $value, egw_time::$user_timezone);
}
else
{
$date = new egw_time($value);
}
if($this->type == 'date-timeonly')
{
$date->setDate(1970, 1, 1);
}
if($date)
{
// postfix date-string with "Z" so javascript doesn't add/subtract anything
$value = $date->format('Y-m-d\TH:i:s\Z');
}
return $value;
}
/**
* Validate input
*

View File

@ -356,6 +356,24 @@ class etemplate_widget_nextmatch extends etemplate_widget
$row_id = isset($value['row_id']) ? $value['row_id'] : 'id';
$row_modified = $value['row_modified'];
if($template && $template->attrs['template'])
{
$row_template = $template->getElementById($template->attrs['template']);
if(!$row_template)
{
$row_template = etemplate_widget_template::instance($template->attrs['template']);
}
// Try to find just the repeating part
$repeating_child = null;
// First child should be a grid, we want last row
foreach($row_template->children[0]->children[1]->children as $child)
{
if($child->type == 'row') $repeating_child = $child;
}
$row_template = $repeating_child ? $repeating_child : null;
}
foreach($rows as $n => $row)
{
@ -373,8 +391,21 @@ class etemplate_widget_nextmatch extends etemplate_widget
if (!$row_id || !$knownUids || ($kUkey = array_search($id, $knownUids)) === false ||
!$lastModified || !isset($row[$row_modified]) || $row[$row_modified] > $lastModified)
{
$result['data'][$id] = self::run_beforeSendToClient($row);
if($row_template)
{
// Change anything by widget for each row ($row set to 1)
$_row = array(1 => &$row);
$row_template->run('set_row_value', array('',array('row' => 1), &$_row), true);
$result['data'][$id] = $row;
}
else if (!$template && !get_class($template) != 'etemplate_widget_historylog')
{
// Fallback based on widget names
error_log(self::$request->template['name'] . ' had to fallback to run_beforeSendToClient() because it could not find the row' );
$result['data'][$id] = self::run_beforeSendToClient($row);
}
}
if ($kUkey !== false) unset($knownUids[$kUkey]);
}
else // non-row data set by get_rows method