private function getsourcepdf(array $data) { ini_set('memory_limit', '1024M'); if (!is_dir(dirname(__DIR__) . '/tmp')) { mkdir(dirname(__DIR__) . '/tmp'); } chmod(dirname(__DIR__) . '/tmp', 0777); $params = ['error' => null, 'errorinfo' => '']; $tmpFileName = 'gantt_export_' . Helper::randomString() . '.pdf'; $tmpFilePath = \OC::$SERVERROOT . \OC_App::getAppWebPath('owncollab_chart') . '/tmp/' . $tmpFileName; $encodeData = 'data=' . urlencode($data['data']) . '&type=pdf'; ob_start(); system('curl --request POST "https://export.dhtmlx.com/gantt" --data "' . $encodeData . '"'); $result = ob_get_clean(); //$params['$encodeData'] = $encodeData; //$params['$tmpFilePath'] = print_r($result, true); //$params['result strlen'] = strlen($result); $print_portrait = isset($data['printconf']['orientation']) && $data['printconf']['orientation'] == 'P'; $print_paper_size = isset($data['printconf']['paper_size']) ? $data['printconf']['paper_size'] : 'A4'; $print_notes = isset($data['pagenotes']) ? $data['pagenotes'] : false; if ($result) { if ($is_save = file_put_contents($tmpFilePath, $result)) { $downloadPath = $this->explodePDF($tmpFilePath, $print_portrait, $print_paper_size, $print_notes); if ($downloadPath) { $params['download'] = $downloadPath; } else { $params['errorinfo'] = 'Error: download path exist'; } } else { $params['errorinfo'] = 'Saved PDF file fail. Temp path: ' . $tmpFilePath; } } else { $params['errorinfo'] = 'Request to export.dhtmlx.com is failed. Or response is empty'; } if (is_array($params)) { return new DataResponse($params); } }
public function insertTask($data) { $result = null; $task['type'] = $data['type'] ? $data['type'] : 'task'; $task['text'] = $data['text']; $task['users'] = $task['users'] ? $task['users'] : ''; $task['start_date'] = Helper::toTimeFormat($data['start_date']); $task['end_date'] = Helper::toTimeFormat($data['end_date']); $task['open'] = 1; $task['parent'] = $data['parent'] ? (int) $data['parent'] : 1; try { $_result = $this->connect->insert($this->tableName, $task); if ($_result) { return $this->connect->db->lastInsertId(); } } catch (\Exception $e) { $result = 'error:' . $e->getMessage(); } return $result; }
//$l10n = $container->query('OCP\IL10N'); $l = \OC::$server->getL10N('owncollab_chart'); return ['id' => $appName, 'order' => 10, 'href' => $urlGenerator->linkToRoute($appName . '.main.index'), 'icon' => $urlGenerator->imagePath($appName, 'gantt.svg'), 'name' => $l10n->t('Gantt')]; }); // Create public accept, only redirecting $shred = new Sharedchart(); $shred->match(); /** * Loading translations * The string has to match the app's folder name */ Util::addTranslations($appName); /** * Application styles and scripts */ if (Helper::isApp($appName)) { Util::addStyle($appName, 'jquery.custom-scrollbar'); Util::addStyle($appName, 'jquery-ui-timepicker'); Util::addStyle($appName, 'main'); Util::addScript($appName, 'libs/jquery.custom-scrollbar'); Util::addScript($appName, 'libs/ns.application'); Util::addScript($appName, 'init'); // dhtmlxGantt v.4.0.0 Standard Util::addStyle($appName, 'dhtmlxgantt'); Helper::provider('config', ['domain' => '']); } /** * Detect and appoints styles and scripts for particular app page */ $currentUri = Helper::getCurrentUri($appName); if ($currentUri == '/') { }
/** * @PublicPage * @NoAdminRequired * @NoCSRFRequired */ public function index() { $pKey = Helper::post('key'); $pApp = Helper::post('app'); if ($pKey != 'jasj765Uyt87ouIIfars' || $pApp != 'owncollab_chart') { return false; } //название календаря тасков в которых пользователь берет участие как отдельный пользователь $userTaskName = 'project'; //все id пользователей $allUsers = $this->connect->users->get(); //таблица тасков $allTasks = $this->connect->task()->get(); //массив тасков, ключами которого является id таска $arrIdTasks = []; for ($i = 0; $i < count($allTasks); $i++) { $arrIdTasks[$allTasks[$i]['id']] = $allTasks[$i]; } $userTaskName = $arrIdTasks[1]['text']; //массив id тасков, ключами которого являются id пользователей $userTasks = []; for ($i = 0; $i < count($allUsers); $i++) { $temp_arr = []; for ($j = 0; $j < count($allTasks); $j++) { $taskUser = json_decode($allTasks[$j]['users'])->users; if (in_array($allUsers[$i]['uid'], $taskUser)) { $temp_arr[$allTasks[$j]['id']] = ''; } } $userTasks[$allUsers[$i]['uid']] = $temp_arr; unset($temp_arr); } //id текущих пользователей $usersId = array_keys($userTasks); //id пользователей с таблицы синхронизации $usersIdCal = $this->connect->calendar()->getUsersId(); //добавление в таблицу синхронизации новых пользователей $newUserId = array_diff($usersId, $usersIdCal); $this->connect->calendar()->insertAllById($newUserId); //удаление удаленных пользователей с таблицы синхронизации $deleteUserId = array_diff($usersIdCal, $usersId); $this->connect->calendar()->deleteAllById($deleteUserId); //синхронизация тасков //uid id_tasks (json) $tasksIdCalTable = $this->connect->calendar()->get(); for ($i = 0; $i < count($tasksIdCalTable); $i++) { //создание рабочего календаря для каждого пользователя $user = $tasksIdCalTable[$i]['uid']; if (!$this->userManager->userExists($user)) { throw new \InvalidArgumentException("User <{$user}> in unknown."); } $principalBackend = new Principal($this->userManager, $this->groupManager); $caldav = new CalDAV\CalDavBackend($this->connect->db, $principalBackend); //проверка существования календаря if (!$caldav->getCalendarByUri("principals/users/{$user}", $userTaskName)) { //создание календаря если его нет $caldav->createCalendar("principals/users/{$user}", $userTaskName, []); } //находим id календаря пользователя $calendarId $userCalendar = $caldav->getCalendarByUri("principals/users/{$user}", $userTaskName); if (array_key_exists($tasksIdCalTable[$i]['uid'], $userTasks)) { //массив тасков одного пользователя с таблицы синхронизации $taskArr = (array) json_decode($tasksIdCalTable[$i]['id_tasks']); if ($taskArr == '') { $taskArr = []; } //массив тасков одного пользователя с чартов $mainTasksArr = $userTasks[$tasksIdCalTable[$i]['uid']]; if ($mainTasksArr == '') { $mainTasksArr = []; } //новые таски------------------------------------------------------------------ $idNewTasks = array_values(array_diff(array_keys($mainTasksArr), array_keys($taskArr))); if (count($idNewTasks)) { //создаем новые события календаря //проходим в цыкле по новых тасках пользователя for ($j = 0; $j < count($idNewTasks); $j++) { $uid = $this->connect->calendarObjects()->randhesh(25); $etag = $this->connect->calendarObjects()->randhesh(32); $uri = 'ownCloud-'; $uri .= $this->connect->calendarObjects()->randhesh(50); $uri .= '.ics'; $description = ''; // $key = array_keys($idNewTasks); $this->connect->calendarChanges()->insert($uri, $userCalendar['id']); //id созданого события $insertId = $this->connect->calendarObjects()->insert($userCalendar['id'], $uri, $etag, $uid, $arrIdTasks[$idNewTasks[$j]]['text'], $description, $arrIdTasks[$idNewTasks[$j]]['start_date'], $arrIdTasks[$idNewTasks[$j]]['end_date']); //записываем id события в таблицу синхронизации $res = $this->connect->calendar()->getById($tasksIdCalTable[$i]['uid']); $res[$idNewTasks[$j]] = (int) $insertId; $this->connect->calendar()->update($tasksIdCalTable[$i]['uid'], json_encode($res)); } } //удаленные таски---------------------------------------------------------------- $idDeleteTask = array_values(array_diff(array_keys($taskArr), array_keys($mainTasksArr))); if (count($idDeleteTask)) { //удаляем старые события $deleteId = []; foreach ($taskArr as $k => $v) { if (in_array($k, $idDeleteTask)) { $deleteId[] = $v; } } $this->connect->calendarObjects()->delete($deleteId); //удаляем таск с таблицы синхронизации $res = $this->connect->calendar()->getById($tasksIdCalTable[$i]['uid']); foreach ($res as $k => $v) { if (!in_array($k, $idDeleteTask)) { $newRes[$k] = $v; } } $this->connect->calendar()->update($tasksIdCalTable[$i]['uid'], json_encode($newRes)); } //обновляем события текущих тасков----------------------------------------------- if (count($taskArr)) { //обновляем события текущих тасков for ($k = 0; $k < count($taskArr); $k++) { $uid = $this->connect->calendarObjects()->randhesh(25); $description = ''; $etag = $this->connect->calendarObjects()->randhesh(32); $uri = 'ownCloud-'; $uri .= $this->connect->calendarObjects()->randhesh(50); $uri .= '.ics'; $result = $this->connect->calendarObjects()->updateFromTasks(array_values($taskArr)[$k], $uid, $arrIdTasks[array_keys($taskArr)[$k]]['text'], $description, $arrIdTasks[array_keys($taskArr)[$k]]['start_date'], $arrIdTasks[array_keys($taskArr)[$k]]['end_date'], $uri, $etag, $userCalendar['id']); } } } } //все id групп $allGroups = $this->connect->groups->get(); //массив id тасков, ключами которого являются id груп $groupTasks = []; //перебираем группы for ($i = 0; $i < count($allGroups); $i++) { //юзеры i-той группы $usersGroup = $this->connect->groupUser()->getByGid($allGroups[$i]['gid']); $temp = []; $temp_arr = []; for ($k = 0; $k < count($allTasks); $k++) { $taskGroup = json_decode($allTasks[$k]['users'])->groups; if (in_array($allGroups[$i]['gid'], $taskGroup)) { $temp_arr[$allTasks[$k]['id']] = ''; } } for ($j = 0; $j < count($usersGroup); $j++) { $temp[$usersGroup[$j]] = $temp_arr; } $groupTasks[$allGroups[$i]['gid']] = $temp; unset($temp_arr); } //id текущих груп $groupId = array_keys($groupTasks); //id груп с таблицы синхронизации $groupIdCal = $this->connect->calendarGroup()->getGroupsId(); //добавление в таблицу синхронизации новых груп $newGroupId = array_diff($groupId, $groupIdCal); $this->connect->calendarGroup()->insertAllById($newGroupId); //удаление удаленных груп с таблицы синхронизации $deleteGroupId = array_diff($groupIdCal, $groupId); $this->connect->calendarGroup()->deleteAllById($deleteGroupId); //синхронизация тасков //gid[$i]=>admin //users (json)["bogdan","oleg","alex","ivan"] //id_tasks (json){"2":81,"3":82,"4":83,"5":84} $tasksIdCalTable = $this->connect->calendarGroup()->get(); //$tasksIdCalTable[0]['gid']=admin; //$tasksIdCalTable[0]['id_tasks']=json(id_tasks); //проходим по всех группах for ($i = 0; $i < count($tasksIdCalTable); $i++) { $group = $tasksIdCalTable[$i]['gid']; //admin //вытаскиваем всех юзеров i-той группы (admin) //$userGroup[0]['uid'] = 'bogdan'; $usersGroup = array_keys($groupTasks[$group]); //находим учасников с группы таблицы синхронизации $usersGroupTable = json_decode($tasksIdCalTable[$i]['id_tasks'], true); if (!$usersGroupTable) { $usersGroupTable = []; } //добавляем новых юзеров в группу-------------------------------------------------- $newUsers = array_values(array_diff($usersGroup, array_keys($usersGroupTable))); if (count($newUsers)) { //--------------------------------------------------------------------------------- //создание рабочего календаря для каждого пользователя for ($j = 0; $j < count($newUsers); $j++) { $user = $newUsers[$j]; if (!$this->userManager->userExists($user)) { throw new \InvalidArgumentException("User <{$user}> in unknown."); } $principalBackend = new Principal($this->userManager, $this->groupManager); $caldav = new CalDAV\CalDavBackend($this->connect->db, $principalBackend); //проверка существования календаря if (!$caldav->getCalendarByUri("principals/users/{$user}", $group)) { //создание календаря если его нет $caldav->createCalendar("principals/users/{$user}", $group, []); } } //--------------------------------------------------------------------------------- for ($j = 0; $j < count($newUsers); $j++) { $arr = []; $usersGroupTable[$newUsers[$j]] = $arr; } } //удаляем старых юзеров с группы--------------------------------------------------- $deletedUsers = array_values(array_diff(array_keys($usersGroupTable), $usersGroup)); if (count($deletedUsers)) { for ($j = 0; $j < count($deletedUsers); $j++) { //удаляем календарь и таски этого юзера $userCalendar = $caldav->getCalendarByUri("principals/users/{$deletedUsers[$j]}", $group); $caldav->deleteCalendar($userCalendar['id']); //удаляем ячейку юзера с таблицы синхронизации unset($usersGroupTable[$deletedUsers[$j]]); } } //проверяем таски каждого юзера foreach ($usersGroupTable as $k => $v) { $newTasks = array_values(array_diff(array_keys($groupTasks[$group][$k]), array_keys($v))); //находим id календаря пользователя $calendarId, если его пользователь удалил - создаем обратно $userCalendar = $caldav->getCalendarByUri("principals/users/{$k}", $group); if (!$userCalendar) { $result = $caldav->createCalendar("principals/users/{$k}", $group, []); $userCalendar = []; $userCalendar['id'] = $result; } if (count($newTasks)) { for ($n = 0; $n < count($newTasks); $n++) { //------------------------------------- //создание нового события $uid = $this->connect->calendarObjects()->randhesh(25); $etag = $this->connect->calendarObjects()->randhesh(32); $uri = 'ownCloud-'; $uri .= $this->connect->calendarObjects()->randhesh(50); $uri .= '.ics'; $description = ''; $this->connect->calendarChanges()->insert($uri, $userCalendar['id']); //id созданого события $insertId = $this->connect->calendarObjects()->insert($userCalendar['id'], $uri, $etag, $uid, $arrIdTasks[$newTasks[$n]]['text'], $description, $arrIdTasks[$newTasks[$n]]['start_date'], $arrIdTasks[$newTasks[$n]]['end_date']); //------------------------------------- $v[$newTasks[$n]] = (int) $insertId; } } //удаленные таски $deleteTasks = array_values(array_diff(array_keys($v), array_keys($groupTasks[$group][$k]))); if (count($deleteTasks)) { $arr_del = []; for ($n = 0; $n < count($deleteTasks); $n++) { $arr_del[] = $v[$deleteTasks[$n]]; unset($v[$deleteTasks[$n]]); } $this->connect->calendarObjects()->delete($arr_del); } $usersGroupTable[$k] = $v; if (!$usersGroupTable) { $usersGroupTable = ''; } foreach ($v as $taskId => $eventId) { $uid = $this->connect->calendarObjects()->randhesh(25); $description = ''; $etag = $this->connect->calendarObjects()->randhesh(32); $uri = 'ownCloud-'; $uri .= $this->connect->calendarObjects()->randhesh(50); $uri .= '.ics'; $result = $this->connect->calendarObjects()->updateFromTasks($eventId, $uid, $arrIdTasks[$taskId]['text'], $description, $arrIdTasks[$taskId]['start_date'], $arrIdTasks[$taskId]['end_date'], $uri, $etag, $userCalendar['id']); } } $this->connect->calendarGroup()->updateUsersTasks($group, $usersGroupTable); } }
/** * * @PublicPage * @NoAdminRequired * @NoCSRFRequired * * @param $share * @return TemplateResponse */ public function publicChart($share) { $project = $this->connect->project()->getShare($share); $params = ['template' => 'guest', 'protected' => false, 'wrongpw' => false, 'requesttoken' => false]; if ($project['open'] == 1 && $project['is_share'] == 1) { // static requesttoken $params['requesttoken'] = md5($project['share_password'] . md5($project['share_link'])); // share time is over if ($project['share_is_expire'] == '1' && strtotime($project['share_expire_time']) < time()) { $params['protected'] = true; $params['template'] = 'guest'; } else { // $session_publickey = Helper::session('publickey'); if (!empty($session_publickey) && $session_publickey == $params['requesttoken']) { $params['template'] = 'project'; } else { if ($project['share_is_protected'] == 1) { $post_requesttoken = Helper::get('requesttoken'); $post_password = Helper::get('password'); $params['protected'] = true; $params['template'] = 'authenticate'; if ($post_requesttoken == $params['requesttoken'] && md5($post_password) == $project['share_password']) { Helper::session('publickey', $params['requesttoken']); $params['template'] = 'project'; } else { if (!empty($post_password)) { $params['wrongpw'] = true; } } } else { $params['template'] = 'project'; } } } } if ($params['template'] == 'guest') { $template = new \OCP\Template('', '404', 'guest'); $template->printPage(); exit; } if ($params['template'] == 'authenticate') { return new TemplateResponse($this->appName, 'authenticate', ['wrongpw' => $params['wrongpw'], 'requesttoken' => $params['requesttoken']], 'guest'); } if ($params['template'] == 'project') { unset($project['is_share']); unset($project['share_link']); unset($project['share_is_protected']); unset($project['share_password']); unset($project['share_is_expire']); unset($project['share_expire_time']); $jsonData = ['project' => $project, 'tasks' => $this->connect->task()->get(), 'links' => $this->connect->link()->get()]; $params = ['current_user' => null]; return new TemplateResponse($this->appName, 'main', $params); } }