Начат запил страницы отображающей пост
This commit is contained in:
parent
62b7b68976
commit
e538a76b09
@ -186,7 +186,7 @@ function Post_Create (
|
|||||||
if ($s->execute() === false)
|
if ($s->execute() === false)
|
||||||
return new ReturnT(err_code: E_DBE_INSERTFAIL, err_desc: "failed to create post record in DB");
|
return new ReturnT(err_code: E_DBE_INSERTFAIL, err_desc: "failed to create post record in DB");
|
||||||
|
|
||||||
$result = true;
|
$result = $db->insert_id;
|
||||||
|
|
||||||
return new ReturnT(data: $result);
|
return new ReturnT(data: $result);
|
||||||
}
|
}
|
||||||
@ -199,10 +199,12 @@ function Post_Create (
|
|||||||
* METHOD
|
* METHOD
|
||||||
* Create single publication
|
* Create single publication
|
||||||
* Request fields:
|
* Request fields:
|
||||||
* tags - list of tags, should be delimited by comma
|
* tags - list of tags, should be delimited by comma
|
||||||
* title - optional title for post
|
* title - optional title for post
|
||||||
* Files fields:
|
* Files fields:
|
||||||
* pic - id of file object in $_FILES variable
|
* pic - id of file object in $_FILES variable
|
||||||
|
* Return value:
|
||||||
|
* id - unique identifier of created post
|
||||||
*/
|
*/
|
||||||
function Post_Create_Method (array $req, array $files): ReturnT {
|
function Post_Create_Method (array $req, array $files): ReturnT {
|
||||||
global $Config, $LOGGED_IN, $THIS_USER;
|
global $Config, $LOGGED_IN, $THIS_USER;
|
||||||
@ -341,7 +343,7 @@ if (Utils_ThisFileIsRequested(__FILE__)) {
|
|||||||
if ($result->IsError())
|
if ($result->IsError())
|
||||||
$result->ThrowJSONError();
|
$result->ThrowJSONError();
|
||||||
else
|
else
|
||||||
JSON_ReturnData(["success" => $result->GetData()]);
|
JSON_ReturnData(["id" => $result->GetData()]);
|
||||||
}
|
}
|
||||||
|
|
||||||
?>
|
?>
|
@ -5,6 +5,7 @@
|
|||||||
|
|
||||||
// Includes
|
// Includes
|
||||||
if (isset($IS_FRONTEND) && $IS_FRONTEND) {
|
if (isset($IS_FRONTEND) && $IS_FRONTEND) {
|
||||||
|
require_once("api/_config.php");
|
||||||
require_once("api/_auth.php");
|
require_once("api/_auth.php");
|
||||||
require_once("api/_utils.php");
|
require_once("api/_utils.php");
|
||||||
require_once("api/_input_checks.php");
|
require_once("api/_input_checks.php");
|
||||||
@ -13,6 +14,7 @@ if (isset($IS_FRONTEND) && $IS_FRONTEND) {
|
|||||||
require_once("api/user/index.php");
|
require_once("api/user/index.php");
|
||||||
require_once("api/post/index.php");
|
require_once("api/post/index.php");
|
||||||
} else {
|
} else {
|
||||||
|
require_once("../_config.php");
|
||||||
require_once("../_auth.php");
|
require_once("../_auth.php");
|
||||||
require_once("../_utils.php");
|
require_once("../_utils.php");
|
||||||
require_once("../_input_checks.php");
|
require_once("../_input_checks.php");
|
||||||
|
@ -41,12 +41,10 @@ function Post_AddView (int $id): ReturnT {
|
|||||||
global $db;
|
global $db;
|
||||||
|
|
||||||
$s = $db->prepare("UPDATE posts SET views = views + 1 WHERE id = ?");
|
$s = $db->prepare("UPDATE posts SET views = views + 1 WHERE id = ?");
|
||||||
$s->bind_param("s", $id);
|
$s->bind_param("i", $id);
|
||||||
$s->execute();
|
|
||||||
$d = $s->get_result()->fetch_assoc();
|
|
||||||
|
|
||||||
if (!(bool)$d)
|
if (!$s->execute())
|
||||||
return new ReturnT(err_code: E_UIN_WRONGID, err_desc: "failed to increment number of views");
|
return new ReturnT(err_code: E_DBE_UNKNOWN, err_desc: "failed to execute statement");
|
||||||
|
|
||||||
return new ReturnT(data: true);
|
return new ReturnT(data: true);
|
||||||
}
|
}
|
||||||
|
@ -3,4 +3,4 @@
|
|||||||
Restrict access to files:
|
Restrict access to files:
|
||||||
|
|
||||||
- Any file from `api` directory with prepended `_`
|
- Any file from `api` directory with prepended `_`
|
||||||
- `config.json`
|
- `config.json`
|
||||||
|
@ -26,10 +26,10 @@ if (isset($_POST) && $_POST) {
|
|||||||
$result = Post_Create_Method($_POST, $_FILES);
|
$result = Post_Create_Method($_POST, $_FILES);
|
||||||
if ($result->IsError()) { // Something happened
|
if ($result->IsError()) { // Something happened
|
||||||
NTFY_AddNotice("Failed to create post! Reason:<br>" . $result->GetError());
|
NTFY_AddNotice("Failed to create post! Reason:<br>" . $result->GetError());
|
||||||
} /*else { // All OK
|
} else { // All OK
|
||||||
header("Location: .");
|
header("Location: ./?do=view_post&id=" + strval($result->GetData()));
|
||||||
exit();
|
exit();
|
||||||
} TODO: redirect to page with new post */
|
}
|
||||||
} else {
|
} else {
|
||||||
NTFY_AddNotice("You must supply image and tags for post");
|
NTFY_AddNotice("You must supply image and tags for post");
|
||||||
}
|
}
|
||||||
|
@ -174,7 +174,6 @@ NTFY_EchoAllNotices();
|
|||||||
} else {
|
} else {
|
||||||
echo "<h2 style=\"color: gray; font-style: italic;\">Nothing found!</h2>";
|
echo "<h2 style=\"color: gray; font-style: italic;\">Nothing found!</h2>";
|
||||||
}
|
}
|
||||||
// TODO: pages
|
|
||||||
?>
|
?>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
106
front/pages/view_post/page.php
Normal file
106
front/pages/view_post/page.php
Normal file
@ -0,0 +1,106 @@
|
|||||||
|
<?php
|
||||||
|
// View post by ID
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// Includes
|
||||||
|
// API
|
||||||
|
require_once("api/post/index.php");
|
||||||
|
require_once("api/comments/index.php");
|
||||||
|
// Markup includes
|
||||||
|
require_once("front/pages/main_nav.php");
|
||||||
|
require_once("front/notifications.php");
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// Processing request
|
||||||
|
$reqResult = Post_GetByID_Method($_GET);
|
||||||
|
$postData = null;
|
||||||
|
if ($reqResult->IsError()) { // Something happened, very likely that post is not found
|
||||||
|
header("Location: .");
|
||||||
|
exit();
|
||||||
|
} else {
|
||||||
|
$postData = $reqResult->GetData();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
NTFY_EchoAllNotices();
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
?>
|
||||||
|
<div class="visualbox">
|
||||||
|
<div class="postviewer">
|
||||||
|
<div class="stats">
|
||||||
|
<div title="Positive votes">
|
||||||
|
<img src="front/images/plus.png" alt="Positive votes icon">
|
||||||
|
<p><?php echo $postData["votes_up"]; ?></p>
|
||||||
|
</div>
|
||||||
|
<div title="Negative votes">
|
||||||
|
<img src="front/images/minus.png" alt="Negative votes icon">
|
||||||
|
<p><?php echo $postData["votes_down"]; ?></p>
|
||||||
|
</div>
|
||||||
|
<div title="Views count">
|
||||||
|
<img src="front/images/eye.png" alt="Views count icon">
|
||||||
|
<p><?php echo $postData["views"]; ?></p>
|
||||||
|
</div>
|
||||||
|
<!--TODO: reset button for moderators-->
|
||||||
|
</div>
|
||||||
|
<div class="picture">
|
||||||
|
<?php
|
||||||
|
echo "<img src=\"" . $postData["pic_path"] . "\" alt=\"" . $postData["tags"] . "\" title=\"" . $postData["tags"] . "\">\n";
|
||||||
|
?>
|
||||||
|
</div>
|
||||||
|
<div class="tags">
|
||||||
|
<ul>
|
||||||
|
<?php
|
||||||
|
$tagsArr = explode(",", $postData["tags"]);
|
||||||
|
foreach ($tagsArr as $tag)
|
||||||
|
echo "<li>$tag</li>\n";
|
||||||
|
?>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
<div class="comments">
|
||||||
|
<?php
|
||||||
|
if (!$postData["comments_enabled"]) {
|
||||||
|
echo "<p style=\"color: gray;\"><i>Comments disabled</i></p>\n";
|
||||||
|
} else { // TODO: this part down is untested (and incomplete), so beware
|
||||||
|
$reqResult = Comments_GetSectionRange_Method(array("id" => $postData["comment_section_id"]));
|
||||||
|
if ($reqResult->IsError()) {
|
||||||
|
echo "<p style=\"color: gray;\"><i>Can't fetch comments</i></p>\n";
|
||||||
|
} else {
|
||||||
|
$commentsList = $reqResult->GetData();
|
||||||
|
$commentsAmount = count($commentsList);
|
||||||
|
echo "<p>Comments: " . strval($commentsAmount) . "</p>\n";
|
||||||
|
foreach ($commentsList as $commentData) { // TODO
|
||||||
|
echo "<div class=\"entry\">\n";
|
||||||
|
echo "<div class=\"meta\">\n";
|
||||||
|
echo "<img src=\"front/images/pfp_placeholder.png\" alt=\"Guy's pfp\">\n";
|
||||||
|
echo "<p>\n";
|
||||||
|
echo strval($commentData["created_at"]) . "<br>\n"; //"04/04/2024 04:20<br>\n";
|
||||||
|
echo "<a href=\"./noway\">Guy</a>\n";
|
||||||
|
echo "</p>\n";
|
||||||
|
echo "</div>\n";
|
||||||
|
echo "<p>cool story bob</p>\n";
|
||||||
|
echo "</div>\n";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
?>
|
||||||
|
<!--
|
||||||
|
<p>Comments: 54</p>
|
||||||
|
<div class="entry">
|
||||||
|
<div class="meta">
|
||||||
|
<img src="front/images/pfp_placeholder.png" alt="Guy's pfp">
|
||||||
|
<p>
|
||||||
|
04/04/2024 04:20<br>
|
||||||
|
<a href="./noway">Guy</a>
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
<p>cool story bob</p>
|
||||||
|
</div>
|
||||||
|
-->
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
@ -27,6 +27,7 @@ nav.main ul {
|
|||||||
margin-right: 10px;
|
margin-right: 10px;
|
||||||
padding: 7px;
|
padding: 7px;
|
||||||
backdrop-filter: blur(6px);
|
backdrop-filter: blur(6px);
|
||||||
|
background-color: #094e5970;
|
||||||
border-bottom-left-radius: 5px;
|
border-bottom-left-radius: 5px;
|
||||||
border-bottom-right-radius: 5px;
|
border-bottom-right-radius: 5px;
|
||||||
box-shadow: 0 0 5px #000;
|
box-shadow: 0 0 5px #000;
|
||||||
@ -34,8 +35,8 @@ nav.main ul {
|
|||||||
text-align: center;
|
text-align: center;
|
||||||
|
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-flow: row wrap;
|
flex-flow: row wrap;
|
||||||
justify-content: space-around;
|
justify-content: space-around;
|
||||||
}
|
}
|
||||||
|
|
||||||
nav.main ul li {
|
nav.main ul li {
|
||||||
@ -154,7 +155,6 @@ div.postsearchcolumn form input[type="text"] {
|
|||||||
display: inline-block;
|
display: inline-block;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
div.postsearchcolumn form input[type="submit"] {
|
div.postsearchcolumn form input[type="submit"] {
|
||||||
border-top-left-radius: 0px;
|
border-top-left-radius: 0px;
|
||||||
border-bottom-left-radius: 0px;
|
border-bottom-left-radius: 0px;
|
||||||
@ -217,3 +217,109 @@ div.postlist a.entry div.stats p {
|
|||||||
div.postlist a.entry:hover div.stats p {
|
div.postlist a.entry:hover div.stats p {
|
||||||
color: #49f49f;
|
color: #49f49f;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Post viewer */
|
||||||
|
|
||||||
|
div.postviewer div.stats {
|
||||||
|
margin-bottom: 0.5em;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.postviewer div.stats * {
|
||||||
|
display: inline-block;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.postviewer div.stats div {
|
||||||
|
margin-right: 1em;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.postviewer div.stats img {
|
||||||
|
width: 1em;
|
||||||
|
height: 1em;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.postviewer div.picture {
|
||||||
|
background-color: #aaa3;
|
||||||
|
border-radius: 3px;
|
||||||
|
text-align: center;
|
||||||
|
overflow: clip;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.postviewer div.picture img {
|
||||||
|
max-width: 100%;
|
||||||
|
min-width: 50px;
|
||||||
|
vertical-align: center;
|
||||||
|
margin-bottom: -4.5px;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.postviewer div.tags {
|
||||||
|
/* background-color: #aaa3;
|
||||||
|
background-color: #0002;
|
||||||
|
border: 2px solid #aaa7;
|
||||||
|
border-bottom: 2px solid #aaa7;
|
||||||
|
border-bottom-left-radius: 4px;
|
||||||
|
border-bottom-right-radius: 4px; */
|
||||||
|
}
|
||||||
|
|
||||||
|
div.postviewer div.tags ul {
|
||||||
|
text-align: center;
|
||||||
|
padding: 0 0 4px 0;
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.postviewer div.tags ul li {
|
||||||
|
background-color: #009049a0;
|
||||||
|
color: #00c07c;
|
||||||
|
text-shadow: 0 0 2px #000c, 0 0 2px #000c;
|
||||||
|
box-shadow: 0 0 3px #0005;
|
||||||
|
border-radius: 2px;
|
||||||
|
padding: 4px;
|
||||||
|
margin: 4px 0 0 0;
|
||||||
|
display: inline-block;
|
||||||
|
transition: all 0.2s;
|
||||||
|
cursor: default;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.postviewer div.tags ul li:hover {
|
||||||
|
color: #49f49f;
|
||||||
|
box-shadow: 0 0 5px #0007;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.postviewer div.comments {}
|
||||||
|
|
||||||
|
div.postviewer div.comments p {
|
||||||
|
margin: 8px 0 8px 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.postviewer div.comments div.entry {
|
||||||
|
margin-top: 8px;
|
||||||
|
padding: 5px;
|
||||||
|
border: 1px solid #009049;
|
||||||
|
border-radius: 3px;
|
||||||
|
align-items: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.postviewer div.comments div.entry p {
|
||||||
|
display: inline-block;
|
||||||
|
vertical-align: top;
|
||||||
|
margin: 0 0 0 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.postviewer div.comments div.entry div.meta {
|
||||||
|
display: inline-block;
|
||||||
|
width: 12%;
|
||||||
|
text-align: center;
|
||||||
|
border-right: 1px solid #009049;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.postviewer div.comments div.entry div.meta img {
|
||||||
|
display: inline-block;
|
||||||
|
vertical-align: middle;
|
||||||
|
width: 64px;
|
||||||
|
height: 64px;
|
||||||
|
margin: 0 8px 0 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.postviewer div.comments div.entry div.meta p {
|
||||||
|
display: inline-block;
|
||||||
|
vertical-align: top;
|
||||||
|
}
|
||||||
|
@ -26,6 +26,13 @@ else
|
|||||||
|
|
||||||
// Picking current page
|
// Picking current page
|
||||||
switch ($PICKED_PAGE) {
|
switch ($PICKED_PAGE) {
|
||||||
|
// Direct-link pages
|
||||||
|
// Post viewing page
|
||||||
|
case "view_post":
|
||||||
|
$PAGE_TITLE = "Post #" . $_GET["id"]; // NOTICE: not good
|
||||||
|
$PAGE_STYLE = "front/styles/main.css";
|
||||||
|
$PAGE_FILE = "front/pages/view_post/page.php";
|
||||||
|
break;
|
||||||
// Available-on-login pages
|
// Available-on-login pages
|
||||||
// Post creation page
|
// Post creation page
|
||||||
case "new_post":
|
case "new_post":
|
||||||
|
Loading…
Reference in New Issue
Block a user