Rename 'config/database.config.php.install' to 'config/database.config.php' and configure your connection"); 35 | } 36 | 37 | /** 38 | * Extract settings from db 39 | */ 40 | $settings = Settings::where('id', '=', 1)->first(); 41 | $settings->base_url = $app->request->getUrl() . $app->request->getScriptName(); 42 | 43 | /** 44 | * Set template directory 45 | */ 46 | $app->config(array( 47 | "templates.path" => TEMPLATEDIR . $settings->template . DS, 48 | )); 49 | 50 | /** 51 | * Add some twig extensions for multilanguage support 52 | */ 53 | $app->view->parserExtensions = array( 54 | new \Slim\Views\TwigExtension(), 55 | new Twig_Extension_StringLoader() 56 | ); 57 | 58 | /** 59 | * Get language 60 | */ 61 | $app->lang = require_once LANGUAGEDIR . $settings->language . ".php"; 62 | 63 | /** 64 | * Markdown support 65 | */ 66 | $app->container->singleton('markdown', function () { 67 | return Parsedown::instance(); 68 | }); 69 | 70 | /** 71 | * Load all libs 72 | */ 73 | foreach (glob(ROOT . 'src' . DS . 'libs' . DS . '*.php') as $filename) { 74 | require_once $filename; 75 | } -------------------------------------------------------------------------------- /src/libs/functions.php: -------------------------------------------------------------------------------- 1 | '.$readmore.''; 27 | } 28 | return $excerpt; 29 | } -------------------------------------------------------------------------------- /src/models/Comments.models.php: -------------------------------------------------------------------------------- 1 | belongsTo('Posts'); 7 | } 8 | } -------------------------------------------------------------------------------- /src/models/Posts.models.php: -------------------------------------------------------------------------------- 1 | hasMany('Comments'); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /src/models/Settings.models.php: -------------------------------------------------------------------------------- 1 | username; 9 | } 10 | 11 | public static function get_id($user) { 12 | $user = Users::where('username', '=', $user)->first(); 13 | return $user->id; 14 | } 15 | } -------------------------------------------------------------------------------- /src/routes/admin.route.php: -------------------------------------------------------------------------------- 1 | group('/admin', function () use ($app, $settings, $isLogged, $authenticate) { 3 | $app->get('/login/', $isLogged($app, $settings), function() use ($app) { 4 | $flash = $app->view()->getData('flash'); 5 | $error = isset($flash['error']) ? $flash['error'] : ''; 6 | 7 | $app->render('login.html', array('error' => $error)); 8 | }); 9 | 10 | $app->post('/login', function() use ($app, $settings) { 11 | $username = $app->request->post('form-username'); 12 | $password = hash('sha512', $app->request->post('form-password')); 13 | $user = Users::whereRaw('username = ? AND password = ?', array($username, $password))->get(); 14 | 15 | if ($user->count() != 0) { 16 | $_SESSION['user'] = $username; 17 | $app->redirect($settings->base_url . '/admin'); 18 | } else { 19 | $app->flash('error', 1); 20 | $app->redirect($settings->base_url . '/admin/login'); 21 | } 22 | }); 23 | 24 | $app->get('/logout/', $authenticate($app, $settings), function() use ($app, $settings) { 25 | unset($_SESSION['user']); 26 | $app->view()->setData('user', null); 27 | $app->redirect($settings->base_url); 28 | }); 29 | 30 | $app->get('/', $authenticate($app, $settings), function() use ($app) { 31 | $posts = Posts::orderBy('creation', 'desc')->get(); 32 | $arr = array(); 33 | foreach ($posts as $post) { 34 | $post['author'] = Users::get_author($post['user_id']); 35 | $post['date'] = date('d-m-Y H:i', $post['creation']); 36 | $post['url'] = $app->request->getUrl() . $app->request->getPath() . 'post/' . $post['id']; 37 | $arr[] = $post; 38 | } 39 | $app->render('a_posts.html', array('posts' => $arr)); 40 | }); 41 | 42 | $app->get('/posts/new/', $authenticate($app, $settings), function() use ($app) { 43 | $flash = $app->view()->getData('flash'); 44 | $error = isset($flash['error']) ? $flash['error'] : ''; 45 | 46 | $app->render('a_post_new.html', array('error' => $error)); 47 | }); 48 | 49 | $app->post('/posts/new', $authenticate($app, $settings), function() use ($app, $settings) { 50 | $title = $app->request->post('title'); 51 | $text = $app->request->post('markdown'); 52 | $redirect = $app->request->post('redirect'); 53 | 54 | if ($title == "") { 55 | $app->flash('error', 1); 56 | $app->redirect($settings->base_url . '/admin/posts/new'); 57 | } 58 | if ($text == "") { 59 | $app->flash('error', 2); 60 | $app->redirect($settings->base_url . '/admin/posts/new'); 61 | } 62 | 63 | $date = time(); 64 | $author = Users::get_id($_SESSION['user']); 65 | 66 | Posts::insert(array('title' => $title, 'creation' => $date, 'text' => $text, 'user_id' => $author)); 67 | $app->render('success.html', array('redirect' => $redirect)); 68 | }); 69 | 70 | $app->post('/markdown/ajax', $authenticate($app, $settings), function() use ($app) { 71 | if ($app->request->post('markdown') !== null) { 72 | echo $app->markdown->parse($app->request->post('markdown')); 73 | } 74 | }); 75 | 76 | $app->get('/posts/edit/:id', $authenticate($app, $settings), function($id) use ($app) { 77 | $post = Posts::where('id', '=', $id)->first(); 78 | 79 | if($post){ 80 | $title = $post->title; 81 | $text = $post->text; 82 | $postId = $id; 83 | 84 | $flash = $app->view()->getData('flash'); 85 | $error = isset($flash['error']) ? $flash['error'] : ''; 86 | 87 | $app->render('a_post_edit.html', array('id' => $postId, 'title' => $title, 'text' => $text, 'error' => $error)); 88 | } 89 | else{ 90 | $app->render('404_post.html'); 91 | } 92 | })->conditions(array('id' => '\d+')); 93 | 94 | $app->post('/posts/edit/:id', $authenticate($app, $settings), function($id) use ($app, $settings) { 95 | $title = $app->request->post('title'); 96 | $text = $app->request->post('markdown'); 97 | 98 | $post = Posts::where('id', '=', $id)->first(); 99 | 100 | if($post){ 101 | if ($title == "") { 102 | $app->flash('error', 1); 103 | $app->redirect($settings->base_url . '/admin/posts/edit/' . $id); 104 | } 105 | if ($text == "") { 106 | $app->flash('error', 2); 107 | $app->redirect($settings->base_url . '/admin/posts/edit/' . $id); 108 | } 109 | 110 | $redirect = $settings->base_url . '/admin'; 111 | 112 | $post->update(array('title' => $title, 'text' => $text)); 113 | $app->render('success.html', array('redirect' => $redirect)); 114 | } 115 | else { 116 | $app->render('404_post.html'); 117 | } 118 | })->conditions(array('id' => '\d+')); 119 | 120 | $app->get('/posts/delete/:id', $authenticate($app, $settings), function($id) use ($app) { 121 | $post = Posts::where('id', '=', $id)->first(); 122 | 123 | if($post){ 124 | $app->render('a_post_delete.html', array('post_id' => $id)); 125 | } 126 | else { 127 | $app->render('404_post.html'); 128 | } 129 | 130 | })->conditions(array('id' => '\d+')); 131 | 132 | $app->delete('/posts/delete/:id', $authenticate($app, $settings), function($id) use ($app, $settings) { 133 | $post = Posts::where('id', '=', $id)->first(); 134 | 135 | if($post){ 136 | Posts::destroy($id); 137 | $redirect = $settings->base_url . '/admin'; 138 | $app->render('success.html', array('redirect' => $redirect)); 139 | } 140 | else { 141 | $app->render('404_post.html'); 142 | } 143 | })->conditions(array('id' => '\d+')); 144 | 145 | $app->get('/settings/', $authenticate($app, $settings), function() use ($app) { 146 | $flash = $app->view()->getData('flash'); 147 | $error = isset($flash['error']) ? $flash['error'] : ''; 148 | 149 | $paths = glob(TEMPLATEDIR . '*' , GLOB_ONLYDIR); 150 | $dirs = array(); 151 | foreach($paths as $path) { 152 | $a = explode(DS, $path); 153 | $dirs[] = end($a); 154 | } 155 | 156 | $l = glob(LANGUAGEDIR . '*.php'); 157 | $langs = array(); 158 | foreach($l as $lang) { 159 | $a = explode('.', $lang); 160 | $b = explode(DS, $a[0]); 161 | $langs[] = end($b); 162 | } 163 | 164 | $app->render('a_settings.html', array('error' => $error, 'dirs' => $dirs, 'langs' => $langs)); 165 | }); 166 | 167 | $app->post('/settings/update', function() use ($app, $settings) { 168 | $title = $app->request->post('title'); 169 | $post_per_page = (int)$app->request->post('post_per_page'); 170 | $template = $app->request->post('template'); 171 | $truncate = $app->request->post('truncate') == 'on' ? 'true' : 'false'; 172 | $language = $app->request->post('language'); 173 | 174 | if($title == "") { 175 | $app->flash('error', 1); 176 | $app->redirect($settings->base_url . '/admin/settings'); 177 | } 178 | if($post_per_page == '') { 179 | $app->flash('error', 2); 180 | $app->redirect($settings->base_url . '/admin/settings'); 181 | } 182 | if($template == '') { 183 | $app->flash('error', 3); 184 | $app->redirect($settings->base_url . '/admin/settings'); 185 | } 186 | if($language == '') { 187 | $app->flash('error', 4); 188 | $app->redirect($settings->base_url . '/admin/settings'); 189 | } 190 | 191 | $redirect = $settings->base_url . '/admin/settings'; 192 | 193 | Settings::where('id', '=', 1)->update(array('title' => $title, 'template' => $template, 'post_per_page' => $post_per_page, 'truncate' => $truncate, 'language' => $language)); 194 | $app->render('success.html', array('redirect' => $redirect)); 195 | }); 196 | 197 | $app->get('/users/', $authenticate($app, $settings), function() use ($app) { 198 | $users = Users::orderBy('created_at', 'asc')->get(); 199 | $app->render('a_users.html', array('users' => $users)); 200 | }); 201 | 202 | $app->get('/users/edit/:id', $authenticate($app, $settings), function($id) use ($app) { 203 | $flash = $app->view()->getData('flash'); 204 | $error = isset($flash['error']) ? $flash['error'] : ''; 205 | 206 | $u = Users::where('id', '=', $id)->first(); 207 | $app->render('a_user_edit.html', array('u' => $u, 'error' => $error)); 208 | })->conditions(array('id' => '\d+')); 209 | 210 | $app->post('/users/edit/:id', $authenticate($app, $settings), function($id) use ($app, $settings) { 211 | $username = $app->request->post('username'); 212 | $pass = $app->request->post('password'); 213 | $password = hash('sha512', $pass ); 214 | $email = $app->request->post('email'); 215 | 216 | if($username == "") { 217 | $app->flash('error', 1); 218 | $app->redirect($settings->base_url . '/admin/users/new'); 219 | } 220 | if($email == "" OR !filter_var($email, FILTER_VALIDATE_EMAIL)) { 221 | $app->flash('error', 2); 222 | $app->redirect($settings->base_url . '/admin/users/new'); 223 | } 224 | 225 | $redirect = $settings->base_url . '/admin/users'; 226 | 227 | if( !empty($pass) ) { 228 | Users::where('id', '=', $id)->update(array('username' => $username, 'password' => $password, 'email' => $email)); 229 | } else { 230 | Users::where('id', '=', $id)->update(array('username' => $username, 'email' => $email)); 231 | } 232 | 233 | $app->render('success.html', array('redirect' => $redirect)); 234 | })->conditions(array('id' => '\d+')); 235 | 236 | $app->get('/users/delete/:id', $authenticate($app, $settings), function($id) use ($app) { 237 | $app->render('a_user_delete.html', array('user_id' => $id)); 238 | })->conditions(array('id' => '\d+')); 239 | 240 | $app->delete('/users/delete/:id', $authenticate($app, $settings), function($id) use ($app, $settings) { 241 | Users::destroy($id); 242 | $redirect = $settings->base_url . '/admin/users'; 243 | $app->render('success.html', array('redirect' => $redirect)); 244 | })->conditions(array('id' => '\d+')); 245 | 246 | $app->get('/users/new/', $authenticate($app, $settings), function() use ($app) { 247 | $flash = $app->view()->getData('flash'); 248 | $error = isset($flash['error']) ? $flash['error'] : ''; 249 | 250 | $app->render('a_user_new.html', array('error' => $error)); 251 | }); 252 | 253 | $app->post('/users/new', $authenticate($app, $settings), function() use ($app, $settings) { 254 | $username = $app->request->post('username'); 255 | $password = hash('sha512', $app->request->post('password')); 256 | $email = $app->request->post('email'); 257 | $created_at = date('Y-m-d H:i:s'); 258 | 259 | if($username == "") { 260 | $app->flash('error', 1); 261 | $app->redirect($settings->base_url . '/admin/users/new'); 262 | } 263 | if($password == "") { 264 | $app->flash('error', 2); 265 | $app->redirect($settings->base_url . '/admin/users/new'); 266 | } 267 | if($email == "" OR !filter_var($email, FILTER_VALIDATE_EMAIL)) { 268 | $app->flash('error', 3); 269 | $app->redirect($settings->base_url . '/admin/users/new'); 270 | } 271 | 272 | $redirect = $settings->base_url . '/admin/users'; 273 | 274 | Users::insert(array('username' => $username, 'password' => $password, 'email' => $email, 'created_at' => $created_at)); 275 | $app->render('success.html', array('redirect' => $redirect)); 276 | }); 277 | 278 | $app->get('/posts/activate/:id', $authenticate($app, $settings), function($id) use ($app, $settings) { 279 | $post = Posts::where('id', '=', $id)->first(); 280 | 281 | if($post){ 282 | $redirect = $settings->base_url . '/admin'; 283 | 284 | $post->update(array('active' => 'true')); 285 | $app->render('success.html', array('redirect' => $redirect)); 286 | } 287 | else { 288 | $app->render('404_post.html'); 289 | } 290 | })->conditions(array('id' => '\d+')); 291 | 292 | $app->get('/posts/deactivate/:id', $authenticate($app, $settings), function($id) use ($app, $settings) { 293 | $post = Posts::where('id', '=', $id)->first(); 294 | 295 | if($post){ 296 | $redirect = $settings->base_url . '/admin'; 297 | 298 | $post->update(array('active' => 'false')); 299 | $app->render('success.html', array('redirect' => $redirect)); 300 | } 301 | else { 302 | $app->render('404_post.html'); 303 | } 304 | })->conditions(array('id' => '\d+')); 305 | }); 306 | -------------------------------------------------------------------------------- /src/routes/base.route.php: -------------------------------------------------------------------------------- 1 | get('/(:page)', function($page = 1) use ($app, $settings) { 3 | $p = Posts::count(); 4 | $pages = ceil($p / $settings->post_per_page); 5 | if ($page > $pages) $app->pass(); 6 | 7 | $posts = Posts::orderBy('creation', 'desc')->skip($settings->post_per_page * ($page - 1))->take($settings->post_per_page)->get(); 8 | $arr = array(); //Posts 9 | foreach ($posts as $post) { 10 | if ($post['active'] == 'true') { 11 | $post['author'] = Users::get_author($post['user_id']); 12 | $post['date'] = date('d-m-Y H:i', $post['creation']); 13 | $post['url'] = $app->request->getUrl() . $app->request->getPath() . 'post/' . $post['id']; 14 | 15 | if ($settings->truncate == 'true') { 16 | $text = truncate_to_n_words($post['text'], 70, $post['url']); 17 | $post['text'] = $app->markdown->parse($text); 18 | } else { 19 | $post['text'] = $app->markdown->parse($post['text']); 20 | } 21 | 22 | $post['count'] = Posts::find($post['id'])->comments->count(); 23 | $arr[] = $post; 24 | } 25 | } 26 | 27 | 28 | $app->render('posts.html', array('posts' => $arr, 'pages' => $pages, 'page' => $page)); 29 | })->conditions(array('page' => '\d+')); -------------------------------------------------------------------------------- /src/routes/post.route.php: -------------------------------------------------------------------------------- 1 | get('/post/:id', function($id) use ($app) { 3 | if ($post = Posts::find($id)) { 4 | $flash = $app->view()->getData('flash'); 5 | $error = isset($flash['error']) ? $flash['error'] : ''; 6 | 7 | $post->author = Users::get_author($post->user_id); 8 | $post->date = date('d-m-Y H:i', $post->creation); 9 | $post->text = $app->markdown->parse($post->text); 10 | $post->count = Posts::find($post->id)->comments->count(); 11 | 12 | $comments = Posts::find($post->id)->comments; 13 | 14 | $redirect = $app->request->getUrl() . $app->request->getPath(); 15 | 16 | $app->render('post.html', array('post' => $post, 'error' => $error, 'comments' => $comments, 'redirect' => $redirect)); 17 | } 18 | else { 19 | $app->render('404_post.html'); 20 | } 21 | })->conditions(array('page' => '\d+')); 22 | 23 | $app->post('/post/comment/new', function() use($app, $settings) { 24 | $username = $app->request->post('username'); 25 | $url = filter_var($app->request->post('url'), FILTER_SANITIZE_URL); 26 | $email = $app->request->post('email'); 27 | $text = filter_var($app->request->post('text'), FILTER_SANITIZE_STRING); 28 | $post_id = $app->request->post('post_id'); 29 | $redirect = $app->request->post('redirect'); 30 | 31 | if($username == "") { 32 | $app->flash('error', 1); 33 | $app->redirect($settings->base_url . '/post/' . $post_id); 34 | } 35 | if($url == "") { 36 | $app->flash('error', 2); 37 | $app->redirect($settings->base_url . '/post/' . $post_id); 38 | } 39 | if($email == "" OR !filter_var($email, FILTER_VALIDATE_EMAIL)) { 40 | $app->flash('error', 3); 41 | $app->redirect($settings->base_url . '/post/' . $post_id); 42 | } 43 | if($text == "") { 44 | $app->flash('error', 4); 45 | $app->redirect($settings->base_url . '/post/' . $post_id); 46 | } 47 | 48 | Comments::insert(array('username' => $username, 'url' => $url, 'email' => $email, 'text' => $text, 'posts_id' => $post_id)); 49 | $app->render('success.html', array('redirect' => $redirect)); 50 | }); -------------------------------------------------------------------------------- /templates/default/404.html: -------------------------------------------------------------------------------- 1 | {% extends "base.html" %} 2 | 3 | {% block content %} 4 |
8 | | {{ include(template_from_string(lang.title)) }} | 9 |{{ include(template_from_string(lang.state)) }} | 10 |{{ include(template_from_string(lang.author)) }} | 11 |{{ include(template_from_string(lang.date)) }} | 12 |{{ include(template_from_string(lang.action)) }} | 13 |
---|---|---|---|---|---|
{{loop.index}} | 19 |{{post.title}} | 20 |21 | {% if post.active is sameas("true") %} 22 | {{ include(template_from_string(lang.activate)) }}/{{ include(template_from_string(lang.deactivate)) }} 23 | {% else %} 24 | {{ include(template_from_string(lang.activate)) }}/{{ include(template_from_string(lang.deactivate)) }} 25 | {% endif %} 26 | | 27 |{{post.author}} | 28 |{{post.date}} | 29 |{{ include(template_from_string(lang.edit)) }} | {{ include(template_from_string(lang.delete)) }} | 30 |
8 | | {{ include(template_from_string(lang.username)) }} | 9 |{{ include(template_from_string(lang.createdat)) }} | 10 |{{ include(template_from_string(lang.action)) }} | 11 |
---|---|---|---|
{{loop.index}} | 17 |{{user.username}} | 18 |{{user.created_at}} | 19 |{{ include(template_from_string(lang.edit)) }} | {{ include(template_from_string(lang.delete)) }} | 20 |