From aeefd2823aace41e5c068f1c08aca4710ffb0f92 Mon Sep 17 00:00:00 2001 From: Nathan Gray Date: Mon, 6 Oct 2014 20:43:46 +0000 Subject: [PATCH] Use a client-side setDetachedAttributes() to do needed data changes for dates. --- .../inc/class.etemplate_widget_date.inc.php | 70 ++++++++++++++----- .../class.etemplate_widget_nextmatch.inc.php | 33 ++++++++- 2 files changed, 83 insertions(+), 20 deletions(-) diff --git a/etemplate/inc/class.etemplate_widget_date.inc.php b/etemplate/inc/class.etemplate_widget_date.inc.php index 4cc8a80579..3939d4d414 100644 --- a/etemplate/inc/class.etemplate_widget_date.inc.php +++ b/etemplate/inc/class.etemplate_widget_date.inc.php @@ -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 * diff --git a/etemplate/inc/class.etemplate_widget_nextmatch.inc.php b/etemplate/inc/class.etemplate_widget_nextmatch.inc.php index 5106c15b18..4ba23c7af5 100644 --- a/etemplate/inc/class.etemplate_widget_nextmatch.inc.php +++ b/etemplate/inc/class.etemplate_widget_nextmatch.inc.php @@ -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