/** * Возвращает сформированный массив дат * @param Calendar_Event $event * @param string $period * @return array */ private function _repeat(Calendar_Event $event, $period) { $datetime = new DateTime($event->getDate()); $week = $event->getWeek(); // Массив с датами события $arrayDays = array(); $lastDate = strtotime($event->getLast()); // Если мы идём до даты окончания if ($lastDate > 0) { // Устанавливаем максимальное число повторов $endRepeat = self::MAX_EVENTS; } else { $endRepeat = $event->getRepeat(); } for ($i = 1; $i <= $endRepeat; $i++) { if ($lastDate > 0 && $datetime->format('U') > $lastDate) { return $arrayDays; } if (count($arrayDays) > self::MAX_EVENTS) { $this->_errors['repeat'] = "Максимальное количество повторений = " . self::MAX_EVENTS . " раз, у вас " . count($arrayDays); return false; } if ($period == 'week') { if ($week[$datetime->format('N') - 1] == 1) { $arrayDays[] = $datetime->format('Y-m-d'); } // День недели для выбранной даты, от 1 (пнд) до 7 (вск) $dwr = $datetime->format('N'); // Перебираем по циклу неделю, на один день меньше for ($j = 0; $j < 6; $j++) { $dw = $dwr + $j; if ($dw > 6) { $dw = $dw - 7; } if ($week[$dw] == 1) { $arrayDays[] = date('Y-m-d', $datetime->format('U') + ($j + 1) * 86400); } } } else { $arrayDays[] = $datetime->format('Y-m-d'); } $datetime->modify("+1 " . $period); } return $arrayDays; }
/** * Создаёт цепочку операций * @param oldUser $user Пользователь * @param Calendar_Event $event Событие * @param array $arrayDays Массив с днями, повторениями * @return bool */ public static function create(oldUser $user, Calendar_Event $event, $arrayDays) { // Создаём само событие $sql = "INSERT INTO calendar_chains (`user_id`,`start`,`last`,`every`, `repeat`, `week`)\n VALUES (?, ?, ?, ?, ?, ?);"; // Создаём событие в календаре $calId = Core::getInstance()->db->query($sql, $user->getId(), $event->getDate(), $event->getLast(), $event->getEvery(), $event->getRepeat(), $event->getWeek()); return self::createOperations($user, $event, $calId, $arrayDays); }