diff --git a/main/cron/import_csv.php b/main/cron/import_csv.php index b9cb19f41e..eca6231a37 100755 --- a/main/cron/import_csv.php +++ b/main/cron/import_csv.php @@ -141,8 +141,7 @@ class ImportCsv } if (method_exists($this, $method)) { - if ( - ( + if (( $method == 'importSubscribeStatic' || $method == 'importSubscribeUserToCourse' ) || @@ -184,7 +183,8 @@ class ImportCsv 'sessions', 'subscribe-static', 'courseinsert-static', - 'unsubscribe-static' + 'unsubscribe-static', + 'care', ); foreach ($sections as $section) { @@ -2064,6 +2064,114 @@ class ImportCsv } } + /** + * @param $file + * @param bool $moveFile + */ + public function importCare($file, $moveFile = false) + { + $data = Import::csv_reader($file); + $counter = 1; + $batchSize = $this->batchSize; + $em = Database::getManager(); + + if (!empty($data)) { + $this->logger->addInfo(count($data)." records found."); + $items = []; + foreach ($data as $list) { + $post = []; + foreach ($list as $key => $value) { + $key = (string) trim($key); + // Remove utf8 bom + $key = preg_replace('/[\x00-\x1F\x80-\xFF]/', '', $key); + $post[$key] = $value; + } + + if (empty($post)) { + continue; + } + + $externalId = $post['External_care_id']; + $items[$externalId] = $post; + } + ksort($items); + + foreach ($items as $row) { + $insertUserInfo = api_get_user_info_from_username($row['Added_by']); + if (empty($insertUserInfo)) { + $this->logger->addInfo("User does '".$row['Added_by']."' not exists skip this entry."); + continue; + } + + $insertUserInfo = api_get_user_entity($insertUserInfo['user_id']); + + $userId = UserManager::get_user_id_from_original_id( + $row['External_user_id'], + $this->extraFieldIdNameList['user'] + ); + + if (empty($userId)) { + if (empty($userInfo)) { + $this->logger->addInfo("User does '".$row['External_user_id']."' not exists skip this entry."); + continue; + } + } + $userInfo = api_get_user_entity($userId); + $createdAt = $this->createDateTime($row['Added_On']); + $updatedAt = $this->createDateTime($row['Edited_on']); + $parent = null; + if (!empty($row['Parent_id'])) { + $parentId = $items[$row['Parent_id']]; + $criteria = [ + 'externalCareId' => $parentId + ]; + $parent = $em->getRepository('ChamiloPluginBundle:StudentFollowUp\CarePost')->findOneBy($criteria); + } + + $tags = explode(',', $row['Tags']); + $post = new \Chamilo\PluginBundle\Entity\StudentFollowUp\CarePost(); + $post + ->setTitle($row['Title']) + ->setContent($row['Article']) + ->setExternalCareId($row['External_care_id']) + ->setCreatedAt($createdAt) + ->setUpdatedAt($updatedAt) + ->setPrivate((int) $row['Private']) + ->setInsertUser($insertUserInfo) + ->setExternalSource((int) $row['Source_is_external']) + ->setParent($parent) + ->setTags($tags) + ->setUser($userInfo) + ; + $em->persist($post); + $em->flush(); + if (($counter % $batchSize) === 0) { + $em->flush(); + $em->clear(); // Detaches all objects from Doctrine! + } + $counter++; + } + + $em->clear(); // Detaches all objects from Doctrine! + } + } + + /** + * 23/4/2017 to datetime + * @param $string + * @return mixed + */ + private function createDateTime($string) + { + if (empty($string)) { + return null; + } + + $date = DateTime::createFromFormat('j/m/Y', $string); + + return $date; + } + /** * @param string $file * @param bool $moveFile diff --git a/main/inc/lib/banner.lib.php b/main/inc/lib/banner.lib.php index 336554ad93..eae68e4472 100755 --- a/main/inc/lib/banner.lib.php +++ b/main/inc/lib/banner.lib.php @@ -339,6 +339,18 @@ function return_navigation_array() $menu_navigation['dashboard'] = isset($possible_tabs['dashboard']) ? $possible_tabs['dashboard'] : null; } + ///if (api_is_student()) { + if (true) { + $params = array('variable = ? AND subkey = ?' => ['status', 'studentfollowup']); + $result = api_get_settings_params_simple($params); + if (!empty($result) && $result['selected_value'] === 'installed') { + $navigation['follow_up']['url'] = api_get_path(WEB_PLUGIN_PATH).'studentfollowup/post.php'; + $navigation['follow_up']['title'] = get_lang('CareSystem'); + $navigation['follow_up']['key'] = 'homepage'; + $navigation['follow_up']['icon'] = 'homepage.png'; + } + } + // Administration if (api_is_platform_admin(true)) { if (api_get_setting('show_tabs', 'platform_administration') == 'true') { @@ -388,7 +400,7 @@ function return_navigation_array() if (!empty($customTabs)) { foreach ($customTabs as $tab) { if (api_get_setting($tab['variable'], $tab['subkey']) == 'true' && - isset($possible_tabs[$tab['subkey']]) && + isset($possible_tabs[$tab['subkey']]) && api_get_plugin_setting(strtolower(str_replace('Tabs', '', $tab['subkeytext'])), 'public_main_menu_tab') == 'true' ) { $possible_tabs[$tab['subkey']]['url'] = api_get_path(WEB_PATH).$possible_tabs[$tab['subkey']]['url']; diff --git a/main/inc/lib/database.lib.php b/main/inc/lib/database.lib.php index 702b0b4e09..8be3029afa 100755 --- a/main/inc/lib/database.lib.php +++ b/main/inc/lib/database.lib.php @@ -147,7 +147,8 @@ class Database 'ChamiloCoreBundle' => 'Chamilo\CoreBundle\Entity', 'ChamiloCourseBundle' => 'Chamilo\CourseBundle\Entity', 'ChamiloSkillBundle' => 'Chamilo\SkillBundle\Entity', - 'ChamiloTicketBundle' => 'Chamilo\TicketBundle\Entity' + 'ChamiloTicketBundle' => 'Chamilo\TicketBundle\Entity', + 'ChamiloPluginBundle' => 'Chamilo\PluginBundle\Entity' ) ); @@ -162,7 +163,7 @@ class Database );*/ AnnotationRegistry::registerLoader( - function($class) use ($sysPath) { + function ($class) use ($sysPath) { $file = str_replace("\\", DIRECTORY_SEPARATOR, $class).".php"; $file = str_replace('Symfony/Component/Validator', '', $file); $file = $sysPath.'vendor/symfony/validator'.$file; @@ -700,6 +701,7 @@ class Database $path.'src/Chamilo/CourseBundle/Entity', $path.'src/Chamilo/TicketBundle/Entity', $path.'src/Chamilo/SkillBundle/Entity', + $path.'src/Chamilo/PluginBundle/Entity', //$path.'vendor/sonata-project/user-bundle/Entity', //$path.'vendor/sonata-project/user-bundle/Model', //$path.'vendor/friendsofsymfony/user-bundle/FOS/UserBundle/Entity', diff --git a/main/inc/lib/plugin.class.php b/main/inc/lib/plugin.class.php index 3a6c77357b..627616b5d8 100755 --- a/main/inc/lib/plugin.class.php +++ b/main/inc/lib/plugin.class.php @@ -112,6 +112,15 @@ class Plugin return $result; } + /** + * @return string + */ + public function getCamelCaseName() + { + $result = get_class($this); + return str_replace('Plugin', '', $result); + } + /** * Returns the title of the plugin * @return string diff --git a/plugin/studentfollowup/Entity/CarePost.php b/plugin/studentfollowup/Entity/CarePost.php new file mode 100644 index 0000000000..85e054bfc3 --- /dev/null +++ b/plugin/studentfollowup/Entity/CarePost.php @@ -0,0 +1,418 @@ +createdAt = new \DateTime(); + $this->attachment = ''; + } + + /** + * @return int + */ + public function getId() + { + return $this->id; + } + + /** + * @param int $id + * @return $this + */ + public function setId($id) + { + $this->id = $id; + + return $this; + } + + /** + * @return string + */ + public function getTitle() + { + return $this->title; + } + + /** + * @param string $title + * @return CarePost + */ + public function setTitle($title) + { + $this->title = $title; + + return $this; + } + + /** + * @return string + */ + public function getContent() + { + return $this->content; + } + + /** + * @param string $content + * @return CarePost + */ + public function setContent($content) + { + $this->content = $content; + + return $this; + } + + /** + * @return string + */ + public function getExternalCareId() + { + return $this->externalCareId; + } + + /** + * @param string $externalCareId + * @return CarePost + */ + public function setExternalCareId($externalCareId) + { + $this->externalCareId = $externalCareId; + + return $this; + } + + /** + * @return mixed + */ + public function getUser() + { + return $this->user; + } + + /** + * @param mixed $user + * @return CarePost + */ + public function setUser($user) + { + $this->user = $user; + + return $this; + } + + /** + * @return bool + */ + public function isPrivate() + { + return $this->private; + } + + /** + * @param bool $private + * @return CarePost + */ + public function setPrivate($private) + { + $this->private = $private; + + return $this; + } + + /** + * @return bool + */ + public function isExternalSource() + { + return $this->externalSource; + } + + /** + * @param bool $externalSource + * @return CarePost + */ + public function setExternalSource($externalSource) + { + $this->externalSource = $externalSource; + + return $this; + } + + /** + * @return string + */ + public function getAttachment() + { + return $this->attachment; + } + + /** + * @param string $attachment + * @return CarePost + */ + public function setAttachment($attachment) + { + $this->attachment = $attachment; + + return $this; + } + + /** + * @return mixed + */ + public function getParent() + { + return $this->parent; + } + + /** + * @param mixed $parent + * @return CarePost + */ + public function setParent($parent) + { + $this->parent = $parent; + + return $this; + } + + /** + * @return mixed + */ + public function getChildren() + { + return $this->children; + } + + /** + * @param mixed $children + * @return CarePost + */ + public function setChildren($children) + { + $this->children = $children; + + return $this; + } + + /** + * @return mixed + */ + public function getCreatedAt() + { + return $this->createdAt; + } + + /** + * @param mixed $createdAt + * @return CarePost + */ + public function setCreatedAt($createdAt) + { + $this->createdAt = $createdAt; + + return $this; + } + + /** + * @return mixed + */ + public function getUpdatedAt() + { + return $this->updatedAt; + } + + /** + * @param mixed $updatedAt + * @return CarePost + */ + public function setUpdatedAt($updatedAt) + { + $this->updatedAt = $updatedAt; + + return $this; + } + + /** + * @return array + */ + public function getTags() + { + return $this->tags; + } + + /** + * @param array $tags + * @return CarePost + */ + public function setTags($tags) + { + $this->tags = $tags; + + return $this; + } + + /** + * @return mixed + */ + public function getInsertUser() + { + return $this->insertUser; + } + + /** + * @param mixed $insertUser + * @return CarePost + */ + public function setInsertUser($insertUser) + { + $this->insertUser = $insertUser; + + return $this; + } + + + +} diff --git a/plugin/studentfollowup/StudentFollowUpPlugin.php b/plugin/studentfollowup/StudentFollowUpPlugin.php index 9598964a8e..d92f4d08b3 100644 --- a/plugin/studentfollowup/StudentFollowUpPlugin.php +++ b/plugin/studentfollowup/StudentFollowUpPlugin.php @@ -1,11 +1,15 @@ getEntityPath(); + if (!is_dir($pluginEntityPath)) { + mkdir($pluginEntityPath, api_get_permissions_for_new_directories()); + } + $fs = new Filesystem(); + $fs->mirror(__DIR__.'/Entity/', $pluginEntityPath, null, ['override']); + + $table = Database::get_main_table('sfu_post'); + $sql = "CREATE TABLE sfu_post (id INT AUTO_INCREMENT NOT NULL, insert_user_id INT NOT NULL, user_id INT NOT NULL, parent_id INT DEFAULT NULL, title VARCHAR(255) NOT NULL, content LONGTEXT DEFAULT NULL, external_care_id INT DEFAULT NULL, created_at DATETIME NOT NULL, updated_at DATETIME NOT NULL, private TINYINT(1) NOT NULL, external_source TINYINT(1) NOT NULL, tags LONGTEXT NOT NULL COMMENT '(DC2Type:array)', attachment VARCHAR(255) NOT NULL, lft INT DEFAULT NULL, rgt INT DEFAULT NULL, lvl INT DEFAULT NULL, root INT DEFAULT NULL, INDEX IDX_35F9473C9C859CC3 (insert_user_id), INDEX IDX_35F9473CA76ED395 (user_id), INDEX IDX_35F9473C727ACA70 (parent_id), PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci ENGINE = InnoDB;"; + Database::query($sql); + $sql = "ALTER TABLE sfu_post ADD CONSTRAINT FK_35F9473C9C859CC3 FOREIGN KEY (insert_user_id) REFERENCES user (id);"; + Database::query($sql); + $sql = "ALTER TABLE sfu_post ADD CONSTRAINT FK_35F9473CA76ED395 FOREIGN KEY (user_id) REFERENCES user (id);"; + Database::query($sql); + $sql = "ALTER TABLE sfu_post ADD CONSTRAINT FK_35F9473C727ACA70 FOREIGN KEY (parent_id) REFERENCES sfu_post (id) ON DELETE SET NULL;"; + Database::query($sql); } /** @@ -42,6 +62,21 @@ class StudentFollowUpPlugin extends Plugin */ public function uninstall() { + $pluginEntityPath = $this->getEntityPath(); + $fs = new Filesystem(); + if ($fs->exists($pluginEntityPath)) { + $fs->remove($pluginEntityPath); + } + $table = Database::get_main_table('sfu_post'); + $sql = "DROP TABLE $table"; + Database::query($sql); + } + /** + * @return string + */ + public function getEntityPath() + { + return api_get_path(SYS_PATH).'src/Chamilo/PluginBundle/Entity/'.$this->getCamelCaseName(); } } diff --git a/plugin/studentfollowup/plugin.php b/plugin/studentfollowup/plugin.php index 31fec82e34..8f61bea213 100644 --- a/plugin/studentfollowup/plugin.php +++ b/plugin/studentfollowup/plugin.php @@ -17,6 +17,8 @@ $form->addButtonSave(get_lang('Save')); if ($form->validate()) { } + +$plugin_info['templates'] = array('view/post.html.twig'); $plugin_info['settings_form'] = $form; diff --git a/plugin/studentfollowup/post.php b/plugin/studentfollowup/post.php new file mode 100644 index 0000000000..6f36f38391 --- /dev/null +++ b/plugin/studentfollowup/post.php @@ -0,0 +1,106 @@ +createQueryBuilder(); +$criteria = Criteria::create(); +$criteria->where(Criteria::expr()->eq('user', $studentId)); + +if ($showPrivate == false) { + $criteria->andWhere(Criteria::expr()->eq('private', false)); +} + +if (!empty($postId)) { + //$criteria->andWhere(Criteria::expr()->eq('private', false)); +} + +$pageSize = 2; + +$qb + ->select('p') + ->from('ChamiloPluginBundle:StudentFollowUp\CarePost', 'p') + ->addCriteria($criteria) + ->setFirstResult($pageSize * ($currentPage-1)) + ->setMaxResults($pageSize) + ->orderBy('p.createdAt', 'desc') +; + +$query = $qb->getQuery(); + +$posts = new Paginator($query, $fetchJoinCollection = true); + +$totalItems = count($posts); +$pagesCount = ceil($totalItems / $pageSize); +$pagination = ''; +$url = api_get_self().'?student_id='.$studentId; +$pagination .= '
{{ post.content }}
+{{ post.createdAt |date('d/m/Y') }}
+ + {% if post.private %} +Private
+ {% endif %} + +{{ post.insertUser.completeName }}
+ + {% if post.tags %} + {% for tag in post.tags %} + {{ tag }} + {% if not loop.last %} + , + {% endif %} + {% endfor %} + {% endif %} + + {% if post.parent %} +