/** * Method to update the start and end dates of tasks * associated with the milestone. * * @param integer $id The milestone id * @param string $start The milestone start date * @param string $end The milestone end date * * @return void */ protected function updateTimeline($id, $start = null, $end = null) { jimport('projectfork.library'); $db = JFactory::getDbo(); $query = $db->getQuery(true); $nd = $db->getNullDate(); $has_start = !(empty($start) || $start == $nd); $has_end = !(empty($end) || $end == $nd); // Do nothing if no start and end date are set if (!$has_start && !$has_end) { return; } $this_const = array($start, $end); $prev_const = array($this->prev_start, $this->prev_end); // Get all tasks $query->select('id, start_date, end_date')->from('#__pf_tasks')->where('milestone_id = ' . (int) $id)->order('id ASC'); $db->setQuery($query); $tasks = (array) $db->loadObjectList('id'); // Process tasks foreach ($tasks as $i => $item) { $item_has_start = !(empty($item->start_date) || $item->start_date == $nd); $item_has_end = !(empty($item->end_date) || $item->end_date == $nd); // Skip if not start and end date are set if (!$item_has_start && !$item_has_end) { continue; } $span = array($item->start_date, $item->end_date); // Shift dates list($new_start, $new_end) = PFDate::shiftTimeline($span, $this_const, $prev_const); // Update the database $updates = array(); if ($item_has_start && $item->start_date != $new_start) { $updates[] = 'start_date = ' . $db->quote($new_start); $milestones[$i]->start_date = $new_start; } if ($item_has_end && $item->end_date != $new_end) { $updates[] = 'end_date = ' . $db->quote($new_end); $milestones[$i]->end_date = $new_end; } if (count($updates)) { $query->clear()->update('#__pf_tasks')->set(implode(', ', $updates))->where('id = ' . (int) $item->id); $db->setQuery($query); $db->execute(); } } }