function _save(TikiSheet &$sheet) { global $user, $prefs; $tikilib = TikiLib::lib('tiki'); // Load the current database state {{{3 $current = new TikiSheet(); $handler = new TikiSheetDatabaseHandler($this->id, null, $this->metadata); $current->import($handler); // Find differences {{{3 $mods = array(); for ($row = 0; $sheet->getRowCount() > $row; $row++) { for ($col = 0; $sheet->getColumnCount() > $col; $col++) { if (!$sheet->equals($current, $row, $col)) { $mods[] = array("row" => $row, "col" => $col); } } } $stamp = time(); $inserts = array(); $updates = array(); $updates[] = $stamp; $updates[] = $this->id; // Update the database {{{3 if (is_array($mods)) { foreach ($mods as $coord) { extract($coord); $value = $sheet->dataGrid[$row][$col]['value']; $calc = $sheet->calcGrid[$row][$col]['calculation']; $width = $sheet->cellInfo[$row][$col]['width']; $height = $sheet->cellInfo[$row][$col]['height']; $format = $sheet->cellInfo[$row][$col]['format']; $style = $sheet->cellInfo[$row][$col]['style']; $class = $sheet->cellInfo[$row][$col]['class']; $updates[] = $row; $updates[] = $col; //Now that sheets have styles, many things can change and the cell not have a value. //if ( !$sheet->isEmpty( $row, $col ) ) $inserts[] = array((int) $this->id, $stamp, $row, $col, $value, $calc, $width, $height, $format, $style, $class, $user); } } $updates[] = $sheet->getRowCount(); $updates[] = $sheet->getColumnCount(); $conditions = str_repeat("( rowIndex = ? AND columnIndex = ? ) OR ", (count($updates) - 4) / 2); if ($prefs['feature_actionlog'] == 'y') { // must keep the previous value to do the difference $query = "SELECT `rowIndex`, `columnIndex`, `value`, `style`, `class` FROM `tiki_sheet_values` WHERE `sheetId` = ? AND `end` IS NULL"; $result = $tikilib->query($query, array($this->id)); $old = array(); while ($row = $result->fetchRow()) { $old[$row['rowIndex'] . '-' . $row['columnIndex']] = $row['value']; $old[$row['rowIndex'] . '-' . $row['columnIndex']]['style'] = $row['style']; $old[$row['rowIndex'] . '-' . $row['columnIndex']]['class'] = $row['class']; } $tikilib->query("UPDATE `tiki_sheet_layout` SET `metadata` = ? WHERE `sheetId` = ?", array($handler->metadata, $handler->id)); } $tikilib->query("UPDATE `tiki_sheet_values` SET `end` = ? WHERE `sheetId` = ? AND `end` IS NULL AND ( {$conditions}`rowIndex` >= ? OR `columnIndex` >= ? )", $updates); if (count($inserts) > 0) { foreach ($inserts as $values) { $tikilib->query("INSERT INTO `tiki_sheet_values` (`sheetId`, `begin`, `rowIndex`, `columnIndex`, `value`, `calculation`, `width`, `height`, `format`, `style`, `class`, `user` ) VALUES( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )", $values); } } if ($prefs['feature_actionlog'] == 'y') { $logslib = TikiLib::lib('logs'); $add = 0; $del = 0; foreach ($inserts as $values) { $add += strlen($values[4]); if (!empty($old[$values[2] . '-' . $values[3]])) { $del += strlen($old[$values[2] . '-' . $values[3]]); } } if ($prefs['feature_contribution'] == 'y' && isset($_REQUEST['contributions'])) { $contributionlib = TikiLib::lib('contribution'); $contributionlib->assign_contributions($_REQUEST['contributions'], $this->id, 'sheet', '', '', ''); } if (isset($_REQUEST['contributions'])) { $logslib->add_action('Updated', $this->id, 'sheet', "add={$add}&del={$del}&sheetId=" . $this->id, '', '', '', '', $_REQUEST['contributions']); } else { $logslib->add_action('Updated', $this->id, 'sheet', "add={$add}&del={$del}&sheetId=" . $this->id); } } // }}}3 return true; }