post.php 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382
  1. <?php
  2. session_start();
  3. $http_host = $_SERVER["HTTP_HOST"];
  4. $doc_root = $_SERVER["DOCUMENT_ROOT"] . "/";
  5. include $doc_root . "functions.php";
  6. $proto = get_protocol();
  7. $con = start_db();
  8. $server = $proto . $http_host;
  9. $lang = select_language($con);
  10. $lserver = $server . "/" . $lang;
  11. // Get post data
  12. $permalink = mysqli_real_escape_string($con, $_GET["permalink"]);
  13. $q_post = mysqli_query($con, "SELECT * FROM post WHERE permalink = '$permalink' AND visible = 1;");
  14. if (mysqli_num_rows($q_post) == 0){
  15. header("Location: $lserver/blog/");
  16. exit(-1);
  17. }
  18. $r_post = mysqli_fetch_array($q_post);
  19. $id = $r_post["id"];
  20. $title = text($con, $r_post["title"], $lang);
  21. $text = text($con, $r_post["text"], $lang);
  22. $cur_section = "blog";
  23. $cur_entry = $id;
  24. // First image (if any)
  25. $image = "";
  26. $q_image = mysqli_query($con, "SELECT image FROM post_image WHERE post = $id ORDER BY idx LIMIT 1");
  27. if (mysqli_num_rows($q_image) > 0){
  28. $image = mysqli_fetch_array($q_image)["image"];
  29. }
  30. ?>
  31. <!DOCTYPE html>
  32. <html>
  33. <head>
  34. <meta content='text/html; charset=utf-8' http-equiv='content-type'/>
  35. <meta charset='utf-8'/>
  36. <meta name='viewport' content='width=device-width, initial-scale=1, maximum-scale=1, minimum-scale=1'/>
  37. <title><?=$title?> - <?=text($con, "USER_NAME", $lang);?></title>
  38. <link rel='shortcut icon' href='<?=$lserver?>/img/logo/favicon.ico'/>
  39. <!-- CSS files -->
  40. <style>
  41. <?php
  42. include $doc_root . "css/ui.css";
  43. include $doc_root . "css/blog.css";
  44. ?>
  45. </style>
  46. <!-- CSS for mobile version -->
  47. <style media='(max-width : 990px)'>
  48. <?php
  49. include $doc_root . "css/m/ui.css";
  50. include $doc_root . "css/m/blog.css";
  51. ?>
  52. </style>
  53. <!-- Script files -->
  54. <script type='text/javascript'>
  55. <?php
  56. include $doc_root . "script/ui.js";
  57. include $doc_root . "script/blog.js";
  58. ?>
  59. </script>
  60. <!-- Meta tags -->
  61. <link rel='canonical' href='<?=$lserver?>/blog/<?=$permalink?>'/>
  62. <link rel='author' href='<?=$lserver?>'/>
  63. <link rel='publisher' href='<?=$lserver?>'/>
  64. <meta name='description' content='<?=$text?>'/>
  65. <meta property='og:title' content='<?=$title?> - <?=text($con, "USER_NAME", $lang);?>'/>
  66. <meta property='og:url' content='<?=$lserver?>/blog/<?=$permalink?>'/>
  67. <meta property='og:description' content='<?=$text?>'/>
  68. <?php
  69. if (strlen($image) == 0){
  70. ?>
  71. <meta property="og:image" content="<?=$lserver?>/img/logo/x3/favicon.ico"/>
  72. <?php
  73. }
  74. else{
  75. ?>
  76. <meta property="og:image" content="<?=$lserver?>/img/blog/x3/<?=$image?>"/>
  77. <?php
  78. }
  79. ?>
  80. <meta property='og:site_name' content='<?=text($con, "USER_NAME", $lang);?>'/>
  81. <meta property='og:type' content='website'/>
  82. <meta property='og:locale' content='<?=$lang?>'/>
  83. <meta name='twitter:card' content='summary'/>
  84. <meta name='twitter:title' content='<?=$title?> - <?=text($con, "USER_NAME", $lang);?>'/>
  85. <meta name='twitter:description' content='<?=$text?>'/>
  86. <?php
  87. if (strlen($image) == 0){
  88. ?>
  89. <meta property="twitter:image" content="<?=$lserver?>/img/logo/x3/favicon.ico"/>
  90. <?php
  91. }
  92. else{
  93. ?>
  94. <meta property="twitter:image" content="<?=$lserver?>/img/blog/x3/<?=$image?>"/>
  95. <?php
  96. }
  97. ?> <meta name='twitter:url' content='<?=$lserver?>/blog/<?=$permalink?>'/>
  98. <meta name='robots' content='index follow'/>
  99. </head>
  100. <body>
  101. <?php
  102. include $doc_root . "header.php";
  103. ?>
  104. <div id='content'>
  105. <div id='content_row'>
  106. <div id='content_cell_post' class='content_cell'>
  107. <div class='section' id='post'>
  108. <h3 class='section_title'><?=$title?></h3>
  109. <div class='entry'>
  110. <?php
  111. if (strlen($image) > 0){
  112. ?>
  113. <img id='post_main_image' src='<?=$lserver?>/img/blog/x6/<?=$image?>' alt='<?=$title?>' title='<?=$title?>' />
  114. <?php
  115. }
  116. ?>
  117. <?=$text?>
  118. <?php
  119. $q_image = mysqli_query($con, "SELECT image FROM post_image WHERE post = $id ORDER BY idx OFFSET 1");
  120. if (mysqli_num_rows($q_image) > 0){
  121. ?>
  122. <div id='image_reel'>
  123. <?php
  124. while ($r_image = mysqli_fetch_array($q_image)){
  125. ?>
  126. <img src='<?=$lserver?>/img/blog/x6/<?=$r_image["image"]?>' alt='<?=$title?>' title='<?=$title?>' />
  127. <?php
  128. }
  129. ?>
  130. </div> <!-- #image_reel -->
  131. <?php
  132. }
  133. ?>
  134. <hr/>
  135. <?php
  136. #Comments
  137. if ($r_post["comments"] == 1){
  138. $q_comment = mysqli_query($con, "SELECT id, post, DATE_FORMAT(dtime, '%Y-%m-%dT%T') AS cdate, DATE_FORMAT(dtime,'%b %d, %Y - %H:%i') AS dtime, user, username, text FROM post_comment WHERE post = $id;");
  139. $count = mysqli_num_rows($q_comment);
  140. if ($count == 1){
  141. ?>
  142. <span class='comment_counter'>1 <?=text($con, "BLOG_COMMENTS_1", $lang)?></span>
  143. <?php
  144. }
  145. else if ($count == 0){
  146. ?>
  147. <span class='comment_counter'><?=text($con, "BLOG_COMMENTS_0", $lang)?></span>
  148. <?php
  149. }
  150. else{
  151. ?>
  152. <span class='comment_counter'><?=$count?> <?=text($con, "BLOG_COMMENTS_X", $lang)?></span>
  153. <?php
  154. }
  155. while ($r_comment = mysqli_fetch_array($q_comment)){
  156. $user = $r_comment["username"];
  157. $user_string = $user;
  158. if (strlen($user) == 0){
  159. $user = mysqli_fetch_array(mysqli_query($con, "SELECT concat(fname, concat(' ', lname)) AS name FROM user WHERE id = $r_comment[user];"))["name"];
  160. $user_string = "<span class='comment_user_registered'>$user</span>";
  161. }
  162. ?>
  163. <div itemprop='comment' itemscope itemtype='http://schema.org/UserComments' id='comment_<?=$r_comment["id"]?>' class='comment'>
  164. <h4 class='comment_user'><?=$user_string?></h4>
  165. <meta itemprop='creator' content='<?=$user?>'>
  166. <span class='comment_date date'>
  167. <time itemprop='commentTime' datetime='<?=$r_comment["cdate"]?>'>
  168. <?=$r_comment["dtime"]?>
  169. </span>
  170. <p itemprop='commentText' class='comment_text'><?=$r_comment["text"]?></p>
  171. </div>
  172. <?php
  173. }
  174. //Comment form
  175. ?>
  176. <div class='comment' id='comment_new'>
  177. <textarea id='new_comment_text' name='text' maxlength='1800' onfocus='showCommentIdentification();' placeholder='<?=text($con, "BLOG_COMMENTS_YOUR", $lang)?>'></textarea>
  178. <div id='identification_form'>
  179. <br/>
  180. <input id='new_comment_user' name='user' maxlength='50' type='text' placeholder='<?text($con, "COMMENT_YOUR_NAME", $lang)?>'/>
  181. <input type='button' value='<?text($con, "COMMENT_PUBLISH", $lang)?>'/>
  182. </div>
  183. </div>
  184. <?php
  185. }
  186. else{
  187. ?>
  188. <h4><?text($con, "COMMENT_CLOSED_POST", $lang)?></h4>
  189. <?php
  190. }
  191. ?>
  192. </div> <!-- .entry -->
  193. </div> <!-- .section -->
  194. </div> <!-- .content_cell -->
  195. <div id='content_cell_info' class='content_cell'>
  196. <div class='section' id='info'>
  197. <h3 class='section_title'><?=text($con, "BLOG_DETAILS", $lang)?></h3>
  198. <div id="info_date" class='entry'>
  199. <span class='date'><?=format_date($r_post["dtime"], $lang)?></span>
  200. </div>
  201. <hr/>
  202. <div id="info_share" class='entry'>
  203. <h4><?=text($con, "BLOG_SHARE", $lang)?></h4>
  204. <div id='social'>
  205. <?php
  206. $q_share = mysqli_query($con, "SELECT id FROM share WHERE visible = 1 ORDER BY idx;");
  207. while ($r_share = mysqli_fetch_array($q_share)){
  208. ?>
  209. <?=share_link($con, $r_share["id"], $lserver, "$server/blog/$permalink", $lang)?>
  210. <?php
  211. }
  212. ?>
  213. </div> <!-- #social -->
  214. </div> <!-- #info_share -->
  215. <hr/>
  216. <?php
  217. $q_tag = mysqli_query($con, "SELECT tag FROM post_tag WHERE post = $id;");
  218. if (mysqli_num_rows($q_tag) > 0){
  219. ?>
  220. <div id="info_tags" class='entry'>
  221. <?php
  222. $tag_string = "<span id='tags'>" . text($con, "BLOG_TAGS", $lang) . ": ";
  223. $tag_raw = "";
  224. while ($r_tag = mysqli_fetch_array($q_tag)){
  225. $tag_string = $tag_string . "<a href='$lserver/blog/search/tag/$r_tag[tag]'>$r_tag[tag]</a>, ";
  226. $tag_raw = $tag_raw . "$r_tag[tag],";
  227. }
  228. $tag_string = substr($tag_string, 0, strlen($tag_string) - 2);
  229. $tag_string = $tag_string . "</span>";
  230. $tag_raw = substr($tag_raw, 0, strlen($tag_raw) - 1);
  231. ?>
  232. <span class='tags'><?=$tag_string?></span>
  233. <meta itemprop='keywords' content='<?=$tag_raw?>'/>
  234. </div> <!-- #info_tags -->
  235. <hr/>
  236. <?php
  237. } // if (mysqli_num_rows($q_tag) > 0)
  238. ?>
  239. <?php
  240. // Previous / next
  241. $q_prev = mysqli_query($con, "SELECT id, permalink, title FROM post WHERE id <> $id AND dtime <= '$r_post[dtime]' ORDER BY dtime DESC LIMIT 1;");
  242. $q_next = mysqli_query($con, "SELECT id, permalink, title FROM post WHERE id <> $id AND dtime >= '$r_post[dtime]' ORDER BY dtime LIMIT 1;");
  243. if (mysqli_num_rows($q_prev) > 0 || mysqli_num_rows($q_next) > 0){
  244. ?>
  245. <div id='info_prev_next' class='entry'>
  246. <table id='prev_next'>
  247. <tr>
  248. <td id='prev'>
  249. <?php
  250. if (mysqli_num_rows($q_prev) > 0){
  251. $r_prev = mysqli_fetch_array($q_prev);
  252. ?>
  253. <a href='<?=$lserver?>/blog/<?=$r_prev["permalink"]?>'>
  254. <span class='info'>Previous post:</span>
  255. <br/>
  256. <span class='title'><?=text($con, $r_prev["title"], $lang)?></span>
  257. </a>
  258. <?php
  259. }
  260. ?>
  261. </td>
  262. <td id='next'>
  263. <?php
  264. if (mysqli_num_rows($q_next) > 0){
  265. $r_next = mysqli_fetch_array($q_next);
  266. ?>
  267. <a href='<?=$lserver?>/blog/<?=$r_next["permalink"]?>'>
  268. <span class='info'>Next post:</span>
  269. <br/>
  270. <span class='title'><?=text($con, $r_next["title"], $lang)?></span>
  271. </a>
  272. <?php
  273. }
  274. ?>
  275. </td>
  276. </tr>
  277. </table>
  278. </div> <!-- #info_prev_next -->
  279. <hr/>
  280. <?php
  281. } // if (mysqli_num_rows($q_prev) > 0 || mysqli_num_rows($q_next) > 0)
  282. ?>
  283. <div id='info_related' class='entry'>
  284. <h4><?=text($con, "BLOG_RELATED", $lang)?></h4>
  285. <ul>
  286. <?php
  287. // TODO: Truly select related
  288. $q_related = mysqli_query($con, "SELECT permalink, title FROM post WHERE id <> $id ORDER BY rand() LIMIT 3;");
  289. while($r_related = mysqli_fetch_array($q_related)){
  290. ?>
  291. <li>
  292. <a href='<?=$lserver?>/blog/<?=$r_related["permalink"]?>'><?=text($con, $r_related["title"], $lang)?></a>
  293. </li>
  294. <?php
  295. }
  296. ?>
  297. </ul>
  298. </div>
  299. <hr/>
  300. <div id='info_search' class='entry'>
  301. <h4><?=text($con, "BLOG_SEARCH", $lang)?></h4>
  302. <div id='search_panel_inputs'>
  303. <form action='#' onSubmit='event.preventDefault();launchSearch("<?=$lng["search_field_all"]?>");'>
  304. <input id='search_panel_input' class='search_element' type='text' name='query' placeholder='<?=text($con, "BLOG_SEARCH", $lang)?>'/>
  305. <input id='search_panel_submit' class='search_element' type='submit' value='<?=text($con, "BLOG_SEARCH", $lang)?>'/>
  306. </form>
  307. </div>
  308. </div> <!-- #info_search -->
  309. <hr/>
  310. <div id='info_tag_cloud' class='entry'>
  311. <h4><?=text($con, "BLOG_TAG_CLOUD", $lang)?></h4>
  312. <div id='cloud'>
  313. <?php
  314. //Get the most used tag
  315. $q_max = mysqli_query($con, "SELECT max(count) AS max FROM (SELECT count(post) AS count FROM post_tag GROUP BY tag) AS t;");
  316. $r_max = mysqli_fetch_array($q_max);
  317. $max = $r_max["max"];
  318. $q_tag = mysqli_query($con, "SELECT tag, count(post) AS count FROM post_tag GROUP BY tag;");
  319. while($r_tag = mysqli_fetch_array($q_tag)){
  320. $size = round(60 + 100 * $r_tag['count'] / $max);
  321. ?>
  322. <a href='<?=$lserver?>/blog/search/tag/<?=$r_tag["tag"]?>'>
  323. <span style='font-size: <?=$size?>%'><?=text($con, $r_tag["tag"], $lang)?></span>
  324. </a>
  325. <?php
  326. }
  327. ?>
  328. </div>
  329. </div> <!-- #info_tag_cloud -->
  330. <hr/>
  331. <div id='info_all' class='entry'>
  332. <h4><?=text($con, "BLOG_ARCHIVE", $lang)?></h4>
  333. <?php
  334. $q_year = mysqli_query($con, "SELECT year(dtime) AS year FROM post WHERE visible = 1 GROUP BY year(dtime) ORDER BY year DESC;");
  335. while($r_year = mysqli_fetch_array($q_year)){
  336. ?>
  337. <div class='year pointer' onClick='toggleElement("year_<?=$r_year["year"]?>");'>
  338. <img class='slider' id='slid_year_<?=$r_year["year"]?>' src='<?=$server?>/img/misc/slid-right.png' alt='<?=$r_year["year"]?>'/>
  339. <span class='fake_a'><?=$r_year["year"]?></span>
  340. </div>
  341. <div class='list_year pointer' id='list_year_<?=$r_year["year"]?>'>
  342. <?php
  343. $q_month = mysqli_query($con, "SELECT month(dtime) AS month FROM post WHERE visible = 1 AND year(dtime) = $r_year[year] GROUP BY month(dtime) ORDER BY month DESC;");
  344. while($r_month = mysqli_fetch_array($q_month)){
  345. ?>
  346. <div class='month pointer' onClick='toggleElement("month_<?=$r_year["year"]?>_<?=$r_month["month"]?>");'>
  347. <img class='slider' id='slid_month_<?=$r_year["year"]?>_<?=$r_month["month"]?>' src='<?=$server?>/img/misc/slid-right.png' alt='<?=$r_month["month"]?>'/>
  348. <span class='fake_a'><?=ucfirst(text($con, "MONTH_" . str_pad($r_month["month"], 2, "0", STR_PAD_LEFT), $lang))?></span>
  349. </div>
  350. <ul id='list_month_<?=$r_year["year"]?>_<?=$r_month["month"]?>' class='post_list'>
  351. <?php
  352. $q_title = mysqli_query($con, "SELECT id, permalink, title FROM post WHERE visible = 1 AND year(dtime) = $r_year[year] AND month(dtime) = '$r_month[month]' ORDER BY dtime DESC;");
  353. while($r_title = mysqli_fetch_array($q_title)){
  354. ?>
  355. <li>
  356. <a href='<?=$lserver?>/blog/<?=$r_title["permalink"]?>'><?=text($con, $r_title["title"], $lang)?></a>
  357. </li>
  358. <?php
  359. }
  360. ?>
  361. </ul>
  362. <?php
  363. }
  364. ?>
  365. </div> <!-- #list_year_<?=$r_year["year"]?> -->
  366. <?php
  367. } //while($r_year = mysqli_fetch_array($q_year))
  368. ?>
  369. </div> <!-- #info_all -->
  370. </div> <!-- #info -->
  371. </div> <!-- .content-cell -->
  372. </div> <!-- #content-row -->
  373. </div> <!-- #content -->
  374. <?php
  375. include $doc_root . "footer.php";
  376. stats($con, $cur_section, $cur_entry);
  377. ?>
  378. </body>
  379. </html>