Database refactoring and improving blog comments, blog post history and more
This commit is contained in:
		| @@ -55,6 +55,7 @@ | ||||
|     $route['r/(:any)'] = 'redirect/p/$1'; | ||||
|     $route['admin/(:any)'] = 'admin/$1'; | ||||
|     $route['admin'] = 'admin/dashboard/index'; | ||||
|     $route['admin/blog/history/(:any)/compare/(:any)/(:any)'] = 'admin/blog/history_compare/$1/$2/$3'; | ||||
|     $route['tools/csgo/(:any)'] = 'tools/csgo/index/$1'; | ||||
|     $route['tools'] = 'tools/tools/index'; | ||||
|     $route['watch/(:any)/(:any)'] = 'watch/index/$1/$2'; | ||||
|   | ||||
| @@ -1,22 +1,25 @@ | ||||
| <?php | ||||
| defined('BASEPATH') OR exit('No direct script access allowed'); | ||||
|     defined('BASEPATH') OR exit('No direct script access allowed'); | ||||
|  | ||||
| class Blog extends MY_Controller { | ||||
|     class Blog extends MY_Controller | ||||
|     { | ||||
|  | ||||
|     function __construct() { | ||||
|         function __construct() | ||||
|         { | ||||
|             parent::__construct('blog'); | ||||
|             $this->load->model('BlogModel', '', TRUE); | ||||
|             $this->load->helper('url'); | ||||
|         } | ||||
|  | ||||
|     function index() { | ||||
|         function index() | ||||
|         { | ||||
|             $offset = isset($_GET['page']) ? intval($_GET['page']) - 1 : 0; | ||||
|             $data = $this->BlogModel->getAllPosts('', 5, $offset); | ||||
|  | ||||
|             $this->load->view('header', ['active' => 'blog', 'title' => 'Blog', 'additionalStyles' => ['blog.css']]); | ||||
|             $this->load->view('blog/first', ['categories' => $this->BlogModel->getCategories()]); | ||||
|  | ||||
|         if(!empty($data)) { | ||||
|             if (!empty($data)) { | ||||
|                 $pageCount = $this->BlogModel->getPostPageCount('', 5); | ||||
|                 $this->load->view('blog/postList', ['pageContent' => $data]); | ||||
|             } else { | ||||
| @@ -25,13 +28,14 @@ class Blog extends MY_Controller { | ||||
|             } | ||||
|  | ||||
|             $this->load->view('footer', ['additionalScripts' => ['lib/jquery.twbsPagination.min.js']]); | ||||
|         $this->load->view('blog/pagination', ['pageCount' => $pageCount]); | ||||
|             $this->load->view('blog/pagination', ['pageCount' => $pageCount, 'page' => $offset]); | ||||
|         } | ||||
|  | ||||
|     function search($query = null) { | ||||
|         if(isset($_GET['q'])) { | ||||
|         function search($query = null) | ||||
|         { | ||||
|             if (isset($_GET['q'])) { | ||||
|                 redirect(base_url('blog/search/' . urlencode($this->input->get('q')))); | ||||
|         } elseif($query == null) { | ||||
|             } elseif ($query == null) { | ||||
|                 redirect(base_url('blog')); | ||||
|             } else { | ||||
|                 $query = $this->security->xss_clean(urldecode($query)); | ||||
| @@ -41,7 +45,7 @@ class Blog extends MY_Controller { | ||||
|                 $this->load->view('header', ['active' => 'blog', 'title' => 'Blog', 'additionalStyles' => ['blog.css']]); | ||||
|                 $this->load->view('blog/first', ['categories' => $this->BlogModel->getCategories()]); | ||||
|  | ||||
|             if(!empty($data)) { | ||||
|                 if (!empty($data)) { | ||||
|                     $pageCount = $this->BlogModel->getPostPageCount($query, 5); | ||||
|                     $this->load->view('blog/postList', ['pageContent' => $data]); | ||||
|                 } else { | ||||
| @@ -54,8 +58,9 @@ class Blog extends MY_Controller { | ||||
|             } | ||||
|         } | ||||
|  | ||||
|     function category($category = null) { | ||||
|         if($category == null) { | ||||
|         function category($category = null) | ||||
|         { | ||||
|             if ($category == null) { | ||||
|                 redirect(base_url('blog')); | ||||
|             } else { | ||||
|                 $category = urldecode($category); | ||||
| @@ -65,7 +70,7 @@ class Blog extends MY_Controller { | ||||
|                 $this->load->view('header', ['active' => 'blog', 'title' => 'Blog', 'additionalStyles' => ['blog.css']]); | ||||
|                 $this->load->view('blog/first', ['categories' => $this->BlogModel->getCategories()]); | ||||
|  | ||||
|             if(!empty($data)) { | ||||
|                 if (!empty($data)) { | ||||
|                     $pageCount = $this->BlogModel->getPostPageCount('', 5); | ||||
|                     $this->load->view('blog/postList', ['pageContent' => $data]); | ||||
|                 } else { | ||||
| @@ -78,18 +83,19 @@ class Blog extends MY_Controller { | ||||
|             } | ||||
|         } | ||||
|  | ||||
|     public function tag($tag = null) { | ||||
|         if($tag == null) { | ||||
|         public function tag($tag = null) | ||||
|         { | ||||
|             if ($tag == null) { | ||||
|                 redirect(base_url('blog')); | ||||
|             } | ||||
|             $tag = urldecode($tag); | ||||
|         $offset = isset($_GET['page']) ? intval($_GET['page']) -1 : 0; | ||||
|             $offset = isset($_GET['page']) ? intval($_GET['page']) - 1 : 0; | ||||
|             $data = $this->BlogModel->getTagPosts($tag, 5, $offset); | ||||
|  | ||||
|             $this->load->view('header', ['active' => 'blog', 'title' => 'Blog', 'additionalStyles' => ['blog.css']]); | ||||
|             $this->load->view('blog/first', ['categories' => $this->BlogModel->getCategories()]); | ||||
|  | ||||
|         if(!empty($data)) { | ||||
|             if (!empty($data)) { | ||||
|                 $pageCount = $this->BlogModel->getPostPageCount('', 5); | ||||
|                 $this->load->view('blog/postList', ['pageContent' => $data]); | ||||
|             } else { | ||||
| @@ -101,48 +107,51 @@ class Blog extends MY_Controller { | ||||
|             $this->load->view('blog/pagination', ['pageCount' => $pageCount]); | ||||
|         } | ||||
|  | ||||
|     function add() { | ||||
|         if(isset($_SESSION['user']) && $this->hasPermission('blog.create')) { | ||||
|         function add() | ||||
|         { | ||||
|             if (isset($_SESSION['user']) && $this->hasPermission('blog.create')) { | ||||
|                 redirect('/admin/blog/add'); | ||||
|             } else { | ||||
|                 redirect('/blog'); | ||||
|             } | ||||
|         } | ||||
|  | ||||
|    function post($postTitle = null) { | ||||
|         if($postTitle == null) { | ||||
|         function post($postTitle = null) | ||||
|         { | ||||
|             if ($postTitle == null) { | ||||
|                 redirect("/blog"); | ||||
|         } elseif(isset($_GET['q'])) { | ||||
|             } elseif (isset($_GET['q'])) { | ||||
|                 redirect('/blog?q=' . $_GET['q']); | ||||
|             } else { | ||||
|                 $post = $this->BlogModel->getPost($postTitle); | ||||
|             if(empty($post)) { | ||||
|                 if (empty($post)) { | ||||
|                     redirect('/blog'); | ||||
|                 } else { | ||||
|                 $post['randomPosts'] = $this->BlogModel->getRandomPosts($post['postID']); | ||||
|                 $post['comments'] = $this->BlogModel->getComments($post['postID']); | ||||
|                 $post['tags'] = $this->BlogModel->getTags($post['postID']); | ||||
|                 $post['hasLiked'] = isset($_SESSION['user']) && !empty($_SESSION['user']) ? $this->BlogModel->hasAlreadyLiked($post['postID'], $_SESSION['user']['ID']) : false; | ||||
|                 $sameCategoryPosts = $this->BlogModel->getCategoryPostsByID($post['postCategoryID'], 3, $post['postID']); | ||||
|                     $post['randomPosts'] = $this->BlogModel->getRandomPosts($post['ID']); | ||||
|                     $post['comments'] = $this->BlogModel->getComments($post['ID']); | ||||
|                     $post['tags'] = $this->BlogModel->getTags($post['ID']); | ||||
|                     $post['hasLiked'] = isset($_SESSION['user']) && !empty($_SESSION['user']) ? $this->BlogModel->hasAlreadyLiked($post['ID'], $_SESSION['user']['ID']) : false; | ||||
|                     $sameCategoryPosts = $this->BlogModel->getCategoryPostsByID($post['categories'], 3, $post['ID']); | ||||
|  | ||||
|                 $post['prevPost'] = $this->BlogModel->getPrevPost($post['postID']); | ||||
|                 $post['nextPost'] = $this->BlogModel->getNextPost($post['postID']); | ||||
|                     $post['prevPost'] = $this->BlogModel->getPrevPost($post['initialRelease']); | ||||
|                     $post['nextPost'] = $this->BlogModel->getNextPost($post['initialRelease']); | ||||
|  | ||||
|                 $this->BlogModel->incrementViews($post['postID']); | ||||
|                     $this->BlogModel->incrementViews($post['ID']); | ||||
|  | ||||
|                 $this->load->view('header', ['active' => 'blog', 'title' => $post['postTitle'], 'additionalStyles' => ['posts_list.css', 'blog.css']]); | ||||
|                     $this->load->view('header', ['active' => 'blog', 'title' => $post['title'], 'additionalStyles' => ['posts_list.css', 'blog.css']]); | ||||
|                     $this->load->view('blog/first', ['categoryPosts' => $sameCategoryPosts, 'categories' => $this->BlogModel->getCategories()]); | ||||
|                     $this->load->view('blog/post', $post); | ||||
|                 $this->load->view('footer', ['additionalScripts' => ['lib/prism.js', 'blog.js']]); | ||||
|                     $this->load->view('footer', ['additionalScripts' => ['lib/prism.js', 'blog.js', 'comment-item.js']]); | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|  | ||||
|     function like() { | ||||
|         if(!isset($_SESSION['user']) || $_SESSION['user']['username'] == NULL) { | ||||
|         function like() | ||||
|         { | ||||
|             if (!isset($_SESSION['user']) || $_SESSION['user']['username'] == NULL) { | ||||
|                 echo "no-user"; | ||||
|             } else { | ||||
|             if(!$this->BlogModel->hasAlreadyLiked($_POST['postID'], $_SESSION['user']['ID'])) { | ||||
|                 if (!$this->BlogModel->hasAlreadyLiked($_POST['postID'], $_SESSION['user']['ID'])) { | ||||
|                     echo 'true:'; | ||||
|                     echo $this->BlogModel->addLike($_POST['postID'], $_SESSION['user']['ID'])['likeCount']; | ||||
|                 } else { | ||||
| @@ -152,37 +161,176 @@ class Blog extends MY_Controller { | ||||
|             } | ||||
|         } | ||||
|  | ||||
|     function comment() { | ||||
|         if(!isset($_SESSION['user']) || $_SESSION['user']['username'] == NULL) { | ||||
|             $result = ['type' => 'error', 'message' => 'Nicht eingeloggt']; | ||||
|         function comment() | ||||
|         { | ||||
|             if (!isset($_SESSION['user']) || $_SESSION['user']['username'] == NULL) { | ||||
|                 $result = [ | ||||
|                     'success' => false, | ||||
|                     'message' => '<b>Nicht eingeloggt!</b> Du musst in deinem Account angemeldet sein, um Kommentare auf Blog-Posts zu verfassen. Die Registrierung ist völlig kostenlos!', | ||||
|                 ]; | ||||
|             } else { | ||||
|                 $url = $this->input->post('url'); | ||||
|  | ||||
|                 $url = str_replace('/blog/post/', '', $url); | ||||
|  | ||||
|             $comment = $this->BlogModel->addCommentByUrl($url, $_SESSION['user']['ID'], $this->input->post('comment'), false, NULL); | ||||
|             $result = ['type' => 'success', 'content' => [ | ||||
|                 $comment = $this->BlogModel->addCommentByUrl($url, $_SESSION['user']['ID'], $this->input->post('comment'), NULL); | ||||
|  | ||||
|                 if ($comment == NULL) { | ||||
|                     $result = [ | ||||
|                         'success' => false, | ||||
|                         'message' => '<b>Post nicht gefunden.</b> Bitte lade die Seite erneut oder kontaktiere das Support-Team!', | ||||
|                     ]; | ||||
|                 } else { | ||||
|                     $result = [ | ||||
|                         'success' => true, | ||||
|                         'content' => [ | ||||
|                             'username' => $_SESSION['user']['username'], | ||||
|                             'displayname' => $_SESSION['user']['displayname'], | ||||
|                 'profilePic' => $_SESSION['user']['profilePic'], | ||||
|                 'date' => date('d.m.Y H: i \\U\\h\\r', strtotime($comment['date_created'])) | ||||
|             ]]; | ||||
|                             'profilePicture' => $_SESSION['user']['profilePic'], | ||||
|                         ] | ||||
|                     ]; | ||||
|                 } | ||||
|             } | ||||
|  | ||||
|             header("Content-Type: application/json"); | ||||
|             echo json_encode($result); | ||||
|         } | ||||
|  | ||||
|     function getComments() { | ||||
|         function getComments() | ||||
|         { | ||||
|             $url = $this->input->get('url'); | ||||
|  | ||||
|             $url = str_replace('/blog/post/', '', $url); | ||||
|  | ||||
|             $authorCache = []; | ||||
|  | ||||
|             $comments = $this->BlogModel->getCommentsByUrl($url); | ||||
|         foreach($comments as $comment) { | ||||
|             $comment['author'] = $this->BlogModel->getAuthorData($comment['user_id']); | ||||
|             $this->load->view('blog/comment', $comment); | ||||
|             foreach ($comments as $comment) { | ||||
|                 $userID = $comment['userID']; | ||||
|                 if (isset($authorCache[$userID])) { | ||||
|                     $author = $authorCache[$userID]; | ||||
|                 } else { | ||||
|                     $author = $this->BlogModel->getAuthorData($userID); | ||||
|                     $authorCache[$userID] = $author; | ||||
|                 } | ||||
|                 $this->load->view('network/blog/comment_item', ['data' => $author, 'c' => $comment]); | ||||
|             } | ||||
|         } | ||||
|  | ||||
| } | ||||
|         public function getReportModal() | ||||
|         { | ||||
|             header('Content-Type: application/json'); | ||||
|  | ||||
|             $body = $this->load->view('blog/report_modal', [], true); | ||||
|             echo json_encode([ | ||||
|                 'success' => true, | ||||
|                 'title' => 'Kommentar melden', | ||||
|                 'body' => $body | ||||
|             ]); | ||||
|         } | ||||
|  | ||||
|         public function reportComment() | ||||
|         { | ||||
|             header('Content-Type: application/json'); | ||||
|  | ||||
|             $commentID = intval($this->input->post('ID')); | ||||
|  | ||||
|             if ($commentID == 0) { | ||||
|                 echo json_encode(['success' => false, 'message' => 'Der angegebene Kommentar existiert nicht.']); | ||||
|                 exit; | ||||
|             } | ||||
|  | ||||
|             $reason = $this->input->post('reason'); | ||||
|             $reasonText = trim($this->input->post('explanation')); | ||||
|  | ||||
|             if ($reason == '') { | ||||
|                 echo json_encode(['success' => false, 'message' => 'Bitte wähle einen Grund für deine Meldung aus.']); | ||||
|                 exit; | ||||
|             } | ||||
|  | ||||
|             $allowedReasons = ['hatespeech', 'racism', 'terrorism', 'abuse', 'violence', 'copyright', 'spam', 'technical-issue']; | ||||
|  | ||||
|             if (!array_search($reason, $allowedReasons)) { | ||||
|                 echo json_encode(['success' => false, 'message' => 'Bitte wähle einen standardmäßig vorhandenen und validen Grund für die Meldung aus.']); | ||||
|                 exit; | ||||
|             } | ||||
|  | ||||
|             if (!$this->BlogModel->isCommentIDValid($commentID)) { | ||||
|                 echo json_encode(['success' => true, 'message' => 'Der ausgewählte Kommentar ist nicht (mehr) vorhanden. Sollte es sich hierbei um ein Irrtum handeln, verfasse bitte über den Button unten rechts ein Feedback.']); | ||||
|                 exit; | ||||
|             } | ||||
|  | ||||
|             $this->BlogModel->reportComment($commentID, $reason, $reasonText); | ||||
|  | ||||
|             echo json_encode(['success' => true, 'message' => 'Vielen Dank für das Melden dieses Kommentars. Wir werden schnellstmöglich angemessene Aktionen unternehmen.']); | ||||
|         } | ||||
|  | ||||
|         public function getDeleteModal() | ||||
|         { | ||||
|             header('Content-Type: application/json'); | ||||
|             if (!isset($_SESSION['user'])) { | ||||
|                 echo json_encode(['success' => false, 'message' => 'Du musst eingeloggt sein, um die Posts deines Accounts zu löschen']); | ||||
|                 exit; | ||||
|             } | ||||
|  | ||||
|             $commentID = intval($this->input->post('ID')); | ||||
|  | ||||
|             if ($commentID == 0) { | ||||
|                 echo json_encode(['success' => false, 'message' => 'Der angegebene Kommentar existiert nicht.']); | ||||
|                 exit; | ||||
|             } | ||||
|  | ||||
|             $comment = $this->BlogModel->getComment($commentID); | ||||
|  | ||||
|             if ($comment == NULL) { | ||||
|                 echo json_encode(['success' => false, 'message' => 'Der angegebene Kommentar existiert nicht.']); | ||||
|                 exit; | ||||
|             } | ||||
|  | ||||
|             $author = $this->BlogModel->getAuthorData($comment['userID']); | ||||
|  | ||||
|             if ($author == NULL || $author['ID'] !== $_SESSION['user']['ID']) { | ||||
|                 echo json_encode(['success' => false, 'message' => 'Du kannst keine Kommentare löschen, die dir nicht gehören.']); | ||||
|                 exit; | ||||
|             } | ||||
|  | ||||
|             $body = $this->load->view('blog/delete_modal', ['author' => $author, 'comment' => $comment], true); | ||||
|  | ||||
|             echo json_encode(['success' => true, 'title' => 'Kommentar löschen', 'body' => $body]); | ||||
|         } | ||||
|  | ||||
|         public function deleteComment() | ||||
|         { | ||||
|             header('Content-Type: application/json'); | ||||
|             if (!isset($_SESSION['user'])) { | ||||
|                 echo json_encode(['success' => false, 'message' => 'Du musst eingeloggt sein, um die Posts deines Accounts zu löschen']); | ||||
|                 exit; | ||||
|             } | ||||
|  | ||||
|             $commentID = intval($this->input->post('ID')); | ||||
|  | ||||
|             if ($commentID == 0) { | ||||
|                 echo json_encode(['success' => false, 'message' => 'Der angegebene Kommentar existiert nicht.']); | ||||
|                 exit; | ||||
|             } | ||||
|  | ||||
|             $comment = $this->BlogModel->getComment($commentID); | ||||
|  | ||||
|             if ($comment == null) { | ||||
|                 echo json_encode(['success' => false, 'message' => 'Der angegebene Kommentar existiert nicht.']); | ||||
|                 exit; | ||||
|             } | ||||
|  | ||||
|             $author = $this->BlogModel->getAuthorData($comment['userID']); | ||||
|  | ||||
|             if ($author == NULL || $author['ID'] !== $_SESSION['user']['ID']) { | ||||
|                 echo json_encode(['success' => false, 'message' => 'Du kannst keine Kommentare löschen, die dir nicht gehören.']); | ||||
|                 exit; | ||||
|             } | ||||
|  | ||||
|             $this->BlogModel->deleteComment($_SESSION['user']['ID'], $commentID); | ||||
|  | ||||
|             echo json_encode(['success' => true, 'message' => 'Der Kommentar wurde erfolgreich gelöscht.']); | ||||
|         } | ||||
|  | ||||
|     } | ||||
|   | ||||
| @@ -14,7 +14,7 @@ class File extends MY_Controller | ||||
|         if ($title == null) { | ||||
|             redirect(base_url()); | ||||
|         } else { | ||||
|             $file = $this->db->query('SELECT name, type, path, isUserData FROM files WHERE name = ?', [urldecode($title)])->result_array(); | ||||
|             $file = $this->db->query('SELECT name, type, path FROM files WHERE name = ?', [urldecode($title)])->result_array(); | ||||
|  | ||||
|             if (!empty($file)) { | ||||
|                 $file = $file[0]; | ||||
|   | ||||
| @@ -26,7 +26,7 @@ | ||||
|                 $rememberMe = isset($_POST['rememberMe']) ? $_POST['rememberMe'] : 'off'; | ||||
|                 $this->LoginModel->login($_POST['loginname'], $_POST['loginPassword'], $rememberMe); | ||||
|  | ||||
|                 isset($_GET['r']) && !empty($_GET['r']) ? redirect(base64_decode(urldecode($_GET['r']))) : redirect(base_url('login')); | ||||
| //                isset($_GET['r']) && !empty($_GET['r']) ? redirect(base64_decode(urldecode($_GET['r']))) : redirect(base_url('login')); | ||||
|             } | ||||
|  | ||||
|             $notice = isset($_SESSION['notice']) ? $_SESSION['notice'] : ''; | ||||
|   | ||||
| @@ -20,7 +20,7 @@ | ||||
|         { | ||||
|             // TODO: Add twitch, instagram and 500px as further services | ||||
|  | ||||
|             $video = $this->YoutubePlayerModel->newestVids(1)[0]; | ||||
|             $video = $this->SocialMediaModel->newestVids(1)[0]; | ||||
|  | ||||
|             $currentlyActiveUsers = $this->UserModel->getActiveUsers(5); | ||||
|             $newestUsers = $this->UserModel->getNewestUsers(5); | ||||
| @@ -43,8 +43,8 @@ | ||||
|             } | ||||
|             $font_sizes = [27, 27, 24, 24, 24, 20, 16, 16, 14, 14, 12, 11, 10]; | ||||
|             foreach ($items as $item) { | ||||
|                 $post_date = $item['post_date']; | ||||
|                 $item['post_date'] = DateTimeHumanizer::difference(new \DateTime(), new \DateTime("@$post_date"), $_SESSION['site_lang']); | ||||
|                 $date = strtotime($item['date']); | ||||
|                 $item['date'] = DateTimeHumanizer::difference(new \DateTime(), new \DateTime("@$date"), $_SESSION['site_lang']); | ||||
|                 $item['font_sizes'] = $font_sizes; | ||||
|                 $this->load->view('post_list_entry', $item); | ||||
|             } | ||||
|   | ||||
| @@ -71,10 +71,10 @@ | ||||
|                 exit; | ||||
|             } | ||||
|  | ||||
|             $postUUID = $this->input->post('postUUID'); | ||||
|             $hashID = $this->input->post('postUUID'); | ||||
|  | ||||
|             $isLiked = $this->PostsModel->addPostLikeByUUID($postUUID, $_SESSION['user']['ID']); | ||||
|             $likeCount = $this->PostsModel->getPostLikeCountByUUID($postUUID); | ||||
|             $isLiked = $this->PostsModel->addPostLikeByHashID($hashID, $_SESSION['user']['ID']); | ||||
|             $likeCount = $this->PostsModel->getPostLikeCountByHashID($hashID); | ||||
|  | ||||
|             echo json_encode([ | ||||
|                 'success' => true, | ||||
| @@ -115,7 +115,7 @@ | ||||
|                 $users = $this->UserModel->searchUsers($query, $rank, $country, $lang, $userAmount, $userOffset); | ||||
|  | ||||
|                 if (!empty($users)) { | ||||
|                     if($offset == 0) { | ||||
|                     if ($offset == 0) { | ||||
|                         echo '<h2>Nutzer (' . sizeof($users) . ')</h2>'; | ||||
|                     } | ||||
|  | ||||
| @@ -142,7 +142,8 @@ | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         public function getAvailableCountries() { | ||||
|         public function getAvailableCountries() | ||||
|         { | ||||
|             $countries = $this->UserModel->getAvailableCountries(); | ||||
|  | ||||
|             foreach ($countries as $i => $country) { | ||||
| @@ -153,7 +154,8 @@ | ||||
|             echo json_encode(['countries' => $countries]); | ||||
|         } | ||||
|  | ||||
|         public function getAvailableLanguages() { | ||||
|         public function getAvailableLanguages() | ||||
|         { | ||||
|             $languages = $this->UserModel->getAvailableLanguages(); | ||||
|  | ||||
|             foreach ($languages as $i => $language) { | ||||
| @@ -164,54 +166,69 @@ | ||||
|             echo json_encode(['languages' => $languages]); | ||||
|         } | ||||
|  | ||||
|         public function getReportModal() { | ||||
|         public function getReportModal() | ||||
|         { | ||||
|             $this->load->view('network/posts/report_modal'); | ||||
|         } | ||||
|  | ||||
|         public function reportPost() { | ||||
|         public function reportPost() | ||||
|         { | ||||
|             header('Content-Type: application/json'); | ||||
|             $uuid = $this->input->post('uuid'); | ||||
|             $hashID = $this->input->post('hashID'); | ||||
|  | ||||
|             if ($hashID == NULL) { | ||||
|                 echo json_encode(['success' => false, 'message' => 'Der angegebene Post existiert nicht.']); | ||||
|                 exit; | ||||
|             } | ||||
|  | ||||
|             $reason = $this->input->post('reason'); | ||||
|             $reasonText = $this->input->post('explanation'); | ||||
|  | ||||
|             if($reason == '') { | ||||
|             if ($reason == '') { | ||||
|                 echo json_encode(['success' => false, 'message' => 'Bitte wähle einen Grund für deine Meldung aus.']); | ||||
|                 exit; | ||||
|             } | ||||
|  | ||||
|             $allowedReasons = ['hatespeech', 'racism', 'terrorism', 'abuse', 'violence', 'copyright', 'spam', 'technical-issue']; | ||||
|  | ||||
|             if(!array_search($reason, $allowedReasons)) { | ||||
|             if (!array_search($reason, $allowedReasons)) { | ||||
|                 echo json_encode(['success' => false, 'message' => 'Bitte wähle einen standardmäßig vorhandenen und validen Grund für die Meldung aus.']); | ||||
|                 exit; | ||||
|             } | ||||
|  | ||||
|             if(!$this->PostsModel->isUUIDValid($uuid)) { | ||||
|             if (!$this->PostsModel->isHashIDValid($hashID)) { | ||||
|                 echo json_encode(['success' => true, 'message' => 'Der ausgewählte Post ist nicht (mehr) vorhanden. Sollte es sich hierbei um ein Irrtum handeln, verfasse bitte über den Button unten rechts ein Feedback.']); | ||||
|                 exit; | ||||
|             } | ||||
|  | ||||
|             $this->PostsModel->reportPost($uuid, $reason, $reasonText); | ||||
|             $this->PostsModel->reportPost($hashID, $reason, $reasonText); | ||||
|  | ||||
|             echo json_encode(['success' => true, 'message' => 'Vielen Dank für das Melden dieses Posts. Wir werden schnellstmöglich angemessene Aktionen unternehmen.']); | ||||
|         } | ||||
|  | ||||
|         public function getDeleteModal() { | ||||
|         public function getDeleteModal() | ||||
|         { | ||||
|             header('Content-Type: application/json'); | ||||
|             if(!isset($_SESSION['user'])) { | ||||
|             if (!isset($_SESSION['user'])) { | ||||
|                 echo json_encode(['success' => false, 'message' => 'Du musst eingeloggt sein, um die Posts deines Accounts zu löschen']); | ||||
|                 exit; | ||||
|             } | ||||
|  | ||||
|             $uuid = $this->input->post('uuid'); | ||||
|             $post = $this->PostsModel->getPostByUUID($uuid); | ||||
|             $hashID = $this->input->post('hashID'); | ||||
|  | ||||
|             if(empty($post)) { | ||||
|             if ($hashID == NULL) { | ||||
|                 echo json_encode(['success' => false, 'message' => 'Der angegebene Post existiert nicht.']); | ||||
|                 exit; | ||||
|             } | ||||
|  | ||||
|             if($post[0]['user_id'] != $_SESSION['user']['ID']) { | ||||
|             $post = $this->PostsModel->getPostByHashID($hashID); | ||||
|  | ||||
|             if (empty($post)) { | ||||
|                 echo json_encode(['success' => false, 'message' => 'Der angegebene Post existiert nicht.']); | ||||
|                 exit; | ||||
|             } | ||||
|  | ||||
|             if ($post[0]['userID'] != $_SESSION['user']['ID']) { | ||||
|                 echo json_encode(['success' => false, 'message' => 'Du kannst keine Posts löschen, die dir nicht gehören.']); | ||||
|                 exit; | ||||
|             } | ||||
| @@ -222,27 +239,34 @@ | ||||
|             echo json_encode(['success' => true, 'title' => 'Post löschen', 'body' => $body]); | ||||
|         } | ||||
|  | ||||
|         public function deletePost() { | ||||
|         public function deletePost() | ||||
|         { | ||||
|             header('Content-Type: application/json'); | ||||
|             if(!isset($_SESSION['user'])) { | ||||
|             if (!isset($_SESSION['user'])) { | ||||
|                 echo json_encode(['success' => false, 'message' => 'Du musst eingeloggt sein, um die Posts deines Accounts zu löschen']); | ||||
|                 exit; | ||||
|             } | ||||
|  | ||||
|             $uuid = $this->input->post('uuid'); | ||||
|             $post = $this->PostsModel->getPostByUUID($uuid); | ||||
|             $hashID = $this->input->post('hashID'); | ||||
|  | ||||
|             if(empty($post)) { | ||||
|             if ($hashID == NULL) { | ||||
|                 echo json_encode(['success' => false, 'message' => 'Der angegebene Post existiert nicht.']); | ||||
|                 exit; | ||||
|             } | ||||
|  | ||||
|             if($post[0]['user_id'] != $_SESSION['user']['ID']) { | ||||
|             $post = $this->PostsModel->getPostByHashID($hashID); | ||||
|  | ||||
|             if (empty($post)) { | ||||
|                 echo json_encode(['success' => false, 'message' => 'Der angegebene Post existiert nicht.']); | ||||
|                 exit; | ||||
|             } | ||||
|  | ||||
|             if ($post[0]['userID'] != $_SESSION['user']['ID']) { | ||||
|                 echo json_encode(['success' => false, 'message' => 'Du kannst keine Posts löschen, die dir nicht gehören.']); | ||||
|                 exit; | ||||
|             } | ||||
|  | ||||
|             $this->PostsModel->deletePost($_SESSION['user']['ID'], $uuid); | ||||
|             $this->PostsModel->deletePost($_SESSION['user']['ID'], $hashID); | ||||
|  | ||||
|             echo json_encode(['success' => true, 'message' => 'Der Post wurde erfolgreich gelöscht.']); | ||||
|         } | ||||
|   | ||||
| @@ -14,11 +14,11 @@ class Projects extends MY_Controller | ||||
|  | ||||
|     public function index($album = 'all') | ||||
|     { | ||||
|         $collections = $this->ProjectsModel->getCategories($album); | ||||
|         $categories = $this->ProjectsModel->getCategories($album); | ||||
|         $content = $this->ProjectsModel->getEntries('all'); | ||||
|  | ||||
|         $this->load->view('header', ['active' => 'projects', 'title' => lang('projects_sitetitle'), 'additionalStyles' => ['sortlist.css', 'projects.css']]); | ||||
|         $this->load->view('projects', ['content' => $content, 'album' => $album, 'collections' => $collections]); | ||||
|         $this->load->view('projects', ['content' => $content, 'album' => $album, 'categories' => $categories]); | ||||
|         $this->load->view('footer', ['additionalScripts' => ['lib/isotope.pkgd.min.js', 'projects.js']]); | ||||
|     } | ||||
|  | ||||
|   | ||||
| @@ -20,24 +20,24 @@ | ||||
|                 $title = "Error - Profile"; | ||||
|                 $message = ["type" => "danger", "message1" => "Dieser Nutzer existiert nicht!", "message2" => "Es wurde kein Nutzername angegeben."]; | ||||
|             } else { | ||||
|                 $user_data = $this->UserModel->getUser($user); | ||||
|                 $user_exists = !empty($user_data); | ||||
|                 if ($user_exists) { | ||||
|                     $user_data = $user_data[0]; | ||||
|                     $user_stats = $this->UserModel->getUserStats($user_data['ID']); | ||||
|                 $userData = $this->UserModel->getUser($user); | ||||
|                 $userExists = !empty($userData); | ||||
|                 if ($userExists) { | ||||
|                     $userData = $userData[0]; | ||||
|                     $userStats = $this->UserModel->getUserStats($userData['ID']); | ||||
|  | ||||
|                     $user_posts = $this->PostsModel->getUserPosts($user_data['ID'], 3, 0, 192); | ||||
|                     $user_comments = $this->UserModel->getUserComments($user_data['ID'], 3, 0); | ||||
|                     $user_blog_posts = $this->UserModel->getUserBlogPosts($user_data['ID'], 3, 0); | ||||
|                     $userPosts = $this->PostsModel->getUserPosts($userData['ID'], 3, 0, 192); | ||||
|                     $userComments = $this->UserModel->getUserComments($userData['ID'], 3, 0); | ||||
|                     $userBlogPosts = $this->UserModel->getUserBlogPosts($userData['ID'], 3, 0); | ||||
|  | ||||
|                     $date_created = strtotime($user_data['date_created']); | ||||
|                     $user_data['time_existing'] = DateTimeHumanizer::difference(new \DateTime(), new \DateTime("@$date_created"), $_SESSION['site_lang']); | ||||
|                     $title = $user_data['displayname'] . " - Profile"; | ||||
|                     $dateCreated = strtotime($userData['dateCreated']); | ||||
|                     $userData['time_existing'] = DateTimeHumanizer::difference(new \DateTime(), new \DateTime("@$dateCreated"), $_SESSION['site_lang']); | ||||
|                     $title = $userData['displayname'] . " - Profile"; | ||||
|                     $isCurrentUserFollowing = false; | ||||
|                     if (isset($_SESSION['user']['ID'])) | ||||
|                         $isCurrentUserFollowing = $this->UserModel->isFollowing($_SESSION['user']['ID'], $user_data['ID']); | ||||
|                         $isCurrentUserFollowing = $this->UserModel->isFollowing($_SESSION['user']['ID'], $userData['ID']); | ||||
|  | ||||
|                     $_SESSION['currentProfilePage'] = $user_data['ID']; | ||||
|                     $_SESSION['currentProfilePage'] = $userData['ID']; | ||||
|                 } else { | ||||
|                     $message = ["type" => "danger", "message1" => "Dieser Nutzer existiert nicht!", "message2" => "Der angegebene Nutzername konnte nicht gefunden werden."]; | ||||
|                     $title = "Error - Profile"; | ||||
| @@ -48,10 +48,10 @@ | ||||
|             if (isset($message)) { | ||||
|                 $this->load->view('network/message', $message); | ||||
|             } | ||||
|             if (isset($user_data) && isset($user_stats) && isset($user_posts) && isset($user_comments) && isset($user_blog_posts)) { | ||||
|                 $this->load->view('network/user/profile_page', ['data' => $user_data, 'stats' => $user_stats, 'posts' => $user_posts, 'comments' => $user_comments, 'blog_posts' => $user_blog_posts, 'isCurrentUserFollowing' => $isCurrentUserFollowing]); | ||||
|             if (isset($userData) && isset($userStats) && isset($userPosts) && isset($userComments) && isset($userBlogPosts)) { | ||||
|                 $this->load->view('network/user/profile_page', ['data' => $userData, 'stats' => $userStats, 'posts' => $userPosts, 'comments' => $userComments, 'blog_posts' => $userBlogPosts, 'isCurrentUserFollowing' => $isCurrentUserFollowing]); | ||||
|             } | ||||
|             $this->load->view('footer', ['additionalScripts' => ['profile_page.js']]); | ||||
|             $this->load->view('footer', ['additionalScripts' => ['profile_page.js', 'comment-item.js']]); | ||||
|         } | ||||
|  | ||||
|         public function comments($user = "") | ||||
| @@ -65,7 +65,7 @@ | ||||
|             $user_exists = !empty($user_data); | ||||
|             if ($user_exists) { | ||||
|                 $user_data = $user_data[0]; | ||||
|                 $dateCreated = strtotime($user_data['date_created']); | ||||
|                 $dateCreated = strtotime($user_data['dateCreated']); | ||||
|                 $user_data['time_existing'] = DateTimeHumanizer::difference(new \DateTime(), new \DateTime("@$dateCreated"), $_SESSION['site_lang']); | ||||
|                 $user_stats = $this->UserModel->getUserStats($user_data['ID']); | ||||
|                 $title = $user_data['displayname'] . " - Blog-Kommentare"; | ||||
| @@ -87,7 +87,7 @@ | ||||
|             if ($user_exists) { | ||||
|                 $this->load->view('network/blog/user_comments', ['data' => $user_data, 'stats' => $user_stats, 'isCurrentUserFollowing' => $isCurrentUserFollowing]); | ||||
|             } | ||||
|             $this->load->view('footer', ['additionalScripts' => ['profile_page.js']]); | ||||
|             $this->load->view('footer', ['additionalScripts' => ['profile_page.js', 'comment-item.js']]); | ||||
|             $this->load->view('network/blog/user_comments_end', ['data' => $user_data]); | ||||
|         } | ||||
|  | ||||
| @@ -114,7 +114,7 @@ | ||||
|             $user_exists = !empty($user_data); | ||||
|             if ($user_exists) { | ||||
|                 $user_data = $user_data[0]; | ||||
|                 $dateCreated = strtotime($user_data['date_created']); | ||||
|                 $dateCreated = strtotime($user_data['dateCreated']); | ||||
|                 $user_data['time_existing'] = DateTimeHumanizer::difference(new \DateTime(), new \DateTime("@$dateCreated"), $_SESSION['site_lang']); | ||||
|                 $user_stats = $this->UserModel->getUserStats($user_data['ID']); | ||||
|                 $title = $user_data['displayname'] . " - Posts"; | ||||
| @@ -161,7 +161,7 @@ | ||||
|             $user_exists = !empty($user_data); | ||||
|             if ($user_exists) { | ||||
|                 $user_data = $user_data[0]; | ||||
|                 $dateCreated = strtotime($user_data['date_created']); | ||||
|                 $dateCreated = strtotime($user_data['dateCreated']); | ||||
|                 $user_data['time_existing'] = DateTimeHumanizer::difference(new \DateTime(), new \DateTime("@$dateCreated"), $_SESSION['site_lang']); | ||||
|                 $user_stats = $this->UserModel->getUserStats($user_data['ID']); | ||||
|                 $title = $user_data['displayname'] . " - Posts"; | ||||
| @@ -204,7 +204,7 @@ | ||||
|             if (!isset($_SESSION['user']) || empty($_SESSION['user'])) | ||||
|                 redirect(base_url()); | ||||
|  | ||||
|             if(empty($_FILES) || !isset($_FILES['postMedia'])) | ||||
|             if (empty($_FILES) || !isset($_FILES['postMedia'])) | ||||
|                 redirect(base_url()); | ||||
|  | ||||
|             header('Content-Type: application/json'); | ||||
| @@ -229,23 +229,25 @@ | ||||
|             echo json_encode(['success' => true, 'type' => $mediaType, 'path' => $path]); | ||||
|         } | ||||
|  | ||||
|         public function deletePostMedia() { | ||||
|         public function deletePostMedia() | ||||
|         { | ||||
|             if (!isset($_SESSION['user']) || empty($_SESSION['user'])) | ||||
|                 redirect(base_url()); | ||||
|  | ||||
|             if(empty($_POST) || !isset($_POST['path'])) | ||||
|             if (empty($_POST) || !isset($_POST['path'])) | ||||
|                 redirect(base_url()); | ||||
|  | ||||
|             $url = $_POST['path']; | ||||
|  | ||||
|             $filePath = $this->FileModel->getFilePath(substr($url, 3), $_SESSION['user']['ID']); | ||||
|  | ||||
|             if($filePath != null) | ||||
|             if ($filePath != null) | ||||
|                 unlink($filePath); | ||||
|         } | ||||
|  | ||||
|         public function publishPost() | ||||
|         { | ||||
|             header('Content-Type: application/json'); | ||||
|             if (!isset($_SESSION['user']) || empty($_SESSION['user'])) { | ||||
|                 echo json_encode(['success' => false, | ||||
|                     'title' => lang('post_error_login_title'), | ||||
| @@ -255,29 +257,32 @@ | ||||
|             } | ||||
|  | ||||
|             $content = $this->input->post('content'); | ||||
|             $content = trim($content); | ||||
|             if (strlen($content) >= 10000) { | ||||
|             ?> | ||||
|             <div class="alert alert-warning" role="alert"> | ||||
|                 <b>Veröffentlichung des Posts fehlgeschlagen!</b> Dein Post ist leider zu lang. Er darf maximal 10.000 | ||||
|                 Zeichen umfassen. | ||||
|             </div> | ||||
|             <?php | ||||
|                 echo json_encode(['success' => false, | ||||
|                     'title' => lang('post_error_too_long_title'), | ||||
|                     'message' => lang('post_error_too_long_lines') | ||||
|                 ]); | ||||
|                 exit; | ||||
|             } | ||||
|  | ||||
|             if (strlen($content) == 0 && empty($media)) { | ||||
|                 echo json_encode(['success' => false, | ||||
|                     'title' => lang('post_error_no_content_title'), | ||||
|                     'message' => lang('post_error_no_content_lines') | ||||
|                 ]); | ||||
|                 exit; | ||||
|             } | ||||
|  | ||||
|             $replyTo = $this->input->post('replyTo'); | ||||
|         if ($replyTo !== "-1" && !$this->PostsModel->isUUIDValid($replyTo)) { | ||||
|             ?> | ||||
|             <div class="alert alert-warning" role="alert"> | ||||
|                 <b>Veröffentlichung des Posts fehlgeschlagen!</b> Der Post, an den du deine Antwort richten willst, | ||||
|                 existiert nicht (mehr).<br> | ||||
|                 Solltest du dies für einen Fehler halten, versuche es später erneut oder kontaktiere uns. | ||||
|             </div> | ||||
|             <?php | ||||
|             if ($replyTo !== "-1" && !$this->PostsModel->isHashIDValid($replyTo)) { | ||||
|                 echo json_encode(['success' => false, | ||||
|                     'title' => lang('post_error_reply_title'), | ||||
|                     'message' => lang('post_error_reply_lines') | ||||
|                 ]); | ||||
|                 exit; | ||||
|             } | ||||
|  | ||||
|         $postID = -1; | ||||
|             if ($replyTo !== "-1") { | ||||
|                 $postID = $this->PostsModel->addReply($_SESSION['user']['ID'], $content, $replyTo); | ||||
|             } else { | ||||
| @@ -321,15 +326,21 @@ | ||||
|                 } | ||||
|             } | ||||
|  | ||||
|             ?> | ||||
|             <div class="alert alert-success" role="alert"> | ||||
|                 <b>Dein Post wurde erfolgreich veröffentlicht!</b> Möchtest du nun deine Posts ansehen? <br> | ||||
|                 <button type="button" class="btn btn-sm btn-default" data-dismiss="modal">Nein</button> | ||||
|                 <a href='<?= base_url('user/' . $_SESSION['user']['username'] . '/posts') ?>' | ||||
|                    class='btn btn-sm btn-primary'>Ja | ||||
|                 </a> | ||||
|             </div> | ||||
|             <?php | ||||
|             echo json_encode(['success' => true, | ||||
|                 'title' => lang('post_success_title'), | ||||
|                 'message' => lang('post_success_lines'), | ||||
|                 'buttons' => [ | ||||
|                     [ | ||||
|                         'type' => 'default', | ||||
|                         'text' => lang('post_success_no') | ||||
|                     ], | ||||
|                     [ | ||||
|                         'type' => 'primary', | ||||
|                         'action' => base_url('user/' . $_SESSION['user']['username'] . '/posts'), | ||||
|                         'text' => lang('post_success_yes') | ||||
|                     ] | ||||
|                 ] | ||||
|             ]); | ||||
|         } | ||||
|  | ||||
|         public function followers($user = "") | ||||
| @@ -343,7 +354,7 @@ | ||||
|             $user_exists = !empty($user_data); | ||||
|             if ($user_exists) { | ||||
|                 $user_data = $user_data[0]; | ||||
|                 $dateCreated = strtotime($user_data['date_created']); | ||||
|                 $dateCreated = strtotime($user_data['dateCreated']); | ||||
|                 $user_data['time_existing'] = DateTimeHumanizer::difference(new \DateTime(), new \DateTime("@$dateCreated"), $_SESSION['site_lang']); | ||||
|                 $user_stats = $this->UserModel->getUserStats($user_data['ID']); | ||||
|                 $followers = $this->UserModel->getFollowers($user_data['ID']); | ||||
| @@ -379,7 +390,7 @@ | ||||
|             $user_exists = !empty($user_data); | ||||
|             if ($user_exists) { | ||||
|                 $user_data = $user_data[0]; | ||||
|                 $dateCreated = strtotime($user_data['date_created']); | ||||
|                 $dateCreated = strtotime($user_data['dateCreated']); | ||||
|                 $user_data['time_existing'] = DateTimeHumanizer::difference(new \DateTime(), new \DateTime("@$dateCreated"), $_SESSION['site_lang']); | ||||
|                 $user_stats = $this->UserModel->getUserStats($user_data['ID']); | ||||
|                 $following = $this->UserModel->getFollowing($user_data['ID']); | ||||
| @@ -460,6 +471,13 @@ | ||||
|                 // Update Settings | ||||
|                 $newData = []; | ||||
|                 // TODO: Error messages | ||||
|  | ||||
|                 foreach ($_POST as $key => $item) { | ||||
|                     if (isset($user_data[$key]) && $user_data[$key] == $item) { | ||||
|                         unset($_POST[$key]); | ||||
|                     } | ||||
|                 } | ||||
|  | ||||
|                 // Username | ||||
|                 if (isset($_POST['username'])) { | ||||
|                     if (!preg_match('/[^A-Za-z0-9._]/', $_POST['username'])) { | ||||
| @@ -474,7 +492,7 @@ | ||||
|                             $_SESSION['profileEditNotification'] .= "<div class='alert alert-danger' role='alert'><b>Nutzername bereits vergeben!</b> Ein anderer Nutzer hat anscheinend diesen Namen bereits gewählt.</div>"; | ||||
|                         } | ||||
|                     } else { | ||||
|                         $_SESSION['profileEditNotification'] .= "<div class='alert alert-danger' role='alert'><b>Ungültiger Nutzername!</b> Dein Name darf nur Groß- (A-Z) und Kleinbuchstaben (a-z), Zahlen (0-9) und Punkte (.) sowie Unterstriche (_).</div>"; | ||||
|                         $_SESSION['profileEditNotification'] .= "<div class='alert alert-danger' role='alert'><b>Ungültiger Nutzername!</b> Dein Name darf nur Groß- (A-Z) und Kleinbuchstaben (a-z), Zahlen (0-9) und Punkte (.) sowie Unterstriche (_) enthalten.</div>"; | ||||
|                     } | ||||
|                 } | ||||
|                 // Gender | ||||
| @@ -506,25 +524,25 @@ | ||||
|                     $newData['country'] = $_POST['country']; | ||||
|                 } | ||||
|                 // Biography/About | ||||
|                 if (isset($_POST['biography'])) { | ||||
|                     $newData['about'] = $_POST['biography']; | ||||
|                 if (isset($_POST['about'])) { | ||||
|                     $newData['about'] = trim($_POST['about']); | ||||
|                 } | ||||
|                 // Avatar | ||||
|                 if (isset($_FILES['avatar'])) { | ||||
|                     $image = $this->FileModel->uploadCroppedImage('avatar', 4096, $_FILES['avatar']['name'], 500, 500); | ||||
|                     if ($image != null) | ||||
|                         $newData['profile_picture'] = $image; | ||||
|                         $newData['profilePicture'] = $image; | ||||
|                     unset($_FILES['avatar']); | ||||
|                 } | ||||
|                 // Header | ||||
|                 if (isset($_FILES['header'])) { | ||||
|                     $image = $this->FileModel->uploadImage('header', 4096, $_FILES['header']['name'], 1920); | ||||
|                     if ($image != null) | ||||
|                         $newData['header_image'] = $image; | ||||
|                         $newData['headerImage'] = $image; | ||||
|                     unset($_FILES['header']); | ||||
|                 } | ||||
|                 // Social Networks | ||||
|                 if (isset($_POST['social-networks'])) { | ||||
|                 if (isset($_POST['sociaNetworks'])) { | ||||
|  | ||||
|                 } | ||||
|                 // Profile color | ||||
| @@ -611,7 +629,7 @@ | ||||
|                     // Add entry to history | ||||
|                     unset($user_data['rankName']); | ||||
|                     unset($_SESSION['user']); | ||||
|                     $this->UserModel->insertIntoHistory($user_data); | ||||
|                     $this->UserModel->insertIntoHistory($newData); | ||||
|                     // Update profile | ||||
|                     $this->UserModel->updateProfile($newData, $user_data['ID']); | ||||
|                     $this->db->cache_delete('user', $user_data['username']); | ||||
| @@ -651,38 +669,36 @@ | ||||
|             $this->load->view('footer', ['additionalScripts' => ['single-post-page.js']]); | ||||
|         } | ||||
|  | ||||
|         public function single_post_data($username = null, $uuid = null) | ||||
|         public function single_post_data($username = null, $hashID = null) | ||||
|         { | ||||
|             $message = ""; | ||||
|             $post = []; | ||||
|             $replies = []; | ||||
|             if ($username == null) { | ||||
|                 $message .= '<div class="alert alert-danger" role="alert"><b>Es wurde kein Nutzer angegeben!</b> Es können keine Posts von einem undefinierten Nutzer gefunden werden.</div>'; | ||||
|                 goto display; | ||||
|                 echo '<div class="alert alert-danger" role="alert"><b>Es wurde kein Nutzer angegeben!</b> Es können keine Posts von einem undefinierten Nutzer gefunden werden.</div>'; | ||||
|                 exit; | ||||
|             } | ||||
|             if ($uuid == null) { | ||||
|                 $message .= '<div class="alert alert-danger" role="alert"><b>Es wurde keine Post-ID angegeben!</b> Es können keine undefinierten Posts gefunden werden.</div>'; | ||||
|                 goto display; | ||||
|  | ||||
|             if ($hashID == null) { | ||||
|                 echo '<div class="alert alert-danger" role="alert"><b>Es wurde keine Post-ID angegeben!</b> Es können keine undefinierten Posts gefunden werden.</div>'; | ||||
|                 exit; | ||||
|             } | ||||
|  | ||||
|             $user = $this->UserModel->getUser($username); | ||||
|             if (empty($user)) { | ||||
|                 $message .= '<div class="alert alert-warning" role="alert"><b>Es wurde kein Nutzer mit dem angegebenen Namen gefunden!</b> Vielleicht kannst du ja diese Lücke füllen?</div>'; | ||||
|                 goto display; | ||||
|                 echo '<div class="alert alert-warning" role="alert"><b>Es wurde kein Nutzer mit dem angegebenen Namen gefunden!</b> Vielleicht kannst du ja diese Lücke füllen?</div>'; | ||||
|                 exit; | ||||
|             } | ||||
|             $user = $user[0]; | ||||
|  | ||||
|             $post = $this->PostsModel->getPostDetails($user['ID'], $uuid); | ||||
|             $post = $this->PostsModel->getPostDetails($user['ID'], $hashID); | ||||
|             if (empty($post)) { | ||||
|                 $message .= '<div class="alert alert-warning" role="alert"><b>Es wurde kein Post mit der angegebenen ID gefunden!</b> Vielleicht kannst du ja diesen neuen Content erschaffen?</div>'; | ||||
|                 goto display; | ||||
|                 echo '<div class="alert alert-warning" role="alert"><b>Es wurde kein Post mit der angegebenen ID gefunden!</b> Vielleicht kannst du ja diesen neuen Content erschaffen?</div>'; | ||||
|                 exit; | ||||
|             } | ||||
|             $post = $post[0]; | ||||
|  | ||||
|             $replies = $this->PostsModel->getPostReplies($post['ID']); | ||||
|  | ||||
|             display: | ||||
|             $this->load->view('network/posts/user_post_content', ['message' => $message, 'post' => $post, 'replies' => $replies]); | ||||
|             $this->load->view('network/posts/user_post_content', ['post' => $post, 'replies' => $replies]); | ||||
|  | ||||
|         } | ||||
|     } | ||||
|   | ||||
| @@ -1,8 +1,11 @@ | ||||
| <?php | ||||
| defined('BASEPATH') OR exit('No direct script access allowed'); | ||||
|     defined('BASEPATH') OR exit('No direct script access allowed'); | ||||
|  | ||||
| class Blog extends MY_Controller | ||||
| { | ||||
|     require_once './vendor/Diff/htmLawed.php'; | ||||
|     use SebastianBergmann\Diff\Differ; | ||||
|  | ||||
|     class Blog extends MY_Controller | ||||
|     { | ||||
|  | ||||
|         public function __construct() | ||||
|         { | ||||
| @@ -15,12 +18,14 @@ class Blog extends MY_Controller | ||||
|         { | ||||
|             $this->neededPermission('blog.view'); | ||||
|             $posts = $this->BlogModel->getPostList(false); | ||||
|  | ||||
|             $this->load->view('admin/sidebar', ['title' => 'Alle Blog-Posts']); | ||||
|             $this->load->view('admin/blog_posts', ['posts' => $posts]); | ||||
|             $this->load->view('admin/footer'); | ||||
|         } | ||||
|  | ||||
|     public function tags() { | ||||
|         public function tags() | ||||
|         { | ||||
|             $this->neededPermission('blog.view'); | ||||
|  | ||||
|             $tags = $this->BlogModel->getAllTags(); | ||||
| @@ -47,65 +52,77 @@ class Blog extends MY_Controller | ||||
|                 exit; | ||||
|             } | ||||
|  | ||||
|         $contentID = $this->input->post('contentID'); | ||||
|         $contentID = is_numeric($contentID) && is_int(intval($contentID)) ? intval($contentID) : -2; | ||||
|             $versionID = $this->input->post('versionID'); | ||||
|             $versionID = is_numeric($versionID) && is_int(intval($versionID)) ? intval($versionID) : -2; | ||||
|  | ||||
|         $translationID = $this->input->post('translationID'); | ||||
|         $translationID = is_numeric($translationID) && is_int(intval($translationID)) ? intval($translationID) : -2; | ||||
|             $image = $this->input->post('postImage'); | ||||
|             $title = $this->input->post('postTitle'); | ||||
|             $description = $this->input->post('postDescription'); | ||||
|             $content = $this->input->post('postContent'); | ||||
|  | ||||
|         $postImage = $this->input->post('postImage'); | ||||
|         $postTitle = $this->input->post('postTitle'); | ||||
|         $postDescription = $this->input->post('postDescription'); | ||||
|         $postContent = $this->input->post('postContent'); | ||||
|             $initialRelease = $this->input->post('postPublishDate'); | ||||
|             $initialRelease = date("Y-m-d H:i:s", strtotime($initialRelease)); | ||||
|  | ||||
|         $postPublishDate = $this->input->post('postPublishDate'); | ||||
|         $postPublishDate = date("Y-m-d H:i:s", strtotime($postPublishDate)); | ||||
|             $url = $this->input->post('postUrl'); | ||||
|             $categories = $this->input->post('postCategories'); | ||||
|             $tags = $this->input->post('postTags'); | ||||
|  | ||||
|         $postUrl = $this->input->post('postUrl'); | ||||
|         $postCategory = $this->input->post('postCategory'); | ||||
|         $postTags = $this->input->post('postTags'); | ||||
|             $lang = $this->input->post('postLanguage'); | ||||
|             $lang = $lang !== NULL ? $lang : 'de'; | ||||
|  | ||||
|         $postLang = $this->input->post('postLanguage'); | ||||
|         $postLang = $postLang !== NULL ? $postLang : 'de'; | ||||
|  | ||||
|         if(strlen($postUrl) == 0) { | ||||
|             if (strlen($url) == 0) { | ||||
|                 echo json_encode(['success' => false, 'message' => 'Es wurde keine Post-URL angegeben.']); | ||||
|                 exit; | ||||
|             } | ||||
|         if(strlen($postUrl) < 4) { | ||||
|             if (strlen($url) < 4) { | ||||
|                 echo json_encode(['success' => false, 'message' => 'Die angegebene Post-URL ist zu kurz. Sie muss mindestens 4 Zeichen umfassen, um eine eindeutige Zuordnung zu ermöglichen.']); | ||||
|                 exit; | ||||
|             } | ||||
|  | ||||
|         if ($postID == -1 || $translationID == -1) { // Create new blog post | ||||
|             if ($postID == -1) { // Create new blog post | ||||
|                 if ($postID == -1) { | ||||
|                     $postID = $this->BlogModel->createNewPostDraft($_SESSION['user']['ID']); | ||||
|  | ||||
|                 if($this->BlogModel->postUrlExisting($postUrl)) { | ||||
|                     if ($this->BlogModel->postUrlExisting($url)) { | ||||
|                         echo json_encode(['success' => false, 'message' => 'Die angegebene Post-URL bereits vorhanden.']); | ||||
|                         exit; | ||||
|                     } | ||||
|                 } | ||||
|             $translationID = $this->BlogModel->createNewTranslation($postID, $postLang); | ||||
|             } | ||||
|  | ||||
|         if ($contentID < 0) { | ||||
|             $contentID = $this->BlogModel->createNewContentDraft($postID); | ||||
|             if ($versionID < 0) { | ||||
|                 $versionID = $this->BlogModel->createNewTranslationDraft($postID, $_SESSION['user']['ID'], $lang); | ||||
|             } | ||||
|  | ||||
|         $this->BlogModel->updatePostDraft($postID, $postUrl, $postCategory, $postPublishDate, $postImage); | ||||
|         $this->BlogModel->updateContentDraft($contentID, $postContent, $postLang); | ||||
|         $this->BlogModel->updateTranslation($translationID, $postTitle, $postDescription); | ||||
|             $this->BlogModel->updatePostDraft($postID, $initialRelease, $image); | ||||
|             $this->BlogModel->updateTranslationDraft($versionID, $url, $title, $description, $content, $lang); | ||||
|  | ||||
|         if(!empty($postTags)) { | ||||
|             if(!empty($categories)) { | ||||
|                 $this->BlogModel->deleteAllPostCategories($postID); | ||||
|                 foreach ($categories as $category) { | ||||
|                     if($category == 'new-category') { | ||||
|                         $name = strtolower($this->input->post('newCategoryName')); | ||||
|                         $displayname = $this->input->post('newCategoryDisplayName'); | ||||
|  | ||||
|                         $category = $this->BlogModel->createCategory($name, $displayname, 'de'); | ||||
|                         $newCategoryID = $category; | ||||
|                     } | ||||
|                     $this->BlogModel->addPostCategoryByID($postID, $category); | ||||
|                 } | ||||
|             } | ||||
|  | ||||
|             if (!empty($tags)) { | ||||
|                 $this->BlogModel->deleteAllPostTags($postID); | ||||
|             foreach ($postTags as $postTag) { | ||||
|                 foreach ($tags as $postTag) { | ||||
|                     $tagID = $this->BlogModel->createTagIfNotExists($postTag); | ||||
|                     $this->BlogModel->addPostTagByID($postID, $tagID); | ||||
|                 } | ||||
|             } | ||||
|  | ||||
|         echo json_encode(['success' => true, 'message' => 'Der Entwurf wurde erfolgreich gespeichert.', 'postID' => $postID, 'contentID' => $contentID, 'translationID' => $translationID]); | ||||
|             $result = ['success' => true, 'message' => 'Der Entwurf wurde erfolgreich gespeichert.', 'postID' => $postID, 'versionID' => $versionID]; | ||||
|             if(isset($newCategoryID)) | ||||
|                 $result['newCategoryID'] = $newCategoryID; | ||||
|             echo json_encode($result); | ||||
|         } | ||||
|  | ||||
|         public function publishPost() | ||||
| @@ -124,16 +141,16 @@ class Blog extends MY_Controller | ||||
|                 exit; | ||||
|             } | ||||
|  | ||||
|         $contentIDs = $this->input->post('contentIDs'); | ||||
|             $versionIDs = $this->input->post('versionIDs'); | ||||
|             $contentPublished = FALSE; | ||||
|         foreach ($contentIDs as $lang => $contentID) { | ||||
|             $contentID = is_numeric($contentID) && is_int(intval($contentID)) ? intval($contentID) : -2; | ||||
|             foreach ($versionIDs as $lang => $versionID) { | ||||
|                 $versionID = is_numeric($versionID) && is_int(intval($versionID)) ? intval($versionID) : -2; | ||||
|  | ||||
|             if($contentID < 0) { | ||||
|                 if ($versionID < 0) { | ||||
|                     continue; | ||||
|                 } | ||||
|  | ||||
|             $this->BlogModel->publishContentDraft($_SESSION['user']['ID'], $contentID, $postID, $lang); | ||||
|                 $this->BlogModel->publishTranslationDraft($postID, $versionID, $_SESSION['user']['ID'], $lang); | ||||
|                 $contentPublished = TRUE; | ||||
|             } | ||||
|  | ||||
| @@ -167,7 +184,8 @@ class Blog extends MY_Controller | ||||
|             echo json_encode(['status' => 'success', 'translations' => $translations]); | ||||
|         } | ||||
|  | ||||
|     public function getPost() { | ||||
|         public function getPost() | ||||
|         { | ||||
|             header('Content-Type: application/json'); | ||||
|             if (!isset($_SESSION['user']) || empty($_SESSION['user']) || $_SESSION['user']['rank'] < 6) { | ||||
|                 echo json_encode(['status' => 'error', 'message' => 'Du musst eingeloggt sein, um Blog-Posts zu verfassen.']); | ||||
| @@ -176,14 +194,14 @@ class Blog extends MY_Controller | ||||
|  | ||||
|             $postID = intval($this->input->post('postID')); | ||||
|  | ||||
|         if(!is_numeric($postID)) { | ||||
|             if (!is_numeric($postID)) { | ||||
|                 echo json_encode(['status' => 'error', 'message' => 'Es wurde eine ungültige Post-ID angegeben.']); | ||||
|                 exit; | ||||
|             } | ||||
|  | ||||
|             $postData = $this->BlogModel->getPostDataByID($postID); | ||||
|  | ||||
|         if(empty($postData)) { | ||||
|             if (empty($postData)) { | ||||
|                 echo json_encode(['status' => 'error', 'message' => 'Es wurde kein Post mit der angegebenen Post-ID gefunden.']); | ||||
|                 exit; | ||||
|             } | ||||
| @@ -191,69 +209,39 @@ class Blog extends MY_Controller | ||||
|             echo json_encode(['status' => 'success', 'postData' => $postData[0]]); | ||||
|         } | ||||
|  | ||||
|     public function getContent() { | ||||
|         public function getVersion() { | ||||
|             header('Content-Type: application/json'); | ||||
|             if (!isset($_SESSION['user']) || empty($_SESSION['user']) || $_SESSION['user']['rank'] < 6) { | ||||
|             echo json_encode(['status' => 'error', 'message' => 'Du musst eingeloggt sein, um Blog-Posts zu verfassen.']); | ||||
|                 echo json_encode(['success' => false, 'message' => 'Du musst eingeloggt sein, um Blog-Posts zu verfassen.']); | ||||
|                 exit; | ||||
|             } | ||||
|  | ||||
|             $postID = intval($this->input->post('postID')); | ||||
|         $contentID = intval($this->input->post('contentID')); | ||||
|             $versionID = intval($this->input->post('versionID')); | ||||
|             $language = $this->input->post('lang'); | ||||
|  | ||||
|         if(!is_numeric($postID)) { | ||||
|             if ($postID == 0) { | ||||
|                 echo json_encode(['status' => 'error', 'message' => 'Es wurde eine ungültige Post-ID angegeben.']); | ||||
|                 exit; | ||||
|             } | ||||
|  | ||||
|         if(!is_numeric($contentID)) { | ||||
|             echo json_encode(['status' => 'error', 'message' => 'Es wurde kein Content mit der angegebenen Content-ID gefunden.']); | ||||
|             if ($versionID == 0) { | ||||
|                 echo json_encode(['status' => 'error', 'message' => 'Es wurde keine Version mit der angegebenen Versions-ID gefunden.']); | ||||
|                 exit; | ||||
|             } | ||||
|  | ||||
|         $contentData = $this->BlogModel->getContentDataByID($postID, $contentID, $language); | ||||
|             $versionData = $this->BlogModel->getPostTranslationByID($postID, $versionID, $language); | ||||
|  | ||||
|         if(empty($contentData)) { | ||||
|             echo json_encode(['status' => 'error', 'message' => 'Es wurde kein Content mit der angegebenen Content-ID gefunden.']); | ||||
|             if (empty($versionData)) { | ||||
|                 echo json_encode(['status' => 'error', 'message' => 'Es wurde keine Version mit der angegebenen Versions-ID gefunden.']); | ||||
|                 exit; | ||||
|             } | ||||
|  | ||||
|         echo json_encode(['status' => 'success', 'contentData' => $contentData[0]]); | ||||
|             echo json_encode(array_merge(['status' => 'success'], $versionData[0])); | ||||
|         } | ||||
|  | ||||
|     public function getTranslationData() { | ||||
|         header('Content-Type: application/json'); | ||||
|         if (!isset($_SESSION['user']) || empty($_SESSION['user']) || $_SESSION['user']['rank'] < 6) { | ||||
|             echo json_encode(['status' => 'error', 'message' => 'Du musst eingeloggt sein, um Blog-Posts zu verfassen.']); | ||||
|             exit; | ||||
|         } | ||||
|  | ||||
|         $postID = intval($this->input->post('postID')); | ||||
|         $translationID = intval($this->input->post('translationID')); | ||||
|         $language = $this->input->post('lang'); | ||||
|  | ||||
|         if(!is_numeric($postID)) { | ||||
|             echo json_encode(['status' => 'error', 'message' => 'Es wurde eine ungültige Post-ID angegeben.']); | ||||
|             exit; | ||||
|         } | ||||
|  | ||||
|         if(!is_numeric($translationID)) { | ||||
|             echo json_encode(['status' => 'error', 'message' => 'Es wurde kein Übersetzung mit der angegebenen ID gefunden.']); | ||||
|             exit; | ||||
|         } | ||||
|  | ||||
|         $translationData = $this->BlogModel->getTranslationDataByID($postID, $translationID, $language); | ||||
|  | ||||
|         if(empty($translationData)) { | ||||
|             echo json_encode(['status' => 'error', 'message' => 'Es wurde kein Übersetzung mit der angegebenen ID gefunden.']); | ||||
|             exit; | ||||
|         } | ||||
|  | ||||
|         echo json_encode(['status' => 'success', 'translationData' => $translationData[0]]); | ||||
|     } | ||||
|  | ||||
|     public function getPostTags() { | ||||
|         public function getPostTags() | ||||
|         { | ||||
|             header('Content-Type: application/json'); | ||||
|             if (!isset($_SESSION['user']) || empty($_SESSION['user']) || $_SESSION['user']['rank'] < 6) { | ||||
|                 echo json_encode(['success' => false, 'message' => 'Du musst eingeloggt sein, um Blog-Posts zu verfassen.']); | ||||
| @@ -262,7 +250,7 @@ class Blog extends MY_Controller | ||||
|  | ||||
|             $postID = intval($this->input->post('postID')); | ||||
|  | ||||
|         if(!is_numeric($postID)) { | ||||
|             if (!is_numeric($postID)) { | ||||
|                 echo json_encode(['success' => false, 'message' => 'Es wurde eine ungültige Post-ID angegeben.']); | ||||
|                 exit; | ||||
|             } | ||||
| @@ -276,26 +264,20 @@ class Blog extends MY_Controller | ||||
|         { | ||||
|             if (!isset($_SESSION['user']) || empty($_SESSION['user']) || $_SESSION['user']['rank'] < 6) redirect(base_url('login')); | ||||
|  | ||||
|         $translations = ['de' => -1]; | ||||
|         $contents = ['de' => -1]; | ||||
|             $versions = ['de' => -1]; | ||||
|  | ||||
|         if(!$postID != -1) { | ||||
|             if($this->BlogModel->postIDExisting($postID)) { | ||||
|                 $postTranslations = $this->BlogModel->getPostTranslationIDs($postID); | ||||
|                 foreach ($postTranslations as $postTranslation) { | ||||
|                     $translations[$postTranslation['language']] = $postTranslation['postTranslationID']; | ||||
|                 } | ||||
|  | ||||
|                 $postContents = $this->BlogModel->getPostContentIDs($postID); | ||||
|                 foreach ($postContents as $postContent) { | ||||
|                     $contents[$postContent['language']] = $postContent['contentID']; | ||||
|             if (!$postID != -1) { | ||||
|                 if ($this->BlogModel->postIDExisting($postID)) { | ||||
|                     $postVersions = $this->BlogModel->getPostVersionIDs($postID); | ||||
|                     foreach ($postVersions as $postVersion) { | ||||
|                         $versions[$postVersion['lang']] = $postVersion['ID']; | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
|  | ||||
|             $categories = $this->BlogModel->getCategories(); | ||||
|             $this->load->view('admin/sidebar', ['title' => 'Blog-Post erstellen', 'additionalStyles' => ['lib/bootstrap-tagsinput.css', 'lib/bootstrap-tagsinput-typeahead.css']]); | ||||
|         $this->load->view('admin/blog_edit', ['categories' => $categories, 'postID' => $postID, 'contents' => $contents, 'translations' => $translations, 'postLanguage' => $lang]); | ||||
|             $this->load->view('admin/blog_edit', ['categories' => $categories, 'postID' => $postID, 'versions' => $versions, 'lang' => $lang]); | ||||
|             $this->load->view('admin/footer', ['additionalScripts' => ['lib/typeahead.bundle.min.js', 'lib/bootstrap-tagsinput.min.js', 'lib/highlight.pack.js', 'lib/quill.min.js', 'blog-edit.js']]); | ||||
|  | ||||
|         } | ||||
| @@ -305,13 +287,35 @@ class Blog extends MY_Controller | ||||
|             if (!isset($_SESSION['user']) || empty($_SESSION['user']) || $_SESSION['user']['rank'] < 6) redirect(base_url('login')); | ||||
|             if ($postID === NULL) redirect(base_url('admin/blog')); | ||||
|  | ||||
|         $content['de'] = $this->BlogModel->getAllContentVersions($postID, 'de'); | ||||
|         $content['en'] = $this->BlogModel->getAllContentVersions($postID, 'en'); | ||||
|         $content['fr'] = $this->BlogModel->getAllContentVersions($postID, 'fr'); | ||||
|             $content['de'] = $this->BlogModel->getAllPostVersions($postID, 'de'); | ||||
|             $content['en'] = $this->BlogModel->getAllPostVersions($postID, 'en'); | ||||
|             $content['fr'] = $this->BlogModel->getAllPostVersions($postID, 'fr'); | ||||
|  | ||||
|         $this->load->view('admin/sidebar', ['title' => 'Geschichte']); | ||||
|             $this->load->view('admin/sidebar', ['title' => 'Änderungen']); | ||||
|             $this->load->view('admin/blog_history', ['content' => $content]); | ||||
|         $this->load->view('admin/footer'); | ||||
|             $this->load->view('admin/footer', ['additionalScripts' => ['blog-history.js']]); | ||||
|         } | ||||
|  | ||||
|         public function history_compare($postID = NULL, $version1 = NULL, $version2 = NULL) { | ||||
|             if (!isset($_SESSION['user']) || empty($_SESSION['user']) || $_SESSION['user']['rank'] < 6) redirect(base_url('login')); | ||||
|             if ($postID === NULL) redirect(base_url('admin/blog')); | ||||
|             if ($version1 === NULL || $version2 === NULL) redirect(base_url('admin/blog/' . $postID)); | ||||
|  | ||||
|             $content[] = $this->BlogModel->getPostTranslationByHashID($version1); | ||||
|             $content[] = $this->BlogModel->getPostTranslationByHashID($version2); | ||||
|  | ||||
|             $differ = new Differ; | ||||
|             $diff['content'] = $differ->diff( | ||||
|                 htmlspecialchars(hl_tidy($content[0]['content'], 't', 'div')), | ||||
|                 htmlspecialchars(hl_tidy($content[1]['content'], 't', 'div')) | ||||
|             ); | ||||
|  | ||||
| //            var_dump($diff); | ||||
|             var_dump(htmlspecialchars($content[0]['content']), | ||||
|                 htmlspecialchars($content[1]['content'])); | ||||
|  | ||||
|             $this->load->view('admin/sidebar', ['title' => 'Vergleich']); | ||||
|             $this->load->view('admin/footer', ['additionalScripts' => ['blog-history.js']]); | ||||
|         } | ||||
|  | ||||
|         public function new_category() | ||||
| @@ -362,26 +366,27 @@ class Blog extends MY_Controller | ||||
|                 header("Content-Type: application/json"); | ||||
|                 exit; | ||||
|             } | ||||
|         $result = array_map(function($value) { | ||||
|             return $value['display_name']; | ||||
|             $result = array_map(function ($value) { | ||||
|                 return $value['displayname']; | ||||
|             }, $this->BlogModel->getAllTags()); | ||||
|             echo json_encode($result); | ||||
| //        echo json_encode($this->BlogModel->getAllTags()); | ||||
|             header("Content-Type: application/json"); | ||||
|         } | ||||
|  | ||||
|     public function updatePreview() { | ||||
|         public function updatePreview() | ||||
|         { | ||||
|             header('Content-Type: application/json'); | ||||
|         if(!$this->hasPermission('blog.create')) { | ||||
|             if (!$this->hasPermission('blog.create')) { | ||||
|                 echo json_encode(['success' => false, 'message' => 'Du hast nicht genügend Rechte, um die Vorschau anzusehen.']); | ||||
|                 exit; | ||||
|             } | ||||
|  | ||||
|         if(!isset($_POST['postTitle']) || !isset($_POST['postDesc']) || !isset($_POST['postContent'])) { | ||||
|             if (!isset($_POST['postTitle']) || !isset($_POST['postDesc']) || !isset($_POST['postContent'])) { | ||||
|                 exit; | ||||
|             } | ||||
|  | ||||
|         if(!isset($_POST['previewID'])) { | ||||
|             if (!isset($_POST['previewID'])) { | ||||
|                 $previewID = substr(md5(uniqid() . date(time())), 0, 16); | ||||
|             } else { | ||||
|                 $previewID = $_POST['previewID']; | ||||
| @@ -397,10 +402,11 @@ class Blog extends MY_Controller | ||||
|         } | ||||
|  | ||||
|  | ||||
|     public function getTemplates() { | ||||
|         public function getTemplates() | ||||
|         { | ||||
|             header('Content-Type: application/json'); | ||||
|  | ||||
|         if(!$this->hasPermission('blog.create')) { | ||||
|             if (!$this->hasPermission('blog.create')) { | ||||
|                 echo json_encode([]); | ||||
|                 exit; | ||||
|             } | ||||
| @@ -416,12 +422,13 @@ class Blog extends MY_Controller | ||||
|             echo json_encode($templates); | ||||
|         } | ||||
|  | ||||
|     public function preview() { | ||||
|         public function preview() | ||||
|         { | ||||
|             $this->neededPermission('blog.create'); | ||||
|  | ||||
|             $previewID = $_GET['id']; | ||||
|  | ||||
|         if(!isset($_SESSION['preview_' . $previewID])) { | ||||
|             if (!isset($_SESSION['preview_' . $previewID])) { | ||||
|                 redirect('admin/blog'); | ||||
|             } | ||||
|  | ||||
| @@ -430,9 +437,10 @@ class Blog extends MY_Controller | ||||
|             $this->load->view('admin/blog_post_preview', $_SESSION['preview_' . $previewID]); | ||||
|             $this->load->view('footer', ['additionalScripts' => ['lib/prism.js', 'blog.js']]); | ||||
|         } | ||||
| } | ||||
|     } | ||||
|  | ||||
| class Template { | ||||
|     class Template | ||||
|     { | ||||
|         public $title; | ||||
|         public $desc; | ||||
|         public $content; | ||||
| @@ -449,4 +457,4 @@ class Template { | ||||
|             $this->desc = $desc; | ||||
|             $this->content = $content; | ||||
|         } | ||||
| } | ||||
|     } | ||||
|   | ||||
| @@ -16,7 +16,7 @@ | ||||
|             $this->neededPermission('projects.view'); | ||||
|  | ||||
|             $entries = $this->ProjectsModel->getEntries('all'); | ||||
|             $categories = $this->ProjectsModel->getCategories('all'); | ||||
|             $categories = $this->ProjectsModel->getCategoriesRaw('all'); | ||||
|  | ||||
|             $this->load->view('admin/sidebar', ['title' => 'Projekte verwalten']); | ||||
|             $this->load->view('admin/projects', ['entries' => $entries, 'categories' => $categories]); | ||||
|   | ||||
| @@ -127,8 +127,8 @@ class Users extends MY_Controller | ||||
|                 'displayname' => $userData['displayname'], | ||||
|                 'email' => $userData['email'], | ||||
|                 'rank' => $userData['rank'], | ||||
|                 'profile_picture' => $userData['profile_picture'], | ||||
|                 'header_image' => $userData['header_image'], | ||||
|                 'profilePicture' => $userData['profilePicture'], | ||||
|                 'headerImage' => $userData['headerImage'], | ||||
|                 'social_networks' => $userData['social_networks'], | ||||
|                 'showAds' => $userData['showAds'], | ||||
|                 'about' => $userData['about'], | ||||
|   | ||||
| @@ -81,7 +81,9 @@ | ||||
|         'Du hast uns leider keinen Inhalt angegeben, den wir veröffentlichen können.', | ||||
|         'Sollte es sich dabei um ein Irrtum handeln, so kontaktiere uns bitte über das Kontakt-Formular.', | ||||
|     ]; | ||||
|     $lang['post_success_title'] = ''; | ||||
|     $lang['post_success_title'] = 'Dein Post wurde erfolgreich veröffentlicht!'; | ||||
|     $lang['post_success_lines'] = [ | ||||
|         '', | ||||
|         'Möchtest du nun deine Posts ansehen?' | ||||
|     ]; | ||||
|     $lang['post_success_yes'] = 'Ja, Posts ansehen'; | ||||
|     $lang['post_success_no'] = 'Nein'; | ||||
|   | ||||
							
								
								
									
										7
									
								
								application/language/fr/projects_lang.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								application/language/fr/projects_lang.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,7 @@ | ||||
| <?php | ||||
|     /** | ||||
|      * Created by PhpStorm. | ||||
|      * User: tetri | ||||
|      * Date: 05.01.2019 | ||||
|      * Time: 17:46 | ||||
|      */ | ||||
| @@ -16,101 +16,215 @@ | ||||
|             $this->load->model('UserModel', '', TRUE); | ||||
|         } | ||||
|  | ||||
|         function transfer() { | ||||
|             $data = $this->db->query('SELECT * FROM kingofdog.blog_posts')->result_array(); | ||||
|             foreach ($data as $item) { | ||||
|                 extract($item); | ||||
| //                $this->db->query('INSERT INTO kingofdog_new.blog_post_versions (postID, lang, active, title, description, content, contentWordsCount, authorID, changes, edited) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)', [ | ||||
| //                    $postID, $language, $isActive, "", "", $content, $wordCount, $contentAuthorID, $versionMessage, $contentDate | ||||
| //                ]); | ||||
| //                $this->db->query('UPDATE kingofdog_new.blog_post_versions SET title = ?, description = ? WHERE postID = ? AND lang = ?', [ | ||||
| //                    $postTitle, $postDesc, $postID, $language | ||||
| //                ]); | ||||
| //                $this->db->query('UPDATE kingofdog_new.blog_post_versions SET url = ? WHERE postID = ?', [$postUrl, $postID]); | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         private function getPostIDByUrl($url) { | ||||
|             $data = $this->db->query('SELECT postID FROM blog_post_versions WHERE url = ? AND lang = ? AND active ORDER BY edited DESC LIMIT 1', [$url, $_SESSION['site_lang']])->result_array(); | ||||
|             return !empty($data) ? $data[0]['postID'] : NULL; | ||||
|         } | ||||
|  | ||||
|         function getAllPosts($search, $amount, $offset = 0) | ||||
|         { | ||||
|             $offset *= $amount; | ||||
|             if ($search !== '') { | ||||
|                 $search = strtolower($search); | ||||
|                 $posts = $this->db->query(' | ||||
| SELECT | ||||
|   p.*, | ||||
|   ca.name                    categoryName, | ||||
|   ca.display_name            categoryDisplayName, | ||||
|   (SELECT count(*) | ||||
|    FROM blog_comments | ||||
|    WHERE post_id = p.postID) commentCount, | ||||
|   (SELECT count(*) | ||||
|    FROM blog_post_likes | ||||
|    WHERE post_id = p.postID) likeCount, | ||||
|    (SELECT wordCount FROM blog_content c WHERE c.postID = p.postID AND isActive = TRUE AND c.language = ? ORDER BY c.contentDate DESC LIMIT 1) wordCount | ||||
| FROM blog_posts p, blog_categories ca | ||||
| WHERE ca.id = p.postCategoryID | ||||
|       AND (CONCAT((SELECT t.postTitle FROM blog_translations t WHERE t.postID = p.postID AND language = ?), postUrl, (SELECT t.postDesc FROM blog_translations t WHERE t.postID = p.postID AND language = ?)) RLIKE ? | ||||
|            OR (SELECT content | ||||
|                FROM blog_content | ||||
|                WHERE blog_content.postID = p.postID AND isActive = TRUE | ||||
|                LIMIT 1) RLIKE ?) | ||||
|       AND postState = 1 | ||||
| ORDER BY postPublishDate DESC | ||||
| LIMIT ? OFFSET ?', [$_SESSION['site_lang'], $_SESSION['site_lang'], $_SESSION['site_lang'], $search, $search, $amount, $offset])->result_array(); | ||||
|                   SELECT | ||||
|                     p.* | ||||
|                   FROM blog_post p | ||||
|                   WHERE ((SELECT LOWER(title) RLIKE ? OR LOWER(description) RLIKE ? OR LOWER(content) RLIKE ? FROM blog_post_versions WHERE postID = p.ID AND lang = ?) | ||||
|                            OR (SELECT LOWER(displayname) RLIKE ? FROM blog_categories c WHERE c.lang = ? AND c.categoryID IN (SELECT categoryID FROM blog_post_categories pc WHERE pc.postID = p.ID))) | ||||
|                         AND state = 1 | ||||
|                   ORDER BY initialRelease DESC | ||||
|                   LIMIT ? OFFSET ?', [$search, $search, $search, $_SESSION['site_lang'], $search, $_SESSION['site_lang'], $amount, $offset])->result_array(); | ||||
|             } else { | ||||
|                 $posts = $this->db->query(' | ||||
|             SELECT p.*, | ||||
|               ca.name categoryName, | ||||
|               ca.display_name categoryDisplayName, | ||||
|               (SELECT count(*) FROM blog_comments WHERE post_id = p.postID) commentCount, | ||||
|               (SELECT count(*) FROM blog_post_likes WHERE post_id = p.postID) likeCount, | ||||
|               (SELECT wordCount FROM blog_content c WHERE c.postID = p.postID AND isActive = TRUE AND c.language = ? ORDER BY c.contentDate DESC LIMIT 1) wordCount | ||||
|             FROM blog_posts p, blog_categories ca | ||||
|             WHERE ca.id = p.postCategoryID | ||||
|             AND postState = 1  | ||||
|             ORDER BY postPublishDate DESC | ||||
|             LIMIT ? OFFSET ?', [$_SESSION['site_lang'], $amount, $offset])->result_array(); | ||||
|                   SELECT * | ||||
|                   FROM blog_post | ||||
|                   WHERE state = 1  | ||||
|                   ORDER BY initialRelease DESC | ||||
|                   LIMIT ? OFFSET ?', [$amount, $offset])->result_array(); | ||||
|             } | ||||
|             $posts = $this->mergePostTitleDesc($posts); | ||||
|             $posts = $this->mergePostTranslation($posts); | ||||
|             $posts = $this->mergePostCategories($posts); | ||||
|             $posts = $this->mergePostStats($posts); | ||||
|             $posts = $this->mergePostAuthorData($posts); | ||||
|             return $posts; | ||||
|         } | ||||
|  | ||||
|         public function mergePostTranslation($posts, $content = FALSE, $language = NULL, $indexID = 'ID') | ||||
|         { | ||||
|             $language = ($language == NULL ? $_SESSION['site_lang'] : $language); | ||||
|             foreach ($posts as $i => $post) { | ||||
|                 $translationData = $this->getPostTranslation($post[$indexID], $content, $language); | ||||
|                 if(isset($translationData['error']) && $translationData['error']) { | ||||
|                     unset($posts[$i]); | ||||
|                     continue; | ||||
|                 } | ||||
|                 $posts[$i] += $translationData; | ||||
|             } | ||||
|             return $posts; | ||||
|         } | ||||
|  | ||||
|         private function mergePostCategories($posts, $language = NULL) | ||||
|         { | ||||
|             $language = $language == NULL ? $_SESSION['site_lang'] : $language; | ||||
|             foreach ($posts as $i => $post) { | ||||
|                 $categories = $this->getPostCategories($post['ID'], $language); | ||||
|                 $posts[$i]['categories'] = $categories; | ||||
|             } | ||||
|             return $posts; | ||||
|         } | ||||
|  | ||||
|         private function getPostCategories($postID, $language) | ||||
|         { | ||||
|             $data = $this->db->query('SELECT ID, name, displayname FROM blog_categories WHERE categoryID IN (SELECT categoryID FROM blog_post_categories WHERE postID = ?) AND lang = ?', [$postID, $language])->result_array(); | ||||
|             return $data; | ||||
|         } | ||||
|  | ||||
|         private function mergePostStats($posts, $language = NULL) | ||||
|         { | ||||
|             $language = $language == NULL ? $_SESSION['site_lang'] : $language; | ||||
|             foreach ($posts as $i => $post) { | ||||
|                 $stats = $this->getPostStats($post['ID'], $language); | ||||
|                 $posts[$i] += $stats; | ||||
|             } | ||||
|             return $posts; | ||||
|         } | ||||
|  | ||||
|         private function mergePostState($posts) { | ||||
|             $states = [ | ||||
|                 1 => "Veröffentlicht", | ||||
|                 2 => "Entwurf", | ||||
|                 3 => "Geplant", | ||||
|                 4 => "Im Papierkorb", | ||||
|             ]; | ||||
|             foreach ($posts as $i => $post) { | ||||
|                 $posts[$i]['stateName'] = $states[$post['state']]; | ||||
|             } | ||||
|             return $posts; | ||||
|         } | ||||
|  | ||||
|         private function getPostStats($postID, $language) | ||||
|         { | ||||
|             $comments = $this->db->query('SELECT COUNT(*) count FROM blog_post_comments WHERE postID = ?', [$postID])->result_array()[0]['count']; | ||||
|             $likes = $this->db->query('SELECT COUNT(*) count FROM blog_post_likes WHERE postID = ?', [$postID])->result_array()[0]['count']; | ||||
|             $words = $this->db->query('SELECT contentWordsCount count FROM blog_post_versions WHERE postID = ? AND active AND lang = ?', [$postID, $language])->result_array(); | ||||
|  | ||||
|             $words = empty($words) ? 0 : $words[0]['count']; | ||||
|  | ||||
|             return [ | ||||
|                 'commentCount' => $comments, | ||||
|                 'likeCount' => $likes, | ||||
|                 'wordCount' => $words, | ||||
|             ]; | ||||
|         } | ||||
|  | ||||
|         private function mergePostAuthorData($posts) | ||||
|         { | ||||
|             foreach ($posts as $i => $post) { | ||||
|                 $authorData = $this->getAuthorData($post['authorID']); | ||||
|                 $posts[$i]['author'] = $authorData; | ||||
|             } | ||||
|             return $posts; | ||||
|         } | ||||
|  | ||||
|         public function getAuthorData($authorID) | ||||
|         { | ||||
|             $author = $this->db->query('SELECT u.ID, u.username, u.displayname, u.rank, s.profilePicture, s.headerImage, s.about FROM users u LEFT JOIN user_settings s ON u.ID = s.ID WHERE u.ID = ?', [$authorID])->result_array(); | ||||
|  | ||||
|             $author = $this->UserModel->setDefaultImages($author); | ||||
|  | ||||
|             if (empty($author)) { | ||||
|                 return null; | ||||
|             } | ||||
|             return $author[0]; | ||||
|         } | ||||
|  | ||||
|         public function getPostPageCount($search, $postsPerPage) | ||||
|         { | ||||
|             if ($search !== '') { | ||||
|                 $search = strtolower($search); | ||||
|                 $data = $this->db->query(' | ||||
| SELECT COUNT(*) pageCount | ||||
| FROM blog_posts p, blog_categories ca | ||||
| WHERE ca.id = p.postCategoryID | ||||
| AND (CONCAT((SELECT t.postTitle FROM blog_translations t WHERE t.postID = p.postID AND language = ?), postUrl, (SELECT t.postDesc FROM blog_translations t WHERE t.postID = p.postID AND language = ?)) RLIKE ?  | ||||
| OR (SELECT content FROM blog_content WHERE blog_content.postID = p.postID AND isActive = TRUE LIMIT 1) RLIKE ?) | ||||
| AND postState = 1', [$_SESSION['site_lang'], $_SESSION['site_lang'], $search, $search])->result_array(); | ||||
|                   SELECT COUNT(*) pageCount | ||||
|                   FROM blog_post p | ||||
|                   WHERE ((SELECT LOWER(title) RLIKE ? OR LOWER(description) RLIKE ? OR LOWER(content) RLIKE ? FROM blog_post_versions v WHERE v.postID = p.ID AND v.lang = ? AND active) | ||||
|                            OR (SELECT LOWER(displayname) RLIKE ? FROM blog_categories c WHERE c.lang = ? AND c.categoryID IN (SELECT categoryID FROM blog_post_categories pc WHERE pc.postID = p.ID))) | ||||
|                   AND state = 1', [$search, $search, $_SESSION['site_lang'], $search, $_SESSION['site_lang']])->result_array(); | ||||
|             } else { | ||||
|                 $data = $this->db->query('SELECT COUNT(*) pageCount FROM blog_posts')->result_array(); | ||||
|                 $data = $this->db->query('SELECT COUNT(*) pageCount FROM blog_post')->result_array(); | ||||
|             } | ||||
|             return ($data[0]['pageCount']) / $postsPerPage; | ||||
|         } | ||||
|  | ||||
|         function getCategoryPosts($category, $amount, $offset = 0) | ||||
|         { | ||||
|             $category = $this->db->query('SELECT ID FROM blog_categories WHERE name = ? AND lang = ?', [$category, $_SESSION['site_lang']])->result_array(); | ||||
|  | ||||
|             if(empty($category)) { | ||||
|                 return NULL; | ||||
|             } | ||||
|  | ||||
|             $offset *= $amount; | ||||
|             $posts = $this->db->query(' | ||||
|         SELECT p.*, ca.name categoryName, ca.display_name categoryDisplayName, (SELECT count(*) FROM blog_comments WHERE post_id = p.postID) commentCount, (SELECT count(*) FROM blog_post_likes WHERE post_id = p.postID) likeCount | ||||
|         FROM blog_posts p, blog_categories ca | ||||
|         WHERE ca.id = p.postCategoryID | ||||
|         AND postState = 1  | ||||
|         AND ca.name = ?  | ||||
|         ORDER BY postPublishDate DESC | ||||
|         LIMIT ? OFFSET ?', [$category, $amount, $offset])->result_array(); | ||||
|             $posts = $this->mergePostTitleDesc($posts); | ||||
|             $posts = $this->db->query('SELECT * FROM blog_post p WHERE ID IN (SELECT postID FROM blog_post_categories pc WHERE pc.categoryID = ?) LIMIT ? OFFSET ?', [$category[0]['ID'], $amount, $offset])->result_array(); | ||||
|             $posts = $this->mergePostTranslation($posts); | ||||
|             $posts = $this->mergePostCategories($posts); | ||||
|             $posts = $this->mergePostStats($posts); | ||||
|             $posts = $this->mergePostAuthorData($posts); | ||||
|             return $posts; | ||||
|         } | ||||
|  | ||||
|         public function getCategoryPostsByID($categoryID, $amount = 3, $postID = NULL) | ||||
|         public function getCategoryPostsByID($categories, $amount = 3, $postID = NULL) | ||||
|         { | ||||
|             $posts = $this->db->query('SELECT * FROM blog_posts WHERE postCategoryID = ? AND postID != ? AND blog_posts.postState = 1 ORDER BY postPublishDate DESC LIMIT ?', [$categoryID, $postID, $amount])->result_array(); | ||||
|             return $this->mergePostTitleDesc($posts); | ||||
|             function getIDs($val) { | ||||
|                 return $val['ID']; | ||||
|             } | ||||
|  | ||||
|         public function getTagPosts($tag, $amount, $offset = 0) { | ||||
|             if(empty($categories)) { | ||||
|                 return NULL; | ||||
|             } | ||||
|  | ||||
|             $categories = array_map('getIDs', $categories); | ||||
|  | ||||
|             $posts = $this->db->query('SELECT * FROM blog_post WHERE ID IN (SELECT postID FROM blog_post_categories WHERE categoryID IN ?) AND ID != ? AND state = 1 ORDER BY initialRelease DESC LIMIT ?', [$categories, $postID, $amount])->result_array(); | ||||
|             $posts = $this->mergePostTranslation($posts); | ||||
|             return $posts; | ||||
|         } | ||||
|  | ||||
|         public function getTagPosts($tag, $amount, $offset = 0) | ||||
|         { | ||||
|             $offset *= $amount; | ||||
|             $posts = $this->db->query('SELECT p.*, ca.name categoryName, ca.display_name categoryDisplayName, (SELECT count(*) FROM blog_comments WHERE post_id = p.postID) commentCount, (SELECT count(*) FROM blog_post_likes WHERE post_id = p.postID) likeCount FROM blog_posts p LEFT JOIN blog_categories ca ON ca.ID = p.postCategoryID WHERE postState = 1 AND EXISTS(SELECT post_id FROM blog_post_tags WHERE tag_id = (SELECT ID FROM blog_tags t WHERE t.name = ?) AND post_id = p.postID) ORDER BY postPublishDate DESC LIMIT ? OFFSET ?', [$tag, $amount, $offset])->result_array(); | ||||
|             $posts = $this->mergePostTitleDesc($posts); | ||||
|             $tag = strtolower($tag); | ||||
|             $tagID = $this->db->query('SELECT ID FROM blog_tags WHERE name = ? AND lang = ?', [$tag, $_SESSION['site_lang']])->result_array(); | ||||
|  | ||||
|             if(empty($tagID)) { | ||||
|                 return; | ||||
|             } | ||||
|  | ||||
|             $posts = $this->db->query('SELECT * FROM blog_post p WHERE state = 1 AND ID IN (SELECT postID FROM blog_post_tags WHERE tagID = ?) ORDER BY initialRelease DESC LIMIT ? OFFSET ?', [$tagID[0]['ID'], $amount, $offset])->result_array(); | ||||
|             $posts = $this->mergePostTranslation($posts); | ||||
|             $posts = $this->mergePostCategories($posts); | ||||
|             $posts = $this->mergePostStats($posts); | ||||
|             $posts = $this->mergePostAuthorData($posts); | ||||
|             return $posts; | ||||
|         } | ||||
|  | ||||
|         function getCategoryIDAfterInsert($name, $display_name) | ||||
|         { | ||||
|             if (!$this->db->simple_query('INSERT INTO blog_categories (name, display_name) VALUES (?, ?)', [$name, $display_name])) { | ||||
|                 $return = $this->db->query('SELECT ID FROM blog_categories WHERE name = ? AND display_name = ? LIMIT 1', [$name, $display_name])->result_array()[0]; | ||||
|             if (!$this->db->simple_query('INSERT INTO blog_categories (name, displayname) VALUES (?, ?)', [$name, $display_name])) { | ||||
|                 $return = $this->db->query('SELECT ID FROM blog_categories WHERE name = ? AND displayname = ? LIMIT 1', [$name, $display_name])->result_array()[0]; | ||||
|                 $return = $return['ID']; | ||||
|             } else { | ||||
|                 $return = $this->db->query('SELECT LAST_INSERT_ID() ID')->result_array()[0]['ID']; | ||||
| @@ -120,7 +234,9 @@ AND postState = 1', [$_SESSION['site_lang'], $_SESSION['site_lang'], $search, $s | ||||
|  | ||||
|         function incrementViews($id) | ||||
|         { | ||||
|             $this->db->query('UPDATE blog_posts SET postViews = postViews+1 WHERE postID = ?', [$id]); | ||||
|             $this->db->query('INSERT IGNORE INTO blog_post_stats (ID) VALUES (?)', [$id]); | ||||
|  | ||||
|             $this->db->query('UPDATE blog_post_stats SET views = views + 1 WHERE ID = ?', [$id]); | ||||
|             $this->db->cache_delete('admin', 'blog'); | ||||
|         } | ||||
|  | ||||
| @@ -135,172 +251,157 @@ AND postState = 1', [$_SESSION['site_lang'], $_SESSION['site_lang'], $search, $s | ||||
|         public function getPost($postUrl) | ||||
|         { | ||||
|             $content = $this->db->query(' | ||||
|         SELECT p.*,  | ||||
|             ca.name categoryName,  | ||||
|             ca.display_name categoryDisplayName,  | ||||
|             COUNT(co.comment) commentCount,  | ||||
|             (SELECT count(*) FROM blog_post_likes l WHERE l.post_id = p.postID) likeCount | ||||
|         FROM blog_posts p | ||||
|             LEFT JOIN blog_categories ca ON p.postCategoryID = ca.ID  | ||||
|             LEFT JOIN blog_comments co ON p.postID = co.post_id  | ||||
|             LEFT JOIN blog_post_likes l ON p.postID = l.post_id  | ||||
|         WHERE postUrl = ? AND postState = 1 | ||||
|         GROUP BY p.postID', [$postUrl])->result_array(); //TODO: language integration | ||||
|               SELECT p.*  | ||||
|               FROM blog_post p | ||||
|               WHERE (SELECT postID FROM blog_post_versions v WHERE v.postID = p.ID AND (v.lang = ? OR v.lang = "de") AND active AND url = ? ORDER BY edited DESC LIMIT 1) = p.ID AND state = 1 | ||||
|               GROUP BY ID', [$_SESSION['site_lang'], $postUrl])->result_array(); //TODO: language integration | ||||
|  | ||||
|             $content = $this->mergePostTitleDesc($content); | ||||
|             $content = $this->mergePostTranslation($content, true); | ||||
|             $content = $this->mergePostStats($content); | ||||
|             $content = $this->mergePostCategories($content); | ||||
|             $content = $this->mergePostAuthorData($content); | ||||
|             $content = $this->mergePostContent($content, $_SESSION['site_lang']); | ||||
|             return $content[0]; | ||||
|         } | ||||
|  | ||||
|         public function getPostDataByID($postID) | ||||
|         { | ||||
|             $data = $this->db->query(' | ||||
|         SELECT p.*,  | ||||
|             ca.name AS categoryName, | ||||
|             ca.display_name AS categoryDisplayName,  | ||||
|             COUNT(co.comment) AS commentCount,  | ||||
|             COUNT(l.post_id) AS likeCount  | ||||
|         FROM blog_posts p | ||||
|             LEFT JOIN blog_categories ca ON p.postCategoryID = ca.ID  | ||||
|             LEFT JOIN blog_comments co ON p.postID = co.post_id  | ||||
|             LEFT JOIN blog_post_likes l ON p.postID = l.post_id  | ||||
|         WHERE postID = ? | ||||
|         GROUP BY p.postID', [$postID])->result_array(); | ||||
|               SELECT * | ||||
|               FROM blog_post | ||||
|               WHERE ID = ?', [$postID])->result_array(); | ||||
|  | ||||
|             $data = $this->mergePostCategories($data); | ||||
|  | ||||
|             return $data; | ||||
|         } | ||||
|  | ||||
|         public function getContentDataByID($postID, $contentID, $lang) | ||||
|         { | ||||
|             $data = $this->db->query('SELECT * FROM blog_content WHERE postID = ? AND contentID = ? AND language = ?', [$postID, $contentID, $lang])->result_array(); | ||||
|             return $data; | ||||
|         } | ||||
|  | ||||
|         public function getTranslationDataByID($postID, $translationID, $lang) | ||||
|         { | ||||
|             $data = $this->db->query('SELECT * FROM blog_translations WHERE postID = ? AND postTranslationID = ? AND language = ?', [$postID, $translationID, $lang])->result_array(); | ||||
|             return $data; | ||||
|         } | ||||
|  | ||||
|         private function getPostContentByID($postID, $language) | ||||
|         { | ||||
|             $content = $this->db->query('SELECT * FROM blog_content WHERE postID = ? AND isActive = TRUE AND language = ? ORDER BY contentDate DESC LIMIT 1', [$postID, $language])->result_array(); | ||||
|             return $content; | ||||
|         } | ||||
|  | ||||
|         public function getRandomPosts($postID) | ||||
|         { | ||||
|             $posts = $this->db->query('SELECT * FROM blog_posts WHERE postID <> ? AND postState = 1 ORDER BY RAND() LIMIT 3', [$postID])->result_array(); | ||||
|             $posts = $this->mergePostTitleDesc($posts); | ||||
|             $posts = $this->db->query('SELECT * FROM blog_post WHERE ID <> ? AND state = 1 ORDER BY RAND() LIMIT 3', [$postID])->result_array(); | ||||
|             $posts = $this->mergePostTranslation($posts); | ||||
|             $posts = $this->mergePostAuthorData($posts); | ||||
|             return $posts; | ||||
|         } | ||||
|  | ||||
|         public function mergePostTitleDesc($posts, $language = NULL) | ||||
|         public function getPostTranslation($postID, $showContent, $language) | ||||
|         { | ||||
|             $language = ($language == NULL ? $_SESSION['site_lang'] : $language); | ||||
|             foreach ($posts as $i => $post) { | ||||
|                 $titleDesc = $this->getPostTitleDesc($post['postID'], $language); | ||||
|                 $posts[$i]['postTitle'] = $titleDesc['title']; | ||||
|                 $posts[$i]['postDesc'] = $titleDesc['desc']; | ||||
|             } | ||||
|             return $posts; | ||||
|         } | ||||
|             $data = $this->db->query('SELECT * FROM blog_post_versions WHERE postID = ? AND active ORDER BY lang ASC', [$postID])->result_array(); | ||||
|  | ||||
|         private function mergePostAuthorData($posts) | ||||
|         { | ||||
|             foreach ($posts as $i => $post) { | ||||
|                 $authorData = $this->getAuthorData($post['postAuthorID']); | ||||
|                 $posts[$i]['postAuthorDisplayname'] = $authorData['displayname']; | ||||
|                 $posts[$i]['postAuthorUsername'] = $authorData['username']; | ||||
|                 $posts[$i]['postAuthorProfilePicture'] = $authorData['profile_picture']; | ||||
|                 $posts[$i]['postAuthorHeaderImage'] = $authorData['header_image']; | ||||
|                 $posts[$i]['postAuthorRank'] = $authorData['rank']; | ||||
|                 $posts[$i]['postAuthorAbout'] = $authorData['about']; | ||||
|             } | ||||
|             return $posts; | ||||
|         } | ||||
|  | ||||
|         private function mergePostContent($posts, $language) | ||||
|         { | ||||
|             $language = ($language == NULL ? $_SESSION['site_lang'] : $language); | ||||
|             foreach ($posts as $i => $post) { | ||||
|                 $content = $this->getPostContentByID($post['postID'], $language); | ||||
|                 if (empty($content) && $_SESSION['site_lang'] !== 'de') { | ||||
|                     $content = $this->getPostContentByID($post['postID'], 'de'); | ||||
|                 } | ||||
|                 if (!empty($content)) { | ||||
|                     $content = $content[0]; | ||||
|                     $posts[$i]['postContent'] = $content['content']; | ||||
|                     $posts[$i]['postWordCount'] = $content['wordCount']; | ||||
|                 } | ||||
|             } | ||||
|             return $posts; | ||||
|         } | ||||
|  | ||||
|         public function getPostTitleDesc($postID, $language) | ||||
|         { | ||||
|             $data = $this->db->query('SELECT * FROM blog_translations WHERE postID = ? ORDER BY blog_translations.language ASC', [$postID])->result_array(); | ||||
|             if (empty($data)) { | ||||
|                 return ['title' => 'Nicht vorhandener Post', 'desc' => 'Aus unbekannten Gründen ist dieser Blog-Post nicht vorhanden. Bitte versuche es später erneut oder kontaktiere das Support-Team']; | ||||
|                 return ['error' => true, 'title' => 'Nicht vorhandener Post', 'description' => 'Aus unbekannten Gründen ist dieser Blog-Post nicht vorhanden. Bitte versuche es später erneut oder kontaktiere das Support-Team']; | ||||
|             } | ||||
|             $postTitle = $data[0]['postTitle']; | ||||
|             $postDesc = $data[0]['postDesc']; | ||||
|  | ||||
|             $url = $data[0]['url']; | ||||
|             $title = $data[0]['title']; | ||||
|             $description = $data[0]['description']; | ||||
|             $content = $data[0]['content']; | ||||
|             foreach ($data as $row) { | ||||
|                 if ($row['language'] == $language) { | ||||
|                     $postTitle = $row['postTitle']; | ||||
|                     $postDesc = $row['postDesc']; | ||||
|                 if ($row['lang'] == $language) { | ||||
|                     $url = $row['url']; | ||||
|                     $title = $row['title']; | ||||
|                     $description = $row['description']; | ||||
|                     $content = $row['content']; | ||||
|                     break; | ||||
|                 } | ||||
|             } | ||||
|             return ['title' => $postTitle, 'desc' => $postDesc]; | ||||
|  | ||||
|             $return = [ | ||||
|                 'url' => $url, | ||||
|                 'title' => $title, | ||||
|                 'description' => $description, | ||||
|             ]; | ||||
|             if($showContent) { | ||||
|                 $return['content'] = $content; | ||||
|             } | ||||
|  | ||||
|         public function getAuthorData($authorID) | ||||
|         { | ||||
|             $author = $this->db->query('SELECT ID, username, displayname, rank, profile_picture, header_image, about FROM users WHERE ID = ?', [$authorID])->result_array(); | ||||
|  | ||||
|             $author = $this->UserModel->setDefaultImages($author); | ||||
|  | ||||
|             if(empty($author)) { | ||||
|                 return null; | ||||
|             return $return; | ||||
|         } | ||||
|             return $author[0]; | ||||
|  | ||||
|         public function getPostTranslationByID($postID, $versionID, $lang) { | ||||
|             $data = $this->db->query('SELECT * FROM blog_post_versions WHERE postID = ? AND ID = ? AND lang = ?', [$postID, $versionID, $lang])->result_array(); | ||||
|             return $data; | ||||
|         } | ||||
|  | ||||
|         public function getPostTranslationByHashID($versionID) { | ||||
|             $data = $this->db->query('SELECT * FROM blog_post_versions WHERE MD5(ID) = ?', [$versionID])->result_array(); | ||||
|             return !empty($data) ? $data[0] : NULL; | ||||
|         } | ||||
|  | ||||
|         public function getComments($postID) | ||||
|         { | ||||
|             $comments = $this->db->query('SELECT * FROM blog_comments WHERE post_id = ? ORDER BY date_created DESC', [$postID])->result_array(); | ||||
|             $comments = $this->db->query('SELECT * FROM blog_post_comments WHERE postID = ? ORDER BY date DESC', [$postID])->result_array(); | ||||
|             return $comments; | ||||
|         } | ||||
|  | ||||
|         public function getCommentsByUrl($postUrl) | ||||
|         { | ||||
|             return $this->db->query('SELECT * FROM blog_comments WHERE post_id = (SELECT postID FROM blog_posts WHERE postUrl = ?) ORDER BY date_created DESC', [$postUrl])->result_array(); | ||||
|             $ID = $this->getPostIDByUrl($postUrl); | ||||
|             if($ID !== NULL) { | ||||
|                 return $this->getComments($ID); | ||||
|             } else { | ||||
|                 return NULL; | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         public function addComment($postID, $userID, $comment, $reply, $replyTo) | ||||
|         { | ||||
|             $this->db->query('INSERT INTO blog_comments (post_id, user_id, comment, reply, replyTo_id) VALUES (?, ?, ?, ?, ?)', [$postID, $userID, $comment, $reply, $replyTo]); | ||||
|         public function getComment($commentID) { | ||||
|             $comment = $this->db->query('SELECT * FROM blog_post_comments WHERE ID = ?', [$commentID])->result_array(); | ||||
|             return !empty($comment) ? $comment[0] : NULL; | ||||
|         } | ||||
|  | ||||
|         public function isCommentIDValid($commentID) { | ||||
|             $comment = $this->db->query('SELECT ID FROM blog_post_comments WHERE ID = ?', [$commentID])->result_array(); | ||||
|             return !empty($comment); | ||||
|         } | ||||
|  | ||||
|         public function addCommentByUrl($postUrl, $userID, $comment, $replyTo) | ||||
|         { | ||||
|             $postID = $this->getPostIDByUrl($postUrl); | ||||
|  | ||||
|             if($postID == NULL) { | ||||
|                 return null; | ||||
|             } | ||||
|  | ||||
|             $this->addComment($postID, $userID, $comment, $replyTo); | ||||
|  | ||||
|             return $this->db->query('SELECT * FROM blog_post_comments WHERE postID = ? AND userID = ? ORDER BY ID DESC LIMIT 1', [$postID, $userID])->result_array()[0]; | ||||
|         } | ||||
|  | ||||
|         public function addComment($postID, $userID, $comment, $replyTo) | ||||
|         { | ||||
|             $this->db->query('INSERT INTO blog_post_comments (postID, userID, comment, replyToID) VALUES (?, ?, ?, ?)', [$postID, $userID, $comment, $replyTo]); | ||||
|  | ||||
|             $this->db->cache_delete('user', 'getComments'); | ||||
|             $this->db->cache_delete('blog', 'index'); | ||||
|             $this->db->cache_delete('blog', 'post'); | ||||
|             $this->db->cache_delete('blog', 'comment'); | ||||
|             $this->db->cache_delete('blog', 'getComments'); | ||||
|             $this->db->cache_delete('blog', 'getReportModal'); | ||||
|             $this->db->cache_delete('blog', 'reportModal'); | ||||
|             $this->db->cache_delete('blog', 'getDeleteModal'); | ||||
|             $this->db->cache_delete('blog', 'deleteComment'); | ||||
|             $this->db->cache_delete('admin', 'blog'); | ||||
|         } | ||||
|  | ||||
|         public function addCommentByUrl($postUrl, $userID, $comment, $reply, $replyTo) | ||||
|         { | ||||
|             $postID = $this->db->query('SELECT postID FROM blog_posts WHERE postUrl = ?', [$postUrl])->result_array(); | ||||
|             if(empty($postID)) { | ||||
|                 return null; | ||||
|         public function reportComment($commentID, $reason, $reasonText) { | ||||
|             $this->db->query('INSERT INTO blog_post_comments_reports (commentID, reason, reasonText) VALUES (?, ?, ?)', [$commentID, $reason, $reasonText]); | ||||
|  | ||||
|             $this->db->cache_delete('admin', 'blog'); | ||||
|         } | ||||
|  | ||||
|             $this->addComment($postID[0]['postID'], $userID, $comment, $reply, $replyTo); | ||||
|         public function deleteComment($userID, $commentID) { | ||||
|             $this->db->query('DELETE FROM blog_post_comments WHERE replyToID = ?', [$commentID]); | ||||
|             $this->db->query('DELETE FROM blog_post_comments WHERE userID = ? AND ID = ?', [$userID, $commentID]); | ||||
|  | ||||
|             return $this->db->query('SELECT * FROM blog_comments WHERE post_id = ? AND user_id = ? ORDER BY ID DESC LIMIT 1', [$postID[0]['postID'], $userID])->result_array()[0]; | ||||
|             $this->db->cache_delete('user', 'getComments'); | ||||
|             $this->db->cache_delete('blog', 'index'); | ||||
|             $this->db->cache_delete('blog', 'post'); | ||||
|             $this->db->cache_delete('blog', 'comment'); | ||||
|             $this->db->cache_delete('blog', 'getComments'); | ||||
|             $this->db->cache_delete('blog', 'getReportModal'); | ||||
|             $this->db->cache_delete('blog', 'reportModal'); | ||||
|             $this->db->cache_delete('blog', 'getDeleteModal'); | ||||
|             $this->db->cache_delete('blog', 'deleteComment'); | ||||
|             $this->db->cache_delete('admin', 'blog'); | ||||
|         } | ||||
|  | ||||
|         public function getAllTags() | ||||
| @@ -310,13 +411,14 @@ AND postState = 1', [$_SESSION['site_lang'], $_SESSION['site_lang'], $search, $s | ||||
|  | ||||
|         public function getTags($postID) | ||||
|         { | ||||
|             $tags = $this->db->query('SELECT t.* FROM blog_tags t WHERE ID IN (SELECT tag_id FROM blog_post_tags WHERE post_id = ?)', [$postID])->result_array(); | ||||
|             $tags = $this->db->query('SELECT t.* FROM blog_tags t WHERE ID IN (SELECT tagID FROM blog_post_tags WHERE postID = ?)', [$postID])->result_array(); | ||||
|             return $tags; | ||||
|         } | ||||
|  | ||||
|         public function mergeTagInfo($tags) { | ||||
|         public function mergeTagInfo($tags) | ||||
|         { | ||||
|             foreach ($tags as $i => $tag) { | ||||
|                 $data = $this->db->query('SELECT count(*) countUsed, SUM(postViews) totalViews FROM blog_posts WHERE postID = (SELECT post_id FROM blog_post_tags WHERE tag_id = ? AND post_id = postID)', [$tag['ID']])->result_array(); | ||||
|                 $data = $this->db->query('SELECT count(*) countUsed, SUM(postViews) totalViews FROM blog_posts WHERE postID = (SELECT postID FROM blog_post_tags WHERE tag_id = ? AND postID = postID)', [$tag['ID']])->result_array(); | ||||
|                 $data = $data[0]; | ||||
|                 $tags[$i]['countUsed'] = $data['countUsed']; | ||||
|                 $tags[$i]['totalViews'] = $data['totalViews'] != '' ? $data['totalViews'] : 0; | ||||
| @@ -326,7 +428,7 @@ AND postState = 1', [$_SESSION['site_lang'], $_SESSION['site_lang'], $search, $s | ||||
|  | ||||
|         public function hasAlreadyLiked($postID, $userID) | ||||
|         { | ||||
|             $getLikes = $this->db->query('SELECT * FROM blog_post_likes WHERE post_id = ? AND user_id = ?', [$postID, $userID])->result_array(); | ||||
|             $getLikes = $this->db->query('SELECT * FROM blog_post_likes WHERE postID = ? AND userID = ?', [$postID, $userID])->result_array(); | ||||
|             if (empty($getLikes)) { | ||||
|                 return false; | ||||
|             } else { | ||||
| @@ -336,53 +438,49 @@ AND postState = 1', [$_SESSION['site_lang'], $_SESSION['site_lang'], $search, $s | ||||
|  | ||||
|         public function addLike($postID, $userID) | ||||
|         { | ||||
|             $this->db->query('INSERT INTO blog_post_likes (post_id, user_id) VALUES (?, ?)', [$postID, $userID]); | ||||
|             $this->db->query('INSERT INTO blog_post_likes (postID, userID) VALUES (?, ?)', [$postID, $userID]); | ||||
|  | ||||
|             $this->db->cache_delete('blog', 'index'); | ||||
|             $this->db->cache_delete('blog', 'post'); | ||||
|             $this->db->cache_delete('blog', 'like'); | ||||
|             $this->db->cache_delete('admin', 'blog'); | ||||
|  | ||||
|             return $this->db->query('SELECT count(*) likeCount FROM blog_post_likes WHERE post_id = ?', [$postID])->result_array()[0]; | ||||
|             return $this->db->query('SELECT count(*) likeCount FROM blog_post_likes WHERE postID = ?', [$postID])->result_array()[0]; | ||||
|         } | ||||
|  | ||||
|         public function removeLike($postID, $userID) | ||||
|         { | ||||
|             $this->db->query('DELETE FROM blog_post_likes WHERE post_id = ? AND user_id = ?', [$postID, $userID]); | ||||
|             $this->db->query('DELETE FROM blog_post_likes WHERE postID = ? AND userID = ?', [$postID, $userID]); | ||||
|  | ||||
|             $this->db->cache_delete('blog', 'index'); | ||||
|             $this->db->cache_delete('blog', 'post'); | ||||
|             $this->db->cache_delete('blog', 'like'); | ||||
|             $this->db->cache_delete('admin', 'blog'); | ||||
|  | ||||
|             return $this->db->query('SELECT count(*) likeCount FROM blog_post_likes WHERE post_id = ?', [$postID])->result_array()[0]; | ||||
|             return $this->db->query('SELECT count(*) likeCount FROM blog_post_likes WHERE postID = ?', [$postID])->result_array()[0]; | ||||
|         } | ||||
|  | ||||
|         public function getPostList($onlyTrash) | ||||
|         { | ||||
|             $posts = $this->db->query('SELECT p.*, | ||||
|           ca.name                    categoryName, | ||||
|           ca.display_name            categoryDisplayName, | ||||
|           (SELECT count(*) | ||||
|            FROM blog_comments | ||||
|            WHERE post_id = p.postID) commentCount, | ||||
|           (SELECT count(*) | ||||
|            FROM blog_post_likes | ||||
|            WHERE post_id = p.postID) likeCount, | ||||
|           (SELECT display_name | ||||
|           FROM blog_states | ||||
|           WHERE ID = p.postState) postStateDisplay | ||||
|         FROM blog_posts p | ||||
|         LEFT JOIN blog_categories ca ON ca.ID = p.postCategoryID | ||||
|         WHERE postIsDeleted = ?', [$onlyTrash])->result_array(); | ||||
|             $posts = $this->mergePostTitleDesc($posts); | ||||
|             if($onlyTrash) { | ||||
|                 $posts = $this->db->query('SELECT p.*, s.views | ||||
|                   FROM blog_trash p LEFT JOIN blog_post_stats s ON s.ID = p.ID')->result_array(); | ||||
|             } else { | ||||
|                 $posts = $this->db->query('SELECT p.*, s.views | ||||
|                   FROM blog_post p LEFT JOIN blog_post_stats s ON s.ID = p.ID')->result_array(); | ||||
|             } | ||||
|  | ||||
|             $posts = $this->mergePostTranslation($posts); | ||||
|             $posts = $this->mergePostCategories($posts); | ||||
|             $posts = $this->mergePostStats($posts); | ||||
|             $posts = $this->mergePostAuthorData($posts); | ||||
|             $posts = $this->mergePostState($posts); | ||||
|             return $posts; | ||||
|         } | ||||
|  | ||||
|         public function getAllContentVersions($postID, $lang) | ||||
|         public function getAllPostVersions($postID, $lang) | ||||
|         { | ||||
|             $content = $this->db->query('SELECT * FROM blog_content WHERE postID = ? AND language = ? ORDER BY contentDate DESC', [$postID, $lang])->result_array(); | ||||
|             $content = $this->db->query('SELECT *, MD5(ID) hashID FROM blog_post_versions WHERE postID = ? AND lang = ? ORDER BY edited DESC', [$postID, $lang])->result_array(); | ||||
|             return $content; | ||||
|         } | ||||
|  | ||||
| @@ -391,7 +489,7 @@ AND postState = 1', [$_SESSION['site_lang'], $_SESSION['site_lang'], $search, $s | ||||
|             $this->db->cache_off(); | ||||
|             $tagData = $this->db->query('SELECT ID FROM blog_tags WHERE name = ?', [strtolower($tag)])->result_array(); | ||||
|             if (empty($tagData)) { | ||||
|                 $this->db->query('INSERT INTO blog_tags (name, display_name) VALUES (?, ?)', [strtolower($tag), $tag]); | ||||
|                 $this->db->query('INSERT INTO blog_tags (name, displayname) VALUES (?, ?)', [strtolower($tag), $tag]); | ||||
|                 $tagData = $this->db->query('SELECT ID FROM blog_tags WHERE name = ?', [strtolower($tag)])->result_array(); | ||||
|             } | ||||
|             $this->db->cache_on(); | ||||
| @@ -401,7 +499,7 @@ AND postState = 1', [$_SESSION['site_lang'], $_SESSION['site_lang'], $search, $s | ||||
|  | ||||
|         public function addPostTagByID($postID, $tagID) | ||||
|         { | ||||
|             $this->db->query('INSERT INTO blog_post_tags (post_id, tag_id) VALUES (?, ?) ON DUPLICATE KEY UPDATE post_id = post_id', [$postID, $tagID]); | ||||
|             $this->db->query('INSERT INTO blog_post_tags (postID, tagID) VALUES (?, ?) ON DUPLICATE KEY UPDATE postID = postID', [$postID, $tagID]); | ||||
|  | ||||
|             $this->db->cache_delete('blog', 'index'); | ||||
|             $this->db->cache_delete('blog', 'post'); | ||||
| @@ -411,7 +509,7 @@ AND postState = 1', [$_SESSION['site_lang'], $_SESSION['site_lang'], $search, $s | ||||
|  | ||||
|         public function deleteAllPostTags($postID) | ||||
|         { | ||||
|             $this->db->query('DELETE FROM blog_post_tags WHERE post_id = ?', [$postID]); | ||||
|             $this->db->query('DELETE FROM blog_post_tags WHERE postID = ?', [$postID]); | ||||
|  | ||||
|             $this->db->cache_delete('blog', 'index'); | ||||
|             $this->db->cache_delete('blog', 'post'); | ||||
| @@ -419,6 +517,25 @@ AND postState = 1', [$_SESSION['site_lang'], $_SESSION['site_lang'], $search, $s | ||||
|             $this->db->cache_delete('admin', 'blog'); | ||||
|         } | ||||
|  | ||||
|         public function addPostCategoryByID($postID, $categoryID) | ||||
|         { | ||||
|             $this->db->query('INSERT INTO blog_post_categories (postID, categoryID) VALUES (?, ?) ON DUPLICATE KEY UPDATE postID = postID', [$postID, $categoryID]); | ||||
|  | ||||
|             $this->db->cache_delete('blog', 'index'); | ||||
|             $this->db->cache_delete('blog', 'post'); | ||||
|             $this->db->cache_delete('blog', 'like'); | ||||
|             $this->db->cache_delete('admin', 'blog'); | ||||
|         } | ||||
|  | ||||
|         public function deleteAllPostCategories($postID) | ||||
|         { | ||||
|             $this->db->query('DELETE FROM blog_post_categories WHERE postID = ?', [$postID]); | ||||
|  | ||||
|             $this->db->cache_delete('blog', 'index'); | ||||
|             $this->db->cache_delete('blog', 'post'); | ||||
|             $this->db->cache_delete('blog', 'category'); | ||||
|             $this->db->cache_delete('admin', 'blog'); | ||||
|         } | ||||
|         // TODO: Update | ||||
|         public function prepareContentForRelease($content) | ||||
|         { | ||||
| @@ -469,7 +586,8 @@ AND postState = 1', [$_SESSION['site_lang'], $_SESSION['site_lang'], $search, $s | ||||
|  | ||||
|         public function deletePost($id) | ||||
|         { | ||||
|             $this->db->query('UPDATE blog_posts SET postIsDeleted = TRUE, postDeletedDate = NOW(), postState = 4 WHERE postID = ? LIMIT 1', [$id]); | ||||
|             $this->db->query('INSERT INTO blog_trash SELECT * FROM blog_post WHERE ID = ?', [$id]); | ||||
|             $this->db->query('DELETE FROM blog_post WHERE ID = ?', [$id]); | ||||
|  | ||||
|             $this->db->cache_delete('blog', 'index'); | ||||
|             $this->db->cache_delete('blog', 'post'); | ||||
| @@ -481,7 +599,8 @@ AND postState = 1', [$_SESSION['site_lang'], $_SESSION['site_lang'], $search, $s | ||||
|  | ||||
|         public function restorePost($id) | ||||
|         { | ||||
|             $this->db->query('UPDATE blog_posts SET postIsDeleted = FALSE, postDeletedDate = NULL, postState = 1 WHERE postID = ? LIMIT 1', [$id]); | ||||
|             $this->db->query('INSERT INTO blog_post SELECT * FROM blog_trash WHERE ID = ?', [$id]); | ||||
|             $this->db->query('DELETE FROM blog_trash WHERE ID = ?', [$id]); | ||||
|  | ||||
|             $this->db->cache_delete('blog', 'index'); | ||||
|             $this->db->cache_delete('blog', 'post'); | ||||
| @@ -493,11 +612,19 @@ AND postState = 1', [$_SESSION['site_lang'], $_SESSION['site_lang'], $search, $s | ||||
|  | ||||
|         public function deletePostFinally($id) | ||||
|         { | ||||
|             $this->db->query('DELETE FROM blog_content WHERE postID = ? AND (SELECT postIsDeleted FROM blog_posts WHERE postID = ?) = TRUE', [$id, $id]); | ||||
|             $this->db->query('DELETE FROM blog_post_likes WHERE post_id = ? AND (SELECT postIsDeleted FROM blog_posts WHERE postID = ?) = TRUE', [$id, $id]); | ||||
|             $this->db->query('DELETE FROM blog_post_tags WHERE post_id = ? AND (SELECT postIsDeleted FROM blog_posts WHERE postID = ?) = TRUE', [$id, $id]); | ||||
|             $this->db->query('DELETE FROM blog_comments WHERE post_id = ? AND (SELECT postIsDeleted FROM blog_posts WHERE postID = ?) = TRUE', [$id, $id]); | ||||
|             $this->db->query('DELETE FROM blog_posts WHERE postID = ? AND postIsDeleted = TRUE LIMIT 1', [$id]); | ||||
|             $data = $this->db->query('SELECT ID FROM blog_trash WHERE ID = ?', [$id])->result_array(); | ||||
|  | ||||
|             if(empty($data)) { | ||||
|                 return; | ||||
|             } | ||||
|  | ||||
|             $this->db->query('DELETE FROM blog_post_categories WHERE postID = ?', [$id]); | ||||
|             $this->db->query('DELETE FROM blog_post_comments WHERE postID = ?', [$id]); | ||||
|             $this->db->query('DELETE FROM blog_post_likes WHERE postID = ?', [$id]); | ||||
|             $this->db->query('DELETE FROM blog_post_stats WHERE ID = ?', [$id]); | ||||
|             $this->db->query('DELETE FROM blog_post_tags WHERE postID = ?', [$id]); | ||||
|             $this->db->query('DELETE FROM blog_post_versions WHERE postID = ?', [$id]); | ||||
|             $this->db->query('DELETE FROM blog_trash WHERE ID = ? LIMIT 1', [$id]); | ||||
|  | ||||
|             $this->db->cache_delete('blog', 'index'); | ||||
|             $this->db->cache_delete('blog', 'post'); | ||||
| @@ -507,47 +634,29 @@ AND postState = 1', [$_SESSION['site_lang'], $_SESSION['site_lang'], $search, $s | ||||
|             $this->db->cache_delete('admin', 'blog'); | ||||
|         } | ||||
|  | ||||
|         public function getPrevPost($id) | ||||
|         public function getPrevPost($initialRelease) | ||||
|         { | ||||
|             $posts = $this->db->query('SELECT postID, postUrl, postImage FROM blog_posts WHERE postPublishDate < (SELECT postPublishDate FROM blog_posts WHERE postID = ?) AND postState = 1 ORDER BY postPublishDate DESC LIMIT 1', [$id])->result_array(); | ||||
|             return $this->mergePostTitleDesc($posts); | ||||
|             $posts = $this->db->query('SELECT ID, image FROM blog_post WHERE initialRelease < ? AND state = 1 ORDER BY initialRelease DESC LIMIT 1', [$initialRelease])->result_array(); | ||||
|             $posts = $this->mergePostTranslation($posts); | ||||
|             return $posts; | ||||
|         } | ||||
|  | ||||
|         public function getNextPost($id) | ||||
|         public function getNextPost($initialRelease) | ||||
|         { | ||||
|             $posts = $this->db->query('SELECT postID, postUrl, postImage FROM blog_posts WHERE postPublishDate > (SELECT postPublishDate FROM blog_posts WHERE postID = ?) AND postState = 1 ORDER BY postPublishDate ASC LIMIT 1', [$id])->result_array(); | ||||
|             return $this->mergePostTitleDesc($posts); | ||||
|             $posts = $this->db->query('SELECT ID, image FROM blog_post WHERE initialRelease > ? AND state = 1 ORDER BY initialRelease ASC LIMIT 1', [$initialRelease])->result_array(); | ||||
|             $posts = $this->mergePostTranslation($posts); | ||||
|             return $posts; | ||||
|         } | ||||
|  | ||||
|         public function getMostRecentPosts($count) | ||||
|         { | ||||
|             $posts = $this->db->query('SELECT postID, postImage, postUrl, postPublishDate FROM blog_posts WHERE postState = 1 ORDER BY postPublishDate DESC LIMIT ?', [$count])->result_array(); | ||||
|             return $this->mergePostTitleDesc($posts); | ||||
|             $posts = $this->db->query('SELECT ID, image, initialRelease FROM blog_post WHERE state = 1 ORDER BY initialRelease DESC LIMIT ?', [$count])->result_array(); | ||||
|             $posts = $this->mergePostTranslation($posts); | ||||
|             return $posts; | ||||
|         } | ||||
|  | ||||
|         private function countWords($text) | ||||
|         public function getReadingTime($wordCount) | ||||
|         { | ||||
|             $text = preg_replace("/<[a-zA-Z0-9\/ .,:;\-_+!?&%=\"]+>/", '', $text); | ||||
|             return str_word_count($text); | ||||
|         } | ||||
|  | ||||
|         public function getReadingTime($postID) | ||||
|         { | ||||
|             $data = $this->db->query('SELECT wordCount, language FROM blog_content c WHERE postID = ? AND isActive = TRUE AND (c.language = ? OR c.language = "de") ORDER BY contentDate DESC', [$postID, $_SESSION['site_lang']])->result_array(); | ||||
|  | ||||
|             if (empty($data)) { | ||||
|                 return 0; | ||||
|             } | ||||
|  | ||||
|             $wordCount = $data[0]['wordCount']; | ||||
|  | ||||
|             foreach ($data as $entry) { | ||||
|                 if ($entry['language'] == $_SESSION['site_lang']) { | ||||
|                     $wordCount = $entry['wordCount']; | ||||
|                     break; | ||||
|                 } | ||||
|             } | ||||
|  | ||||
|             $wordsPerSecond = 3; | ||||
|             $duration = $wordCount / $wordsPerSecond; | ||||
|             $duration /= 60; | ||||
| @@ -557,53 +666,46 @@ AND postState = 1', [$_SESSION['site_lang'], $_SESSION['site_lang'], $search, $s | ||||
|  | ||||
|         public function createNewPostDraft($authorID) | ||||
|         { | ||||
|             $this->db->query('INSERT INTO blog_posts (postAuthorID, postState) VALUE (?, 2)', [$authorID]); | ||||
|             $data = $this->db->query('SELECT postID FROM blog_posts WHERE postState = 2 ORDER BY postID DESC LIMIT 1')->result_array(); | ||||
|             $this->db->query('INSERT INTO blog_post (authorID, state) VALUE (?, 2)', [$authorID]); | ||||
|  | ||||
|             $this->db->cache_delete('admin', 'blog'); | ||||
|             $data = $this->db->query('SELECT ID FROM blog_post WHERE state = 2 ORDER BY ID DESC LIMIT 1')->result_array(); | ||||
|  | ||||
|             return intval($data[0]['postID']); | ||||
|         } | ||||
|  | ||||
|         public function createNewContentDraft($postID) | ||||
|         { | ||||
|             $this->db->query('INSERT INTO blog_content (postID, isActive) VALUES (?, 0)', [$postID]); | ||||
|         public function createNewTranslationDraft($postID, $authorID, $lang) { | ||||
|             $this->db->query('INSERT INTO blog_post_versions (postID, authorID, active, lang) VALUES (?, ?, 0, ?)', [$postID, $authorID, $lang]); | ||||
|             $this->db->cache_delete('admin', 'blog'); | ||||
|             $data = $this->db->query('SELECT contentID FROM blog_content WHERE postID = ? ORDER BY contentID DESC LIMIT 1', [$postID])->result_array(); | ||||
|             return intval($data[0]['contentID']); | ||||
|  | ||||
|             $data = $this->db->query('SELECT ID FROM blog_post_versions WHERE postID = ? ORDER BY ID DESC LIMIT 1', [$postID])->result_array(); | ||||
|  | ||||
|             return intval($data[0]['ID']); | ||||
|         } | ||||
|  | ||||
|         public function createNewTranslation($postID, $language) | ||||
|         public function updatePostDraft($postID, $initialRelease, $postImage) | ||||
|         { | ||||
|             $data = $this->db->query('SELECT postTranslationID FROM blog_translations WHERE postID = ? AND language = ?', [$postID, $language])->result_array(); | ||||
|  | ||||
|             if (empty($data)) { | ||||
|                 $this->db->query('INSERT INTO blog_translations (postID, language) VALUES (?, ?)', [$postID, $language]); | ||||
|                 $data = $this->db->query('SELECT postTranslationID FROM blog_translations WHERE postID = ? AND language = ? ORDER BY postTranslationID DESC', [$postID, $language])->result_array(); | ||||
|             } | ||||
|  | ||||
|             return intval($data[0]['postTranslationID']); | ||||
|         } | ||||
|  | ||||
|         public function updatePostDraft($postID, $postUrl, $postCategory, $postPublishDate, $postImage) | ||||
|         { | ||||
|             $this->db->query('UPDATE blog_posts SET postUrl = ?, postCategoryID = ?, postPublishDate = ?, postImage = ? WHERE postID = ?', [$postUrl, $postCategory, $postPublishDate, $postImage, $postID]); | ||||
|             $this->db->cache_delete('admin', 'edit'); | ||||
|         } | ||||
|  | ||||
|         public function updateContentDraft($contentID, $postContent, $postLang) | ||||
|         { | ||||
|             $wordCount = $this->countWords($postContent); | ||||
|             $this->db->query('UPDATE blog_content SET content = ?, language = ?, contentDate = NOW(), wordCount = ? WHERE contentID = ?', [$postContent, $postLang, $wordCount, $contentID]); | ||||
|             $this->db->query('UPDATE blog_post SET initialRelease = ?, image = ? WHERE ID = ?', [$initialRelease, $postImage, $postID]); | ||||
|             $this->db->cache_delete('admin', 'blog'); | ||||
|         } | ||||
|  | ||||
|         public function updateTranslation($translationID, $postTitle, $postDesc) | ||||
|         public function updateTranslationDraft($versionID, $url, $title, $description, $content, $lang) | ||||
|         { | ||||
|             $this->db->query('UPDATE blog_translations SET postTitle = ?, postDesc = ? WHERE postTranslationID = ?', [$postTitle, $postDesc, $translationID]); | ||||
|             $wordCount = $this->countWords($content); | ||||
|             $this->db->query('UPDATE blog_post_versions SET lang = ?, url = ?, title = ?, description = ?, content = ?, contentWordsCount = ?, edited = NOW() WHERE ID = ?', [$lang, $url, $title, $description, $content, $wordCount, $versionID]); | ||||
|             $this->db->cache_delete('admin', 'blog'); | ||||
|         } | ||||
|  | ||||
|         private function countWords($text) | ||||
|         { | ||||
|             $text = preg_replace("/<[a-zA-Z0-9\/ .,:;\-_+!?&%=\"]+>/", '', $text); | ||||
|             return str_word_count($text); | ||||
|         } | ||||
|  | ||||
|         public function publishPostDraft($postID) | ||||
|         { | ||||
|             $this->db->query('UPDATE blog_posts SET postPublishDate = NOW(), postLastEdit = NOW(), postState = 1 WHERE postID = ?', [$postID]); | ||||
|             $this->db->query('UPDATE blog_post SET initialRelease = NOW(), lastEdit = NOW(), state = 1 WHERE ID = ?', [$postID]); | ||||
|             $this->db->query('INSERT INTO blog_post_stats (ID) VALUES (?)', [$postID]); | ||||
|             $this->db->cache_delete('blog', 'index'); | ||||
|             $this->db->cache_delete('blog', 'post'); | ||||
|             $this->db->cache_delete('blog', 'tag'); | ||||
| @@ -612,54 +714,65 @@ AND postState = 1', [$_SESSION['site_lang'], $_SESSION['site_lang'], $search, $s | ||||
|             $this->db->cache_delete('admin', 'blog'); | ||||
|         } | ||||
|  | ||||
|         public function publishContentDraft($authorID, $contentID, $postID, $lang) | ||||
|         public function publishTranslationDraft($postID, $versionID, $authorID, $lang) | ||||
|         { | ||||
|             $firstContent = $this->db->query('SELECT contentID FROM blog_content WHERE postID = ? AND contentID != ? AND language = ?', [$postID, $contentID, $lang])->result_array(); | ||||
|             $isNative = TRUE; | ||||
|             if(!empty($firstContent)) { | ||||
|                 $isNative = FALSE; | ||||
|             $this->db->query('UPDATE blog_post_versions SET active = FALSE WHERE postID = ? AND lang = ?', [$postID, $lang]); | ||||
|             $this->db->query('UPDATE blog_post_versions SET active = TRUE, edited = NOW(), authorID = ? WHERE postID = ? AND ID = ?', [$authorID, $postID, $versionID]); | ||||
|         } | ||||
|  | ||||
|             $this->db->query('UPDATE blog_content SET isActive = FALSE WHERE postID = ?', [$postID]); | ||||
|             $this->db->query('UPDATE blog_content SET isActive = TRUE, isNativePost = ?, contentDate = NOW(), contentAuthorID = ? WHERE contentID = ?', [$isNative, $authorID, $contentID]); | ||||
|         } | ||||
|  | ||||
|         public function getPostTranslationIDs($postID) { | ||||
|             $data = $this->db->query('SELECT postTranslationID, language FROM blog_translations WHERE postID = ?', [$postID])->result_array(); | ||||
|         public function getPostVersionIDs($postID) { | ||||
|             $data = $this->db->query('SELECT ID, lang FROM blog_post_versions WHERE postID = ? GROUP BY lang ORDER BY active DESC, edited DESC, ID DESC', [$postID])->result_array(); | ||||
|             return $data; | ||||
|         } | ||||
|  | ||||
|         public function getPostContentIDs($postID) { | ||||
|             $data = $this->db->query('SELECT (SELECT contentID FROM blog_content WHERE language = c.language ORDER BY contentID DESC LIMIT 1) contentID, language FROM blog_content c WHERE postID = ? AND language IS NOT NULL GROUP BY language ORDER BY contentID DESC', [$postID])->result_array(); | ||||
|             return $data; | ||||
|         public function getPostVersions($postID) { | ||||
|             function getIDs($val) { | ||||
|                 return $val['ID']; | ||||
|             } | ||||
|  | ||||
|         public function getPostTranslations($postID) | ||||
|         { | ||||
|             $data = $this->db->query('SELECT * FROM blog_translations t LEFT JOIN blog_content c ON c.postID = t.postID AND c.language = t.language WHERE t.postID = ?', [$postID])->result_array(); | ||||
|             $versionIDs = $this->getPostVersionIDs($postID); | ||||
|             $versionIDs = array_map("getIDs", $versionIDs); | ||||
|             $data = $this->db->query('SELECT * FROM blog_post_versions WHERE ID IN ?', [$versionIDs])->result_array(); | ||||
|  | ||||
|             return $data; | ||||
|         } | ||||
|  | ||||
|         public function postIDExisting($postID) | ||||
|         { | ||||
|             $data = $this->db->query('SELECT postID FROM blog_posts WHERE postID = ?', [$postID])->result_array(); | ||||
|             $data = $this->db->query('SELECT ID FROM blog_post WHERE ID = ?', [$postID])->result_array(); | ||||
|             return !empty($data); | ||||
|         } | ||||
|  | ||||
|         public function contentIDExisting($postID, $contentID) | ||||
|         public function versionIDExisting($postID, $versionID) | ||||
|         { | ||||
|             $data = $this->db->query('SELECT contentID FROM blog_content WHERE postID = ? AND contentID = ?', [$postID, $contentID])->result_array(); | ||||
|             $data = $this->db->query('SELECT ID FROM blog_post_versions WHERE postID = ? AND ID = ?', [$postID, $versionID])->result_array(); | ||||
|             return !empty($data); | ||||
|         } | ||||
|  | ||||
|         public function translationIDExisting($postID, $translationID) | ||||
|         public function postUrlExisting($postUrl) | ||||
|         { | ||||
|             $data = $this->db->query('SELECT postTranslationID FROM blog_translations WHERE postID = ? AND postTranslationID = ?', [$postID, $translationID])->result_array(); | ||||
|             $data = $this->db->query('SELECT url FROM blog_post_versions WHERE url = ?', [$postUrl])->result_array(); | ||||
|             return !empty($data); | ||||
|         } | ||||
|  | ||||
|         public function postUrlExisting($postUrl) { | ||||
|             $data = $this->db->query('SELECT postUrl FROM blog_posts WHERE postUrl = ?', [$postUrl])->result_array(); | ||||
|             return !empty($data); | ||||
|         public function createCategory($name, $displayname, $lang, $categoryID = null) { | ||||
|             $sameName = $this->db->query('SELECT categoryID FROM blog_categories WHERE name = ? AND displayname = ? AND lang = ?', [$name, $displayname, $lang])->result_array(); | ||||
|             if(!empty($sameName)) { | ||||
|                 return $sameName[0]['categoryID']; | ||||
|             } | ||||
|  | ||||
|             if($categoryID == null) { | ||||
|                 $highestCategoryID = $this->db->query('SELECT categoryID FROM blog_categories ORDER BY categoryID DESC LIMIT 1')->result_array(); | ||||
|                 $categoryID = !empty($highestCategoryID) ? $highestCategoryID[0]['categoryID'] + 1 : 1; | ||||
|             } | ||||
|             $this->db->query('INSERT INTO blog_categories (categoryID, lang, name, displayname) VALUES (?, ?, ?, ?)', [$categoryID, $lang, $name, $displayname]); | ||||
|             $this->db->cache_delete('admin', 'blog'); | ||||
|             $this->db->cache_delete('blog', 'index'); | ||||
|             $this->db->cache_delete('blog', 'category'); | ||||
|             $this->db->cache_delete('blog', 'tag'); | ||||
|             $this->db->cache_delete('blog', 'search'); | ||||
|             $this->db->cache_delete('blog', 'post'); | ||||
|  | ||||
|             return $categoryID; | ||||
|         } | ||||
|     } | ||||
| @@ -12,15 +12,16 @@ class DatabaseModel extends CI_Model | ||||
|     public function createMissingDatabases() | ||||
|     { | ||||
|         //$this->createDatabases(); | ||||
|         $this->createTables(); | ||||
| //        TODO: Update data base generation | ||||
| //        $this->createTables(); | ||||
|         //$this->addIndices(); | ||||
|         //$this->addAutoIncrements(); | ||||
|         //$this->addConstraints(); | ||||
|  | ||||
|         $this->fillBlogTables(); | ||||
|         $this->fillFeedbackTable(); | ||||
|         $this->fillMainTable(); | ||||
|         $this->fillProjectsTable(); | ||||
|         //$this->fillBlogTables(); | ||||
|         //$this->fillFeedbackTable(); | ||||
|         //$this->fillMainTable(); | ||||
|         //$this->fillProjectsTable(); | ||||
|     } | ||||
|  | ||||
|     private function createDatabases() | ||||
|   | ||||
| @@ -10,6 +10,10 @@ | ||||
|         } | ||||
|  | ||||
|         function sendMail($recipient, $subject, $template, $templateData) { | ||||
|             if(base_url() == 'http://192.168.178.39/') { | ||||
|                 return; | ||||
|             } | ||||
|  | ||||
|             $this->load->library('email'); | ||||
|  | ||||
|             $config['mailtype'] = 'html'; | ||||
|   | ||||
| @@ -26,7 +26,7 @@ class FileModel extends CI_Model | ||||
|             $userID = $user; | ||||
|         } | ||||
|  | ||||
|         $this->db->query('INSERT INTO files (name, original_name, type, size, path, user) VALUES (?, ?, ?, ?, ?, ?)', [$name, $originalName, $type, $size, $path, $userID]); | ||||
|         $this->db->query('INSERT INTO files (name, originalName, type, size, path, user) VALUES (?, ?, ?, ?, ?, ?)', [$name, $originalName, $type, $size, $path, $userID]); | ||||
|  | ||||
|         $this->db->cache_delete('admin', 'files'); | ||||
|     } | ||||
|   | ||||
| @@ -19,15 +19,15 @@ | ||||
|  | ||||
|             $return = ''; | ||||
|             foreach ($posts as $result) { | ||||
|                 $date = strtotime($result['postPublishDate']); | ||||
|                 $date = strtotime($result['initialRelease']); | ||||
|                 $return .= '<div class="media">'; | ||||
|  | ||||
|                 if ($result['postImage'] != '') { | ||||
|                     $return .= '<img src="' . $result['postImage'] . '?w=100" style="width:75px" class="img-fluid mr-3">'; | ||||
|                 if ($result['image'] != '') { | ||||
|                     $return .= '<img src="' . $result['image'] . '?w=100" style="width:75px" class="img-fluid mr-3">'; | ||||
|                 } | ||||
|  | ||||
|                 $return .= '<div class="media-body"> | ||||
|                                 <h6 class="my-0"><a href="#">' . $result['postTitle'] . '</a></h6> | ||||
|                                 <h6 class="my-0"><a href="#">' . $result['title'] . '</a></h6> | ||||
|                                 <small class="text-white-50">' . lang('footer_published') . ' ' . DateTimeHumanizer::difference(new \DateTime(), new \DateTime("@$date"), $_SESSION['site_lang']) . '</small> | ||||
|                             </div> | ||||
|                         </div>'; | ||||
|   | ||||
| @@ -28,7 +28,7 @@ | ||||
|                 return; | ||||
|             } | ||||
|  | ||||
|             $encryptedPassword = $this->getPasswordHash($password, $logindata['original_name']); | ||||
|             $encryptedPassword = $this->getPasswordHash($password, $logindata['originalName']); | ||||
|  | ||||
|             if ($encryptedPassword == $logindata['password']) { | ||||
|                 $this->startLoginSession($logindata, $rememberMe); | ||||
| @@ -40,15 +40,15 @@ | ||||
|         public function getLoginData($username) | ||||
|         { | ||||
|             $this->db->cache_off(); | ||||
|             $return = $this->db->query('SELECT * FROM users WHERE (username = lower(?) OR email = lower(?)) AND is_activated = TRUE LIMIT 1', | ||||
|             $return = $this->db->query('SELECT u.ID, u.username, u.displayname, u.originalName, u.email, u.rank, u.loginMethod, u.password, u.isDeleted, s.profilePicture, s.showAds FROM users u INNER JOIN user_settings s ON s.ID = u.ID WHERE (username = lower(?) OR email = lower(?)) AND activated = TRUE LIMIT 1', | ||||
|                 [htmlspecialchars($username, ENT_QUOTES), $username])->result_array(); | ||||
|             $this->db->cache_on(); | ||||
|             return $return; | ||||
|         } | ||||
|  | ||||
|         public function getPasswordHash($password, $original_name) | ||||
|         public function getPasswordHash($password, $originalName) | ||||
|         { | ||||
|             $salt = md5($original_name); | ||||
|             $salt = md5($originalName); | ||||
|             $passwordHash = hash('sha256', $salt . $password . $salt); | ||||
|             return $passwordHash; | ||||
|         } | ||||
| @@ -80,7 +80,7 @@ | ||||
|                 'displayname' => $displayname, | ||||
|                 'rank' => $rank, | ||||
|                 'showAds' => $ads, | ||||
|                 'profile_picture' => $avatar, | ||||
|                 'profilePicture' => $avatar, | ||||
|                 ) = $logindata; | ||||
|  | ||||
|             $this->session->set_userdata('user', [ | ||||
| @@ -131,7 +131,7 @@ | ||||
|  | ||||
|         public function isAvailable($username) | ||||
|         { | ||||
|             $registered = $this->db->query('SELECT * FROM users WHERE username = lower(?) OR original_name = lower(?)', [$username, $username])->result_array(); | ||||
|             $registered = $this->db->query('SELECT * FROM users WHERE username = lower(?) OR originalName = lower(?)', [$username, $username])->result_array(); | ||||
|  | ||||
|             if (empty($registered)) { | ||||
|                 return ''; | ||||
| @@ -144,7 +144,7 @@ | ||||
|         { | ||||
|             $encryptedPassword = $this->LoginModel->getPasswordHash($password, strtolower($username)); | ||||
|             $activation_key = hash("sha512", uniqid(rand(), true)) . hash("sha512", uniqid(rand(), true)); | ||||
|             $this->db->query('INSERT INTO users (original_name, username, displayname, login_method, password, email, rank, is_activated, activation_key) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)', [strtolower($username), strtolower($username), $username, $login_method, $encryptedPassword, $email, 1, false, $activation_key]); | ||||
|             $this->db->query('INSERT INTO users (originalName, username, displayname, login_method, password, email, rank, activated, activation_key) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)', [strtolower($username), strtolower($username), $username, $login_method, $encryptedPassword, $email, 1, false, $activation_key]); | ||||
|  | ||||
|             $this->db->cache_delete('admin', 'users'); | ||||
|  | ||||
| @@ -178,7 +178,7 @@ | ||||
|  | ||||
|         public function hashMailExists($emailHash, $activation_key) | ||||
|         { | ||||
|             $results = $this->db->query('SELECT ID FROM users WHERE MD5(email) = ? AND is_activated = 0 AND activation_key = ?', [$emailHash, $activation_key])->result_array(); | ||||
|             $results = $this->db->query('SELECT ID FROM users WHERE MD5(email) = ? AND activated = 0 AND activation_key = ?', [$emailHash, $activation_key])->result_array(); | ||||
|             if (!empty($results)) { | ||||
|                 return $results[0]['ID']; | ||||
|             } else { | ||||
| @@ -188,7 +188,7 @@ | ||||
|  | ||||
|         public function activateMail($id) | ||||
|         { | ||||
|             $this->db->query('UPDATE users SET is_activated = 1, activation_key = NULL WHERE ID = ? LIMIT 1', [$id]); | ||||
|             $this->db->query('UPDATE users SET activated = 1, activation_key = NULL WHERE ID = ? LIMIT 1', [$id]); | ||||
|  | ||||
|             // Clear cached queries | ||||
|             $username = $this->db->query('SELECT username FROM users WHERE ID = ?', [$id])->result_array(); | ||||
| @@ -199,14 +199,14 @@ | ||||
|         public function changeMailAddress($email, $username) | ||||
|         { | ||||
|             $activation_key = hash("sha512", uniqid(rand(), true)) . hash("sha512", uniqid(rand(), true)); | ||||
|             $this->db->query('UPDATE users SET email = lower(?), is_activated = FALSE, activation_key = ? WHERE username = ?', [$email, $activation_key, $username]); | ||||
|             $this->db->query('UPDATE users SET email = lower(?), activated = FALSE, activation_key = ? WHERE username = ?', [$email, $activation_key, $username]); | ||||
|             $this->db->cache_delete('admin', 'users'); | ||||
|         } | ||||
|  | ||||
|         public function changePassword($newPassword, $original_name) | ||||
|         public function changePassword($newPassword, $originalName) | ||||
|         { | ||||
|             $encryptedPassword = $this->getPasswordHash($newPassword, $original_name); | ||||
|             $this->db->query('UPDATE users SET password = ? WHERE original_name = ?', [$encryptedPassword, $original_name]); | ||||
|             $encryptedPassword = $this->getPasswordHash($newPassword, $originalName); | ||||
|             $this->db->query('UPDATE users SET password = ? WHERE originalName = ?', [$encryptedPassword, $originalName]); | ||||
|         } | ||||
|  | ||||
|         public function checkPassword($password) | ||||
|   | ||||
| @@ -27,7 +27,14 @@ | ||||
|         public function getUserNotificationsRaw($userID, $limit = 20, $offset = 0) | ||||
|         { | ||||
|             $this->db->cache_off(); | ||||
|             $rawData = $this->db->query('SELECT n.*, count(*) count, s.username senderName, s.displayname senderDisplayname, s.profile_picture senderPicture, r.username recipientName, r.displayName recipientDisplayname FROM notifications n LEFT JOIN users s ON n.senderID = s.ID LEFT JOIN users r ON n.recipientID = r.ID WHERE recipientID = ? GROUP BY type, referenceID ORDER BY createdAt DESC, unread DESC LIMIT ? OFFSET ?', [$userID, $limit, $offset])->result_array(); | ||||
|             $rawData = $this->db->query('SELECT n.*, count(*) count, s.username senderName, s.displayname senderDisplayname, ss.profilePicture senderPicture, r.username recipientName, r.displayName recipientDisplayname | ||||
|               FROM notifications n | ||||
|                 LEFT JOIN users s ON n.senderID = s.ID | ||||
|                 LEFT JOIN user_settings ss ON s.ID = ss.ID | ||||
|                 LEFT JOIN users r ON n.recipientID = r.ID  | ||||
|               WHERE recipientID = ?  | ||||
|               GROUP BY type, referenceID  | ||||
|               ORDER BY createdAt DESC, unread DESC LIMIT ? OFFSET ?', [$userID, $limit, $offset])->result_array(); | ||||
|  | ||||
|             $notifications = []; | ||||
|             foreach ($rawData as $notification) { | ||||
| @@ -36,7 +43,13 @@ | ||||
|                 if ($notificationGroup['count'] == 1) { | ||||
|                     $notificationGroup['items'] = [$notification]; | ||||
|                 } else { | ||||
|                     $notificationGroup['items'] = $this->db->query('SELECT n.*, s.username senderName, s.displayname senderDisplayname, s.profile_picture senderPicture, r.username recipientName, r.displayName recipientDisplayname FROM notifications n LEFT JOIN users s ON n.senderID = s.ID LEFT JOIN users r ON n.recipientID = r.ID WHERE recipientID = ? AND type = ? AND referenceID = ? LIMIT 5', [$userID, $notification['type'], $notification['referenceID']])->result_array(); | ||||
|                     $notificationGroup['items'] = $this->db->query('SELECT n.*, s.username senderName, s.displayname senderDisplayname, ss.profilePicture senderPicture, r.username recipientName, r.displayName recipientDisplayname | ||||
|                       FROM notifications n | ||||
|                         LEFT JOIN users s ON n.senderID = s.ID  | ||||
|                         LEFT JOIN user_settings ss ON s.ID = ss.ID | ||||
|                         LEFT JOIN users r ON n.recipientID = r.ID  | ||||
|                       WHERE recipientID = ? AND type = ? AND referenceID = ? | ||||
|                       LIMIT 5', [$userID, $notification['type'], $notification['referenceID']])->result_array(); | ||||
|                 } | ||||
|  | ||||
|                 $notifications[] = $notificationGroup; | ||||
|   | ||||
| @@ -15,43 +15,30 @@ | ||||
|             return $this->addReply($userID, $content, NULL); | ||||
|         } | ||||
|  | ||||
|         public function addReply($userID, $content, $replyToUUID) | ||||
|         public function addReply($userID, $content, $replyToHashID) | ||||
|         { | ||||
|             $content = $this->preparePostContent($content); | ||||
|             $uuid = $this->generatePostUUID($userID, $content); | ||||
|             $hashID = $this->generatePostHashID($userID, $content); | ||||
|             $replyTo = NULL; | ||||
|             if ($replyToUUID !== NULL) { | ||||
|                 $replyToID = $this->db->query('SELECT ID FROM user_posts WHERE uuid = ?', [$replyToUUID])->result_array(); | ||||
|             if ($replyToHashID !== NULL) { | ||||
|                 $replyToID = $this->db->query('SELECT ID FROM user_posts WHERE hashID = ?', [$replyToHashID])->result_array(); | ||||
|                 $replyTo = !empty($replyToID) ? $replyToID[0]['ID'] : NULL; | ||||
|             } | ||||
|             $this->db->query('INSERT INTO user_posts (user_id, content, uuid, reply_to) VALUES (?, ?, ?, ?)', [$userID, $content, $uuid, $replyTo]); | ||||
|             $this->db->query('INSERT INTO user_posts (userID, content, hashID, replyToPostID) VALUES (?, ?, ?, ?)', [$userID, $content, $hashID, $replyTo]); | ||||
|  | ||||
|  | ||||
|             $insertedPost = $this->db->query('SELECT ID, user_id FROM user_posts WHERE uuid = ?', [$uuid])->result_array(); | ||||
|             $this->addPostMentions($insertedPost[0]['ID'], $content, $uuid); | ||||
|             $insertedPost = $this->db->query('SELECT ID, userID FROM user_posts WHERE hashID = ?', [$hashID])->result_array(); | ||||
|             $this->addPostMentions($insertedPost[0]['ID'], $content, $hashID); | ||||
|             $this->addPostHashtags($insertedPost[0]['ID'], $content); | ||||
|  | ||||
|             // Send notification to user whose post was replied to | ||||
|             if ($userID != $insertedPost[0]['user_id']) { | ||||
|                 $this->NotificationModel->userNotificationPostReply($userID, $insertedPost[0]['user_id'], $insertedPost[0]['ID'], $uuid); | ||||
|             if ($userID != $insertedPost[0]['userID']) { | ||||
|                 $this->NotificationModel->userNotificationPostReply($userID, $insertedPost[0]['userID'], $insertedPost[0]['ID'], $hashID); | ||||
|             } | ||||
|  | ||||
|             return $insertedPost[0]['ID']; | ||||
|         } | ||||
|  | ||||
|         public function deletePost($userID, $uuid) { | ||||
|             $postID = $this->db->query('SELECT ID FROM user_posts WHERE user_id = ? AND uuid = ?', [$userID, $uuid])->result_array()[0]['ID']; | ||||
|             $this->db->query('DELETE FROM user_posts WHERE user_id = ? AND uuid = ?', [$userID, $uuid]); | ||||
|             $this->db->query('DELETE FROM user_posts_hashtags WHERE postID = ?', [$postID]); | ||||
|             $this->db->query('DELETE FROM user_posts_mentions WHERE postID = ?', [$postID]); | ||||
|             $this->db->query('DELETE FROM user_posts_likes WHERE postID = ?', [$postID]); | ||||
|             $this->db->query('DELETE FROM user_posts_media WHERE postID = ?', [$postID]); | ||||
|         } | ||||
|  | ||||
|         public function addMediaToPost($postID, $type, $fileID) { | ||||
|             $this->db->query('INSERT INTO user_posts_media (postID, mediaType, fileID) VALUES (?, ?, ?)', [$postID, $type, $fileID]); | ||||
|         } | ||||
|  | ||||
|         public function preparePostContent($content) | ||||
|         { | ||||
|             if ($this->endsWith($content, '<br> ')) { | ||||
| @@ -69,12 +56,7 @@ | ||||
|                 (substr($haystack, -$length) === $needle); | ||||
|         } | ||||
|  | ||||
|         function generatePostUUID($userID, $content) | ||||
|         { | ||||
|             return md5($userID . $content . date("Y-m-d H:i:s")); | ||||
|         } | ||||
|  | ||||
|         public function addPostMentions($postID, $content, $postUUID) | ||||
|         public function addPostMentions($postID, $content, $postHashID) | ||||
|         { | ||||
|             preg_match_all('/@([A-Za-z0-9._]+)/', $content, $mentions, PREG_OFFSET_CAPTURE); | ||||
|             foreach ($mentions[1] as $mention) { | ||||
| @@ -83,16 +65,16 @@ | ||||
|                     continue; | ||||
|                 } | ||||
|                 $mentionedUser = $mentionedUser[0]; | ||||
|                 $this->addMention($postID, $_SESSION['user']['ID'], $mentionedUser['ID'], $mention[1], $postUUID); | ||||
|                 $this->addMention($postID, $_SESSION['user']['ID'], $mentionedUser['ID'], $mention[1], $postHashID); | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         public function addMention($postID, $userID, $mentionedUserID, $position, $postUUID) | ||||
|         public function addMention($postID, $userID, $mentionedUserID, $position, $postHashID) | ||||
|         { | ||||
|             $this->db->query('INSERT INTO user_posts_mentions (userID, postID, mentionedUserID, position) VALUES (?, ?, ?, ?)', [$userID, $postID, $mentionedUserID, $position]); | ||||
|  | ||||
|             // Send notification | ||||
|             $this->NotificationModel->userNotificationPostMentioned($userID, $mentionedUserID, $postID, $postUUID); | ||||
|             $this->NotificationModel->userNotificationPostMentioned($userID, $mentionedUserID, $postID, $postHashID); | ||||
|         } | ||||
|  | ||||
|         public function addPostHashtags($postID, $content) | ||||
| @@ -108,10 +90,30 @@ | ||||
|             $this->db->query('INSERT INTO user_posts_hashtags (userID, postID, hashtag, position) VALUES (?, ?, ?, ?)', [$userID, $postID, $hashtag, $position]); | ||||
|         } | ||||
|  | ||||
|         public function deletePost($userID, $hashID) | ||||
|         { | ||||
|             $postID = $this->db->query('SELECT ID FROM user_posts WHERE userID = ? AND hashID = ?', [$userID, $hashID])->result_array()[0]['ID']; | ||||
|             $this->db->query('DELETE FROM user_posts WHERE userID = ? AND hashID = ?', [$userID, $hashID]); | ||||
|             $this->db->query('DELETE FROM user_posts_hashtags WHERE postID = ?', [$postID]); | ||||
|             $this->db->query('DELETE FROM user_posts_mentions WHERE postID = ?', [$postID]); | ||||
|             $this->db->query('DELETE FROM user_posts_likes WHERE postID = ?', [$postID]); | ||||
|             $this->db->query('DELETE FROM user_posts_media WHERE postID = ?', [$postID]); | ||||
|         } | ||||
|  | ||||
|         public function addMediaToPost($postID, $type, $fileID) | ||||
|         { | ||||
|             $this->db->query('INSERT INTO user_posts_media (postID, mediaType, fileID) VALUES (?, ?, ?)', [$postID, $type, $fileID]); | ||||
|         } | ||||
|  | ||||
|         function generatePostHashID($userID, $content) | ||||
|         { | ||||
|             return md5($userID . $content . date("Y-m-d H:i:s")); | ||||
|         } | ||||
|  | ||||
|         function getUserPosts($id, $count, $offset, $maxLength = 250) | ||||
|         { | ||||
|             $this->db->cache_off(); | ||||
|             $posts = $this->db->query('SELECT * FROM user_posts p WHERE user_id = ? ORDER BY date DESC LIMIT ? OFFSET ?', [$id, $count, $offset])->result_array(); | ||||
|             $posts = $this->db->query('SELECT * FROM user_posts p WHERE userID = ? ORDER BY date DESC LIMIT ? OFFSET ?', [$id, $count, $offset])->result_array(); | ||||
|             $this->db->cache_on(); | ||||
|  | ||||
|             $posts = $this->preparePostList($posts, $maxLength); | ||||
| @@ -136,38 +138,32 @@ | ||||
|                     $post = $this->mergeUserHasLiked($post, $_SESSION['user']['ID']); | ||||
|                 } | ||||
|  | ||||
|                 if($post['reply_to'] != NULL) { | ||||
|                 if ($post['replyToPostID'] != NULL) { | ||||
|                     $post = $this->mergeReplyData($post); | ||||
|                 } | ||||
|  | ||||
|                 $postList[$i] = $post; | ||||
|             } | ||||
|  | ||||
|             $postList = $this->UserModel->setDefaultImages($postList); | ||||
|  | ||||
|             return $postList; | ||||
|         } | ||||
|  | ||||
|         public function getPostMedia($postID) { | ||||
|             $result = $this->db->query('SELECT m.mediaType type, f.name name FROM user_posts_media m LEFT JOIN files f ON f.ID = m.fileID WHERE postID = ?', [$postID])->result_array(); | ||||
|             return $result; | ||||
|         } | ||||
|  | ||||
|         private function mergePostUserData($post) | ||||
|         { | ||||
|             $user = $this->UserModel->getUserByID($post['user_id']); | ||||
|             $user = $this->UserModel->getUserByID($post['userID']); | ||||
|             $user = $user[0]; | ||||
|  | ||||
|             $post['username'] = $user['username']; | ||||
|             $post['displayname'] = $user['displayname']; | ||||
|             $post['profile_picture'] = $user['profile_picture']; | ||||
|             $post['profilePicture'] = $user['profilePicture']; | ||||
|             return $post; | ||||
|         } | ||||
|  | ||||
|         public function getPostReplyCountByID($postID) | ||||
|         { | ||||
|             $this->db->cache_off(); | ||||
|             $data = $this->db->query('SELECT count(*) replyCount FROM user_posts WHERE reply_to = ?', [$postID])->result_array(); | ||||
|             $data = $this->db->query('SELECT count(*) replyCount FROM user_posts WHERE replyToPostID = ?', [$postID])->result_array(); | ||||
|             $this->db->cache_on(); | ||||
|  | ||||
|             return $data[0]['replyCount']; | ||||
| @@ -214,10 +210,16 @@ | ||||
|             return $finalContent; | ||||
|         } | ||||
|  | ||||
|         public function getPostMedia($postID) | ||||
|         { | ||||
|             $result = $this->db->query('SELECT m.mediaType type, f.name name FROM user_posts_media m LEFT JOIN files f ON f.ID = m.fileID WHERE postID = ?', [$postID])->result_array(); | ||||
|             return $result; | ||||
|         } | ||||
|  | ||||
|         private function mergeUserHasLiked($post, $userID) | ||||
|         { | ||||
|             $this->db->cache_off(); | ||||
|             $data = $this->db->query('SELECT * FROM user_posts_likes WHERE postID = (SELECT ID FROM user_posts WHERE uuid = ?) AND likerUserID = ?', [$post['uuid'], $userID])->result_array(); | ||||
|             $data = $this->db->query('SELECT * FROM user_posts_likes WHERE postID = (SELECT ID FROM user_posts WHERE hashID = ?) AND likerUserID = ?', [$post['hashID'], $userID])->result_array(); | ||||
|             $this->db->cache_on(); | ||||
|  | ||||
|             if (empty($data)) { | ||||
| @@ -228,10 +230,11 @@ | ||||
|             return $post; | ||||
|         } | ||||
|  | ||||
|         private function mergeReplyData($post) { | ||||
|             $data = $this->db->query('SELECT p.*, username, displayname FROM user_posts p LEFT JOIN users ON users.ID = p.user_id WHERE p.ID = ?', [$post['reply_to']])->result_array(); | ||||
|         private function mergeReplyData($post) | ||||
|         { | ||||
|             $data = $this->db->query('SELECT p.* FROM user_posts p WHERE p.ID = ?', [$post['replyToPostID']])->result_array(); | ||||
|             $data = $this->preparePostList($data); | ||||
|             if(!empty($data)) { | ||||
|             if (!empty($data)) { | ||||
|                 $post['replyToPost'] = $data[0]; | ||||
|             } else { | ||||
|                 $post['replyToPost'] = [ | ||||
| @@ -259,7 +262,7 @@ | ||||
|         public function getFeedPosts($userID, $amount, $offset) | ||||
|         { | ||||
|             $this->db->cache_off(); | ||||
|             $data = $this->db->query('SELECT * FROM user_posts WHERE user_id IN (SELECT followedUserID FROM user_followers WHERE followerUserID = ?) OR ID IN(SELECT postID FROM user_posts_mentions WHERE mentionedUserID = ?) OR ID IN (SELECT postID FROM user_posts_likes WHERE likedUserID = ?) OR user_id = ? ORDER BY date DESC LIMIT ? OFFSET ?', [$userID, $userID, $userID, $userID, $amount, $offset])->result_array(); | ||||
|             $data = $this->db->query('SELECT * FROM user_posts WHERE userID IN (SELECT followedUserID FROM user_followers WHERE followerUserID = ?) OR ID IN(SELECT postID FROM user_posts_mentions WHERE mentionedUserID = ?) OR ID IN (SELECT postID FROM user_posts_likes WHERE likedUserID = ?) OR userID = ? ORDER BY date DESC LIMIT ? OFFSET ?', [$userID, $userID, $userID, $userID, $amount, $offset])->result_array(); | ||||
|             $this->db->cache_on(); | ||||
|  | ||||
|             $data = $this->preparePostList($data); | ||||
| @@ -270,7 +273,7 @@ | ||||
|         public function getPopularPosts($amount, $offset) | ||||
|         { | ||||
|             $this->db->cache_off(); | ||||
|             $data = $this->db->query('SELECT * FROM user_posts p ORDER BY ((SELECT count(*) FROM user_posts_likes WHERE postID = p.ID) + (SELECT count(*) FROM user_posts WHERE reply_to = p.ID)) DESC, date DESC LIMIT ? OFFSET ?', [$amount, $offset])->result_array(); | ||||
|             $data = $this->db->query('SELECT * FROM user_posts p ORDER BY ((SELECT count(*) FROM user_posts_likes WHERE postID = p.ID) + (SELECT count(*) FROM user_posts WHERE replyToPostID = p.ID)) DESC, date DESC LIMIT ? OFFSET ?', [$amount, $offset])->result_array(); | ||||
|             $this->db->cache_on(); | ||||
|  | ||||
|             $data = $this->preparePostList($data); | ||||
| @@ -278,10 +281,10 @@ | ||||
|             return $data; | ||||
|         } | ||||
|  | ||||
|         public function getPostDetails($userID, $uuid) | ||||
|         public function getPostDetails($userID, $hashID) | ||||
|         { | ||||
|             $this->db->cache_off(); | ||||
|             $data = $this->db->query('SELECT * FROM user_posts WHERE user_id = ? AND uuid = ?', [$userID, $uuid])->result_array(); | ||||
|             $data = $this->db->query('SELECT * FROM user_posts WHERE userID = ? AND hashID = ?', [$userID, $hashID])->result_array(); | ||||
|             $this->db->cache_on(); | ||||
|  | ||||
|             $data = $this->preparePostList($data, -1); | ||||
| @@ -292,7 +295,7 @@ | ||||
|         public function getPostReplies($postID) | ||||
|         { | ||||
|             $this->db->cache_off(); | ||||
|             $replies = $this->db->query('SELECT * FROM user_posts WHERE reply_to = ? ORDER BY date', [$postID])->result_array(); | ||||
|             $replies = $this->db->query('SELECT * FROM user_posts WHERE replyToPostID = ? ORDER BY date', [$postID])->result_array(); | ||||
|             $this->db->cache_on(); | ||||
|  | ||||
|             $replies = $this->preparePostList($replies); | ||||
| @@ -300,33 +303,34 @@ | ||||
|             return $replies; | ||||
|         } | ||||
|  | ||||
|         public function getPostByUUID($uuid) { | ||||
|         public function getPostByHashID($hashID) | ||||
|         { | ||||
|             $this->db->cache_off(); | ||||
|             $result = $this->db->query('SELECT * FROM user_posts WHERE uuid = ?', [$uuid])->result_array(); | ||||
|             $result = $this->db->query('SELECT * FROM user_posts WHERE hashID = ?', [$hashID])->result_array(); | ||||
|             $this->db->cache_on(); | ||||
|             return $result; | ||||
|         } | ||||
|  | ||||
|         public function addPostLikeByUUID($uuid, $userID) | ||||
|         public function addPostLikeByHashID($hashID, $userID) | ||||
|         { | ||||
|             $this->db->cache_off(); | ||||
|             $data = $this->db->query('SELECT * FROM user_posts_likes WHERE postID = (SELECT ID FROM user_posts WHERE uuid = ?) AND likerUserID = ?', [$uuid, $userID])->result_array(); | ||||
|             $data = $this->db->query('SELECT * FROM user_posts_likes WHERE postID = (SELECT ID FROM user_posts WHERE hashID = ?) AND likerUserID = ?', [$hashID, $userID])->result_array(); | ||||
|             $this->db->cache_on(); | ||||
|  | ||||
|             // IDs needed for handling notifications later | ||||
|             $postUser = $this->db->query('SELECT ID FROM users WHERE ID = (SELECT user_id FROM user_posts WHERE uuid = ?)', [$uuid])->result_array(); | ||||
|             $postID = $this->db->query('SELECT ID FROM user_posts WHERE uuid = ?', [$uuid])->result_array(); | ||||
|             $postUser = $this->db->query('SELECT ID FROM users WHERE ID = (SELECT userID FROM user_posts WHERE hashID = ?)', [$hashID])->result_array(); | ||||
|             $postID = $this->db->query('SELECT ID FROM user_posts WHERE hashID = ?', [$hashID])->result_array(); | ||||
|             if (empty($data)) { | ||||
|                 $this->db->query('INSERT INTO user_posts_likes (postID, likedUserID, likerUserID) VALUES ((SELECT ID FROM user_posts WHERE uuid = ?), (SELECT user_id FROM user_posts WHERE uuid = ?), ?)', [$uuid, $uuid, $userID]); | ||||
|                 $this->db->query('INSERT INTO user_posts_likes (postID, likedUserID, likerUserID) VALUES ((SELECT ID FROM user_posts WHERE hashID = ?), (SELECT userID FROM user_posts WHERE hashID = ?), ?)', [$hashID, $hashID, $userID]); | ||||
|  | ||||
|                 // Send like notification | ||||
|                 if ($postUser[0]['ID'] != $userID) { | ||||
|                     $this->NotificationModel->userNotificationPostLike($userID, $postUser[0]['ID'], $postID[0]['ID'], $uuid); | ||||
|                     $this->NotificationModel->userNotificationPostLike($userID, $postUser[0]['ID'], $postID[0]['ID'], $hashID); | ||||
|                 } | ||||
|  | ||||
|                 return true; | ||||
|             } else { | ||||
|                 $this->db->query('DELETE FROM user_posts_likes WHERE postID = (SELECT ID FROM user_posts WHERE uuid = ?) AND likerUserID = ?', [$uuid, $userID]); | ||||
|                 $this->db->query('DELETE FROM user_posts_likes WHERE postID = (SELECT ID FROM user_posts WHERE hashID = ?) AND likerUserID = ?', [$hashID, $userID]); | ||||
|  | ||||
|                 // Remove existing notification | ||||
|                 $this->NotificationModel->removeNotification($userID, $postUser[0]['ID'], $postID[0]['ID'], 'users.likedPost'); | ||||
| @@ -336,18 +340,18 @@ | ||||
|  | ||||
|         } | ||||
|  | ||||
|         public function getPostLikeCountByUUID($uuid) | ||||
|         public function getPostLikeCountByHashID($hashID) | ||||
|         { | ||||
|             $this->db->cache_off(); | ||||
|             $data = $this->db->query('SELECT count(*) likeCount FROM user_posts_likes WHERE postID = (SELECT ID FROM user_posts WHERE uuid = ?)', [$uuid])->result_array(); | ||||
|             $data = $this->db->query('SELECT count(*) likeCount FROM user_posts_likes WHERE postID = (SELECT ID FROM user_posts WHERE hashID = ?)', [$hashID])->result_array(); | ||||
|             $this->db->cache_on(); | ||||
|             return $data[0]['likeCount']; | ||||
|         } | ||||
|  | ||||
|         public function isUUIDValid($uuid) | ||||
|         public function isHashIDValid($hashID) | ||||
|         { | ||||
|             $this->db->cache_off(); | ||||
|             $data = $this->db->query('SELECT ID FROM user_posts WHERE uuid = ?', [$uuid])->result_array(); | ||||
|             $data = $this->db->query('SELECT ID FROM user_posts WHERE hashID = ?', [$hashID])->result_array(); | ||||
|             $this->db->cache_on(); | ||||
|             return !empty($data); | ||||
|         } | ||||
| @@ -376,7 +380,7 @@ | ||||
|         public function searchPosts($query, $limit = 20, $offset = 0) | ||||
|         { | ||||
|             $this->db->cache_off(); | ||||
|             $results = $this->db->query('SELECT * FROM user_posts WHERE content RLIKE ? OR (SELECT username FROM users WHERE ID = user_id) RLIKE ? ORDER BY (SELECT count(*) FROM user_posts_likes WHERE postID = ID) DESC, (SELECT count(*) FROM user_posts WHERE user_posts.reply_to = ID) DESC, date DESC LIMIT ? OFFSET ?', [$query, $query, $limit, $offset])->result_array(); | ||||
|             $results = $this->db->query('SELECT * FROM user_posts WHERE content RLIKE ? OR (SELECT username FROM users WHERE ID = userID) RLIKE ? ORDER BY (SELECT count(*) FROM user_posts_likes WHERE postID = ID) DESC, (SELECT count(*) FROM user_posts WHERE replyToPostID = ID) DESC, date DESC LIMIT ? OFFSET ?', [$query, $query, $limit, $offset])->result_array(); | ||||
|             $this->db->cache_on(); | ||||
|  | ||||
|             $results = $this->preparePostList($results); | ||||
| @@ -384,14 +388,15 @@ | ||||
|             return $results; | ||||
|         } | ||||
|  | ||||
|         public function reportPost($uuid, $reason, $reasonText) { | ||||
|             $this->db->query('INSERT INTO user_posts_reports (postID, reason, reasonText) VALUES ((SELECT ID FROM user_posts WHERE uuid = ?), ?, ?)', [$uuid, $reason, $reasonText]); | ||||
|         public function reportPost($hashID, $reason, $reasonText) | ||||
|         { | ||||
|             $this->db->query('INSERT INTO user_posts_reports (postID, reason, reasonText) VALUES ((SELECT ID FROM user_posts WHERE hashID = ?), ?, ?)', [$hashID, $reason, $reasonText]); | ||||
|             $this->db->cache_delete('admin', 'reports'); | ||||
|  | ||||
|             // Send notification | ||||
|             $postID = $this->db->query('SELECT ID FROM user_posts WHERE uuid = ?', [$uuid])->result_array(); | ||||
|             $postID = $this->db->query('SELECT ID FROM user_posts WHERE hashID = ?', [$hashID])->result_array(); | ||||
|             $this->NotificationModel->rankNotificationPostReport( | ||||
|                 isset($_SESSION['user']) ? $_SESSION['user']['ID'] : -1, | ||||
|                 8, $postID[0]['ID'], $uuid); | ||||
|                 8, $postID[0]['ID'], $hashID); | ||||
|         } | ||||
|     } | ||||
| @@ -26,18 +26,38 @@ | ||||
|         public function mergeTranslationData($postList, $lang = 'de') | ||||
|         { | ||||
|             foreach ($postList as $i => $post) { | ||||
|                 $data = $this->db->query('SELECT * FROM projects_translations WHERE projectID = ? AND (lang = ? OR lang = ?) ORDER BY lang', [$post['ID'], 'de', $lang])->result_array(); | ||||
|                 if (sizeof($data) == 1) { | ||||
|                     $postList[$i] = array_merge($post, $data[0]); | ||||
|                 $data = $this->db->query('SELECT title, description, content, downloadName, openSourceName, customLinkName FROM projects_translations WHERE projectID = ? AND lang = ? ORDER BY lang', [$post['ID'], 'de'])->result_array(); | ||||
|  | ||||
|                 if(empty($data)) { | ||||
|                     $postList[$i] = array_merge($post, [ | ||||
|                         'title' => 'Not found', | ||||
|                         'description' => 'Not found', | ||||
|                         'content' => 'Not found', | ||||
|                     ]); | ||||
|                     continue; | ||||
|                 } | ||||
|  | ||||
|                 $data = $data[0]; | ||||
|                 if($lang == 'de') { | ||||
|                     $postList[$i] = array_merge($post, $data); | ||||
|                     continue; | ||||
|                 } | ||||
|  | ||||
|                 $dataLang = $this->db->query('SELECT title, description, content, downloadName, openSourceName, customLinkName FROM projects_translations WHERE projectID = ? AND lang = ? ORDER BY lang', [$post['ID'], $lang])->result_array(); | ||||
|  | ||||
|                 if (empty($dataLang)) { | ||||
|                     $postList[$i] = array_merge($post, $data); | ||||
|                     continue; | ||||
|                 } | ||||
|  | ||||
|                 $dataLang = $dataLang[0]; | ||||
|  | ||||
|                 $merged = []; | ||||
|                 foreach ($data[0] as $key => $value) { | ||||
|                     if (($value == NULL && $data[1][$key] == NULL) || ($value != NULL && $data[1][$key] == NULL)) { | ||||
|                 foreach ($data as $key => $value) { | ||||
|                     if (($value == NULL && $dataLang[$key] == NULL) || ($value != NULL && $dataLang[$key] == NULL)) { | ||||
|                         $merged[$key] = $value; | ||||
|                     } else { | ||||
|                         $merged[$key] = $data[1][$key]; | ||||
|                         $merged[$key] = $dataLang[$key]; | ||||
|                     } | ||||
|                 } | ||||
|  | ||||
| @@ -48,10 +68,29 @@ | ||||
|  | ||||
|         public function getCategories() | ||||
|         { | ||||
|             $collections = $this->db->query('SELECT c.*, count(p.projectID) count FROM projects_categories c LEFT JOIN projects_entry_categories p ON c.ID = p.categoryID GROUP BY c.ID ORDER BY c.collection')->result_array(); | ||||
|             $collections = $this->db->query('SELECT c.*, count(p.projectID) count FROM projects_categories c LEFT JOIN projects_entry_categories p ON c.categoryID = p.categoryID GROUP BY c.categoryID ORDER BY c.name')->result_array(); | ||||
|  | ||||
|             if($_SESSION['site_lang'] !== 'de') { | ||||
|                 $collectionsLang = $this->db->query('SELECT categoryID, name, displayname FROM projects_categories WHERE lang = ?', [$_SESSION['site_lang']])->result_array(); | ||||
|  | ||||
|                 $categoryIDs = array_column($collections, 'categoryID'); | ||||
|                 foreach ($collectionsLang as $item) { | ||||
|                     $key = array_search($item['categoryID'], $categoryIDs); | ||||
|                     $collections[$key] = array_merge($collections[$key], $item); | ||||
|                 } | ||||
|             } | ||||
|  | ||||
|             return $collections; | ||||
|         } | ||||
|  | ||||
|         public function getCategoriesRaw() { | ||||
|             $categories = $this->db->query('SELECT ID, GROUP_CONCAT(c.name) name, GROUP_CONCAT(c.displayname) displayname, (SELECT COUNT(*) FROM projects_entry_categories p WHERE c.categoryID = p.categoryID) count | ||||
|               FROM projects_categories c | ||||
|               GROUP BY c.categoryID | ||||
|               ORDER BY ID')->result_array(); | ||||
|             return $categories; | ||||
|         } | ||||
|  | ||||
|         public function editEntry($data, $id) | ||||
|         { | ||||
|             $this->db->update('projects', $data, ['id' => $id]); | ||||
| @@ -120,7 +159,19 @@ | ||||
|  | ||||
|         public function getEntryCategories($id) | ||||
|         { | ||||
|             return $this->db->query('SELECT * FROM projects_categories WHERE ID IN (SELECT categoryID FROM projects_entry_categories WHERE projectID = ?)', [$id])->result_array(); | ||||
|             $categories = $this->db->query('SELECT * FROM projects_categories WHERE ID IN (SELECT categoryID FROM projects_entry_categories WHERE projectID = ?) AND lang = "de"', [$id])->result_array(); | ||||
|  | ||||
|             if($_SESSION['site_lang'] != 'de') { | ||||
|                 $categoriesLang = $this->db->query('SELECT categoryID, name, displayname FROM projects_categories WHERE lang = ?', [$_SESSION['site_lang']])->result_array(); | ||||
|  | ||||
|                 $categoryIDs = array_column($categories, 'categoryID'); | ||||
|                 foreach ($categoriesLang as $item) { | ||||
|                     $key = array_search($item['categoryID'], $categoryIDs); | ||||
|                     $categories[$key] = array_merge($categories[$key], $item); | ||||
|                 } | ||||
|             } | ||||
|  | ||||
|             return $categories; | ||||
|         } | ||||
|  | ||||
|         public function updateCategories($postID, $categories) | ||||
|   | ||||
| @@ -50,44 +50,44 @@ | ||||
|  | ||||
|             $possibilities = [ | ||||
|                 'blogPost' => [ | ||||
|                     'sql' => 'SELECT "blogPost" type, bp.postUrl url, bp.postAuthorID author, bp.postImage image, bt.postTitle title, bt.postDesc content, bp.postPublishDate date | ||||
|                        FROM blog_posts bp | ||||
|                               INNER JOIN blog_translations bt ON bt.postID = bp.postID AND bt.language = ? | ||||
|                               LEFT JOIN blog_content bc ON bc.postID = bp.postID AND bc.isActive = TRUE AND bc.language = ? | ||||
|                        WHERE (LOWER(bt.postTitle) RLIKE ? | ||||
|                           OR LOWER(bt.postDesc) RLIKE ? | ||||
|                           OR LOWER(bc.content) RLIKE ? | ||||
|                           OR bp.postID IN (SELECT bpt.post_id FROM blog_post_tags bpt WHERE bpt.tag_id IN(SELECT bt.ID FROM blog_tags bt WHERE bt.name RLIKE ? OR LOWER(bt.display_name) RLIKE ?)) | ||||
|                           OR (SELECT username FROM users WHERE ID = bp.postAuthorID) RLIKE ? | ||||
|                           OR (SELECT display_name FROM blog_categories WHERE ID = bp.postCategoryID) RLIKE ?) | ||||
|                           AND postState = 1 AND postIsDeleted = FALSE', | ||||
|                     'attributes' => 'llqqqqqqq' | ||||
|                     'sql' => 'SELECT "blogPost" type, v.url url, bp.authorID author, bp.image image, v.title title, v.description content, bp.initialRelease date | ||||
|                        FROM blog_post bp | ||||
|                           INNER JOIN blog_post_versions v ON v.postID = bp.ID AND v.lang = ? AND active | ||||
|                        WHERE (LOWER(v.title) RLIKE ? | ||||
|                           OR LOWER(v.description) RLIKE ? | ||||
|                           OR LOWER(v.content) RLIKE ? | ||||
|                           OR bp.ID IN (SELECT bpt.postID FROM blog_post_tags bpt WHERE bpt.tagID IN (SELECT bt.tagID FROM blog_tags bt WHERE (bt.name RLIKE ? OR LOWER(bt.displayname) RLIKE ?) AND lang = ?)) | ||||
|                           OR bp.ID IN (SELECT bpc.postID FROM blog_post_categories bpc WHERE bpc.categoryID IN (SELECT bc.categoryID FROM blog_categories bc WHERE (bc.name RLIKE ? OR LOWER(bc.displayname) RLIKE ?) AND lang = ?)) | ||||
|                           OR (SELECT username FROM users WHERE ID = bp.authorID) RLIKE ?) | ||||
|                           AND state = 1', | ||||
|                     'attributes' => 'lqqqqqlqqlq' | ||||
|                 ], | ||||
|                 'blogCategory' => [ | ||||
|                     'sql' => 'SELECT "blogCategory" type, c.name url, 1 author, null image, c.display_name title, null content, null date | ||||
|                     'sql' => 'SELECT "blogCategory" type, c.name url, 1 author, null image, c.displayname title, null content, null date | ||||
|                       FROM blog_categories c | ||||
|                       WHERE c.name RLIKE ? OR LOWER(c.display_name) RLIKE ?', | ||||
|                     'attributes' => 'qq' | ||||
|                       WHERE (c.name RLIKE ? OR LOWER(c.displayname) RLIKE ?) AND lang = ?', | ||||
|                     'attributes' => 'qql' | ||||
|                 ], | ||||
|                 'blogTag' => [ | ||||
|                     'sql' => 'SELECT "blogTag" type, t.name url, 1 author, null image, t.display_name title, null content, null date | ||||
|                     'sql' => 'SELECT "blogTag" type, t.name url, 1 author, null image, t.displayname title, null content, null date | ||||
|                       FROM blog_tags t | ||||
|                       WHERE t.name RLIKE ? OR LOWER(t.display_name) RLIKE ?', | ||||
|                     'attributes' => 'qq' | ||||
|                       WHERE (t.name RLIKE ? OR LOWER(t.displayname) RLIKE ?) AND lang = ?', | ||||
|                     'attributes' => 'qql' | ||||
|                 ], | ||||
|                 'user' => [ | ||||
|                     'sql' => 'SELECT "user" type, u.username url, u.ID author, u.header_image image, u.displayname title, u.about content, u.date_created date | ||||
|                     'sql' => 'SELECT "user" type, u.username url, u.ID author, s.headerImage image, u.displayname title, s.about content, u.dateCreated date | ||||
|                        FROM users u | ||||
|                           INNER JOIN user_settings s ON u.ID = s.ID | ||||
|                        WHERE (username RLIKE ? | ||||
|                           OR lower(about) RLIKE ?) | ||||
|                           AND is_activated AND isDeleted = FALSE', | ||||
|                           AND activated AND isDeleted = FALSE', | ||||
|                     'attributes' => 'qq', | ||||
|                 ], | ||||
|                 'userPost' => [ | ||||
|                     'sql' => 'SELECT "userPost" type, p.uuid url, p.user_id author, null image, p.content title, null content, p.date date | ||||
|                     'sql' => 'SELECT "userPost" type, p.hashID url, p.userID author, null image, p.content title, null content, p.date date | ||||
|                        FROM user_posts p | ||||
|                        WHERE LOWER(p.content) RLIKE ? | ||||
|                           OR (SELECT username FROM users WHERE ID = p.user_id) RLIKE ?', | ||||
|                           OR (SELECT username FROM users WHERE ID = p.userID) RLIKE ?', | ||||
|                     'attributes' => 'qq', | ||||
|                 ], | ||||
|                 'project' => [ | ||||
| @@ -100,9 +100,9 @@ | ||||
|                     'attributes' => 'lqqq', | ||||
|                 ], | ||||
|                 'projectCategory' => [ | ||||
|                     'sql' => 'SELECT "projectCategory" type, c.collection url, 1 author, null image, c.displayname title, c.displayname content, null date | ||||
|                     'sql' => 'SELECT "projectCategory" type, c.name url, 1 author, null image, c.displayname title, c.displayname content, null date | ||||
|                        FROM projects_categories c | ||||
|                        WHERE lower(collection) RLIKE ? | ||||
|                        WHERE name RLIKE ? | ||||
|                           OR lower(displayname) RLIKE ?', | ||||
|                     'attributes' => 'qq' | ||||
|                 ], | ||||
| @@ -136,7 +136,6 @@ | ||||
|         { | ||||
|             foreach ($results as $i => $result) { | ||||
|                 list( | ||||
|                     'author' => $author, | ||||
|                     'authorDisplayname' => $displayname, | ||||
|                     'authorName' => $username, | ||||
|                     'content' => $content, | ||||
|   | ||||
| @@ -1,113 +1,126 @@ | ||||
| <?php | ||||
| defined('BASEPATH') OR exit('No direct script access allowed'); | ||||
|     defined('BASEPATH') OR exit('No direct script access allowed'); | ||||
|  | ||||
| class SocialMediaModel extends CI_Model | ||||
| { | ||||
|     class SocialMediaModel extends CI_Model | ||||
|     { | ||||
|  | ||||
|         public function __construct() | ||||
|         { | ||||
|             parent::__construct(); | ||||
|         } | ||||
|  | ||||
|     private function getSslPage($url) { | ||||
|         $ch = curl_init(); | ||||
|         curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); | ||||
|         curl_setopt($ch, CURLOPT_HEADER, false); | ||||
|         curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); | ||||
|         curl_setopt($ch, CURLOPT_URL, $url); | ||||
|         curl_setopt($ch, CURLOPT_REFERER, $url); | ||||
|         curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE); | ||||
|         $result = curl_exec($ch); | ||||
|         curl_close($ch); | ||||
|         return $result; | ||||
|     } | ||||
| //    private function getSslPage($url) { | ||||
| //        $ch = curl_init(); | ||||
| //        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); | ||||
| //        curl_setopt($ch, CURLOPT_HEADER, false); | ||||
| //        curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); | ||||
| //        curl_setopt($ch, CURLOPT_URL, $url); | ||||
| //        curl_setopt($ch, CURLOPT_REFERER, $url); | ||||
| //        curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE); | ||||
| //        $result = curl_exec($ch); | ||||
| //        curl_close($ch); | ||||
| //        return $result; | ||||
| //    } | ||||
| // | ||||
| //    public function getYouTubeVideos() | ||||
| //    { | ||||
| //        $apiUrl = 'https://www.googleapis.com/youtube/v3/playlistItems?part=snippet%2CcontentDetails&maxResults=20&playlistId=UUEDHiXaIhm2VFu-hi6CcOWw&key=AIzaSyDAZ_TwVMZeiKDQxgWM2OYRq3YskEpY9yw'; | ||||
| //        $apiResult = json_decode($this->getSslPage($apiUrl)); | ||||
| //        $items = $apiResult->items; | ||||
| //        foreach ($items as $item) { | ||||
| //            $snippet = $item->snippet; | ||||
| //            $published = $snippet->publishedAt; | ||||
| //            $author = $snippet->channelTitle; | ||||
| //            $author_url = "https://youtube.com/channel/" . $snippet->channelId; | ||||
| //            $title = $snippet->title; | ||||
| //            if (isset($snippet->thumbnails->maxres->url)) $thumbnail = $snippet->thumbnails->maxres->url; | ||||
| //            else $thumbnail = $snippet->thumbnails->standard->url; | ||||
| //            $url = "http://youtu.be/" . $snippet->resourceId->videoId; | ||||
| // | ||||
| //            $this->db->query('INSERT INTO social_posts (origin, post_content, post_url, post_author, post_author_url, date, post_img_source) VALUES (?, ?, ?, ?, ?, ?, ?) ON DUPLICATE KEY UPDATE post_content = ?, post_img_source = ?;', ["YouTube", $title, $url, $author, $author_url, strtotime($published), $thumbnail, $title, $thumbnail]); | ||||
| //        } | ||||
| //    } | ||||
| // | ||||
| //    public function getTwitterPosts() | ||||
| //    { | ||||
| //        $consumer_key = 'TsUzd4stukv9Ix7TGG7RdYq4k'; | ||||
| //        $consumer_key_secret = 'sTRq4WcELJZuciTrkNUttGgWhEiGaUkuqNhISgaG4uHRFgzm0B'; | ||||
| //        $access_token = '1880071790-Nij2RaBDVRGVWoWW2PSJUwAvuLAOaQFAAr5tAtC'; | ||||
| //        $access_token_secret = 'ldhLg0SP3ycrrdIqhNcddj0042pdGY9vmZMKQJRClmDkD'; | ||||
| // | ||||
| //        $oauth_hash = 'count=20&oauth_consumer_key=' . $consumer_key . '&oauth_nonce=' . time() . '&oauth_signature_method=HMAC-SHA1&oauth_timestamp=' . time() . '&oauth_token=' . $access_token . '&oauth_version=1.0'; | ||||
| //        $base = 'GET&' . urlencode('https://api.twitter.com/1.1/statuses/user_timeline.json') . '&' . rawurlencode($oauth_hash); | ||||
| //        $key = rawurlencode($consumer_key_secret) . '&' . rawurlencode($access_token_secret); | ||||
| //        $signature = base64_encode(hash_hmac('sha1', $base, $key, true)); | ||||
| //        $signature = rawurlencode($signature); | ||||
| // | ||||
| //        $oauth_header = 'oauth_consumer_key="' . $consumer_key . '", oauth_nonce="' . time() . '", oauth_signature="' . $signature . '", oauth_signature_method="HMAC-SHA1", oauth_timestamp="' . time() . '", oauth_token="' . $access_token . '", oauth_version="1.0", '; | ||||
| //        $curl_header = array("Authorization: Oauth {$oauth_header}", 'Expect:'); | ||||
| // | ||||
| //        $curl_request = curl_init(); | ||||
| //        curl_setopt($curl_request, CURLOPT_HTTPHEADER, $curl_header); | ||||
| //        curl_setopt($curl_request, CURLOPT_HEADER, false); | ||||
| //        curl_setopt($curl_request, CURLOPT_URL, 'https://api.twitter.com/1.1/statuses/user_timeline.json?count=20'); | ||||
| //        curl_setopt($curl_request, CURLOPT_RETURNTRANSFER, true); | ||||
| //        curl_setopt($curl_request, CURLOPT_SSL_VERIFYPEER, false); | ||||
| //        $json = curl_exec($curl_request); | ||||
| //        curl_close($curl_request); | ||||
| // | ||||
| //        $posts = json_decode($json); | ||||
| // | ||||
| // | ||||
| //        foreach ($posts as $post) { | ||||
| //            $content = str_replace("\n", "<br>", $post->text); | ||||
| //            $author = $post->user->screen_name; | ||||
| //            $author_url = 'https://twitter.com/' . $author; | ||||
| //            $url = $author_url . '/status/' . $post->id_str; | ||||
| //            $published = strtotime($post->created_at); | ||||
| //            $original_id = $post->id_str; | ||||
| //            if (isset($post->extended_entities->media[0]->media_url)) { | ||||
| //                $image = $post->extended_entities->media[0]->media_url; | ||||
| //            } else { | ||||
| //                $image = ''; | ||||
| //            } | ||||
| //            $this->db->query('INSERT INTO social_posts (origin, post_content, post_url, post_author, post_author_url, date, post_img_source, post_original_id) VALUES (?, ?, ?, ?, ?, ?, ?, ?) ON DUPLICATE KEY UPDATE post_content = ?, post_author_url = ?, post_original_id = ?;', ["Twitter", $content, $url, $author, $author_url, $published, $image, $original_id, $content, $author_url, $original_id]); | ||||
| //        } | ||||
| //    } | ||||
|  | ||||
|     public function getYouTubeVideos() | ||||
|  | ||||
|         public function newestVids($vidCount) | ||||
|         { | ||||
|         $apiUrl = 'https://www.googleapis.com/youtube/v3/playlistItems?part=snippet%2CcontentDetails&maxResults=20&playlistId=UUEDHiXaIhm2VFu-hi6CcOWw&key=AIzaSyDAZ_TwVMZeiKDQxgWM2OYRq3YskEpY9yw'; | ||||
|         $apiResult = json_decode($this->getSslPage($apiUrl)); | ||||
|         $items = $apiResult->items; | ||||
|         foreach ($items as $item) { | ||||
|             $snippet = $item->snippet; | ||||
|             $published = $snippet->publishedAt; | ||||
|             $author = $snippet->channelTitle; | ||||
|             $author_url = "https://youtube.com/channel/" . $snippet->channelId; | ||||
|             $title = $snippet->title; | ||||
|             if (isset($snippet->thumbnails->maxres->url)) $thumbnail = $snippet->thumbnails->maxres->url; | ||||
|             else $thumbnail = $snippet->thumbnails->standard->url; | ||||
|             $url = "http://youtu.be/" . $snippet->resourceId->videoId; | ||||
|             $data = $this->db->query('SELECT * FROM social_posts WHERE origin = "YouTube" ORDER BY date DESC LIMIT ?', [$vidCount])->result_array(); | ||||
|  | ||||
|             $this->db->query('INSERT INTO social_posts (post_plattform, post_content, post_url, post_author, post_author_url, post_date, post_img_source) VALUES (?, ?, ?, ?, ?, ?, ?) ON DUPLICATE KEY UPDATE post_content = ?, post_img_source = ?;', ["YouTube", $title, $url, $author, $author_url, strtotime($published), $thumbnail, $title, $thumbnail]); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     public function getTwitterPosts() | ||||
|     { | ||||
|         $consumer_key = 'TsUzd4stukv9Ix7TGG7RdYq4k'; | ||||
|         $consumer_key_secret = 'sTRq4WcELJZuciTrkNUttGgWhEiGaUkuqNhISgaG4uHRFgzm0B'; | ||||
|         $access_token = '1880071790-Nij2RaBDVRGVWoWW2PSJUwAvuLAOaQFAAr5tAtC'; | ||||
|         $access_token_secret = 'ldhLg0SP3ycrrdIqhNcddj0042pdGY9vmZMKQJRClmDkD'; | ||||
|  | ||||
|         $oauth_hash = 'count=20&oauth_consumer_key=' . $consumer_key . '&oauth_nonce=' . time() . '&oauth_signature_method=HMAC-SHA1&oauth_timestamp=' . time() . '&oauth_token=' . $access_token . '&oauth_version=1.0'; | ||||
|         $base = 'GET&' . urlencode('https://api.twitter.com/1.1/statuses/user_timeline.json') . '&' . rawurlencode($oauth_hash); | ||||
|         $key = rawurlencode($consumer_key_secret) . '&' . rawurlencode($access_token_secret); | ||||
|         $signature = base64_encode(hash_hmac('sha1', $base, $key, true)); | ||||
|         $signature = rawurlencode($signature); | ||||
|  | ||||
|         $oauth_header = 'oauth_consumer_key="' . $consumer_key . '", oauth_nonce="' . time() . '", oauth_signature="' . $signature . '", oauth_signature_method="HMAC-SHA1", oauth_timestamp="' . time() . '", oauth_token="' . $access_token . '", oauth_version="1.0", '; | ||||
|         $curl_header = array("Authorization: Oauth {$oauth_header}", 'Expect:'); | ||||
|  | ||||
|         $curl_request = curl_init(); | ||||
|         curl_setopt($curl_request, CURLOPT_HTTPHEADER, $curl_header); | ||||
|         curl_setopt($curl_request, CURLOPT_HEADER, false); | ||||
|         curl_setopt($curl_request, CURLOPT_URL, 'https://api.twitter.com/1.1/statuses/user_timeline.json?count=20'); | ||||
|         curl_setopt($curl_request, CURLOPT_RETURNTRANSFER, true); | ||||
|         curl_setopt($curl_request, CURLOPT_SSL_VERIFYPEER, false); | ||||
|         $json = curl_exec($curl_request); | ||||
|         curl_close($curl_request); | ||||
|  | ||||
|         $posts = json_decode($json); | ||||
|  | ||||
|  | ||||
|         foreach ($posts as $post) { | ||||
|             $content = str_replace("\n", "<br>", $post->text); | ||||
|             $author = $post->user->screen_name; | ||||
|             $author_url = 'https://twitter.com/' . $author; | ||||
|             $url = $author_url . '/status/' . $post->id_str; | ||||
|             $published = strtotime($post->created_at); | ||||
|             $original_id = $post->id_str; | ||||
|             if (isset($post->extended_entities->media[0]->media_url)) { | ||||
|                 $image = $post->extended_entities->media[0]->media_url; | ||||
|             if (!empty($data)) { | ||||
|                 return $data; | ||||
|             } else { | ||||
|                 $image = ''; | ||||
|             } | ||||
|             $this->db->query('INSERT INTO social_posts (post_plattform, post_content, post_url, post_author, post_author_url, post_date, post_img_source, post_original_id) VALUES (?, ?, ?, ?, ?, ?, ?, ?) ON DUPLICATE KEY UPDATE post_content = ?, post_author_url = ?, post_original_id = ?;', ["Twitter", $content, $url, $author, $author_url, $published, $image, $original_id, $content, $author_url, $original_id]); | ||||
|                 return null; | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         public function getAllPosts() | ||||
|         { | ||||
|             $this->getTwitterPosts(); | ||||
|         $items = $this->db->query('SELECT * FROM social_posts ORDER BY post_date DESC')->result_array(); | ||||
|             $items = $this->db->query('SELECT * FROM social_posts ORDER BY date DESC')->result_array(); | ||||
|             return $items; | ||||
|         } | ||||
|  | ||||
|         public function getPosts($amount, $offset) | ||||
|         { | ||||
|         if($offset == 0) { | ||||
|             $items = $this->db->query('SELECT * FROM social_posts ORDER BY post_date DESC LIMIT ?', [$amount])->result_array(); | ||||
|             if ($offset == 0) { | ||||
|                 $items = $this->db->query('SELECT * FROM social_posts ORDER BY date DESC LIMIT ?', [$amount])->result_array(); | ||||
|             } else { | ||||
|             $items = $this->db->query('SELECT * FROM social_posts ORDER BY post_date DESC LIMIT ? OFFSET ?', [$amount, $offset])->result_array(); | ||||
|                 $items = $this->db->query('SELECT * FROM social_posts ORDER BY date DESC LIMIT ? OFFSET ?', [$amount, $offset])->result_array(); | ||||
|             } | ||||
|             return $items; | ||||
|         } | ||||
|  | ||||
|     public function getPostsOfCategory($amount, $offset, $category) { | ||||
|         if($offset == 0) { | ||||
|             $items = $this->db->query('SELECT * FROM social_posts WHERE post_plattform LIKE ? ORDER BY post_date DESC LIMIT ?', [$category, $amount])->result_array(); | ||||
|         public function getPostsOfCategory($amount, $offset, $category) | ||||
|         { | ||||
|             if ($offset == 0) { | ||||
|                 $items = $this->db->query('SELECT * FROM social_posts WHERE origin LIKE ? ORDER BY date DESC LIMIT ?', [$category, $amount])->result_array(); | ||||
|             } else { | ||||
|             $items = $this->db->query('SELECT * FROM social_posts WHERE post_plattform LIKE ? ORDER BY post_date DESC LIMIT ? OFFSET ?', [$category, $amount, $offset])->result_array(); | ||||
|                 $items = $this->db->query('SELECT * FROM social_posts WHERE origin LIKE ? ORDER BY date DESC LIMIT ? OFFSET ?', [$category, $amount, $offset])->result_array(); | ||||
|             } | ||||
|             return $items; | ||||
|         } | ||||
| } | ||||
|     } | ||||
|   | ||||
| @@ -13,7 +13,7 @@ | ||||
|  | ||||
|         function getUser($username) | ||||
|         { | ||||
|             $result = $this->db->query('SELECT ID, username, displayname, email, rank, profile_picture, header_image, about, social_networks, showAds, date_created, gender, language, country, birthdate, birthyear, receiveEmails, receiveNewsletter FROM users WHERE username = ? AND is_activated = TRUE AND isDeleted = FALSE LIMIT 1', [$username])->result_array(); | ||||
|             $result = $this->db->query('SELECT u.ID, u.username, u.displayname, u.email, u.rank, u.dateCreated, s.profilePicture, s.headerImage, s.about, s.socialNetworks, s.showAds, s.gender, s.language, s.country, s.birthdate, s.birthyear, s.receiveEmails, s.receiveNewsletter FROM users u INNER JOIN user_settings s ON s.ID = u.ID WHERE username = ? AND activated = TRUE AND isDeleted = FALSE LIMIT 1', [strtolower($username)])->result_array(); | ||||
|             if (empty($result)) { | ||||
|                 return null; | ||||
|             } | ||||
| @@ -25,11 +25,11 @@ | ||||
|         public function setDefaultImages($userList) | ||||
|         { | ||||
|             for ($i = 0; $i < sizeof($userList); $i++) { | ||||
|                 if ((isset($userList[$i]['header_image']) && ($userList[$i]['header_image'] == '' || $userList[$i]['header_image'] == NULL)) || !isset($userList[$i]['header_image'])) { | ||||
|                     $userList[$i]['header_image'] = 'https://cdn.kinogofdog.eu' . '/' . $userList[$i]['displayname']; | ||||
|                 if ((isset($userList[$i]['headerImage']) && ($userList[$i]['headerImage'] == '' || $userList[$i]['headerImage'] == NULL)) || !isset($userList[$i]['headerImage'])) { | ||||
|                     $userList[$i]['headerImage'] = 'https://cdn.kinogofdog.eu' . '/' . $userList[$i]['displayname']; | ||||
|                 } | ||||
|                 if (isset($userList[$i]['profile_picture']) && $userList[$i]['profile_picture'] == '') { | ||||
|                     $userList[$i]['profile_picture'] = base_url('/f/8d204712d8132b36d765640ce775ce15'); | ||||
|                 if (isset($userList[$i]['profilePicture']) && $userList[$i]['profilePicture'] == '') { | ||||
|                     $userList[$i]['profilePicture'] = base_url('/f/8d204712d8132b36d765640ce775ce15'); | ||||
|                 } | ||||
|             } | ||||
|             return $userList; | ||||
| @@ -51,7 +51,18 @@ | ||||
|             return $result; | ||||
|         } | ||||
|  | ||||
|         public function mergeFollowerCount($users) { | ||||
|         public function getFollowers($id) | ||||
|         { | ||||
|             $this->db->cache_off(); | ||||
|             $followers = $this->db->query('SELECT u.ID, followedSince, username, displayname, profilePicture, headerImage FROM user_followers LEFT JOIN users u ON u.ID = followerUserID LEFT JOIN user_settings s ON s.ID = followerUserID WHERE followedUserID = ? AND u.activated = TRUE AND u.isDeleted = FALSE ORDER BY followedSince DESC', [$id])->result_array(); | ||||
|             $this->db->cache_on(); | ||||
|             $followers = $this->setDefaultImages($followers); | ||||
|             $followers = $this->mergeFollowerCount($followers); | ||||
|             return $followers; | ||||
|         } | ||||
|  | ||||
|         public function mergeFollowerCount($users) | ||||
|         { | ||||
|             foreach ($users as $i => $user) { | ||||
|                 $this->db->cache_off(); | ||||
|                 $followerCount = $this->db->query('SELECT count(*) followerCount FROM user_followers WHERE followedUserID = ?', [$user['ID']])->result_array(); | ||||
| @@ -61,19 +72,9 @@ | ||||
|             return $users; | ||||
|         } | ||||
|  | ||||
|         public function getFollowers($id) | ||||
|         { | ||||
|             $this->db->cache_off(); | ||||
|             $followers = $this->db->query('SELECT ID, followedSince, username, displayname, profile_picture, header_image FROM user_followers LEFT JOIN users ON ID = followerUserID WHERE followedUserID = ? AND is_activated = TRUE AND isDeleted = FALSE ORDER BY followedSince DESC', [$id])->result_array(); | ||||
|             $this->db->cache_on(); | ||||
|             $followers = $this->setDefaultImages($followers); | ||||
|             $followers = $this->mergeFollowerCount($followers); | ||||
|             return $followers; | ||||
|         } | ||||
|  | ||||
|         function getUserByID($id) | ||||
|         { | ||||
|             $result = $this->db->query('SELECT ID, original_name, username, displayname, email, rank, profile_picture, header_image, is_activated, about, lastLogin, social_networks, showAds, date_created, gender, language, country, birthdate, birthyear, receiveEmails, receiveNewsletter FROM users WHERE ID = ? AND is_activated = TRUE AND isDeleted = FALSE LIMIT 1', [$id])->result_array(); | ||||
|             $result = $this->db->query('SELECT u.ID, originalName, username, displayname, email, rank, profilePicture, headerImage, activated, about, lastLogin, socialNetworks, showAds, dateCreated, gender, language, country, birthdate, birthyear, receiveEmails, receiveNewsletter FROM users u LEFT JOIN user_settings s ON s.ID = u.ID WHERE u.ID = ? AND activated = TRUE AND isDeleted = FALSE LIMIT 1', [$id])->result_array(); | ||||
|             if (empty($result)) { | ||||
|                 return null; | ||||
|             } | ||||
| @@ -82,15 +83,16 @@ | ||||
|             return $result; | ||||
|         } | ||||
|  | ||||
|         function getUserEmailByID($id) { | ||||
|             $result = $this->db->query('SELECT email FROM users WHERE ID = ? AND is_activated = TRUE AND isDeleted = TRUE', [$id])->result_array(); | ||||
|         function getUserEmailByID($id) | ||||
|         { | ||||
|             $result = $this->db->query('SELECT email FROM users WHERE ID = ? AND activated = TRUE AND isDeleted = TRUE', [$id])->result_array(); | ||||
|             return !empty($result) ? $result[0]['email'] : ''; | ||||
|         } | ||||
|  | ||||
|         public function getFollowing($id) | ||||
|         { | ||||
|             $this->db->cache_off(); | ||||
|             $following = $this->db->query('SELECT ID, followedSince, username, displayname, profile_picture, header_image FROM user_followers LEFT JOIN users ON ID = followedUserID WHERE followerUserID = ? AND isDeleted = FALSE ORDER BY followedSince DESC', [$id])->result_array(); | ||||
|             $following = $this->db->query('SELECT u.ID, followedSince, username, displayname, profilePicture, headerImage FROM user_followers LEFT JOIN users u ON u.ID = followedUserID LEFT JOIN user_settings s ON s.ID = followedUserID WHERE followerUserID = ? AND isDeleted = FALSE ORDER BY followedSince DESC', [$id])->result_array(); | ||||
|             $this->db->cache_on(); | ||||
|             $following = $this->setDefaultImages($following); | ||||
|             $following = $this->mergeFollowerCount($following); | ||||
| @@ -99,15 +101,15 @@ | ||||
|  | ||||
|         function getUserComments($id, $count, $offset) | ||||
|         { | ||||
|             $comments = $this->db->query('SELECT *, p.postUrl FROM blog_comments c LEFT JOIN blog_posts p ON p.postID = c.post_id WHERE user_id = ? ORDER BY date_created DESC LIMIT ? OFFSET ?', [$id, $count, $offset])->result_array(); | ||||
|             $comments = $this->BlogModel->mergePostTitleDesc($comments); | ||||
|             $comments = $this->db->query('SELECT c.* FROM blog_post_comments c WHERE userID = ? ORDER BY date DESC LIMIT ? OFFSET ?', [$id, $count, $offset])->result_array(); | ||||
|             $comments = $this->BlogModel->mergePostTranslation($comments, false, null, 'postID'); | ||||
|             return $comments; | ||||
|         } | ||||
|  | ||||
|         function getUserBlogPosts($id, $count, $offset) | ||||
|         { | ||||
|             $posts = $this->db->query('SELECT * FROM blog_posts WHERE postIsDeleted = FALSE AND postState = 1 AND postAuthorID = ? ORDER BY postPublishDate DESC LIMIT ? OFFSET ?', [$id, $count, $offset])->result_array(); | ||||
|             $posts = $this->BlogModel->mergePostTitleDesc($posts); | ||||
|             $posts = $this->db->query('SELECT * FROM blog_post WHERE state = 1 AND authorID = ? ORDER BY initialRelease DESC LIMIT ? OFFSET ?', [$id, $count, $offset])->result_array(); | ||||
|             $posts = $this->BlogModel->mergePostTranslation($posts); | ||||
|             return $posts; | ||||
|         } | ||||
|  | ||||
| @@ -125,11 +127,11 @@ | ||||
|    FROM user_followers | ||||
|    WHERE followerUserID = ?) followedCount | ||||
| FROM user_posts | ||||
| WHERE user_id = ?', [$userID, $userID, $userID])->result_array()[0]; | ||||
| WHERE userID = ?', [$userID, $userID, $userID])->result_array()[0]; | ||||
|             $result['postCount'] = $user['postCount']; | ||||
|             $result['followerCount'] = $user['followerCount']; | ||||
|             $result['followedCount'] = $user['followedCount']; | ||||
|             $blogResults = $this->db->query('SELECT COUNT(*) blogCount, (SELECT COUNT(*) FROM blog_comments WHERE user_id = ?) commentCount FROM blog_posts WHERE postIsDeleted = FALSE AND postState = 1 AND postAuthorID = ?', [$userID, $userID])->result_array()[0]; | ||||
|             $blogResults = $this->db->query('SELECT COUNT(*) blogCount, (SELECT COUNT(*) FROM blog_post_comments WHERE userID = ?) commentCount FROM blog_post WHERE state = 1 AND authorID = ?', [$userID, $userID])->result_array()[0]; | ||||
|             $result['blogCount'] = $blogResults['blogCount']; | ||||
|             $result['commentCount'] = $blogResults['commentCount']; | ||||
|             $this->db->cache_on(); | ||||
| @@ -162,19 +164,39 @@ WHERE user_id = ?', [$userID, $userID, $userID])->result_array()[0]; | ||||
|  | ||||
|         function updateProfile($data, $id) | ||||
|         { | ||||
|             function in_data1($val) { | ||||
|                 return in_array($val, ['username', 'displayname', 'email', 'password']); | ||||
|             } | ||||
|  | ||||
|             $data1 = array_filter($data, "in_data1"); | ||||
|             if(!empty($data1)) { | ||||
|                 $this->db->where('ID', $id); | ||||
|             $this->db->update('users', $data); | ||||
|                 $this->db->update('users', $data1); | ||||
|             } | ||||
|  | ||||
|             $data2 = array_diff($data, $data1); | ||||
|             if(!empty($data2)) { | ||||
|                 $this->db->where('ID', $id); | ||||
|                 $this->db->update('user_settings', $data2); | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         function insertIntoHistory($data) | ||||
|         { | ||||
|             unset($data['date_created']); | ||||
|             $this->db->insert('users_history', $data); | ||||
|             if(isset($data['password'])) { | ||||
|                 unset($data['password']); | ||||
|                 $data['passwordChanged'] = true; | ||||
|             } | ||||
|  | ||||
|             $this->db->insert('user_settings_history', $data); | ||||
|         } | ||||
|  | ||||
|         function getUserList($amount, $offset) | ||||
|         { | ||||
|             $data = $this->db->query('SELECT ID, username, displayname, rank, profile_picture, header_image, is_activated, showAds, receiveEmails, receiveNewsletter, date_created, isCurrentlyOnline, lastLogin, login_method, language, country, gender FROM users LIMIT ? OFFSET ?', [$amount, $offset])->result_array(); | ||||
|             $data = $this->db->query('SELECT u.ID, username, displayname, rank, profilePicture, headerImage, activated, showAds, receiveEmails, receiveNewsletter, dateCreated, isCurrentlyOnline, lastLogin, loginMethod, language, country, gender | ||||
|               FROM users u | ||||
|                 LEFT JOIN user_settings s ON u.ID = s.ID | ||||
|               LIMIT ? OFFSET ?', [$amount, $offset])->result_array(); | ||||
|             $data = $this->setDefaultImages($data); | ||||
|             $data = $this->setRankname($data); | ||||
|             return $data; | ||||
| @@ -187,34 +209,35 @@ WHERE user_id = ?', [$userID, $userID, $userID])->result_array()[0]; | ||||
|  | ||||
|         function getActiveUsers($count) | ||||
|         { | ||||
|             $data = $this->db->query('SELECT username, displayname, profile_picture, lastLogin, (SELECT COUNT(*) FROM user_followers WHERE followedUserID = users.ID) follower_count FROM users WHERE isCurrentlyOnline = TRUE AND is_activated = TRUE AND isDeleted = FALSE ORDER BY lastLogin DESC LIMIT ?', [$count])->result_array(); | ||||
|             $data = $this->db->query('SELECT username, displayname, profilePicture, lastLogin, (SELECT COUNT(*) FROM user_followers WHERE followedUserID = u.ID) follower_count FROM users u LEFT JOIN user_settings s ON s.ID = u.ID WHERE isCurrentlyOnline = TRUE AND activated = TRUE AND isDeleted = FALSE ORDER BY lastLogin DESC LIMIT ?', [$count])->result_array(); | ||||
|             $data = $this->setDefaultImages($data); | ||||
|             return $data; | ||||
|         } | ||||
|  | ||||
|         public function getNewestUsers($count) | ||||
|         { | ||||
|             $data = $this->db->query('SELECT username, displayname, profile_picture, date_created, (SELECT COUNT(*) FROM user_followers WHERE followedUserID = users.ID) follower_count FROM users WHERE is_activated = TRUE AND isDeleted = FALSE ORDER BY date_created DESC LIMIT ?', [$count])->result_array(); | ||||
|             $data = $this->db->query('SELECT username, displayname, profilePicture, dateCreated, (SELECT COUNT(*) FROM user_followers WHERE followedUserID = u.ID) follower_count FROM users u LEFT JOIN user_settings s ON s.ID = u.ID WHERE activated = TRUE AND isDeleted = FALSE ORDER BY dateCreated DESC LIMIT ?', [$count])->result_array(); | ||||
|             $data = $this->setDefaultImages($data); | ||||
|             return $data; | ||||
|         } | ||||
|  | ||||
|         public function searchUsers($query, $rank = '', $region = '', $lang = '', $amount = 3, $offset = 0) { | ||||
|         public function searchUsers($query, $rank = '', $region = '', $lang = '', $amount = 3, $offset = 0) | ||||
|         { | ||||
|             $conditions = []; | ||||
|             $inputs = []; | ||||
|             if($query !== '') { | ||||
|             if ($query !== '') { | ||||
|                 $conditions[] = 'username RLIKE ?'; | ||||
|                 $inputs[] = $query; | ||||
|             } | ||||
|             if($rank !== '') { | ||||
|             if ($rank !== '') { | ||||
|                 $conditions[] = 'rank = ?'; | ||||
|                 $inputs[] = $rank; | ||||
|             } | ||||
|             if($region !== '') { | ||||
|             if ($region !== '') { | ||||
|                 $conditions[] = 'country = ?'; | ||||
|                 $inputs[] = $region; | ||||
|             } | ||||
|             if($lang !== '') { | ||||
|             if ($lang !== '') { | ||||
|                 $conditions[] = 'language = ?'; | ||||
|                 $inputs[] = $lang; | ||||
|             } | ||||
| @@ -222,7 +245,7 @@ WHERE user_id = ?', [$userID, $userID, $userID])->result_array()[0]; | ||||
|             $dbClause = join(' AND ', $conditions); | ||||
|             $inputs[] = $amount; | ||||
|             $inputs[] = $offset; | ||||
|             $data = $this->db->query('SELECT username, displayname, profile_picture, header_image, about, rank FROM users WHERE is_activated = TRUE AND isDeleted = FALSE AND ' . $dbClause . ' LIMIT ? OFFSET ?', $inputs)->result_array(); | ||||
|             $data = $this->db->query('SELECT username, displayname, profilePicture, headerImage, about, rank FROM users u LEFT JOIN user_settings s ON s.ID = u.ID WHERE activated = TRUE AND isDeleted = FALSE AND ' . $dbClause . ' LIMIT ? OFFSET ?', $inputs)->result_array(); | ||||
|  | ||||
|             $data = $this->setDefaultImages($data); | ||||
|             $data = $this->setRankname($data); | ||||
| @@ -230,19 +253,23 @@ WHERE user_id = ?', [$userID, $userID, $userID])->result_array()[0]; | ||||
|             return $data; | ||||
|         } | ||||
|  | ||||
|         public function getAvailableCountries() { | ||||
|             return $this->db->query('SELECT country, count(*) countryUserCount FROM users WHERE country IS NOT NULL AND country != "" GROUP BY country ORDER BY country')->result_array(); | ||||
|         public function getAvailableCountries() | ||||
|         { | ||||
|             return $this->db->query('SELECT country, count(*) countryUserCount FROM user_settings WHERE country IS NOT NULL AND country != "" GROUP BY country ORDER BY country')->result_array(); | ||||
|         } | ||||
|  | ||||
|         public function getAvailableLanguages() { | ||||
|             return $this->db->query('SELECT language, count(*) langUserCount FROM users GROUP BY language ORDER BY language')->result_array(); | ||||
|         public function getAvailableLanguages() | ||||
|         { | ||||
|             return $this->db->query('SELECT language, count(*) langUserCount FROM user_settings GROUP BY language ORDER BY language')->result_array(); | ||||
|         } | ||||
|  | ||||
|         public function deleteUser($id) { | ||||
|         public function deleteUser($id) | ||||
|         { | ||||
|             $this->db->query('UPDATE users SET isDeleted = TRUE, isCurrentlyOnline = FALSE, lastOnlineUpdate = NULL WHERE ID = ?', [$id])->result_array(); | ||||
|         } | ||||
|  | ||||
|         public function getPermissions($userID) { | ||||
|         public function getPermissions($userID) | ||||
|         { | ||||
|             $this->db->cache_off(); | ||||
|             $result = $this->db->query('SELECT * FROM user_permissions WHERE userID = ?', [$userID])->result_array(); | ||||
|             $this->db->cache_on(); | ||||
| @@ -256,18 +283,21 @@ WHERE user_id = ?', [$userID, $userID, $userID])->result_array()[0]; | ||||
|             return $perms; | ||||
|         } | ||||
|  | ||||
|         public function hasPermission($userID, $permType, $permName) { | ||||
|         public function hasPermission($userID, $permType, $permName) | ||||
|         { | ||||
|             $this->db->cache_off(); | ||||
|             $result = $this->db->query('SELECT ID FROM user_permissions WHERE userID = ? AND permissionType = ? AND permissionName = ?', [$userID, $permType, $permName])->result_array(); | ||||
|             $this->db->cache_on(); | ||||
|             return !empty($result); | ||||
|         } | ||||
|  | ||||
|         public function addPermission($userID, $permissionGroup, $permissionName, $givenBy) { | ||||
|         public function addPermission($userID, $permissionGroup, $permissionName, $givenBy) | ||||
|         { | ||||
|             $this->db->query('INSERT INTO user_permissions (userID, permissionType, permissionName, givenBy) VALUES (?, ?, ?, ?)', [$userID, $permissionGroup, $permissionName, $givenBy]); | ||||
|         } | ||||
|  | ||||
|         public function revokePermission($userID, $permissionGroup, $permissionName) { | ||||
|         public function revokePermission($userID, $permissionGroup, $permissionName) | ||||
|         { | ||||
|             $this->db->query('DELETE FROM user_permissions WHERE userID = ? AND permissionType = ? AND permissionName = ?', [$userID, $permissionGroup, $permissionName]); | ||||
|         } | ||||
|     } | ||||
|   | ||||
							
								
								
									
										10
									
								
								application/views/admin/blog/templates/post_reference.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								application/views/admin/blog/templates/post_reference.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,10 @@ | ||||
| <?php | ||||
|     defined('BASEPATH') OR exit('No direct script access allowed'); | ||||
| ?> | ||||
|  | ||||
| <div class="card"> | ||||
|     <div class="card-body"> | ||||
|         <h5 class="card-title">Titel</h5> | ||||
|         <p class="card-text"></p> | ||||
|     </div> | ||||
| </div> | ||||
| @@ -125,9 +125,8 @@ defined('BASEPATH') OR exit('No direct script access allowed'); | ||||
|  | ||||
|                         </style> | ||||
|                         <input type="hidden" value="<?= $postID ?>" id="postID"> | ||||
|                         <input type="hidden" value="<?= isset($contents[$postLanguage]) ? $contents[$postLanguage] : $contents['de'] ?>" id="contentID"> | ||||
|                         <input type="hidden" value="<?= $translations[$postLanguage] ?>" id="translationID"> | ||||
|                         <input type="hidden" value="<?= $postLanguage ?>" id="postLanguage"> | ||||
|                         <input type="hidden" value="<?= isset($versions[$lang]) ? $versions[$lang] : $versions['de'] ?>" id="versionID"> | ||||
|                         <input type="hidden" value="<?= $lang ?>" id="postLanguage"> | ||||
|                         <input type="hidden" value="" id="uploadedImage"> | ||||
|                         <div class="col-sm-12"> | ||||
|                             <div class="blog"> | ||||
| @@ -157,11 +156,11 @@ defined('BASEPATH') OR exit('No direct script access allowed'); | ||||
|                                             <div> | ||||
|                                                 <i class="fa fa-folder-open"></i> | ||||
|                                                 <div class="category-select" style="display: inline-block;"> | ||||
|                                                     <select class="form-control" id="postCategory"> | ||||
|                                                     <select class="form-control" id="postCategory" multiple> | ||||
|                                                         <option value="new-category">-- Neue Kategorie --</option> | ||||
|                                                         <?php foreach ($categories as $category) { ?> | ||||
|                                                             <option value="<?= $category['ID'] ?>"> | ||||
|                                                                 <?= $category['display_name'] ?> | ||||
|                                                                 <?= $category['displayname'] ?> | ||||
|                                                             </option> | ||||
|                                                         <?php } ?> | ||||
|                                                     </select> | ||||
| @@ -244,13 +243,13 @@ defined('BASEPATH') OR exit('No direct script access allowed'); | ||||
|                     </div> | ||||
|                     <div class="x_content"> | ||||
|                         <ul class="nav nav-pills nav-stacked" id="switchLanguages"> | ||||
|                             <li role="presentation" class="<?= $postLanguage == 'de' ? 'active' : '' ?>" data-lang="de" data-translationID="<?= $translations['de'] ?>" data-contentID="<?= $contents['de'] ?>"> | ||||
|                             <li role="presentation" class="<?= $lang == 'de' ? 'active' : '' ?>" data-lang="de" data-versionID="<?= $versions['de'] ?>"> | ||||
|                                 <span class="flag-icon flag-icon-de"></span> Deutsch | ||||
|                             </li> | ||||
|                             <li role="presentation" class="<?= $postLanguage == 'en' ? 'active' : '' ?>" data-lang="en" data-translationID="<?= isset($translations['en']) ? $translations['en'] : -1 ?>" data-contentID="<?= isset($contents['en']) ? $contents['en'] : -1 ?>"> | ||||
|                             <li role="presentation" class="<?= $lang == 'en' ? 'active' : '' ?>" data-lang="en" data-versionID="<?= isset($versions['en']) ? $versions['en'] : -1 ?>"> | ||||
|                                 <span class="flag-icon flag-icon-us"></span> Englisch | ||||
|                             </li> | ||||
|                             <li role="presentation" class="<?= $postLanguage == 'fr' ? 'active' : '' ?>" data-lang="fr" data-translationID="<?= isset($translations['fr']) ? $translations['fr'] : -1 ?>" data-contentID="<?= isset($contents['fr']) ? $contents['fr'] : -1 ?>"> | ||||
|                             <li role="presentation" class="<?= $lang == 'fr' ? 'active' : '' ?>" data-lang="fr" data-versionID="<?= isset($versions['fr']) ? $versions['fr'] : -1 ?>"> | ||||
|                                 <span class="flag-icon flag-icon-fr"></span> Französisch | ||||
|                             </li> | ||||
|                         </ul> | ||||
|   | ||||
| @@ -1,5 +1,8 @@ | ||||
| <?php | ||||
|     defined('BASEPATH') OR exit('No direct script access allowed'); | ||||
|  | ||||
|     require_once './vendor/Diff/htmLawed.php'; | ||||
|     require_once './vendor/Diff/class.Diff.php'; | ||||
| ?> | ||||
| <div class="right_col" role="main"> | ||||
|     <div class=""> | ||||
| @@ -12,37 +15,64 @@ | ||||
|                     </div> | ||||
|                     <div class="x_content"> | ||||
|                         <div class="row"> | ||||
|                             <div class="compare-items-container"> | ||||
|                                 <div class="compare-items row"> | ||||
|  | ||||
|                                 </div> | ||||
|                                 <div class="row"> | ||||
|                                     <a href="#" class="btn btn-sm btn-primary compare-btn" disabled="">Vergleichen</a> | ||||
|                                 </div> | ||||
|                             </div> | ||||
|                         </div> | ||||
|                         <div class="row" style="width: auto; overflow-x:scroll;"> | ||||
|                             <?php foreach ($content as $language => $items): ?> | ||||
|                                 <div class="col-sm-3"> | ||||
|                                 <div class="col-12"> | ||||
|                                     <h3><?= $language ?></h3> | ||||
|  | ||||
|                                     <!--                                    --><?php //echo Diff::toHTML(Diff::compare("Hallo!\n   Peter Enis\nFotze", "Hallo.\n    Peter Penis\nFotze")) ?> | ||||
|  | ||||
|                                     <ul class="list-unstyled timeline"> | ||||
|                                         <?php foreach ($items as $item): ?> | ||||
|                                         <?php foreach ($items as $i => $item): ?> | ||||
|                                             <li> | ||||
|                                                 <div class="block"> | ||||
|                                                     <div class="tags"> | ||||
|                                                         <?php if ($item['isActive'] == 1): ?> | ||||
|                                                         <?php if ($item['active'] == 1): ?> | ||||
|                                                             <a class="tag"> | ||||
|                                                                 <span>Aktiv</span> | ||||
|                                                             </a> | ||||
|                                                         <?php endif; ?> | ||||
|                                                         <?php if ($item['isNativePost'] == 1): ?> | ||||
|                                                             <a class="tag"> | ||||
|                                                                 <span>Original-Version</span> | ||||
|                                                             </a> | ||||
|                                                         <?php endif; ?> | ||||
|                                                     </div> | ||||
|                                                     <div class="block_content"> | ||||
|                                                         <h2 class="title"> | ||||
|                                                             <?= $item['versionMessage'] ?> | ||||
|                                                             <span class="badge badge-default"><?= substr($item['hashID'], 0, 8) ?></span> | ||||
|                                                             <?= $item['changes'] ?> | ||||
|                                                         </h2> | ||||
|                                                         <div class="byline"> | ||||
|                                                             <span><?= date("d.m.Y \u\m H:i", strtotime($item['contentDate'])) ?> Uhr</span> | ||||
|                                                             <span><?= date("d.m.Y \u\m H:i", strtotime($item['edited'])) ?> Uhr</span> | ||||
|                                                             von | ||||
|                                                             <?php $author = $this->BlogModel->getAuthorData($item['contentAuthorID']) ?> | ||||
|                                                             <?php $author = $this->BlogModel->getAuthorData($item['authorID']) ?> | ||||
|                                                             <a href="/user/<?= $author['username'] ?>"><?= $author['displayname'] ?></a> | ||||
|                                                         </div> | ||||
|                                                         <p class="excerpt"><?= $item['content'] ?> | ||||
|                                                         <p class="excerpt"> | ||||
|                                                             Titel: | ||||
|                                                             <i><?= $item['title'] ?></i> | ||||
|                                                             <br> | ||||
|                                                             Beschreibung: | ||||
|                                                             <i><?= $item['description'] ?></i> | ||||
|                                                         </p> | ||||
|                                                         <div class="actions"> | ||||
|                                                             <button class="btn btn-sm btn-primary"> | ||||
|                                                                 Ansehen | ||||
|                                                             </button> | ||||
|                                                             <button class="btn btn-sm btn-default history-compare" data-hashID="<?= $item['hashID'] ?>"> | ||||
|                                                                 Vergleichen mit... | ||||
|                                                             </button> | ||||
|                                                             <?php if (!$item['active']): ?> | ||||
|                                                                 <button class="btn btn-sm btn-default"> | ||||
|                                                                     Aktivieren | ||||
|                                                                 </button> | ||||
|                                                             <?php endif; ?> | ||||
|                                                         </div> | ||||
|                                                     </div> | ||||
|                                                 </div> | ||||
|                                             </li> | ||||
|   | ||||
| @@ -36,33 +36,33 @@ | ||||
|                                 </thead> | ||||
|                                 <tbody> | ||||
|                                 <?php foreach ($posts as $post) { ?> | ||||
|                                     <tr id="post-<?= $post['postID'] ?>"> | ||||
|                                     <tr id="post-<?= $post['ID'] ?>"> | ||||
|                                         <td> | ||||
|                                             <?= $post['postID'] ?> | ||||
|                                             <?= $post['ID'] ?> | ||||
|                                         </td> | ||||
|                                         <td> | ||||
|                                             <a href="<?= base_url('blog/post/' . $post['postUrl']) ?>" target="_blank"><?= $post['postTitle'] ?></a> | ||||
|                                             <a href="<?= base_url('blog/post/' . $post['url']) ?>" target="_blank"><?= $post['title'] ?></a> | ||||
|                                         </td> | ||||
|                                         <td> | ||||
|                                             <?= $post['postDesc'] ?> | ||||
|                                             <?= substr($post['description'], 0, 40) ?>... | ||||
|                                         </td> | ||||
|                                         <td> | ||||
|                                             <?= $post['postStateDisplay'] ?> | ||||
|                                             <?= $post['stateName'] ?> | ||||
|                                         </td> | ||||
|                                         <td> | ||||
|                                             <?= date('d.m.Y H:i', strtotime($post['postPublishDate'])) ?> | ||||
|                                             <?= date('d.m.Y H:i', strtotime($post['initialRelease'])) ?> | ||||
|                                         </td> | ||||
|                                         <td> | ||||
|                                             <?= date('d.m.Y H:i', strtotime($post['postLastEdit'])) ?> | ||||
|                                             <?= date('d.m.Y H:i', strtotime($post['lastEdit'])) ?> | ||||
|                                         </td> | ||||
|                                         <td> | ||||
|                                             <a href="<?= base_url('user/' . $post['postAuthorUsername']) ?>" target="_blank"><?= $post['postAuthorDisplayname'] ?></a> | ||||
|                                             <a href="<?= base_url('user/' . $post['author']['displayname']) ?>" target="_blank"><?= $post['author']['displayname'] ?></a> | ||||
|                                         </td> | ||||
|                                         <td> | ||||
|                                             <a href="<?= base_url('blog/category/' . $post['categoryName']) ?>" target="_blank"><?= $post['categoryDisplayName'] ?></a> | ||||
| <!--                                            <a href="--><?//= base_url('blog/category/' . $post['categoryName']) ?><!--" target="_blank">--><?//= $post['categoryDisplayName'] ?><!--</a>--> | ||||
|                                         </td> | ||||
|                                         <td> | ||||
|                                             <?= $post['postViews'] ?> | ||||
|                                             <?= $post['views'] ?> | ||||
|                                             <i class="fa fa-eye"></i> | ||||
|                                         </td> | ||||
|                                         <td> | ||||
| @@ -75,30 +75,30 @@ | ||||
|                                         </td> | ||||
|                                         <?php if (isset($trashbin) && $trashbin): ?> | ||||
|                                             <td> | ||||
|                                                 <a data-toggle="tooltip" data-placement="top" title="" data-original-title="Bearbeiten" href="<?= base_url('admin/blog/edit/' . $post['postID']) ?>" target="_blank" class="btn btn-xs btn-default"> | ||||
|                                                 <a data-toggle="tooltip" data-placement="top" title="" data-original-title="Bearbeiten" href="<?= base_url('admin/blog/edit/' . $post['ID']) ?>" target="_blank" class="btn btn-xs btn-default"> | ||||
|                                                     <i class="fa fa-edit"></i> | ||||
|                                                 </a> | ||||
|                                                 <a data-toggle="tooltip" data-placement="top" title="" data-original-title="History" href="<?= base_url('admin/blog/history/' . $post['postID']) ?>" target="_blank" class="btn btn-xs btn-default"> | ||||
|                                                 <a data-toggle="tooltip" data-placement="top" title="" data-original-title="History" href="<?= base_url('admin/blog/history/' . $post['ID']) ?>" target="_blank" class="btn btn-xs btn-default"> | ||||
|                                                     <i class="fa fa-history"></i> | ||||
|                                                 </a> | ||||
|                                                 <a data-toggle="tooltip" data-placement="top" title="" data-original-title="Wiederherstellen" onclick="restorePost(<?= $post['postID'] ?>)" class="btn btn-xs btn-green"> | ||||
|                                                 <a data-toggle="tooltip" data-placement="top" title="" data-original-title="Wiederherstellen" onclick="restorePost(<?= $post['ID'] ?>)" class="btn btn-xs btn-green"> | ||||
|                                                     <i class="fa fa-undo"></i> | ||||
|                                                 </a> | ||||
|                                                 <a href="" data-toggle="tooltip" data-placement="top" title="Endgültig löschen"> | ||||
|                                                     <button type="button" class="btn btn-xs btn-red" data-toggle="modal" data-target="#deleteModal" data-type="Blog-Post" data-title="<?= $post['postTitle'] ?>" data-id="<?= $post['postID'] ?>"> | ||||
|                                                     <button type="button" class="btn btn-xs btn-red" data-toggle="modal" data-target="#deleteModal" data-type="Blog-Post" data-title="<?= $post['title'] ?>" data-id="<?= $post['ID'] ?>"> | ||||
|                                                         <i class="fa fa-trash"></i> | ||||
|                                                     </button> | ||||
|                                                 </a> | ||||
|                                             </td> | ||||
|                                         <?php else: ?> | ||||
|                                             <td> | ||||
|                                                 <a data-toggle="tooltip" data-placement="top" title="" data-original-title="Bearbeiten" href="<?= base_url('admin/blog/edit/' . $post['postID'] . '/') ?>" target="_blank" class="btn btn-xs btn-default"> | ||||
|                                                 <a data-toggle="tooltip" data-placement="top" title="" data-original-title="Bearbeiten" href="<?= base_url('admin/blog/edit/' . $post['ID'] . '/') ?>" target="_blank" class="btn btn-xs btn-default"> | ||||
|                                                     <i class="fa fa-edit"></i> | ||||
|                                                 </a> | ||||
|                                                 <a data-toggle="tooltip" data-placement="top" title="" data-original-title="History" href="<?= base_url('admin/blog/history/' . $post['postID']) ?>" target="_blank" class="btn btn-xs btn-default"> | ||||
|                                                 <a data-toggle="tooltip" data-placement="top" title="" data-original-title="History" href="<?= base_url('admin/blog/history/' . $post['ID']) ?>" target="_blank" class="btn btn-xs btn-default"> | ||||
|                                                     <i class="fa fa-history"></i> | ||||
|                                                 </a> | ||||
|                                                 <a data-toggle="tooltip" data-placement="top" title="" data-original-title="Löschen" onclick="deletePost(<?= $post['postID'] ?>)" class="btn btn-xs btn-red"> | ||||
|                                                 <a data-toggle="tooltip" data-placement="top" title="" data-original-title="Löschen" onclick="deletePost(<?= $post['ID'] ?>)" class="btn btn-xs btn-red"> | ||||
|                                                     <i class="fa fa-trash"></i> | ||||
|                                                 </a> | ||||
|                                             </td> | ||||
|   | ||||
| @@ -90,23 +90,37 @@ | ||||
|                         <table id="datatable-fixed-header" class="table table-striped table-bordered"> | ||||
|                             <thead> | ||||
|                             <tr> | ||||
|                                 <th>ID</th> | ||||
|                                 <th>Name</th> | ||||
|                                 <th>Titel - Deutsch</th> | ||||
|                                 <th>Titel - English</th> | ||||
|                                 <th>Titel - Französisch</th> | ||||
|                                 <th>Anzahl Einträge</th> | ||||
|                                 <th>Tools</th> | ||||
|                                 <th rowspan="2">ID</th> | ||||
|                                 <th colspan="3">Name</th> | ||||
|                                 <th colspan="3">Titel</th> | ||||
|                                 <th rowspan="2">Anzahl Einträge</th> | ||||
|                                 <th rowspan="2">Tools</th> | ||||
|                             </tr> | ||||
|                             <tr> | ||||
|                                 <th>Deutsch</th> | ||||
|                                 <th>Englisch</th> | ||||
|                                 <th>Französisch</th> | ||||
|                                 <th>Deutsch</th> | ||||
|                                 <th>Englisch</th> | ||||
|                                 <th>Französisch</th> | ||||
|                             </tr> | ||||
|                             </thead> | ||||
|                             <tbody> | ||||
|                             <?php foreach ($categories as $c) { ?> | ||||
|                             <?php foreach ($categories as $c) { | ||||
|                                 $names = explode(',', $c['name']); | ||||
|                                 $displaynames = explode(',', $c['displayname']); | ||||
|                                 ?> | ||||
|                                 <tr id="category-<?= $c['ID'] ?>"> | ||||
|                                     <td><?= $c['ID'] ?></td> | ||||
|                                     <td><?= $c['collection'] ?></td> | ||||
|                                     <td><?= $c['displayname'] ?></td> | ||||
|                                     <td><?= $c['displaynameEnglish'] ?></td> | ||||
|                                     <td><?= $c['displaynameFrench'] ?></td> | ||||
|  | ||||
|                                     <td><?= isset($names[0]) ? $names[0] : '' ?></td> | ||||
|                                     <td><?= isset($names[1]) ? $names[1] : '' ?></td> | ||||
|                                     <td><?= isset($names[2]) ? $names[2] : '' ?></td> | ||||
|  | ||||
|                                     <td><?= isset($displaynames[0]) ? $displaynames[0] : '' ?></td> | ||||
|                                     <td><?= isset($displaynames[1]) ? $displaynames[1] : '' ?></td> | ||||
|                                     <td><?= isset($displaynames[2]) ? $displaynames[2] : '' ?></td> | ||||
|  | ||||
|                                     <td><?= $c['count'] ?></td> | ||||
|                                     <td> | ||||
|                                         <button type="button" class="btn btn-xs btn-red" data-toggle="modal" data-target="#deleteModal" data-type="Projekt-Kategorie" data-title="<?= $c['displayname'] ?>" data-id="<?= $c['ID'] ?>"> | ||||
|   | ||||
| @@ -16,18 +16,18 @@ use Coduo\PHPHumanizer\DateTimeHumanizer; | ||||
|                     <div class="x_content"> | ||||
|                         <div class="row"> | ||||
|                             <div class="col-sm-2"> | ||||
|                                 <img src="<?= $user['profile_picture'] ?>" class="img-fluid"> | ||||
|                                 <img src="<?= $user['profilePicture'] ?>" class="img-fluid"> | ||||
|                             </div> | ||||
|                             <div class="col-sm-10"> | ||||
|                                 <h3><a href="<?= base_url('user/' . $user['username']) ?>" | ||||
|                                        target="_blank"><?= $user['displayname'] ?></a></h3> | ||||
|                                 <?php $created_at = strtotime($user['date_created']); ?> | ||||
|                                 <?php $created_at = strtotime($user['dateCreated']); ?> | ||||
|                                 <p> | ||||
|                                     <b>Account erstellt: </b> | ||||
|                                     <?= DateTimeHumanizer::difference(new \DateTime(), new \DateTime("@$created_at"), "de_DE") ?> | ||||
|                                     <i>(<?= date("d.m.Y H:i", $created_at) ?>)</i> | ||||
|                                 </p> | ||||
|                                 <p><b>Originaler Name:</b> <?= $user['original_name'] ?></p> | ||||
|                                 <p><b>Originaler Name:</b> <?= $user['originalName'] ?></p> | ||||
|                             </div> | ||||
|                         </div> | ||||
|                         <div class="row col-sm-12"> | ||||
| @@ -55,7 +55,7 @@ use Coduo\PHPHumanizer\DateTimeHumanizer; | ||||
|                             </p> | ||||
|                             <p> | ||||
|                                 <b>Aktiviert?</b> | ||||
|                                 <?= $user['is_activated'] ? '<i class="fa fa-check-circle-o"></i> Ja' : '<i class="fa fa-times-circle-o"></i>Nein' ?> | ||||
|                                 <?= $user['activated'] ? '<i class="fa fa-check-circle-o"></i> Ja' : '<i class="fa fa-times-circle-o"></i>Nein' ?> | ||||
|                             </p> | ||||
|                             <p> | ||||
|                                 <b>Zeige Werbung?</b> | ||||
|   | ||||
| @@ -53,9 +53,9 @@ | ||||
|                                     2 => "Twitter", | ||||
|                                     3 => "GitHub" | ||||
|                                 ]; | ||||
|                                 $loginMethod = $loginMethods[$user['login_method']]; | ||||
|                                 $loginMethod = $loginMethods[$user['loginMethod']]; | ||||
|  | ||||
|                                 $dateCreated = strtotime($user['date_created']); | ||||
|                                 $dateCreated = strtotime($user['dateCreated']); | ||||
|                                 $lastLogin = strtotime($user['lastLogin']); | ||||
|                                 $dateCreatedStr = DateTimeHumanizer::difference(new \DateTime(), new \DateTime("@$dateCreated"), "de_DE"); | ||||
|                                 if($lastLogin) | ||||
| @@ -82,12 +82,12 @@ | ||||
|                                         (<?= date("d.m.Y H:i", $dateCreated) ?>) | ||||
|                                     </td> | ||||
|                                     <td> | ||||
|                                         <img src="<?= $user['profile_picture'] ?>?w=50" class="img-fluid rounded" | ||||
|                                         <img src="<?= $user['profilePicture'] ?>?w=50" class="img-fluid rounded" | ||||
|                                              alt="Profilbild" | ||||
|                                              style="max-height: 50px;"> | ||||
|                                     </td> | ||||
|                                     <td> | ||||
|                                         <?= $user['is_activated'] ? "<i class='fa fa-check-circle'></i> Ja" : "<i class='fa fa-times-circle'></i> Nein" ?> | ||||
|                                         <?= $user['activated'] ? "<i class='fa fa-check-circle'></i> Ja" : "<i class='fa fa-times-circle'></i> Nein" ?> | ||||
|                                     </td> | ||||
|                                     <td> | ||||
|                                         <?= $user['showAds'] ? '<i class="fa fa-check-circle"></i> Ja' : '<i class="fa fa-times-circle"></i> Nein' ?> | ||||
| @@ -128,7 +128,7 @@ | ||||
|                                         <?php endif; ?> | ||||
|  | ||||
|                                         <?php if(get_instance()->hasPermission('user.ban')): ?> | ||||
|                                             <a data-toggle="tooltip" data-placement="top" title="" data-original-title="Account löschen" onclick="showDeleteModal(<?= $user['ID'] ?>. <?= $user['username'] ?>)" target="_blank" class="btn btn-xs btn-red"> | ||||
|                                             <a data-toggle="tooltip" data-placement="top" title="" data-original-title="Account löschen" onclick="showDeleteModal(<?= $user['ID'] ?>.; <?= $user['username'] ?>)" target="_blank" class="btn btn-xs btn-red"> | ||||
|                                                 <i class="fas fa-user-slash"></i> | ||||
|                                             </a> | ||||
|                                         <?php endif; ?> | ||||
|   | ||||
| @@ -5,7 +5,7 @@ | ||||
|     <div class="well comment-well"> | ||||
|         <div class="d-inline-block mr-2"> | ||||
|             <a href="<?= base_url('user/' . $author['username']) ?>" target="_blank"> | ||||
|                 <img src="<?= $author['profile_picture'] ?>" alt=""> | ||||
|                 <img src="<?= $author['profilePicture'] ?>" alt=""> | ||||
|             </a> | ||||
|         </div> | ||||
|         <div class="d-inline-block mr-2"> | ||||
| @@ -16,7 +16,7 @@ | ||||
|                             <?= $author['displayname'] ?> | ||||
|                         </a> | ||||
|                            / | ||||
|                         <?= date('d.m.Y H:i \\U\\h\\r', strtotime($date_created)) ?></small> | ||||
|                         <?= date('d.m.Y H:i \\U\\h\\r', strtotime($date)) ?></small> | ||||
|                 </h3> | ||||
|                 <p class="comment"> | ||||
|                     <?= $comment ?> | ||||
|   | ||||
							
								
								
									
										25
									
								
								application/views/blog/delete_modal.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								application/views/blog/delete_modal.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,25 @@ | ||||
| <?php | ||||
|     defined('BASEPATH') OR exit('No direct script access allowed'); | ||||
| ?> | ||||
|  | ||||
| <form id="postDeleteForm"> | ||||
|     <div class="alert alert-danger" role="alert"> | ||||
|         <p> | ||||
|             <b>Bist du dir wirklich sicher, dass du deinen Kommentar löschen willst?</b> | ||||
|         </p> | ||||
|         <p> | ||||
|             <i>Diese Aktion kann nicht rückgängig gemacht werden!</i> | ||||
|         </p> | ||||
|         <ul class="comment-list" style="pointer-events: none"> | ||||
|             <?php | ||||
|                 $this->load->view('network/blog/comment_item', ['data' => $author, 'c' => $comment, 'hideActionBtns' => true]) ?> | ||||
|         </ul> | ||||
|         <!--        --><?php //var_dump($post) ?> | ||||
|     </div> | ||||
|     <button type="reset" class="btn btn-sm btn-primary round float-right" data-dismiss="modal"> | ||||
|         Nein, Kommentar behalten | ||||
|     </button> | ||||
|     <button type="submit" class="btn btn-sm btn-red outline round float-right" onclick="deleteComment(<?= $comment['ID'] ?>)"> | ||||
|         Ja, endgültig löschen | ||||
|     </button> | ||||
| </form> | ||||
| @@ -5,7 +5,7 @@ defined('BASEPATH') OR exit('No direct script access allowed'); | ||||
|     <div class="container"> | ||||
|         <div class="notice-container navbar-fixed-bottom"></div> | ||||
|         <div class="row"> | ||||
|             <aside class="col-sm-4 col-sm-push-8"> | ||||
|             <aside class="col-lg-4 order-lg-last"> | ||||
|                 <div class="widget search"> | ||||
|                     <form role="form" action="/blog/search"> | ||||
|                         <div class="input-group"> | ||||
| @@ -35,15 +35,15 @@ defined('BASEPATH') OR exit('No direct script access allowed'); | ||||
|                         <?php foreach ($categoryPosts as $post) { ?> | ||||
|                             <div class="media"> | ||||
|                                 <div class="media-body"> | ||||
|                                     <?php if (!empty($post['postImage'])): ?> | ||||
|                                         <a href="<?= base_url('blog/post/' . $post['postUrl']); ?>"> | ||||
|                                             <img src="<?= $post['postImage']; ?>?w=300" class="img-fluid rounded post-image"> | ||||
|                                     <?php if (!empty($post['image'])): ?> | ||||
|                                         <a href="<?= base_url('blog/post/' . $post['url']); ?>"> | ||||
|                                             <img src="<?= $post['image']; ?>?w=300" class="img-fluid rounded post-image"> | ||||
|                                         </a> | ||||
|                                     <?php endif; ?> | ||||
|                                     <div class="overlay"> | ||||
|                                         <div class="media-heading"> | ||||
|                                             <a href="<?= base_url('blog/post/' . $post['postUrl']); ?>"> | ||||
|                                                 <strong><?= $post['postTitle']; ?></strong> | ||||
|                                             <a href="<?= base_url('blog/post/' . $post['url']); ?>"> | ||||
|                                                 <strong><?= $post['title']; ?></strong> | ||||
|                                             </a> | ||||
|                                         </div> | ||||
|                                     </div> | ||||
| @@ -58,7 +58,7 @@ defined('BASEPATH') OR exit('No direct script access allowed'); | ||||
|                         <?php foreach ($categories as $category) { ?> | ||||
|                             <li> | ||||
|                                 <a href="<?= base_url('blog/category/' . $category['name']) ?>"> | ||||
|                                     <?= lang('blog_category_' . $category['name']) != '' ? lang('blog_category_' . $category['name']) : $category['display_name'] ?> | ||||
|                                     <?= lang('blog_category_' . $category['name']) != '' ? lang('blog_category_' . $category['name']) : $category['displayname'] ?> | ||||
|                                 </a> | ||||
|                             </li> | ||||
|                         <?php } ?> | ||||
|   | ||||
| @@ -5,41 +5,44 @@ | ||||
|  | ||||
| ?> | ||||
|  | ||||
| <div class="col-sm-8 col-sm-pull-4"> | ||||
| <div class="col-lg-8 order-lg-first"> | ||||
|     <div class="like-toggle-icon-container floating"> | ||||
|         <button class="like-toggle-icon <?= $hasLiked ? '-checked' : '' ?>" title="❤ Toggle Like!" onclick="likeDislike(<?= $postID ?>)"></button> | ||||
|         <button class="like-toggle-icon <?= $hasLiked ? '-checked' : '' ?>" title="❤ Toggle Like!" onclick="likeDislike(<?= $ID ?>)"></button> | ||||
|         <span class="like-count"><?= $likeCount ?></span> | ||||
|     </div> | ||||
|  | ||||
|     <div class="blog"> | ||||
|         <div class="blog-item"> | ||||
|             <?php if ($postIsDeleted): ?> | ||||
|             <?php // TODO: Add notice if post was deleted | ||||
|                 if (false): ?> | ||||
|                 <h2 class="text-error"> | ||||
|                     <i class="fa fa-warning"></i> | ||||
|                 </h2> | ||||
|             <?php else: ?> | ||||
|             <?php if ($postImage != '') { ?> | ||||
|                 <img class="img-fluid img-blog" src="<?= $postImage; ?>?w=800" width="100%" alt="" /> | ||||
|             <?php if ($image != '') { ?> | ||||
|                 <img class="img-fluid img-blog" src="<?= $image; ?>?w=800" width="100%" alt="" /> | ||||
|             <?php } ?> | ||||
|             <div class="blog-content"> | ||||
|                 <div class="entry-meta"> | ||||
|                     <span> | ||||
|                         <a href="<?= base_url('user/' . $postAuthorUsername) ?>"> | ||||
|                         <a href="<?= base_url('user/' . $author['username']) ?>"> | ||||
|                             <i class="far fa-user"></i> | ||||
|                             <?= $postAuthorDisplayname ?> | ||||
|                             <?= $author['displayname'] ?> | ||||
|                         </a> | ||||
|                     </span> | ||||
|                     <?php | ||||
|                         $publishDate = strtotime($postPublishDate); | ||||
|                         $lastEdit = strtotime($postLastEdit); | ||||
|                         $initialRelease = strtotime($initialRelease); | ||||
|                         if (isset($lastEdit)) { | ||||
|                             $lastEdit = strtotime($lastEdit); | ||||
|                         } | ||||
|                     ?> | ||||
|                     <span style="cursor:pointer" data-toggle="tooltip" data-placement="bottom" | ||||
|                           title="<?= strftime("%d. %B %Y", $publishDate) ?>"> | ||||
|                           title="<?= strftime("%d. %B %Y", $initialRelease) ?>"> | ||||
|                         <i class="far fa-calendar"></i> | ||||
|                         <?= DateTimeHumanizer::difference(new \DateTime(), new \DateTime("@$publishDate"), $_SESSION['site_lang']) ?> | ||||
|                         <?= DateTimeHumanizer::difference(new \DateTime(), new \DateTime("@$initialRelease"), $_SESSION['site_lang']) ?> | ||||
|                     </span> | ||||
|  | ||||
|                     <?php if (isset($postLastEdit) && $postLastEdit !== null): ?> | ||||
|                     <?php if (isset($lastEdit) && $lastEdit !== null): ?> | ||||
|                         <span style="cursor:pointer" data-toggle="tooltip" data-placement="bottom" | ||||
|                               title="<?= strftime("%d. %B %Y", $lastEdit) ?>"> | ||||
|                             <i class="far fa-edit"></i> | ||||
| @@ -47,16 +50,9 @@ | ||||
|                         </span> | ||||
|                     <?php endif; ?> | ||||
|  | ||||
|                     <span> | ||||
|                         <a href="<?= base_url('blog/category/' . $categoryName) ?>"> | ||||
|                             <i class="far fa-folder-open"></i> | ||||
|                             <?= lang('blog_category_' . $categoryName) != '' ? lang('blog_category_' . $categoryName) : $categoryDisplayName ?> | ||||
|                         </a> | ||||
|                     </span> | ||||
|  | ||||
|                     <span style="cursor:pointer" data-toggle="tooltip" data-placement="bottom" title="<?= lang('blog_approximate_reading_time') ?>"> | ||||
|                         <i class="far fa-clock"></i> | ||||
|                         <?= $this->BlogModel->getReadingTime($postID) ?> min | ||||
|                         <?= $this->BlogModel->getReadingTime($wordCount) ?> min | ||||
|                     </span> | ||||
|  | ||||
|                     <span> | ||||
| @@ -67,40 +63,60 @@ | ||||
|                     </span> | ||||
|  | ||||
|                     <span> | ||||
|                         <a href="#" style="cursor:pointer" onclick="likeDislike(<?= $postID ?>)"> | ||||
|                         <a href="#" style="cursor:pointer" onclick="likeDislike(<?= $ID ?>)"> | ||||
|                             <i class="far fa-heart"></i> | ||||
|                             <span class="like-count"><?= $likeCount ?></span> | ||||
|                         </a> | ||||
|                     </span> | ||||
|                 </div> | ||||
|                 <h1 class="post-title"><?= $postTitle ?></h1> | ||||
|                 <h2 class="post-subtitle"><?= $postDesc ?></h2> | ||||
|                 <h1 class="post-title"><?= $title ?></h1> | ||||
|                 <h2 class="post-subtitle"><?= $description ?></h2> | ||||
|             </div> | ||||
|         </div> | ||||
|         <div class="blog-item"> | ||||
|             <div class="blog-content"> | ||||
|                 <div class="blog-post"> | ||||
|                     <?= isset($postContent) ? $postContent : "" ?> | ||||
|                     <?= isset($content) ? $content : "" ?> | ||||
|                 </div> | ||||
|             </div> | ||||
|         </div> | ||||
|         <div class="blog-item"> | ||||
|             <div class="blog-content"> | ||||
|         <div class="row"> | ||||
|             <div class="col-sm-6"> | ||||
|                 <div class="blog-item"> | ||||
|                     <div class="blog-content"> | ||||
|                         <h3> | ||||
|                             <i class="far fa-folder-open"></i> | ||||
|                             Kategorien | ||||
|                         </h3> | ||||
|                         <?php foreach ($categories as $category): ?> | ||||
|                             <a href="<?= base_url('blog/category/' . $category['name']) ?>"> | ||||
|                                 <span class="badge badge-primary"> | ||||
|                                     <?= lang('blog_category_' . $category['name']) != '' ? lang('blog_category_' . $category['name']) : $category['displayname'] ?> | ||||
|                                 </span> | ||||
|                             </a> | ||||
|                         <?php endforeach; ?> | ||||
|                     </div> | ||||
|                 </div> | ||||
|  | ||||
|                 <div class="blog-item"> | ||||
|                     <div class="blog-content"> | ||||
|                         <h3> | ||||
|                             <i class="fa fa-tags"></i> | ||||
|                             Tags | ||||
|                         </h3> | ||||
|                         <div class="tags"> | ||||
|                             <?php foreach ($tags as $tag) { ?> | ||||
|                                 <a href="<?= base_url('blog/tag/' . $tag['name']) ?>"><span | ||||
|                                             class="label label-primary"><?= $tag['display_name'] ?></span> | ||||
|                                 <a href="<?= base_url('blog/tag/' . $tag['name']) ?>"> | ||||
|                                     <span class="badge badge-primary"><?= $tag['displayname'] ?></span> | ||||
|                                 </a> | ||||
|                             <?php } ?> | ||||
|                         </div> | ||||
|                     </div> | ||||
|                 </div> | ||||
|             </div> | ||||
|             <div class="col-sm-6"> | ||||
|                 <div class="blog-item"> | ||||
|                     <div class="blog-content"> | ||||
|                         <h3> | ||||
|                             <i class="far fa-user"></i> <?= lang('blog_about') ?> | ||||
|                         </h3> | ||||
| @@ -108,11 +124,11 @@ | ||||
|                         <?php | ||||
|                             $this->load->view('network/user/user_overview_card', [ | ||||
|                                 'noContainer' => true, | ||||
|                                 'username' => $postAuthorUsername, | ||||
|                                 'displayname' => $postAuthorDisplayname, | ||||
|                                 'profile_picture' => $postAuthorProfilePicture, | ||||
|                                 'header_image' => $postAuthorHeaderImage, | ||||
|                                 'about' => $postAuthorAbout]) | ||||
|                                 'username' => $author['username'], | ||||
|                                 'displayname' => $author['displayname'], | ||||
|                                 'profilePicture' => $author['profilePicture'], | ||||
|                                 'headerImage' => $author['headerImage'], | ||||
|                                 'about' => $author['about']]) | ||||
|                         ?> | ||||
|                     </div> | ||||
|                 </div> | ||||
| @@ -128,19 +144,19 @@ | ||||
|                         <?php foreach ($randomPosts as $item) { ?> | ||||
|                             <div class="col-sm-4"> | ||||
|                                 <div class="card"> | ||||
|                                     <?php if ($item['postImage'] != ''): ?> | ||||
|                                         <a href="<?= base_url('blog/post/' . $item['postUrl']) ?>"> | ||||
|                                             <img src="<?= $item['postImage'] ?>?w=200" alt="<?= $item['postTitle'] ?>" class="card-img-top"> | ||||
|                                     <?php if ($item['image'] != ''): ?> | ||||
|                                         <a href="<?= base_url('blog/post/' . $item['url']) ?>"> | ||||
|                                             <img src="<?= $item['image'] ?>?w=200" alt="<?= $item['title'] ?>" class="card-img-top"> | ||||
|                                         </a> | ||||
|                                     <?php endif; ?> | ||||
|                                     <div class="card-body"> | ||||
|                                         <a href="<?= base_url('blog/post/' . $item['postUrl']) ?>"> | ||||
|                                             <h5 class="card-title"><?= $item['postTitle'] ?></h5> | ||||
|                                         <a href="<?= base_url('blog/post/' . $item['url']) ?>"> | ||||
|                                             <h5 class="card-title"><?= $item['title'] ?></h5> | ||||
|                                         </a> | ||||
|                                         <small class="card-text"> | ||||
|                                             <i class="far fa-user"></i> | ||||
|                                             <a href="<?= base_url('user/' . $item['postAuthorUsername']) ?>"> | ||||
|                                                 <?= $item['postAuthorDisplayname'] ?> | ||||
|                                             <a href="<?= base_url('user/' . $item['author']['username']) ?>"> | ||||
|                                                 <?= $item['author']['displayname'] ?> | ||||
|                                             </a> | ||||
|                                         </small> | ||||
|                                     </div> | ||||
| @@ -152,20 +168,6 @@ | ||||
|             </div> | ||||
|         </div> | ||||
|  | ||||
|         <div class="blog-item"> | ||||
|             <div class="blog-content"> | ||||
|                 <div class="container"> | ||||
|                     <div id="comments"> | ||||
|                         <h3> | ||||
|                             <i class="far fa-comments"></i> <?= lang('blog_comments') ?> (<span class="comment-count"><?= $commentCount; ?></span>) | ||||
|                         </h3> | ||||
|                         <ul class="comment-list" id="comment-list"> | ||||
|                         </ul> | ||||
|                     </div> | ||||
|                 </div> | ||||
|             </div> | ||||
|         </div> | ||||
|  | ||||
|         <div class="blog-item"> | ||||
|             <div class="blog-content"> | ||||
|                 <div id="comment-form"> | ||||
| @@ -196,35 +198,57 @@ | ||||
|             </div> | ||||
|             <!--/#comments--> | ||||
|         </div> | ||||
|  | ||||
|         <div class="blog-item"> | ||||
|             <div class="blog-content"> | ||||
|                 <div class="container"> | ||||
|                     <div id="comments"> | ||||
|                         <h3> | ||||
|                             <i class="far fa-comments"></i> <?= lang('blog_comments') ?> ( | ||||
|                             <span class="comment-count"><?= $commentCount; ?></span> | ||||
|                                                                                          ) | ||||
|                         </h3> | ||||
|                         <ul class="comment-list" id="comment-list"> | ||||
|                         </ul> | ||||
|                     </div> | ||||
|                 </div> | ||||
|             </div> | ||||
|         </div> | ||||
|  | ||||
|         <div class="row"> | ||||
|             <?php if (!empty($prevPost)): | ||||
|                 $prevPost = $prevPost[0]; ?> | ||||
|             <div class="blog-item col-xs-6" style="width:calc(50% - 5px);"> | ||||
|                 <a href="<?= base_url('blog/post/' . $prevPost['postUrl']) ?>"> | ||||
|                     <div class="pull-left" | ||||
|                          style="background: url(<?= $prevPost['postImage'] ?>?w=150) center;background-size:cover;width:100px;height:100px;border-radius: 4px;margin:10px 0;"></div> | ||||
|                     <div class="float-right" style="width: calc(100% - 110px)"> | ||||
|                 <div class="col-6"> | ||||
|                     <div class="blog-item following-post left"> | ||||
|                         <a href="<?= base_url('blog/post/' . $prevPost['url']) ?>"> | ||||
|                             <div class="following-post-image" | ||||
|                                  style="background-image: url(<?= $prevPost['image'] ?>?w=150)"></div> | ||||
|                             <div style="width: calc(100% - 110px);display: inline-block;margin:10px 0;"> | ||||
|                                 <h5> | ||||
|                                     <i class="fa fa-arrow-left"></i> <?= lang('blog_previous_article') ?></h5> | ||||
|                         <h4 style="font-size:20px"><?= $prevPost['postTitle'] ?></h4> | ||||
|                                 <h4 style="font-size:20px"><?= $prevPost['title'] ?></h4> | ||||
|                             </div> | ||||
|                         </a> | ||||
|                     </div> | ||||
|                 </div> | ||||
|             <?php endif; ?> | ||||
|             <?php if (!empty($nextPost)): | ||||
|                 $nextPost = $nextPost[0]; ?> | ||||
|             <div class="blog-item col-xs-6 float-right" style="width:calc(50% - 5px);"> | ||||
|                 <a href="<?= base_url('blog/post/' . $nextPost['postUrl']) ?>"> | ||||
|                     <div class="float-right" | ||||
|                          style="background: url(<?= $nextPost['postImage'] ?>?w=150) center;background-size:cover;width:100px;height:100px;border-radius: 4px;margin:10px 0;"></div> | ||||
|                     <div class="pull-left" style="width: calc(100% - 110px);text-align:right;"> | ||||
|                 <div class="col-6"> | ||||
|                     <div class="blog-item following-post right"> | ||||
|                         <a href="<?= base_url('blog/post/' . $nextPost['url']) ?>"> | ||||
|                             <div class="following-post-image" style="background-image: url(<?= $nextPost['image'] ?>?w=150)"></div> | ||||
|                             <div style="width: calc(100% - 110px);text-align:right;display: inline-block;margin:10px 0;"> | ||||
|                                 <h5><?= lang('blog_next_article') ?> | ||||
|                                     <i class="fa fa-arrow-right"></i> | ||||
|                                 </h5> | ||||
|                         <h4 style="font-size:20px"><?= $nextPost['postTitle'] ?></h4> | ||||
|                                 <h4 style="font-size:20px"><?= $nextPost['title'] ?></h4> | ||||
|                             </div> | ||||
|                         </a> | ||||
|                     </div> | ||||
|                 </div> | ||||
|             <?php endif; ?> | ||||
|         </div> | ||||
|         <!--/.blog-item--> | ||||
|         <?php endif; ?> | ||||
|     </div> | ||||
|   | ||||
| @@ -3,35 +3,40 @@ | ||||
|  | ||||
|     use Coduo\PHPHumanizer\DateTimeHumanizer; | ||||
|  | ||||
|     $postPublishDate = strtotime($postPublishDate); | ||||
|     $initialRelease = strtotime($initialRelease); | ||||
| ?> | ||||
| <div class="blog-item"> | ||||
|     <?php if ($postImage != NULL && $postImage != ''): ?> | ||||
|         <a href="<?= base_url('blog/post/' . $postUrl) ?>"> | ||||
|             <div class="img-blog-entry" style="background-image: url('<?= $postImage ?>?w=750');"></div> | ||||
|     <?php if ($image != NULL && $image != ''): ?> | ||||
|         <a href="<?= base_url('blog/post/' . $url) ?>"> | ||||
|             <div class="img-blog-entry" style="background-image: url('<?= $image ?>?w=750');"></div> | ||||
|         </a> | ||||
|     <?php endif; ?> | ||||
|     <div class="blog-content"> | ||||
|         <div class="entry-meta"> | ||||
|             <span><a target="_blank" href="<?= base_url('user/' . $postAuthorUsername) ?>"><i class="fa fa-user"></i> <?= $postAuthorDisplayname ?></a></span> | ||||
|             <span><i class="fa fa-calendar"></i> <?= DateTimeHumanizer::difference(new \DateTime(), new \DateTime("@$postPublishDate"), $_SESSION['site_lang']) ?></span> | ||||
|             <span><a href="<?= base_url("blog/category/" . $categoryName) ?>"><i class="fa fa-folder-open"></i> <?= $categoryDisplayName ?></a></span> | ||||
|             <span><a target="_blank" href="<?= base_url('user/' . $author['username']) ?>"><i class="fa fa-user"></i> <?= $author['displayname'] ?></a></span> | ||||
|             <span><i class="fa fa-calendar"></i> <?= DateTimeHumanizer::difference(new \DateTime(), new \DateTime("@$initialRelease"), $_SESSION['site_lang']) ?></span> | ||||
|             <span> | ||||
|                 <i class="fa fa-folder-open"></i> | ||||
|                 <?php foreach ($categories as $category) { ?> | ||||
|                     <a href="<?= base_url('blog/category/' . $category['name']) ?>"><?= $category['displayname'] ?></a> | ||||
|                 <?php } ?> | ||||
|             </span> | ||||
|             <span style="cursor: pointer;" data-toggle="tooltip" data-placement="left" title="Geschätzte Lesedauer"> | ||||
|                 <i class="fa fa-clock"></i> | ||||
|                 <?= $this->BlogModel->getReadingTime($postID) ?> min | ||||
|                 <?= $this->BlogModel->getReadingTime($wordCount) ?> min | ||||
|             </span> | ||||
|             <span><a href="<?= base_url('blog/post/' . $postUrl . '#comments') ?>"><i class="fa fa-comment"></i> <?= $commentCount ?></a></span> | ||||
|             <span><a href="<?= base_url('blog/post/' . $url . '#comments') ?>"><i class="fa fa-comment"></i> <?= $commentCount ?></a></span> | ||||
|             <span><i class="fa fa-heart"></i> <?= $likeCount ?></span> | ||||
|         </div> | ||||
|         <a href="<?= base_url('blog/post/' . $postUrl) ?>"> | ||||
|             <h3><?= $postTitle ?></h3> | ||||
|         <a href="<?= base_url('blog/post/' . $url) ?>"> | ||||
|             <h3><?= $title ?></h3> | ||||
|         </a> | ||||
|         <div class="row"> | ||||
|             <div class="col-md-9"> | ||||
|                 <p><?= $postDesc ?></p> | ||||
|                 <p><?= $description ?></p> | ||||
|             </div> | ||||
|             <div class="col-md-3" style="padding:0"> | ||||
|                 <a class="btn btn-primary outline" href="<?= base_url('blog/post/' . $postUrl) ?>"><?= lang('blog_read') ?> | ||||
|                 <a class="btn btn-primary outline" href="<?= base_url('blog/post/' . $url) ?>"><?= lang('blog_read') ?> | ||||
|                     <i class="fa fa-angle-right"></i> | ||||
|                 </a> | ||||
|             </div> | ||||
|   | ||||
| @@ -2,7 +2,7 @@ | ||||
|  | ||||
| ?> | ||||
|  | ||||
| <div class="col-sm-8 col-sm-pull-4"> | ||||
| <div class="col-lg-8 order-lg-first"> | ||||
|     <div class="blog"> | ||||
|         <ul class="page-selection pagination-lg blog-pagination"></ul> | ||||
|         <div id="content"> | ||||
|   | ||||
							
								
								
									
										28
									
								
								application/views/blog/report_modal.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										28
									
								
								application/views/blog/report_modal.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,28 @@ | ||||
| <?php | ||||
|     defined('BASEPATH') OR exit('No direct script access allowed'); | ||||
| ?> | ||||
|  | ||||
| <form id="commentReportForm"> | ||||
|     <div class="form-group"> | ||||
|         <label for="commentReportReason">Grund für deine Meldung</label> | ||||
|         <select name="reason" id="commentReportReason" class="form-control" required> | ||||
|             <option value="">Bitte auswählen</option> | ||||
|             <option value="hatespeech">Hasserfüllte Inhalte</option> | ||||
|             <option value="racism">Rassistische, diskriminierende oder bewusst ausgrenzende Inhalte</option> | ||||
|             <option value="terrorism">Unterstützung von Terrorismus</option> | ||||
|             <option value="abuse">(Kindes-)Missbrauch</option> | ||||
|             <option value="violence">Gewaltverherrlichende Inhalte</option> | ||||
|             <option value="copyright">Verletzung meiner (Urheber-)Rechte</option> | ||||
|             <option value="spam">Spam oder irreführende Inhalte</option> | ||||
|             <option value="technical-issue">Technische Fehler</option> | ||||
|         </select> | ||||
|     </div> | ||||
|     <div class="form-group"> | ||||
|         <label for="commentReportText">Weitere Anmerkungen (optional)</label> | ||||
|         <textarea name="reportText" id="commentReportText" class="form-control"></textarea> | ||||
|     </div> | ||||
|     <button type="submit" class="btn btn-primary float-right"> | ||||
|         Absenden | ||||
|     </button> | ||||
| </form> | ||||
|  | ||||
| @@ -119,7 +119,7 @@ | ||||
|                         <?= lang('header_edit_profile') ?> | ||||
|                     </a> | ||||
|                     <?php if (get_instance()->hasPermission('dashboard.view')): ?> | ||||
|                         <a href="<? //= base_url('admin') ?>" class="dropdown-item"> | ||||
|                         <a href="<?= base_url('admin') ?>" class="dropdown-item"> | ||||
|                             <i class="fa fa-tachometer-alt"></i> | ||||
|                             <?= lang('header_admin_panel') ?> | ||||
|                         </a> | ||||
|   | ||||
| @@ -221,7 +221,7 @@ | ||||
|             <?php foreach ($currentlyActiveUsers as $activeUser): | ||||
|                 $loginTime = strtotime($activeUser['lastLogin']); ?> | ||||
|                 <div class="user-item"> | ||||
|                     <img src="<?= $activeUser['profile_picture'] ?>?w=50" alt="" class="img-fluid rounded-circle"> | ||||
|                     <img src="<?= $activeUser['profilePicture'] ?>?w=50" alt="" class="img-fluid rounded-circle"> | ||||
|                     <div class="user-info"> | ||||
|                         <a href="<?= base_url('user/' . $activeUser['username']) ?>"> | ||||
|                             <h2><?= $activeUser['displayname'] ?></h2> | ||||
| @@ -236,9 +236,9 @@ | ||||
|             <h2><?= lang('home_newest_users') ?></h2> | ||||
|             <?php | ||||
|                 foreach ($newestUsers as $newestUser): | ||||
|                     $registeredDate = strtotime($newestUser['date_created']); ?> | ||||
|                     $registeredDate = strtotime($newestUser['dateCreated']); ?> | ||||
|                     <div class="user-item"> | ||||
|                         <img src="<?= $newestUser['profile_picture'] ?>?w=50" alt="" class="img-fluid rounded-circle"> | ||||
|                         <img src="<?= $newestUser['profilePicture'] ?>?w=50" alt="" class="img-fluid rounded-circle"> | ||||
|                         <div class="user-info"> | ||||
|                             <a href="<?= base_url('user/' . $newestUser['username']) ?>"> | ||||
|                                 <h2><?= $newestUser['displayname'] ?></h2> | ||||
|   | ||||
| @@ -18,7 +18,7 @@ defined('BASEPATH') OR exit('No direct script access allowed'); | ||||
|                 </div> | ||||
|  | ||||
|                 <div class="loading-msg"> | ||||
|                     <i class="fa fa-cog fa-spin"></i> | ||||
|                     .loadingSpinner | ||||
|                 </div> | ||||
|  | ||||
|                 <div class="success-msg"> | ||||
|   | ||||
| @@ -3,22 +3,22 @@ defined('BASEPATH') OR exit('No direct script access allowed'); | ||||
| ?> | ||||
| <li class="blog-post-item"> | ||||
|     <div class="well comment-well"> | ||||
|         <a href="<?= base_url('blog/post/' . $post['postUrl']) ?>" target="_blank"> | ||||
|             <div class="entry-image" style="background-image:url(<?= $post['postImage'] ?>?w=150"></div> | ||||
|         <a href="<?= base_url('blog/post/' . $post['url']) ?>" target="_blank"> | ||||
|             <div class="entry-image" style="background-image:url(<?= $post['image'] ?>?w=150"></div> | ||||
|         </a> | ||||
|         <div class="content"> | ||||
|             <h3> | ||||
|                 <a href="<?= base_url('blog/post/' . $post['postUrl']) ?>" target="_blank"> | ||||
|                     <?= $post['postTitle'] ?> | ||||
|                 <a href="<?= base_url('blog/post/' . $post['url']) ?>" target="_blank"> | ||||
|                     <?= $post['title'] ?> | ||||
|                 </a> | ||||
|  | ||||
|                 <small><?= lang('person_by') ?> <a | ||||
|                             href="<?= base_url('user/' . $data['username']) ?>" | ||||
|                             target="_blank"><?= $data['displayname'] ?></a> | ||||
|                     / <?= date(lang('date'), strtotime($post['postPublishDate'])) ?> | ||||
|                     / <?= date(lang('date'), strtotime($post['initialRelease'])) ?> | ||||
|                 </small> | ||||
|             </h3> | ||||
|             <p class="comment"><?= $post['postDesc'] ?></p> | ||||
|             <p class="comment"><?= $post['description'] ?></p> | ||||
|         </div> | ||||
|     </div> | ||||
| </li> | ||||
| @@ -1,47 +1,64 @@ | ||||
| <?php | ||||
| defined('BASEPATH') OR exit('No direct script access allowed'); | ||||
|  | ||||
| use Coduo\PHPHumanizer\DateTimeHumanizer; | ||||
|     defined('BASEPATH') OR exit('No direct script access allowed'); | ||||
|  | ||||
|     use Coduo\PHPHumanizer\DateTimeHumanizer; | ||||
| ?> | ||||
| <li> | ||||
|     <div class="well comment-well"> | ||||
|         <div class="post-non-content"> | ||||
|             <a href="<?= base_url('user/' . $data['username']) ?>" target="_blank"> | ||||
|                 <img src="<?= $data['profile_picture'] ?>?w=100" class="img-fluid"> | ||||
| <li id="comment-<?= $c['ID'] ?>"> | ||||
|     <div class="user-post-item"> | ||||
|         <a href="<?= base_url('user/' . $data['username']) ?>" class="item-avatar-container"> | ||||
|             <img src="<?= $data['profilePicture'] ?>?w=100" alt="<?= $data['username'] ?>" class="item-avatar"> | ||||
|         </a> | ||||
|         </div> | ||||
|         <div class="content-container"> | ||||
|             <div class="content"> | ||||
|                 <h3> | ||||
|                     <a href="<?= base_url('user/' . $data['username']) ?>" target="_blank"> | ||||
|         <h3 class="item-user"> | ||||
|             <a href="<?= base_url('user/' . $data['username']) ?>"> | ||||
|                 <?= $data['displayname'] ?> | ||||
|             </a> | ||||
|                     <small> | ||||
|         </h3> | ||||
|         <h4 class="item-meta"> | ||||
|             <?php | ||||
|                 $locale = isset($_SESSION['site_lang']) ? $_SESSION['site_lang'] : 'en'; | ||||
|                         $date_created = strtotime($c['date_created']); | ||||
|                         echo DateTimeHumanizer::difference(new \DateTime(), new \DateTime("@$date_created"), $locale); | ||||
|                 $dateCreated = strtotime($c['date']); | ||||
|                 echo DateTimeHumanizer::difference(new \DateTime(), new \DateTime("@$dateCreated"), $locale); | ||||
|             ?> | ||||
|             <?php if (isset($c['url'])): ?> | ||||
|                 unter | ||||
|                         <a href="<?= base_url('blog/post/' . $c['postUrl']) ?>"> | ||||
|                             <?= $c['postTitle'] ?> | ||||
|                 <a href="<?= base_url('blog/post/' . $c['url']) ?>"> | ||||
|                     <?= $c['title'] ?> | ||||
|                 </a> | ||||
|                     </small> | ||||
|                 </h3> | ||||
|                 <p class="comment"><?= $c['comment'] ?></p> | ||||
|             </div> | ||||
|         </div> | ||||
|         <div class="action-btns"> | ||||
|             <a href="#" class="action-btn" data-toggle="tooltip" data-placement="top" title="Antworten"> | ||||
|             <?php endif; ?> | ||||
|         </h4> | ||||
|         <p class="item-content"> | ||||
|             <?= $c['comment'] ?> | ||||
|         </p> | ||||
|         <?php if(!isset($hideActionBtns) || $hideActionBtns == false): ?> | ||||
|         <div class="item-actions"> | ||||
|             <a href="#" class="item-btn" data-toggle="tooltip" data-placement="top" title="Antworten"> | ||||
|                 <i class="far fa-comment"></i> | ||||
|                 <span>0</span> | ||||
|             </a> | ||||
|             <a href="#" class="action-btn" data-toggle="tooltip" data-placement="top" title="Gefällt mir"> | ||||
|             <a href="#" class="item-btn" data-toggle="tooltip" data-placement="top" title="Gefällt mir"> | ||||
|                 <i class="far fa-heart"></i> | ||||
|                 <span>0</span> | ||||
|             </a> | ||||
|             <a href="#" class="action-btn" data-toggle="tooltip" data-placement="top" title="Mehr Optionen"> | ||||
|             <div class="item-btn dropdown"> | ||||
|                 <a href="#" class="" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"> | ||||
|                     <i class="fa fa-ellipsis-h"></i> | ||||
|                 </a> | ||||
|                 <div class="dropdown-menu"> | ||||
|                     <a onclick="openCommentReportModal(<?= $c['ID'] ?>)" class="dropdown-item"> | ||||
|                         <i class="fa fa-flag"></i> | ||||
|                         Kommentar melden | ||||
|                     </a> | ||||
|  | ||||
|                     <?php if(isset($_SESSION['user']) && $_SESSION['user']['username'] == $data['username']): ?> | ||||
|                     <div class="dropdown-divider"></div> | ||||
|                         <a onclick="openCommentDeleteModal(<?= $c['ID'] ?>)" class="dropdown-item text-danger"> | ||||
|                             <i class="fa fa-trash"></i> | ||||
|                             Kommentar löschen | ||||
|                         </a> | ||||
|                     <?php endif; ?> | ||||
|                 </div> | ||||
|             </div> | ||||
|         </div> | ||||
|         <?php endif; ?> | ||||
|     </div> | ||||
| </li> | ||||
| @@ -15,7 +15,7 @@ | ||||
|     <button type="reset" class="btn btn-sm btn-primary round float-right" data-dismiss="modal"> | ||||
|         Nein, Post behalten | ||||
|     </button> | ||||
|     <button type="submit" class="btn btn-sm btn-red outline round float-right" onclick="deletePost('<?= $post['uuid'] ?>')"> | ||||
|     <button type="submit" class="btn btn-sm btn-red outline round float-right" onclick="deletePost('<?= $post['hashID'] ?>')"> | ||||
|         Ja, endgültig löschen | ||||
|     </button> | ||||
| </form> | ||||
|   | ||||
| @@ -4,11 +4,11 @@ | ||||
|     use Coduo\PHPHumanizer\DateTimeHumanizer; | ||||
|  | ||||
| ?> | ||||
| <li class="post-item is-reply% my-2" data-uuid="<?= $uuid ?>" data-username="<?= $username ?>"> | ||||
| <li class="post-item is-reply% my-2" data-uuid="<?= $hashID ?>" data-username="<?= $username ?>"> | ||||
|     <div class="comment-well" <?= isset($hideShadows) && $hideShadows ? 'style="box-shadow: none;padding:0"' : '' ?>> | ||||
|         <div class="post-non-content"> | ||||
|             <a href="<?= base_url('user/' . $username) ?>" target="_blank"> | ||||
|                 <img src="<?= $profile_picture ?>?w=100" class="img-fluid"> | ||||
|                 <img src="<?= $profilePicture ?>?w=100" class="img-fluid"> | ||||
|             </a> | ||||
|         </div> | ||||
|         <div class="content-container"> | ||||
| @@ -18,13 +18,13 @@ | ||||
|                         <?= $displayname ?> | ||||
|                     </a> | ||||
|                     <small><?php | ||||
|                             $date_created = strtotime($date); | ||||
|                             echo DateTimeHumanizer::difference(new \DateTime(), new \DateTime("@$date_created"), $_SESSION['site_lang']); ?></small> | ||||
|                     <?php if ($reply_to != NULL): ?> | ||||
|                             $dateCreated = strtotime($date); | ||||
|                             echo DateTimeHumanizer::difference(new \DateTime(), new \DateTime("@$dateCreated"), $_SESSION['site_lang']); ?></small> | ||||
|                     <?php if ($replyToPostID != NULL): ?> | ||||
|                         <small> | ||||
|                             <i class="fa fa-reply"></i> | ||||
|                             <?= lang('post_reply_to') ?> | ||||
|                             <a href="#" onclick="showFullPost('<?= $replyToPost['uuid'] ?>', '<?= $replyToPost['username'] ?>')">@<?= $replyToPost['displayname'] ?></a> | ||||
|                             <a href="#" onclick="showFullPost('<?= $replyToPost['hashID'] ?>', '<?= $replyToPost['username'] ?>')">@<?= $replyToPost['displayname'] ?></a> | ||||
|                         </small> | ||||
|                     <?php endif; ?> | ||||
|                 </h3> | ||||
| @@ -80,31 +80,31 @@ | ||||
|                 </div> | ||||
|                 <?php if (!isset($hideActionBtns) || !$hideActionBtns): ?> | ||||
|                     <div class="action-btns"> | ||||
|                         <a href="#" data-uuid="<?= $uuid ?>" class="action-btn reply-button" data-toggle="tooltip" data-placement="top" title="<?= lang('post_reply') ?>"> | ||||
|                         <a href="#" data-uuid="<?= $hashID ?>" class="action-btn reply-button" data-toggle="tooltip" data-placement="top" title="<?= lang('post_reply') ?>"> | ||||
|                             <i class="far fa-comment"></i> | ||||
|                             <span><?= $replyCount ?></span> | ||||
|                         </a> | ||||
|                         <a href="#" data-uuid="<?= $uuid ?>" class="action-btn like-button <?= isset($userHasLiked) && $userHasLiked ? 'active' : '' ?>" data-toggle="tooltip" data-placement="top" title="<?= lang('post_like') ?>"> | ||||
|                         <a href="#" data-uuid="<?= $hashID ?>" class="action-btn like-button <?= isset($userHasLiked) && $userHasLiked ? 'active' : '' ?>" data-toggle="tooltip" data-placement="top" title="<?= lang('post_like') ?>"> | ||||
|                             <i class="<?= isset($userHasLiked) && $userHasLiked ? 'fas' : 'far' ?> fa-heart"></i> | ||||
|                             <span><?= $likeCount ?></span> | ||||
|                         </a> | ||||
|                         <div class="action-btn dropdown"> | ||||
|                             <a href="#" class="action-btn more-options-button" id="postMoreOptionsButton<?= $uuid ?>" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"> | ||||
|                             <a href="#" class="action-btn more-options-button" id="postMoreOptionsButton<?= $hashID ?>" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"> | ||||
|                                 <i class="fa fa-ellipsis-h"></i> | ||||
|                             </a> | ||||
|  | ||||
|                             <div class="dropdown-menu" aria-labelledby="postMoreOptionsButton<?= $uuid ?>"> | ||||
|                                 <a href="#" onclick="copyToClipboard('<?= base_url('user/' . $username . '/post/' . $uuid) ?>')" class="dropdown-item"> | ||||
|                             <div class="dropdown-menu" aria-labelledby="postMoreOptionsButton<?= $hashID ?>"> | ||||
|                                 <a href="#" onclick="copyToClipboard('<?= base_url('user/' . $username . '/post/' . $hashID) ?>')" class="dropdown-item"> | ||||
|                                     <i class="fa fa-copy"></i> | ||||
|                                     <?= lang('post_copy_link') ?> | ||||
|                                 </a> | ||||
|                                 <a href="#" onclick="openPostReportModal('<?= $uuid ?>')" class="dropdown-item"> | ||||
|                                 <a href="#" onclick="openPostReportModal('<?= $hashID ?>')" class="dropdown-item"> | ||||
|                                     <i class="fa fa-flag"></i> | ||||
|                                     <?= lang('post_report') ?> | ||||
|                                 </a> | ||||
|                                 <?php if (isset($_SESSION['user']) && $_SESSION['user']['username'] == $username): ?> | ||||
|                                     <div class="dropdown-divider"></div> | ||||
|                                     <a href="#" onclick="openDeletePostModal('<?= $uuid ?>')" class="dropdown-item text-danger"> | ||||
|                                     <a href="#" onclick="openDeletePostModal('<?= $hashID ?>')" class="dropdown-item text-danger"> | ||||
|                                         <i class="fa fa-trash"></i> | ||||
|                                         <?= lang('post_delete') ?> | ||||
|                                     </a> | ||||
|   | ||||
| @@ -5,21 +5,21 @@ | ||||
|  | ||||
| ?> | ||||
|  | ||||
| <?= $message; ?> | ||||
|  | ||||
| <div class="row justify-content-center"> | ||||
| <?php if (isset($post['replyToPost'])): ?> | ||||
|     <div class="row justify-content-center"> | ||||
|         <ul class="comment-list"> | ||||
|             <?php | ||||
|                 $post['replyToPost']['hideShadows'] = true; | ||||
|                 $this->load->view('network/posts/post_item', $post['replyToPost']) | ||||
|             ?> | ||||
|         </ul> | ||||
| </div> | ||||
|     </div> | ||||
| <?php endif; ?> | ||||
|  | ||||
| <div class="row"> | ||||
|     <div class="post-non-content"> | ||||
|         <a href="<?= base_url('user/' . $post['username']) ?>"> | ||||
|             <img src="<?= $post['profile_picture'] ?>?w=75" alt="" class="img-fluid rounded-circle"> | ||||
|             <img src="<?= $post['profilePicture'] ?>?w=75" alt="" class="img-fluid rounded-circle"> | ||||
|         </a> | ||||
|     </div> | ||||
|  | ||||
| @@ -29,8 +29,8 @@ | ||||
|                 <?= $post['displayname'] ?> | ||||
|             </a> | ||||
|             <?php | ||||
|                 $date_created = strtotime($post['date']); | ||||
|                 $time_passed = DateTimeHumanizer::difference(new \DateTime(), new \DateTime("@$date_created"), $_SESSION['site_lang']); | ||||
|                 $dateCreated = strtotime($post['date']); | ||||
|                 $time_passed = DateTimeHumanizer::difference(new \DateTime(), new \DateTime("@$dateCreated"), $_SESSION['site_lang']); | ||||
|             ?> | ||||
|             <small> | ||||
|                 <?= $time_passed ?> | ||||
| @@ -51,20 +51,20 @@ | ||||
|         <?php endif; ?> | ||||
|  | ||||
|         <div class="action-btns"> | ||||
|             <a href="#" data-uuid="<?= $post['uuid'] ?>" class="action-btn reply-button" data-toggle="tooltip" data-placement="top" title="Antworten"> | ||||
|             <a href="#" data-uuid="<?= $post['hashID'] ?>" class="action-btn reply-button" data-toggle="tooltip" data-placement="top" title="Antworten"> | ||||
|                 <span><i class="far fa-comment"></i></span> | ||||
|                 <?= $post['replyCount'] ?> | ||||
|             </a> | ||||
|             <a href="#" data-uuid="<?= $post['uuid'] ?>" class="action-btn like-button <?= isset($post['userHasLiked']) && $post['userHasLiked'] ? 'active' : '' ?>" data-toggle="tooltip" data-placement="top" title="Gefällt mir"> | ||||
|             <a href="#" data-uuid="<?= $post['hashID'] ?>" class="action-btn like-button <?= isset($post['userHasLiked']) && $post['userHasLiked'] ? 'active' : '' ?>" data-toggle="tooltip" data-placement="top" title="Gefällt mir"> | ||||
|                 <i class="<?= isset($post['userHasLiked']) && $post['userHasLiked'] ? 'fas' : 'far' ?> fa-heart"></i> | ||||
|                 <span><?= $post['likeCount'] ?></span> | ||||
|             </a> | ||||
|             <div class="dropdown d-inline-block"> | ||||
|                 <a href="#" class="action-btn more-options-button" id="postMoreOptionsButton<?= $post['uuid'] ?>" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"> | ||||
|                 <a href="#" class="action-btn more-options-button" id="postMoreOptionsButton<?= $post['hashID'] ?>" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"> | ||||
|                     <i class="fa fa-ellipsis-h"></i> | ||||
|                 </a> | ||||
|  | ||||
|                 <div class="dropdown-menu" aria-labelledby="postMoreOptionsButton<?= $post['uuid'] ?>"> | ||||
|                 <div class="dropdown-menu" aria-labelledby="postMoreOptionsButton<?= $post['hashID'] ?>"> | ||||
|                     <a href="#" class="dropdown-item"> | ||||
|                         <i class="fa fa-copy"></i> | ||||
|                         Link zum Post kopieren | ||||
|   | ||||
| @@ -49,8 +49,8 @@ | ||||
|                             <form method="post" enctype="multipart/form-data"> | ||||
|                                 <!-- Username --> | ||||
|                                 <div class="form-group"> | ||||
|                                     <label for="username">Nutzername</label> | ||||
|                                     <input name="username" id="username" class="form-control" | ||||
|                                     <label for="displayname">Nutzername</label> | ||||
|                                     <input name="displayname" id="displayname" class="form-control" | ||||
|                                            value="<?= isset($data['displayname']) ? $data['displayname'] : '' ?>"> | ||||
|                                     <span class="error-message" id="usernameErrorLength"> | ||||
|                                     <b>Dein Nutzername ist zu kurz!</b> Er muss mindestens 4 Zeichen lang sein | ||||
| @@ -1093,26 +1093,24 @@ | ||||
|                                 </div> | ||||
|                                 <!-- Bio --> | ||||
|                                 <div class="form-group"> | ||||
|                                     <label for="biography">Profilbeschreibung/Biographie</label> | ||||
|                                     <textarea class="form-control" name="biography" id="biography"> | ||||
|                                         <?= isset($data['about']) ? $data['about'] : "" ?> | ||||
|                                     </textarea> | ||||
|                                     <label for="about">Profilbeschreibung/Biographie</label> | ||||
|                                     <textarea class="form-control" name="about" id="about"><?= isset($data['about']) ? $data['about'] : "" ?></textarea> | ||||
|                                 </div> | ||||
|                                 <!-- Avatar --> | ||||
|                                 <div class="form-group"> | ||||
|                                     <label for="avatar">Avatar</label> | ||||
|                                     <?php if (isset($data['profile_picture']) || $data['profile_picture'] != ""): ?> | ||||
|                                     <?php if (isset($data['profilePicture']) || $data['profilePicture'] != ""): ?> | ||||
|                                         <img class="img-fluid img-thumbnail picture-preview d-block" | ||||
|                                              src="<?= $data['profile_picture'] ?>"> | ||||
|                                              src="<?= $data['profilePicture'] ?>"> | ||||
|                                     <?php endif; ?> | ||||
|                                     <input type="file" name="avatar" id="avatar"> | ||||
|                                 </div> | ||||
|                                 <!-- Header --> | ||||
|                                 <div class="form-group"> | ||||
|                                     <label for="header">Header</label> | ||||
|                                     <?php if (isset($data['header_image']) || $data['header_image'] != ""): ?> | ||||
|                                     <?php if (isset($data['headerImage']) || $data['headerImage'] != ""): ?> | ||||
|                                         <img class="img-fluid img-thumbnail picture-preview d-block" | ||||
|                                              src="<?= $data['header_image'] ?>"> | ||||
|                                              src="<?= $data['headerImage'] ?>"> | ||||
|                                     <?php endif; ?> | ||||
|                                     <input type="file" name="header" id="header"> | ||||
|                                 </div> | ||||
|   | ||||
| @@ -2,14 +2,14 @@ | ||||
|     defined('BASEPATH') OR exit('No direct script access allowed'); | ||||
| ?> | ||||
| <section id="profile-header" class="container-fluid" data-type="background" data-speed="2.14" | ||||
|          style="background-image: url('<?= $data['header_image'] ?>?w=1920')"> | ||||
|          style="background-image: url('<?= $data['headerImage'] ?>?w=1920')"> | ||||
| </section> | ||||
| <div id="scroll-trigger"></div> | ||||
| <section id="profile-sub-header" data-type="foreground" data-speed="10"> | ||||
|     <div class="container"> | ||||
|         <div class="row"> | ||||
|             <div class="col-xs-3 col-sm-2 col-md-4 col-lg-4 profile-card profile-picture-container"> | ||||
|                 <img src="<?= $data['profile_picture'] ?>?w=300" class="img-fluid rounded-circle profile-picture"> | ||||
|                 <img src="<?= $data['profilePicture'] ?>?w=300" class="img-fluid rounded-circle profile-picture"> | ||||
|                 <?php if (isset($_SESSION['user']) && $_SESSION['user']['username'] == $data['username']): ?> | ||||
|                     <div class="avatar-upload-overlay"> | ||||
|                         <i class="fa fa-upload"></i> | ||||
|   | ||||
| @@ -7,8 +7,8 @@ $dateFollowing = strtotime($data['followedSince']); | ||||
| ?> | ||||
| <li> | ||||
|     <a href="<?= base_url('user/' . $data['username']) ?>"> | ||||
|         <div style="background-image: url(<?= $data['header_image'] ?>)" class="header-image"></div> | ||||
|         <img src="<?= $data['profile_picture'] ?>" alt="" class="img-fluid rounded-circle profile-picture"> | ||||
|         <div style="background-image: url(<?= $data['headerImage'] ?>)" class="header-image"></div> | ||||
|         <img src="<?= $data['profilePicture'] ?>" alt="" class="img-fluid rounded-circle profile-picture"> | ||||
|         <div class="user-card-content"> | ||||
|             <h3><?= $data['displayname'] ?></h3> | ||||
|             <small><?= $data['followerCount'] ?> Follower | folgt | ||||
|   | ||||
| @@ -6,10 +6,10 @@ | ||||
| <?php endif; ?> | ||||
|     <div class="card"> | ||||
|         <a href="<?= base_url('user/' . $username) ?>"> | ||||
|             <img src="<?= $header_image ?>?w=350" class="card-img-top" alt="Header Image"> | ||||
|             <img src="<?= $headerImage ?>?w=350" class="card-img-top" alt="Header Image"> | ||||
|         </a> | ||||
|         <a href="<?= base_url('user/' . $username) ?>"> | ||||
|             <img src="<?= $profile_picture ?>?w=100" class="img-fluid rounded-circle card-profile-picture" alt="Profile Picture"> | ||||
|             <img src="<?= $profilePicture ?>?w=100" class="img-fluid rounded-circle card-profile-picture" alt="Profile Picture"> | ||||
|         </a> | ||||
|         <div class="card-body"> | ||||
|             <a href="<?= base_url('user/' . $username) ?>"> | ||||
|   | ||||
| @@ -2,33 +2,33 @@ | ||||
|     defined('BASEPATH') OR exit('No direct script access allowed'); | ||||
| ?> | ||||
|  | ||||
| <li class="col-4 p-2 <?= strtolower($post_plattform) ?>"> | ||||
| <li class="col-4 p-2 <?= strtolower($origin) ?>"> | ||||
|     <div class="card"> | ||||
|         <a href="<?= $post_url ?>"> | ||||
|             <div class="card-header bg-<?= strtolower($post_plattform) ?> text-white"> | ||||
|                 <i class="fab fa-<?= strtolower($post_plattform) ?>"></i> | ||||
|                 <?= $post_plattform ?> | ||||
|         <a href="<?= $url ?>"> | ||||
|             <div class="card-header bg-<?= strtolower($origin) ?> text-white"> | ||||
|                 <i class="fab fa-<?= strtolower($origin) ?>"></i> | ||||
|                 <?= $origin ?> | ||||
|             </div> | ||||
|             <?php if (!empty($post_img_source)): ?> | ||||
|                 <div style="height: 200px; background: url(<?= $post_img_source ?>) center; background-size: cover;"> | ||||
|             <?php if (!empty($imageSource)): ?> | ||||
|                 <div style="height: 200px; background: url(<?= $imageSource ?>) center; background-size: cover;"> | ||||
|                 </div> | ||||
|             <?php endif; ?> | ||||
|         </a> | ||||
|         <div class="card-body"> | ||||
|             <a href="<?= $post_url ?>"> | ||||
|             <a href="<?= $url ?>"> | ||||
|                 <p class="card-text"> | ||||
|                     <?= $post_content ?> | ||||
|                     <?= $content ?> | ||||
|                 </p> | ||||
|             </a> | ||||
|             <p class="card-text"> | ||||
|                 <small class="text-muted"> | ||||
|                     <i class="far fa-clock"></i> | ||||
|                     <?= $post_date ?> | ||||
|                     <?= $date ?> | ||||
|                     <br> | ||||
|                     <i class="far fa-user"></i> | ||||
|                     <?= lang('person_by') ?> | ||||
|                     <a href="<?= $post_author_url ?>" target="_blank"> | ||||
|                         <?= $post_author ?> | ||||
|                     <a href="<?= $authorUrl ?>" target="_blank"> | ||||
|                         <?= $authorName ?> | ||||
|                     </a> | ||||
|                 </small> | ||||
|             </p> | ||||
|   | ||||
| @@ -39,30 +39,11 @@ defined('BASEPATH') OR exit('No direct script access allowed'); | ||||
|                         <?= lang('projects_all'); ?> | ||||
|                     </a> | ||||
|                 </li> | ||||
|                 <?php | ||||
|                 $categoryList = []; | ||||
|                 $categoryNames = []; | ||||
|                 $siteLang = isset($_SESSION['site_lang']) ? $_SESSION['site_lang'] : 'en'; | ||||
|                 $languageName = 'displayname'; | ||||
|                 if($siteLang == 'en') { | ||||
|                     $languageName = 'displaynameEnglish'; | ||||
|                 } elseif($siteLang == 'fr') { | ||||
|                     $languageName = 'displaynameFrench'; | ||||
|                 } | ||||
|  | ||||
|                 foreach($collections as $item) { | ||||
|                     $categoryName = $item[$languageName]; | ||||
|                     $categoryList[] = $categoryName; | ||||
|                     $categoryNames[$categoryName] = $item['collection']; | ||||
|                 } | ||||
|  | ||||
|                 sort($categoryList); | ||||
|                 ?> | ||||
|  | ||||
|                 <?php foreach($categoryList as $category): ?> | ||||
|                 <?php foreach($categories as $category): ?> | ||||
|                 <li> | ||||
|                     <a href="#" class="btn btn-default btn-sm <?= $album == $categoryNames[$category] ? 'active' : '' ?>" data-filter=".<?= $categoryNames[$category] ?>"> | ||||
|                         <?= $category ?> | ||||
|                     <a href="#" class="btn btn-default btn-sm <?= $album == $category['name'] ? 'active' : '' ?>" data-filter=".<?= $category['name'] ?>"> | ||||
|                         <?= $category['displayname'] ?> | ||||
|                     </a> | ||||
|                 </li> | ||||
|                 <?php endforeach; ?> | ||||
|   | ||||
| @@ -5,26 +5,26 @@ | ||||
|     $categoryUrls = []; | ||||
|     $lang = isset($_SESSION['site_lang']) ? $_SESSION['site_lang'] : 'de'; | ||||
|  | ||||
|     foreach ($pCategories as $pCategory) { | ||||
|         if ($lang == 'fr' && $pCategory['displaynameFrench'] != NULL) { | ||||
|             $pCategoriesList[] = $pCategory['displaynameFrench']; | ||||
|             $categoryUrls[$pCategory['displaynameFrench']] = $pCategory['collection']; | ||||
|         } else if ($lang == 'en' && $pCategory['displaynameEnglish'] != NULL) { | ||||
|             $pCategoriesList[] = $pCategory['displaynameEnglish']; | ||||
|             $categoryUrls[$pCategory['displaynameEnglish']] = $pCategory['collection']; | ||||
|         } else { | ||||
|             $pCategoriesList[] = $pCategory['displayname']; | ||||
|             $categoryUrls[$pCategory['displayname']] = $pCategory['collection']; | ||||
|         } | ||||
|     } | ||||
|     sort($pCategoriesList); | ||||
|  | ||||
|     $pCategoriesListUrls = []; | ||||
|     foreach ($pCategoriesList as $pCategory) { | ||||
|         $pCategoriesListUrls[] = '<a href="' . base_url('projects/' . $categoryUrls[$pCategory]) . '">' . $pCategory . '</a>'; | ||||
|     } | ||||
|  | ||||
|     $pCategoriesListUrls = implode(', ', $pCategoriesListUrls); | ||||
| //    foreach ($pCategories as $pCategory) { | ||||
| //        if ($lang == 'fr' && $pCategory['displaynameFrench'] != NULL) { | ||||
| //            $pCategoriesList[] = $pCategory['displaynameFrench']; | ||||
| //            $categoryUrls[$pCategory['displaynameFrench']] = $pCategory['collection']; | ||||
| //        } else if ($lang == 'en' && $pCategory['displaynameEnglish'] != NULL) { | ||||
| //            $pCategoriesList[] = $pCategory['displaynameEnglish']; | ||||
| //            $categoryUrls[$pCategory['displaynameEnglish']] = $pCategory['collection']; | ||||
| //        } else { | ||||
| //            $pCategoriesList[] = $pCategory['displayname']; | ||||
| //            $categoryUrls[$pCategory['displayname']] = $pCategory['collection']; | ||||
| //        } | ||||
| //    } | ||||
| //    sort($pCategoriesList); | ||||
| // | ||||
| //    $pCategoriesListUrls = []; | ||||
| //    foreach ($pCategoriesList as $pCategory) { | ||||
| //        $pCategoriesListUrls[] = '<a href="' . base_url('projects/' . $categoryUrls[$pCategory]) . '">' . $pCategory . '</a>'; | ||||
| //    } | ||||
| // | ||||
| //    $pCategoriesListUrls = implode(', ', $pCategoriesListUrls); | ||||
| ?> | ||||
| <section class="container"> | ||||
|     <div class="vote-container" data-id="<?= $data['ID'] ?>"> | ||||
| @@ -89,7 +89,13 @@ | ||||
|             </div> | ||||
|             <div class="col-lg-8 col-md-8 col-sm-12 col-xs-12"> | ||||
|                 <span data-toggle="tooltip" data-placement="top" title="Kategorien"> | ||||
|                     <i class="fa fa-folder-open"></i> <?= $pCategoriesListUrls ?> | ||||
|                     <i class="fa fa-folder-open"></i> | ||||
|                     <?php foreach ($pCategories as $i => $category): ?> | ||||
|                         <?= $i != 0 ? ' | ' : '' ?> | ||||
|                         <a href="<?= base_url('projects/' . $category['name']) ?>"> | ||||
|                             <?= $category['displayname'] ?> | ||||
|                         </a> | ||||
|                     <?php endforeach; ?> | ||||
|                 </span> | ||||
|                 <span data-toggle="tooltip" data-placement="top" | ||||
|                       title="Datum: <?= strftime("%d. %B %Y", strtotime($data['datetime'])) ?>" | ||||
|   | ||||
| @@ -4,7 +4,7 @@ | ||||
|     $categories = $this->projectsModel->getEntryCategories($ID); | ||||
|     $categoriesClasses = ""; | ||||
|     foreach ($categories as $category) { | ||||
|         $categoriesClasses .= $category['collection'] . " "; | ||||
|         $categoriesClasses .= $category['name'] . " "; | ||||
|     } | ||||
|     if ($isDownloadable) { | ||||
|         $categoriesClasses .= 'downloadable '; | ||||
|   | ||||
| @@ -169,7 +169,7 @@ | ||||
| .widget.filled-background .media { | ||||
|     margin-top: 0; | ||||
|     padding: 10px 0; | ||||
|     border-bottom: 1px solid rgba(0,0,0,.3); | ||||
|     border-bottom: 1px solid rgba(0, 0, 0, .3); | ||||
|     transition: transform .2s; | ||||
| } | ||||
|  | ||||
| @@ -195,3 +195,31 @@ | ||||
|     right: 30%; | ||||
| } | ||||
|  | ||||
| .following-post { | ||||
|     display: block; | ||||
|     height: 108px; | ||||
|     overflow: hidden; | ||||
| } | ||||
|  | ||||
| .following-post .following-post-image { | ||||
|     float: left; | ||||
|     background-size: cover; | ||||
|     background-position: center; | ||||
|     width: 100px; | ||||
|     height: 100%; | ||||
|     border-radius: 10px; | ||||
|     margin-right: 10px; | ||||
| } | ||||
|  | ||||
| .following-post.right .following-post-image { | ||||
|     float: right; | ||||
|     margin-right: 0; | ||||
|     margin-left: 10px; | ||||
| } | ||||
|  | ||||
| .following-post h4 { | ||||
|     max-height: 48px; | ||||
|     overflow: hidden; | ||||
|     -ms-text-overflow: ellipsis; | ||||
|     text-overflow: ellipsis; | ||||
| } | ||||
| @@ -8,6 +8,15 @@ body { | ||||
|     overflow-x: hidden; | ||||
| } | ||||
|  | ||||
| h1, h2, h3, h4, h5, h6 { | ||||
|     font-family: Roboto, Helvetica, Arial, sans-serif; | ||||
| } | ||||
|  | ||||
| h1 { | ||||
|     font-family: "Roboto Black", Helvetica, "Arial Black", Arial, sans-serif; | ||||
|     color: #333; | ||||
| } | ||||
|  | ||||
| .left_col { | ||||
|     background: #444; | ||||
| } | ||||
|   | ||||
| @@ -1407,6 +1407,87 @@ ul#downloadSlider a.active .overlay { | ||||
|     width: 100%; | ||||
| } | ||||
|  | ||||
| .user-post-item { | ||||
|     display: grid; | ||||
|     grid-template-areas: "logo username metadata" "logo content content" "logo actions actions"; | ||||
|     grid-template-rows: 25px auto 35px; | ||||
|     grid-template-columns: 90px auto 1fr; | ||||
|     grid-gap: 10px 5px; | ||||
|  | ||||
|     box-shadow: 0 2px 2px 0 rgba(0, 0, 0, .14), 0 3px 1px -2px rgba(0, 0, 0, .2), 0 1px 5px 0 rgba(0, 0, 0, .12); | ||||
|     background-color: rgb(255, 255, 255); | ||||
|     padding: 3px 10px; | ||||
|     border-radius: 10px; | ||||
|     /*min-height: 100px;*/ | ||||
| } | ||||
|  | ||||
| .user-post-item:hover { | ||||
|     background-color: rgb(245, 245, 245) | ||||
| } | ||||
|  | ||||
| .user-post-item .item-avatar-container { | ||||
|     grid-area: logo; | ||||
|     padding: 10px 0 10px 5px; | ||||
| } | ||||
|  | ||||
| .user-post-item .item-avatar { | ||||
|     max-width: 100%; | ||||
|     height: 75px; | ||||
|     border-radius: 50%; | ||||
| } | ||||
|  | ||||
| .user-post-item .item-avatar-container .fa { | ||||
|     margin-top: 5px; | ||||
|     padding: 15px; | ||||
|     font-size: 35px; | ||||
|     color: #fff; | ||||
|     border-radius: 50%; | ||||
| } | ||||
|  | ||||
| .user-post-item .item-avatar-container .fa.fa-check { | ||||
|     background-color: #08DD73; | ||||
| } | ||||
|  | ||||
| .user-post-item .item-user { | ||||
|     grid-area: username; | ||||
|     margin: 5px 0 0 !important; | ||||
|     font-size: 20px; | ||||
| } | ||||
|  | ||||
| .user-post-item .item-meta { | ||||
|     grid-area: metadata; | ||||
|     margin: 9px 10px 0 0; | ||||
|     color: rgb(97, 97, 97); | ||||
|     font-size: 16px; | ||||
|     font-weight: 400; | ||||
|     white-space: nowrap; | ||||
|     overflow: hidden; | ||||
|     text-overflow: ellipsis; | ||||
| } | ||||
|  | ||||
| .user-post-item .item-content { | ||||
|     grid-area: content; | ||||
|     font-size: 18px; | ||||
|     color: #777; | ||||
|     margin: 0; | ||||
| } | ||||
|  | ||||
| .user-post-item .item-actions { | ||||
|     grid-area: actions; | ||||
|     height: 35px; | ||||
| } | ||||
|  | ||||
| .user-post-item .item-actions .item-btn { | ||||
|     display: inline-block; | ||||
|     margin: 0 5px; | ||||
|     padding: 5px 10px; | ||||
|     text-align: center; | ||||
| } | ||||
|  | ||||
| .user-post-item .item-actions .item-btn:first-child { | ||||
|     margin-left: -10px; | ||||
| } | ||||
|  | ||||
| .like-button-floating { | ||||
|     position: fixed; | ||||
|     -webkit-transform: translateX(-100%); | ||||
|   | ||||
| @@ -63,19 +63,18 @@ $(document).on("keydown", function (e) { | ||||
| //     }); | ||||
| // }); | ||||
|  | ||||
| $('#postTitle').bind('click', function () { | ||||
| $('#postTitle') | ||||
|     .bind('click', function () { | ||||
|         $(this).attr('contentEditable', true); | ||||
| }).blur( | ||||
|     }).blur( | ||||
|     function () { | ||||
|         $(this).attr('contentEditable', false); | ||||
|     }); | ||||
|  | ||||
| $('#postTitle').on('keyup', function () { | ||||
|     }).on('keyup', function () { | ||||
|         if (changeUrl) { | ||||
|             var title = prepareString($('#postTitle').text()); | ||||
|             $('#postUrl').val(encodeURI(title)); | ||||
|         } | ||||
| }); | ||||
|     }); | ||||
|  | ||||
| $('#postDescription').bind('click', function () { | ||||
|     $(this).attr('contentEditable', true); | ||||
| @@ -89,7 +88,7 @@ $('#postCategory').bind('change', function () { | ||||
| }); | ||||
|  | ||||
| function switchCategory() { | ||||
|     if ($('#postCategory').val() === 'new-category') { | ||||
|     if ($('#postCategory').val().includes('new-category')) { | ||||
|         $('#new-category').fadeIn(250); | ||||
|     } else { | ||||
|         $('#new-category').fadeOut(250); | ||||
| @@ -236,13 +235,8 @@ $(function () { | ||||
|         getPostTags(); | ||||
|         // getTranslations(); | ||||
|  | ||||
|         if ($('#contentID').val() !== '-1') { | ||||
|             getContentData(); | ||||
|         } | ||||
|  | ||||
|         if ($('#translationID').val() !== '-1') { | ||||
|             getTranslationData(); | ||||
|         } | ||||
|         if ($('#versionID').val() !== '-1') | ||||
|             getVersionData(); | ||||
|     } | ||||
|  | ||||
|     $('#postPublishDate').datetimepicker({ | ||||
| @@ -291,66 +285,56 @@ function getPostData() { | ||||
|             console.log(result); | ||||
|  | ||||
|             if (result.status === 'success') { | ||||
|                 $('#postUrl').val(result.postData.postUrl); | ||||
|                 $('#postCategory').val(result.postData.postCategoryID); | ||||
|                 const categoryIDs = result.postData.categories.map(item => item.ID); | ||||
|                 $('#postCategory').val(categoryIDs); | ||||
|                 switchCategory(); | ||||
|  | ||||
|                 $('#postPublishDate').data('DateTimePicker').setValue(convertDate(result.postData.postPublishDate)); | ||||
|                 // $('#postPublishDate').val(convertDate(result.postData.postPublishDate)); | ||||
|                 $('#uploadedImage').val(result.postData.postImage); | ||||
|                 $('.img-container').css('background-image', 'url(' + result.postData.postImage + ')'); | ||||
|                 $('#uploadedImage').val(result.postData.image); | ||||
|                 $('.img-container').css('background-image', 'url(' + result.postData.image + ')'); | ||||
|                 $('#postPublishDate').data('DateTimePicker').setValue(convertDate(result.postData.initialRelease)); | ||||
|             } | ||||
|         } | ||||
|     }) | ||||
| } | ||||
|  | ||||
|                 if (result.postData.postState === "1") { | ||||
|                     $('#postUrl').attr('disabled', ''); | ||||
|                     changeUrl = false; | ||||
|                     $('#postUrl').keydown((e) => { | ||||
|                         e.preventDefault(); | ||||
|  | ||||
| function getVersionData() { | ||||
|     const postID = $('#postID').val(); | ||||
|     const versionID = $('#versionID').val(); | ||||
|     const lang = $('#postLanguage').val(); | ||||
|  | ||||
|     $.ajax({ | ||||
|         url: '/admin/blog/getVersion', | ||||
|         method: 'post', | ||||
|         data: { | ||||
|             postID, versionID, lang, | ||||
|         }, | ||||
|         success: (result) => { | ||||
|             console.log(result); | ||||
|             if (result.status === 'success') { | ||||
|                 $('#postTitle').text(result.title); | ||||
|                 $('#postDescription').text(result.description); | ||||
|  | ||||
|                 console.log(tinyMCE.get('postContent')); | ||||
|                 if (typeof (tinymce.activeEditor.contentDocument) !== 'undefined') { | ||||
|                     tinyMCE.on('addeditor', (e) => { | ||||
|                         const editor = e.editor; | ||||
|                         if (editor.id === 'postContent') { | ||||
|                             editor.setContent(result.content); | ||||
|                             console.log(e); | ||||
|                         } | ||||
|                     }); | ||||
|                 } else { | ||||
|                     // tinyMCE.activeEditor.setContent(result.content); | ||||
|                     $('#postContent').val(result.content); | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|     }) | ||||
| } | ||||
|  | ||||
| function getContentData() { | ||||
|     const postID = $('#postID').val(); | ||||
|     const contentID = $('#contentID').val(); | ||||
|     const lang = $('#postLanguage').val(); | ||||
|     $.ajax({ | ||||
|         url: '/admin/blog/getContent', | ||||
|         method: 'post', | ||||
|         data: { | ||||
|             postID, contentID, lang | ||||
|                 $('#postUrl').val(result.url); | ||||
|                 $('#versionID').val('-1'); | ||||
|             } | ||||
|         }, | ||||
|         success: (result) => { | ||||
|             console.log(result); | ||||
|             if (result.status === 'success') { | ||||
|                 quill.clipboard.dangerouslyPasteHTML(result.contentData.content); | ||||
|                 // $('#contentID').val('-1'); | ||||
|             } | ||||
|         } | ||||
|     }) | ||||
| } | ||||
|  | ||||
| function getTranslationData() { | ||||
|     const postID = $('#postID').val(); | ||||
|     const translationID = $('#translationID').val(); | ||||
|     const lang = $('#postLanguage').val(); | ||||
|     $.ajax({ | ||||
|         url: '/admin/blog/getTranslationData', | ||||
|         method: 'post', | ||||
|         data: { | ||||
|             postID, translationID, lang | ||||
|         }, | ||||
|         success: (result) => { | ||||
|             console.log(result); | ||||
|  | ||||
|             if (result.status === 'success') { | ||||
|                 $('#postTitle').text(result.translationData.postTitle); | ||||
|                 $('#postDescription').text(result.translationData.postDesc); | ||||
|             } | ||||
|         } | ||||
|     }) | ||||
|         error: console.log | ||||
|     }); | ||||
| } | ||||
|  | ||||
| function getPostTags() { | ||||
| @@ -377,54 +361,57 @@ $(function () { | ||||
|     $('#switchLanguages > li').click(function () { | ||||
|         const currentPostTitle = $('#postTitle').text(); | ||||
|         const currentPostDescription = $('#postDescription').text(); | ||||
|         const currentPostContent = quill.getContents(); | ||||
|         const currentContentID = $('#contentID').val(); | ||||
|         const currentTranslationID = $('#translationID').val(); | ||||
|         // const currentPostContent = quill.getContents(); | ||||
|         const currentPostContent = tinymce.get('postContent').getContent(); | ||||
|         const currentPostUrl = $('#postUrl').val(); | ||||
|         const currentVersionID = $('#versionID').val(); | ||||
|  | ||||
|         $('#switchLanguages > li.active').data('title', currentPostTitle) | ||||
|         $('#switchLanguages > li.active') | ||||
|             .data('title', currentPostTitle) | ||||
|             .data('description', currentPostDescription) | ||||
|             .data('content', currentPostContent) | ||||
|             .data('contentid', currentContentID) | ||||
|             .data('translationid', currentTranslationID) | ||||
|             .data('url', currentPostUrl) | ||||
|             .data('versionid', currentVersionID) | ||||
|             .removeClass('active'); | ||||
|  | ||||
|         console.log($(this)); | ||||
|  | ||||
|         const versionID = $(this).data('versionid'); | ||||
|  | ||||
|         $('#versionID').val(versionID); | ||||
|         $('#postLanguage').val($(this).data('lang')); | ||||
|  | ||||
|         if ($(this).data('title')) { | ||||
|             const postTitle = $(this).data('title'); | ||||
|             const postDescription = $(this).data('description'); | ||||
|             const postContent = $(this).data('content'); | ||||
|             const postUrl = $(this).data('url'); | ||||
|  | ||||
|             $('#postTitle').text(postTitle); | ||||
|             $('#postDescription').text(postDescription); | ||||
|             quill.setContents(postContent); | ||||
|             // quill.setContents(postContent); | ||||
|             tinymce.get('postContent').setContent(postContent); | ||||
|             $('#postUrl').val(postUrl); | ||||
|         } else { | ||||
|             getVersionData(); | ||||
|         } | ||||
|  | ||||
|         const contentID = $(this).data('contentid'); | ||||
|         const translationID = $(this).data('translationid'); | ||||
|  | ||||
|         $('#contentID').val(contentID); | ||||
|         $('#translationID').val(translationID); | ||||
|         $('#postLanguage').val($(this).data('lang')); | ||||
|  | ||||
|         getTranslationData(); | ||||
|         getContentData(); | ||||
|  | ||||
|         $(this).addClass('active'); | ||||
|     }); | ||||
| }); | ||||
|  | ||||
| function sendPost(executionFinished) { | ||||
|     const postID = $('#postID').val(), | ||||
|         contentID = $('#contentID').val(), | ||||
|         translationID = $('#translationID').val(), | ||||
|         versionID = $('#versionID').val(), | ||||
|         postImage = $('#uploadedImage').val(), | ||||
|         postTitle = $('#postTitle').text(), | ||||
|         postDescription = $('#postDescription').text(), | ||||
|         postContent = $('.ql-editor').html(), | ||||
|         postContent = tinyMCE.activeEditor.getContent(), | ||||
|         postPublishDate = $('#postPublishDate').val(), | ||||
|         postUrl = $('#postUrl').val(), | ||||
|         postCategory = $('#postCategory').val(), | ||||
|         postCategories = $('#postCategory').val(), | ||||
|         newCategoryName = $('#cat-name').val(), | ||||
|         newCategoryDisplayName = $('#cat-dname').val(), | ||||
|         postLanguage = $('#postLanguage').val(), | ||||
|         postTags = $('#postTags').tagsinput('items'); | ||||
|  | ||||
| @@ -433,29 +420,47 @@ function sendPost(executionFinished) { | ||||
|         method: 'post', | ||||
|         data: { | ||||
|             postID, | ||||
|             contentID, | ||||
|             translationID, | ||||
|             versionID, | ||||
|             postImage, | ||||
|             postTitle, | ||||
|             postDescription, | ||||
|             postContent, | ||||
|             postPublishDate, | ||||
|             postUrl, | ||||
|             postCategory, | ||||
|             postCategories, | ||||
|             newCategoryName, | ||||
|             newCategoryDisplayName, | ||||
|             postLanguage, | ||||
|             postTags | ||||
|         }, | ||||
|         success: (result) => { | ||||
|             console.log(result); | ||||
|  | ||||
|             const newCategory = postCategories.includes('new-category'); | ||||
|  | ||||
|             if (result.success) { | ||||
|                 $('#postID').val(result.postID); | ||||
|                 $('#contentID').val(result.contentID); | ||||
|                 $('#switchLanguages > li.active').data('contentid', result.contentID); | ||||
|                 $('#translationID').val(result.translationID); | ||||
|                 $('#switchLanguages > li.active').data('translationid', result.translationID); | ||||
|                 $('#versionID').val(result.versionID); | ||||
|                 $('#switchLanguages > li.active').data('versionid', result.versionID); | ||||
|  | ||||
|                 $('.snackbar-container').append(`<div class="alert alert-success snackbar" role="alert">${result.message}</div>`); | ||||
|  | ||||
|                 if(newCategory) { | ||||
|                     if(!!result.newCategoryID) { | ||||
|                         let categories = postCategories; | ||||
|                         categories.splice(categories.indexOf('new-category'), 1); | ||||
|                         categories.push(result.newCategoryID.toString()); | ||||
|  | ||||
|                         $('#postCategory').append(`<option value="${result.newCategoryID}">${newCategoryDisplayName}</option>`); | ||||
|                         setTimeout(() => { | ||||
|                             $('#postCategory').val(categories); | ||||
|                         }, 250); | ||||
|                         $('#cat-name').val(''); | ||||
|                         $('#cat-dname').val(''); | ||||
|                     } else { | ||||
|                         $('.snackbar-container').append('<div class="alert alert-warning snackbar" role="alert">Die neue Kategorie konnte nicht erstellt werden.</div>'); | ||||
|                     } | ||||
|                 } | ||||
|             } else { | ||||
|                 $('.snackbar-container').append(`<div class="alert alert-danger snackbar" role="alert">${result.message}</div>`); | ||||
|             } | ||||
| @@ -469,17 +474,17 @@ function sendPost(executionFinished) { | ||||
|  | ||||
| function publishPost() { | ||||
|     const postID = $('#postID').val(), | ||||
|         contentID = $('#contentID').val(), | ||||
|         contentDE = $('#switchLanguages').find('> li[data-lang=de]').data('contentid'), | ||||
|         contentEN = $('#switchLanguages').find('> li[data-lang=en]').data('contentid'), | ||||
|         contentFR = $('#switchLanguages').find('> li[data-lang=fr]').data('contentid'); | ||||
|         versionID = $('#versionID').val(), | ||||
|         versionDE = $('#switchLanguages').find('> li[data-lang=de]').data('versionid'), | ||||
|         versionEN = $('#switchLanguages').find('> li[data-lang=en]').data('versionid'), | ||||
|         versionFR = $('#switchLanguages').find('> li[data-lang=fr]').data('versionid'); | ||||
|  | ||||
|     $.ajax({ | ||||
|         url: '/admin/blog/publishPost', | ||||
|         method: 'post', | ||||
|         data: { | ||||
|             postID, contentID, | ||||
|             contentIDs: {'de': contentDE, 'en': contentEN, 'fr': contentFR} | ||||
|             postID, versionID, | ||||
|             versionIDs: {'de': versionDE, 'en': versionEN, 'fr': versionFR} | ||||
|         }, | ||||
|         success: (result) => { | ||||
|             console.log(result); | ||||
|   | ||||
							
								
								
									
										39
									
								
								assets/js/blog-history.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										39
									
								
								assets/js/blog-history.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,39 @@ | ||||
| let compareItems = []; | ||||
|  | ||||
| $('.history-compare').on('click', function () { | ||||
|     const hashID = $(this).data('hashid'); | ||||
|     if(compareItems.includes(this)) { | ||||
|         compareItems.splice(compareItems.indexOf(this)); | ||||
|  | ||||
|         if(compareItems.length === 0) { | ||||
|             $('.history-compare').text('Vergleichen mit ...'); | ||||
|         } else { | ||||
|             $(this).text('Zum Vergleich hinzufügen'); | ||||
|         } | ||||
|     } else { | ||||
|         if(compareItems.length === 0) { | ||||
|             $('.history-compare').text('Zum Vergleich hinzufügen'); | ||||
|         } else { | ||||
|  | ||||
|         } | ||||
|         compareItems.push(this); | ||||
|         $(this).text('Vom Vergleich entfernen'); | ||||
|     } | ||||
|     updateCompareItemsView(); | ||||
| }); | ||||
|  | ||||
| function updateCompareItemsView() { | ||||
|     $('.compare-items').empty(); | ||||
|     compareItems.forEach(item => { | ||||
|         $('.compare-items').append(`<span class="badge badge-primary">${item.dataset.hashid.substring(0, 6)}</span>`); | ||||
|     }); | ||||
|  | ||||
|     if(compareItems.length >= 2) { | ||||
|         const url = window.location.pathname + '/compare/' + compareItems[0].dataset.hashid + '/' + compareItems[1].dataset.hashid; | ||||
|         $('.compare-btn').attr('disabled', false) | ||||
|             .attr('href', url); | ||||
|     } else { | ||||
|         $('.compare-btn').attr('disabled', true) | ||||
|             .attr('href', '#'); | ||||
|     } | ||||
| } | ||||
| @@ -38,25 +38,38 @@ var addComment = function () { | ||||
|                 comment: comment | ||||
|             }, | ||||
|             beforeSend: function () { | ||||
|                 var date = new Date(); | ||||
|                 date = date.getDate() + '.' + date.getMonth() + '.' + date.getYear() + ' ' + date.getHours() + ':' + date.getMinutes() + ' Uhr'; | ||||
|                 item = $(` | ||||
|                 <li> | ||||
|                     <div class="well comment-well"> | ||||
|                         <div class="d-inline-block mr-2"> | ||||
|                             <div class="image-placeholder"> | ||||
|                     <div class="user-post-item"> | ||||
|                         <div class="item-avatar-container"> | ||||
|                             <div class="loadingSpinner"></div> | ||||
|                         </div> | ||||
|                         </div> | ||||
|                         <div class="d-inline-block mr-2"> | ||||
|                             <h3> | ||||
|                                 <small> | ||||
|                                     von Dir / ${date} | ||||
|                                 </small> | ||||
|                         <h3 class="item-user"> | ||||
|                             <a href="#"> | ||||
|                                 Du | ||||
|                             </a> | ||||
|                         </h3> | ||||
|                             <p class="comment">${comment}</p> | ||||
|                         <h4 class="item-meta"> | ||||
|                             jetzt gerade | ||||
|                         </h4> | ||||
|                         <p class="item-content"> | ||||
|                             ${comment} | ||||
|                         </p> | ||||
|                         <div class="item-actions"> | ||||
|                             <a href="#" class="item-btn" data-toggle="tooltip" data-placement="top" title="Antworten"> | ||||
|                                 <i class="far fa-comment"></i> | ||||
|                                 <span>0</span> | ||||
|                             </a> | ||||
|                             <a href="#" class="item-btn" data-toggle="tooltip" data-placement="top" title="Gefällt mir"> | ||||
|                                 <i class="far fa-heart"></i> | ||||
|                                 <span>0</span> | ||||
|                             </a> | ||||
|                             <div class="item-btn dropdown"> | ||||
|                                 <a href="#" class="" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"> | ||||
|                                     <i class="fa fa-ellipsis-h"></i> | ||||
|                                 </a> | ||||
|                                 <div class="dropdown-menu"></div> | ||||
|                             </div> | ||||
|                         <div class="loading-container d-inline-block"> | ||||
|                             <i class="fa fa-cog fa-spin"></i> | ||||
|                         </div> | ||||
|                     </div> | ||||
|                 </li> | ||||
| @@ -67,27 +80,57 @@ var addComment = function () { | ||||
|                 $('#addComment').attr('disabled', ''); | ||||
|             }, | ||||
|             success: function (data) { | ||||
|                 if (data.type === 'success') { | ||||
|                 console.log(data); | ||||
|                 if (data.success) { | ||||
|                     $('#commentField').val(''); | ||||
|                     $('#notice-container').html('<div class="alert alert-success" role="alert">Dein Kommentar wurde <b>erfolgreich</b> gesendet!</div>'); | ||||
|                     $('.loading-container', item).css('background-color', '#28b62c'); | ||||
|                     $('.loading-container i', item) | ||||
|                         .removeClass('fa-cog').removeClass('fa-spin') | ||||
|                         .addClass('fa-check').css('color', '#fff'); | ||||
|                     $('.content h3 small', item).hide() | ||||
|                         .html(`von <a href="/user/${data.content.username}" target="_blank">${data.content.displayname}</a> / ${data.content.date}`).fadeIn(); | ||||
|                     $('.loading-container', item).delay(2000).fadeOut(2000); | ||||
|                     $('.comment-well', item).prepend(`<img src="${data.content.profilePic}" style="display:none">`); | ||||
|                     $('.comment-well img', item).fadeIn(2000); | ||||
|                     $('.image-placeholder', item).remove(); | ||||
|                     wait(8000); | ||||
|                     $('.content', item).removeClass('small'); | ||||
|                     $('.comment-count').text(parseInt($('.comment-count').text()) + 1); | ||||
|                 } else { | ||||
|  | ||||
|                     addSnackbar('success', 'Dein Kommentar wurde erfolgreich veröffentlicht!'); | ||||
|  | ||||
|                     item | ||||
|                         .find('.item-avatar').attr('src', data.content.profilePicture).attr('alt', data.content.username) | ||||
|                         .find('.item-user a').attr('href', data.content.profileUrl).text(data.content.displayname); | ||||
|  | ||||
|                     item.find('.item-avatar-container .loadingSpinner').fadeOut(); | ||||
|  | ||||
|                     setTimeout(() => { | ||||
|                         item.find('.item-avatar-container .loadingSpinner').remove(); | ||||
|                         item.find('.item-avatar-container') | ||||
|                             .addClass('text-center') | ||||
|                             .append('<i class="fa fa-check" style="display:none"></i>') | ||||
|                             .find('.fa').fadeIn(); | ||||
|                     }, 500); | ||||
|  | ||||
|                     setTimeout(() => { | ||||
|                         item.find('.item-avatar-container .fa').fadeOut(); | ||||
|                     }, 1500); | ||||
|  | ||||
|                     setTimeout(() => { | ||||
|                         item.find('.item-avatar-container') | ||||
|                             .empty() | ||||
|                             .removeClass('text-center') | ||||
|                             .append(`<img src="${data.content.profilePicture}" class="item-avatar" style="display:none">`) | ||||
|                             .find('img').fadeIn(); | ||||
|                     }, 2000); | ||||
|  | ||||
|                     // $('.loading-container', item).css('background-color', '#28b62c'); | ||||
|                     // $('.loading-container i', item) | ||||
|                     //     .removeClass('fa-cog').removeClass('fa-spin') | ||||
|                     //     .addClass('fa-check').css('color', '#fff'); | ||||
|                     // $('.content h3 small', item).hide() | ||||
|                     //     .html(`von <a href="/user/${data.content.username}" target="_blank">${data.content.displayname}</a> / ${data.content.date}`).fadeIn(); | ||||
|                     // $('.loading-container', item).delay(2000).fadeOut(2000); | ||||
|                     // $('.comment-well', item).prepend(`<img src="${data.content.profilePic}" style="display:none">`); | ||||
|                     // $('.comment-well img', item).fadeIn(2000); | ||||
|                     // $('.image-placeholder', item).remove(); | ||||
|                     // wait(8000); | ||||
|                     // $('.content', item).removeClass('small'); | ||||
|                     // $('.comment-count').text(parseInt($('.comment-count').text()) + 1); | ||||
|                 } else { | ||||
|                     addSnackbar('danger', data.message); | ||||
|                 } | ||||
|             }, | ||||
|             error: function (data) { | ||||
|                 console.log(data); | ||||
|                 $('#notice-container').html('<div class="alert alert-danger" role="alert"><b>Error:</b> Comment couldn\'t be sent caused by an unkown error! Please try again later or contact the admin to get help!</div>'); | ||||
|                 $('div.loading-container', item).css('background-color', '#ff4136'); | ||||
|                 $('div.loading-container i', item).removeClass('fa-cog').removeClass('fa-spin').addClass('fa-exclamation').css("color", '#fff'); | ||||
|   | ||||
							
								
								
									
										92
									
								
								assets/js/comment-item.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										92
									
								
								assets/js/comment-item.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,92 @@ | ||||
| function openCommentReportModal(ID) { | ||||
|     openAsyncModal( | ||||
|         '/blog/getReportModal', | ||||
|         'Kommentar melden', | ||||
|         {ID}, | ||||
|         () => { | ||||
|             $('#commentReportForm').on('submit', function(event) { | ||||
|                 event.preventDefault(); | ||||
|  | ||||
|                 const reason = $('#commentReportReason').val(); | ||||
|                 const text = $('#commentReportText').val(); | ||||
|  | ||||
|                 reportComment(ID, reason, text); | ||||
|             }); | ||||
|         }, | ||||
|         'commentReportModal' | ||||
|     ); | ||||
| } | ||||
|  | ||||
| function reportComment(ID, reason, text) { | ||||
|     const modal = $('#commentReportModal'); | ||||
|  | ||||
|     $.ajax({ | ||||
|         url: '/blog/reportComment', | ||||
|         data: { | ||||
|             ID, reason, text | ||||
|         }, | ||||
|         method: 'POST', | ||||
|         success: (result) => { | ||||
|             console.log(result); | ||||
|  | ||||
|             modal.modal('hide'); | ||||
|  | ||||
|             if(result.success) { | ||||
|                 addSnackbar('success', result.message); | ||||
|             } else { | ||||
|                 addSnackbar('danger', result.message); | ||||
|             } | ||||
|         }, | ||||
|         error: (result) => { | ||||
|             console.log(result); | ||||
|         } | ||||
|     }); | ||||
| } | ||||
|  | ||||
| function openCommentDeleteModal(ID) { | ||||
|     openAsyncModal( | ||||
|         '/blog/getDeleteModal', | ||||
|         'Kommentar löschen', | ||||
|         {ID}, | ||||
|         () => { | ||||
|             console.log('tetst'); | ||||
|         }, | ||||
|         'commentDeleteModal', | ||||
|         'lg' | ||||
|     ) | ||||
| } | ||||
|  | ||||
| function deleteComment(ID) { | ||||
|     const modal = $('#commentDeleteModal'); | ||||
|  | ||||
|     modal.find('.modal-body').empty().append('<div class="loadingSpinner"></div>'); | ||||
|  | ||||
|     $.ajax({ | ||||
|         url: '/blog/deleteComment', | ||||
|         data: { | ||||
|             ID | ||||
|         }, | ||||
|         method: 'POST', | ||||
|         success: (result) => { | ||||
|             modal.modal('hide'); | ||||
|             console.log(result); | ||||
|             if(result.success) { | ||||
|                 addSnackbar('success', result.message); | ||||
|                 $('#comment-' + ID).slideUp(); | ||||
|  | ||||
|                 let commentCount = $('.comment-count').text(); | ||||
|                 if(commentCount !== '') { | ||||
|                     commentCount = parseInt(commentCount) - 1; | ||||
|                     $('.comment-count').text(commentCount); | ||||
|                 } | ||||
|  | ||||
|                 setTimeout(() => { | ||||
|                     $('#comment-' + ID).remove(); | ||||
|                 }, 500) | ||||
|             } else { | ||||
|                 addSnackbar('danger', result.message); | ||||
|             } | ||||
|         }, | ||||
|         error: console.log | ||||
|     }); | ||||
| } | ||||
| @@ -230,7 +230,7 @@ function closeSearch() { | ||||
| function executeSearch() { | ||||
|     const search = $('.navbar-search input').val().trim(); | ||||
|  | ||||
|     if(search.length < 3) { | ||||
|     if (search.length < 3) { | ||||
|         addSnackbar('warning', 'Bitte gib mindestens 3 Buchstaben als Suchbegriff an.'); | ||||
|         return; | ||||
|     } | ||||
| @@ -456,3 +456,54 @@ function addSnackbar(type, text) { | ||||
|         snackbar.remove(); | ||||
|     }, 5500); | ||||
| } | ||||
|  | ||||
| function openAsyncModal(url, title, data, finished, id, size = 'default') { | ||||
|     const modal = $(` | ||||
|         <div class="modal fade" id="${id}" tabindex="-1" role="dialog"> | ||||
|             <div class="modal-dialog ${size !== 'default' ? 'modal-' + size : ''} modal-dialog-centered" role="document"> | ||||
|                 <div class="modal-content"> | ||||
|                     <div class="modal-header"> | ||||
|                         <h4 class="modal-title">${title}</h4> | ||||
|                         <button type="button" class="close" data-dismiss="modal" aria-label="Schließen"> | ||||
|                             <span>×</span> | ||||
|                         </button> | ||||
|                     </div> | ||||
|                     <div class="modal-body"> | ||||
|                         <div class="loadingSpinner"></div> | ||||
|                     </div> | ||||
|                 </div> | ||||
|             </div> | ||||
|         </div> | ||||
|     `); | ||||
|     $('body').append(modal); | ||||
|     modal.modal('show'); | ||||
|  | ||||
|     $.ajax({ | ||||
|         url, | ||||
|         data, | ||||
|         method: 'POST', | ||||
|         success: (result) => { | ||||
|             console.log(result); | ||||
|             modal.find('.modal-body').empty(); | ||||
|             if(result.success) { | ||||
|                 modal.find('.modal-title').text(result.title); | ||||
|                 modal.find('.modal-body').append(result.body); | ||||
|                 finished(); | ||||
|             } else { | ||||
|                 modal.modal('hide'); | ||||
|                 addSnackbar('danger', result.message); | ||||
|             } | ||||
|         }, | ||||
|         error: (data) => { | ||||
|             console.log(data); | ||||
|             modal.modal('hide'); | ||||
|             addSnackbar('danger', '<b>Ein unbekannter Fehler ist aufgetreten.</b> Versuche, die Seite erneut zu laden, oder kontaktiere das Support-Team sollte der Fehler bestehen bleiben.'); | ||||
|         } | ||||
|     }); | ||||
|  | ||||
|     modal.on('hidden.bs.modal', function() { | ||||
|         $(this).remove(); | ||||
|     }); | ||||
|  | ||||
|     return modal; | ||||
| } | ||||
| @@ -372,10 +372,31 @@ function submitPost(content, replyTo) { | ||||
|             resetPostForm(); | ||||
|         }, | ||||
|         success: function (data) { | ||||
|             console.log(data); | ||||
|             $('.loadingSpinner', body).remove(); | ||||
|             body.append(data); | ||||
|             body.append(` | ||||
|                 <div class="alert alert-${data.success ? 'success' : 'danger'}" role="alert"> | ||||
|                     <b>${data.title}</b> | ||||
|                     ${data.message.join('<br>')} | ||||
|                 </div> | ||||
|             `); | ||||
|             if(data.buttons) { | ||||
|                 const footer = $('<div class="modal-footer"></div>'); | ||||
|                 body.parent().append(footer); | ||||
|                 data.buttons.forEach(button => { | ||||
|                     let btn; | ||||
|                     if(button.action) { | ||||
|                         btn = `<a href="${button.action}" class="btn btn-${button.type}">${button.text}</a>`; | ||||
|                     } else { | ||||
|                         btn = `<button role="button" class="btn btn-${button.type}">${button.text}</button>`; | ||||
|                     } | ||||
|                     footer.append(btn); | ||||
|                 }); | ||||
|             } | ||||
|         }, | ||||
|         error: function (data) { | ||||
|             console.log(data); | ||||
|             addSnackbar('warning', '<b>Ein unbekannter Fehler ist beim Veröffentlichen deines Posts aufgetreten.</b> Bitte versuche es später erneut oder kontaktiere uns.'); | ||||
|         } | ||||
|     }); | ||||
| } | ||||
| @@ -81,7 +81,8 @@ function registerPostEvents() { | ||||
|     $('.post-item').click(function (e) { | ||||
|         const target = e.target; | ||||
|  | ||||
|         if(target.tagName !== 'BUTTON' && target.tagName !== 'INPUT' && target.tagName !== 'A' && target.tagName !== 'IMG' && target.tagName !== 'I' && !target.classList.contains('post-media')) { | ||||
|         const forbiddenElements = ['BUTTON', 'A', 'INPUT', 'IMG', 'I', 'SPAN']; | ||||
|         if(!forbiddenElements.includes(target.tagName) && !target.classList.contains('post-media')) { | ||||
|             e.preventDefault(); | ||||
|             const uuid = $(this).data('uuid'); | ||||
|             const username = $(this).data('username'); | ||||
| @@ -141,16 +142,9 @@ function addPostLike(el) { | ||||
|                 } | ||||
|             } else { | ||||
|                 text.text(likeCount); | ||||
|                 $('body').append(` | ||||
|                     <div class="alert alert-warning snackbar" id="message-uuid-${uuid}" role="alert"> | ||||
|                         ${result.message} | ||||
|                     </div> | ||||
|                 `); | ||||
|                 addSnackbar('warning', result.message); | ||||
|                 icon.toggleClass('far').toggleClass('fas'); | ||||
|                 icon.parent().toggleClass('active'); | ||||
|                 setTimeout(() => { | ||||
|                     $('#message-uuid-' + uuid).remove(); | ||||
|                 }, 6000); | ||||
|             } | ||||
|             pendingRequests.splice(pendingRequests.indexOf(uuid), 1); | ||||
|         }, | ||||
| @@ -215,7 +209,7 @@ function loadPostReportModal(uuid) { | ||||
|                 e.preventDefault(); | ||||
|                 $('#postReportForm').slideUp(); | ||||
|                 setTimeout(() => { | ||||
|                     $('#postReportBody').append('<i class="fa fa-cog fa-4x fa-spin text-center"></i>'); | ||||
|                     $('#postReportBody').addClass('text-center').append('<i class="fa fa-cog fa-4x fa-spin"></i>'); | ||||
|                 }, 200); | ||||
|                 submitReportForm(uuid, $('#postReportReason').val(), $('#postReportText').val()); | ||||
|             }); | ||||
| @@ -225,11 +219,11 @@ function loadPostReportModal(uuid) { | ||||
|     }); | ||||
| } | ||||
|  | ||||
| function submitReportForm(postUuid, reportReason, reportText) { | ||||
| function submitReportForm(hashID, reportReason, reportText) { | ||||
|     $.ajax({ | ||||
|         url: '/posts/reportPost', | ||||
|         data: { | ||||
|             uuid: postUuid, | ||||
|             hashID, | ||||
|             reason: reportReason, | ||||
|             explanation: reportText | ||||
|         }, | ||||
| @@ -253,8 +247,8 @@ function submitReportForm(postUuid, reportReason, reportText) { | ||||
|             setTimeout(() => { | ||||
|                 $('#postReportBody').find('.alert').slideDown(); | ||||
|             }, 1000); | ||||
|         } | ||||
|     }) | ||||
|         }, | ||||
|     }); | ||||
| } | ||||
|  | ||||
| function openDeletePostModal(uuid) { | ||||
| @@ -278,52 +272,52 @@ function openDeletePostModal(uuid) { | ||||
|  | ||||
|     $('#postDeleteModal').modal('show'); | ||||
|     $('#postDeleteModal').on('hidden.bs.modal', function () { | ||||
|        $('#postDeleteModal').remove(); | ||||
|        $(this).remove(); | ||||
|     }); | ||||
|  | ||||
|     loadDeletePostModal(uuid); | ||||
| } | ||||
|  | ||||
| function loadDeletePostModal(uuid) { | ||||
| function loadDeletePostModal(hashID) { | ||||
|     $.ajax({ | ||||
|         url: '/posts/getDeleteModal', | ||||
|         data: { | ||||
|             uuid | ||||
|             hashID | ||||
|         }, | ||||
|         method: 'post', | ||||
|         success: data => { | ||||
|             $('#postReportTitle').text(data.title); | ||||
|             $('#postDeleteBody').removeClass('text-center').html(data.body); | ||||
|         } | ||||
|         }, | ||||
|         error: console.log | ||||
|     }); | ||||
| } | ||||
|  | ||||
| function deletePost(uuid) { | ||||
| function deletePost(hashID) { | ||||
|     $.ajax({ | ||||
|         url: '/posts/deletePost', | ||||
|         method: 'post', | ||||
|         data: { uuid }, | ||||
|         data: { hashID }, | ||||
|         beforeSend: () => { | ||||
|             $('#postDeleteBody').addClass('text-center').html('<i class="fa fa-cog fa-spin fa-4x"></i>'); | ||||
|         }, | ||||
|         success: data => { | ||||
|             let timeout = 2000; | ||||
|             if(data.success) { | ||||
|                 $('#postDeleteBody').html('<div class="alert alert-success" role="alert"></div>'); | ||||
|                 addSnackbar('success', data.message); | ||||
|                 timeout = 0; | ||||
|             } else { | ||||
|                 $('#postDeleteBody').html('<div class="alert alert-danger" role="alert"></div>'); | ||||
|                 $('#postDeleteBody').html(`<div class="alert alert-danger" role="alert">${data.message}</div>`); | ||||
|             } | ||||
|             $('#postDeleteBody').removeClass('text-center').find('.alert').text(data.message); | ||||
|  | ||||
|             setTimeout(() => { | ||||
|                 $('#postDeleteModal').modal('hide'); | ||||
|                 $(`.post-item[data-uuid=${uuid}]`).slideUp(); | ||||
|                 $(`.post-item[data-uuid=${hashID}]`).slideUp(); | ||||
|                 setTimeout(() => { | ||||
|                     $('#postDeleteModal').modal('dispose').remove(); | ||||
|                     $(`.post-item[data-uuid=${uuid}]`).remove(); | ||||
|                     $(`.post-item[data-uuid=${hashID}]`).remove(); | ||||
|                 }, 500); | ||||
|             }, 2000); | ||||
|             }, timeout); | ||||
|         } | ||||
|     }) | ||||
| } | ||||
|  | ||||
| function addScrollListener() { | ||||
| } | ||||
| @@ -6,7 +6,7 @@ $("input").blur(function () { | ||||
|         passwordError = false, | ||||
|         passwordRepeatError = false; | ||||
|     // Username | ||||
|     if ($(this).attr('name') === "username") { | ||||
|     if ($(this).attr('name') === "displayname") { | ||||
|         if ($(this).val().length < 4) { | ||||
|             $('#usernameErrorLength').addClass('active'); | ||||
|             usernameError = true; | ||||
|   | ||||
							
								
								
									
										386
									
								
								vendor/Diff/class.Diff.php
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										386
									
								
								vendor/Diff/class.Diff.php
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,386 @@ | ||||
| <?php | ||||
|  | ||||
| /* | ||||
|  | ||||
| class.Diff.php | ||||
|  | ||||
| A class containing a diff implementation | ||||
|  | ||||
| Created by Kate Morley - http://iamkate.com/ - and released under the terms of | ||||
| the CC0 1.0 Universal legal code: | ||||
|  | ||||
| http://creativecommons.org/publicdomain/zero/1.0/legalcode | ||||
|  | ||||
| */ | ||||
|  | ||||
| // A class containing functions for computing diffs and formatting the output. | ||||
| class Diff{ | ||||
|  | ||||
|   // define the constants | ||||
|   const UNMODIFIED = 0; | ||||
|   const DELETED    = 1; | ||||
|   const INSERTED   = 2; | ||||
|  | ||||
|   /* Returns the diff for two strings. The return value is an array, each of | ||||
|    * whose values is an array containing two values: a line (or character, if | ||||
|    * $compareCharacters is true), and one of the constants DIFF::UNMODIFIED (the | ||||
|    * line or character is in both strings), DIFF::DELETED (the line or character | ||||
|    * is only in the first string), and DIFF::INSERTED (the line or character is | ||||
|    * only in the second string). The parameters are: | ||||
|    * | ||||
|    * $string1           - the first string | ||||
|    * $string2           - the second string | ||||
|    * $compareCharacters - true to compare characters, and false to compare | ||||
|    *                      lines; this optional parameter defaults to false | ||||
|    */ | ||||
|   public static function compare( | ||||
|       $string1, $string2, $compareCharacters = false){ | ||||
|  | ||||
|     // initialise the sequences and comparison start and end positions | ||||
|     $start = 0; | ||||
|     if ($compareCharacters){ | ||||
|       $sequence1 = $string1; | ||||
|       $sequence2 = $string2; | ||||
|       $end1 = strlen($string1) - 1; | ||||
|       $end2 = strlen($string2) - 1; | ||||
|     }else{ | ||||
|       $sequence1 = preg_split('/\R/', $string1); | ||||
|       $sequence2 = preg_split('/\R/', $string2); | ||||
|       $end1 = count($sequence1) - 1; | ||||
|       $end2 = count($sequence2) - 1; | ||||
|     } | ||||
|  | ||||
|     // skip any common prefix | ||||
|     while ($start <= $end1 && $start <= $end2 | ||||
|         && $sequence1[$start] == $sequence2[$start]){ | ||||
|       $start ++; | ||||
|     } | ||||
|  | ||||
|     // skip any common suffix | ||||
|     while ($end1 >= $start && $end2 >= $start | ||||
|         && $sequence1[$end1] == $sequence2[$end2]){ | ||||
|       $end1 --; | ||||
|       $end2 --; | ||||
|     } | ||||
|  | ||||
|     // compute the table of longest common subsequence lengths | ||||
|     $table = self::computeTable($sequence1, $sequence2, $start, $end1, $end2); | ||||
|  | ||||
|     // generate the partial diff | ||||
|     $partialDiff = | ||||
|         self::generatePartialDiff($table, $sequence1, $sequence2, $start); | ||||
|  | ||||
|     // generate the full diff | ||||
|     $diff = array(); | ||||
|     for ($index = 0; $index < $start; $index ++){ | ||||
|       $diff[] = array($sequence1[$index], self::UNMODIFIED); | ||||
|     } | ||||
|     while (count($partialDiff) > 0) $diff[] = array_pop($partialDiff); | ||||
|     for ($index = $end1 + 1; | ||||
|         $index < ($compareCharacters ? strlen($sequence1) : count($sequence1)); | ||||
|         $index ++){ | ||||
|       $diff[] = array($sequence1[$index], self::UNMODIFIED); | ||||
|     } | ||||
|  | ||||
|     // return the diff | ||||
|     return $diff; | ||||
|  | ||||
|   } | ||||
|  | ||||
|   /* Returns the diff for two files. The parameters are: | ||||
|    * | ||||
|    * $file1             - the path to the first file | ||||
|    * $file2             - the path to the second file | ||||
|    * $compareCharacters - true to compare characters, and false to compare | ||||
|    *                      lines; this optional parameter defaults to false | ||||
|    */ | ||||
|   public static function compareFiles( | ||||
|       $file1, $file2, $compareCharacters = false){ | ||||
|  | ||||
|     // return the diff of the files | ||||
|     return self::compare( | ||||
|         file_get_contents($file1), | ||||
|         file_get_contents($file2), | ||||
|         $compareCharacters); | ||||
|  | ||||
|   } | ||||
|  | ||||
|   /* Returns the table of longest common subsequence lengths for the specified | ||||
|    * sequences. The parameters are: | ||||
|    * | ||||
|    * $sequence1 - the first sequence | ||||
|    * $sequence2 - the second sequence | ||||
|    * $start     - the starting index | ||||
|    * $end1      - the ending index for the first sequence | ||||
|    * $end2      - the ending index for the second sequence | ||||
|    */ | ||||
|   private static function computeTable( | ||||
|       $sequence1, $sequence2, $start, $end1, $end2){ | ||||
|  | ||||
|     // determine the lengths to be compared | ||||
|     $length1 = $end1 - $start + 1; | ||||
|     $length2 = $end2 - $start + 1; | ||||
|  | ||||
|     // initialise the table | ||||
|     $table = array(array_fill(0, $length2 + 1, 0)); | ||||
|  | ||||
|     // loop over the rows | ||||
|     for ($index1 = 1; $index1 <= $length1; $index1 ++){ | ||||
|  | ||||
|       // create the new row | ||||
|       $table[$index1] = array(0); | ||||
|  | ||||
|       // loop over the columns | ||||
|       for ($index2 = 1; $index2 <= $length2; $index2 ++){ | ||||
|  | ||||
|         // store the longest common subsequence length | ||||
|         if ($sequence1[$index1 + $start - 1] | ||||
|             == $sequence2[$index2 + $start - 1]){ | ||||
|           $table[$index1][$index2] = $table[$index1 - 1][$index2 - 1] + 1; | ||||
|         }else{ | ||||
|           $table[$index1][$index2] = | ||||
|               max($table[$index1 - 1][$index2], $table[$index1][$index2 - 1]); | ||||
|         } | ||||
|  | ||||
|       } | ||||
|     } | ||||
|  | ||||
|     // return the table | ||||
|     return $table; | ||||
|  | ||||
|   } | ||||
|  | ||||
|   /* Returns the partial diff for the specificed sequences, in reverse order. | ||||
|    * The parameters are: | ||||
|    * | ||||
|    * $table     - the table returned by the computeTable function | ||||
|    * $sequence1 - the first sequence | ||||
|    * $sequence2 - the second sequence | ||||
|    * $start     - the starting index | ||||
|    */ | ||||
|   private static function generatePartialDiff( | ||||
|       $table, $sequence1, $sequence2, $start){ | ||||
|  | ||||
|     //  initialise the diff | ||||
|     $diff = array(); | ||||
|  | ||||
|     // initialise the indices | ||||
|     $index1 = count($table) - 1; | ||||
|     $index2 = count($table[0]) - 1; | ||||
|  | ||||
|     // loop until there are no items remaining in either sequence | ||||
|     while ($index1 > 0 || $index2 > 0){ | ||||
|  | ||||
|       // check what has happened to the items at these indices | ||||
|       if ($index1 > 0 && $index2 > 0 | ||||
|           && $sequence1[$index1 + $start - 1] | ||||
|               == $sequence2[$index2 + $start - 1]){ | ||||
|  | ||||
|         // update the diff and the indices | ||||
|         $diff[] = array($sequence1[$index1 + $start - 1], self::UNMODIFIED); | ||||
|         $index1 --; | ||||
|         $index2 --; | ||||
|  | ||||
|       }elseif ($index2 > 0 | ||||
|           && $table[$index1][$index2] == $table[$index1][$index2 - 1]){ | ||||
|  | ||||
|         // update the diff and the indices | ||||
|         $diff[] = array($sequence2[$index2 + $start - 1], self::INSERTED); | ||||
|         $index2 --; | ||||
|  | ||||
|       }else{ | ||||
|  | ||||
|         // update the diff and the indices | ||||
|         $diff[] = array($sequence1[$index1 + $start - 1], self::DELETED); | ||||
|         $index1 --; | ||||
|  | ||||
|       } | ||||
|  | ||||
|     } | ||||
|  | ||||
|     // return the diff | ||||
|     return $diff; | ||||
|  | ||||
|   } | ||||
|  | ||||
|   /* Returns a diff as a string, where unmodified lines are prefixed by '  ', | ||||
|    * deletions are prefixed by '- ', and insertions are prefixed by '+ '. The | ||||
|    * parameters are: | ||||
|    * | ||||
|    * $diff      - the diff array | ||||
|    * $separator - the separator between lines; this optional parameter defaults | ||||
|    *              to "\n" | ||||
|    */ | ||||
|   public static function toString($diff, $separator = "\n"){ | ||||
|  | ||||
|     // initialise the string | ||||
|     $string = ''; | ||||
|  | ||||
|     // loop over the lines in the diff | ||||
|     foreach ($diff as $line){ | ||||
|  | ||||
|       // extend the string with the line | ||||
|       switch ($line[1]){ | ||||
|         case self::UNMODIFIED : $string .= '  ' . $line[0];break; | ||||
|         case self::DELETED    : $string .= '- ' . $line[0];break; | ||||
|         case self::INSERTED   : $string .= '+ ' . $line[0];break; | ||||
|       } | ||||
|  | ||||
|       // extend the string with the separator | ||||
|       $string .= $separator; | ||||
|  | ||||
|     } | ||||
|  | ||||
|     // return the string | ||||
|     return $string; | ||||
|  | ||||
|   } | ||||
|  | ||||
|   /* Returns a diff as an HTML string, where unmodified lines are contained | ||||
|    * within 'span' elements, deletions are contained within 'del' elements, and | ||||
|    * insertions are contained within 'ins' elements. The parameters are: | ||||
|    * | ||||
|    * $diff      - the diff array | ||||
|    * $separator - the separator between lines; this optional parameter defaults | ||||
|    *              to '<br>' | ||||
|    */ | ||||
|   public static function toHTML($diff, $separator = '<br>'){ | ||||
|  | ||||
|     // initialise the HTML | ||||
|     $html = ''; | ||||
|  | ||||
|     // loop over the lines in the diff | ||||
|     foreach ($diff as $line){ | ||||
|  | ||||
|       // extend the HTML with the line | ||||
|       switch ($line[1]){ | ||||
|         case self::UNMODIFIED : $element = 'span'; break; | ||||
|         case self::DELETED    : $element = 'del';  break; | ||||
|         case self::INSERTED   : $element = 'ins';  break; | ||||
|       } | ||||
|       $html .= | ||||
|           '<' . $element . '>' | ||||
|           . htmlspecialchars($line[0]) | ||||
|           . '</' . $element . '>'; | ||||
|  | ||||
|       // extend the HTML with the separator | ||||
|       $html .= $separator; | ||||
|  | ||||
|     } | ||||
|  | ||||
|     // return the HTML | ||||
|     return $html; | ||||
|  | ||||
|   } | ||||
|  | ||||
|   /* Returns a diff as an HTML table. The parameters are: | ||||
|    * | ||||
|    * $diff        - the diff array | ||||
|    * $indentation - indentation to add to every line of the generated HTML; this | ||||
|    *                optional parameter defaults to '' | ||||
|    * $separator   - the separator between lines; this optional parameter | ||||
|    *                defaults to '<br>' | ||||
|    */ | ||||
|   public static function toTable($diff, $indentation = '', $separator = '<br>'){ | ||||
|  | ||||
|     // initialise the HTML | ||||
|     $html = $indentation . "<table class=\"diff\">\n"; | ||||
|  | ||||
|     // loop over the lines in the diff | ||||
|     $index = 0; | ||||
|     while ($index < count($diff)){ | ||||
|  | ||||
|       // determine the line type | ||||
|       switch ($diff[$index][1]){ | ||||
|  | ||||
|         // display the content on the left and right | ||||
|         case self::UNMODIFIED: | ||||
|           $leftCell = | ||||
|               self::getCellContent( | ||||
|                   $diff, $indentation, $separator, $index, self::UNMODIFIED); | ||||
|           $rightCell = $leftCell; | ||||
|           break; | ||||
|  | ||||
|         // display the deleted on the left and inserted content on the right | ||||
|         case self::DELETED: | ||||
|           $leftCell = | ||||
|               self::getCellContent( | ||||
|                   $diff, $indentation, $separator, $index, self::DELETED); | ||||
|           $rightCell = | ||||
|               self::getCellContent( | ||||
|                   $diff, $indentation, $separator, $index, self::INSERTED); | ||||
|           break; | ||||
|  | ||||
|         // display the inserted content on the right | ||||
|         case self::INSERTED: | ||||
|           $leftCell = ''; | ||||
|           $rightCell = | ||||
|               self::getCellContent( | ||||
|                   $diff, $indentation, $separator, $index, self::INSERTED); | ||||
|           break; | ||||
|  | ||||
|       } | ||||
|  | ||||
|       // extend the HTML with the new row | ||||
|       $html .= | ||||
|           $indentation | ||||
|           . "  <tr>\n" | ||||
|           . $indentation | ||||
|           . '    <td class="diff' | ||||
|           . ($leftCell == $rightCell | ||||
|               ? 'Unmodified' | ||||
|               : ($leftCell == '' ? 'Blank' : 'Deleted')) | ||||
|           . '">' | ||||
|           . $leftCell | ||||
|           . "</td>\n" | ||||
|           . $indentation | ||||
|           . '    <td class="diff' | ||||
|           . ($leftCell == $rightCell | ||||
|               ? 'Unmodified' | ||||
|               : ($rightCell == '' ? 'Blank' : 'Inserted')) | ||||
|           . '">' | ||||
|           . $rightCell | ||||
|           . "</td>\n" | ||||
|           . $indentation | ||||
|           . "  </tr>\n"; | ||||
|  | ||||
|     } | ||||
|  | ||||
|     // return the HTML | ||||
|     return $html . $indentation . "</table>\n"; | ||||
|  | ||||
|   } | ||||
|  | ||||
|   /* Returns the content of the cell, for use in the toTable function. The | ||||
|    * parameters are: | ||||
|    * | ||||
|    * $diff        - the diff array | ||||
|    * $indentation - indentation to add to every line of the generated HTML | ||||
|    * $separator   - the separator between lines | ||||
|    * $index       - the current index, passes by reference | ||||
|    * $type        - the type of line | ||||
|    */ | ||||
|   private static function getCellContent( | ||||
|       $diff, $indentation, $separator, &$index, $type){ | ||||
|  | ||||
|     // initialise the HTML | ||||
|     $html = ''; | ||||
|  | ||||
|     // loop over the matching lines, adding them to the HTML | ||||
|     while ($index < count($diff) && $diff[$index][1] == $type){ | ||||
|       $html .= | ||||
|           '<span>' | ||||
|           . htmlspecialchars($diff[$index][0]) | ||||
|           . '</span>' | ||||
|           . $separator; | ||||
|       $index ++; | ||||
|     } | ||||
|  | ||||
|     // return the HTML | ||||
|     return $html; | ||||
|  | ||||
|   } | ||||
|  | ||||
| } | ||||
|  | ||||
| ?> | ||||
		Reference in New Issue
	
	Block a user