read($folder); } public function read($folder) { $folders = glob("$folder/*", GLOB_ONLYDIR); foreach ($folders as $folder) { //$this->files[] = $folder . "/"; $this->read($folder); } $files = array_filter(glob("$folder/*md"), "is_file"); foreach ($files as $file) { $this->files[] = $file; } } public function findPageById(string $uuid) { $content = $this->getContents(); $page = find($content, ["uuid" => $uuid]); return $page; } public function findPageBySlug(string $slug = null) { $content = $this->getContents(); if (isset($slug)) { $page = find($content, ["slug" => $slug]); } else { $page = find($content, ["layout" => "index"]); } return $page; } public function editPage($task, $request) { $content = $this->getContents(); if ($task == "delete") { $parsed = json_decode(file_get_contents("php://input"), true); $body = find($content, ["uuid" => $parsed["id"]]); } else { $body = $request->getParsedBody(); } $page = find($content, ["uuid" => $body["uuid"]]); $image = $request->getUploadedFiles(); $member = Session::get("member"); if ($task != "create") { $path = date("Y", date($page["rawCreated"])) . "/" . date("m", date($page["rawCreated"])); } else { $path = date("Y") . "/" . date("m"); } if (isset($image["feature_image"])) { if ($task != "create") { $feature = "/assets/images/blog/" . $path . "/" . $image["feature_image"]->getClientFileName(); } else { $feature = "/assets/images/blog/" . $path . "/" . $image["feature_image"]->getClientFileName(); } FileUploader::uploadFile( "../public/assets/images/blog/" . $path . "/", $image["feature_image"] ); } else { if (isset($body["feature_image"])) { $url = explode("/", $body["feature_image"]); $feature = "/" . $url[3] . "/" . $url[4] . "/" . $url[5] . "/" . $url[6] . "/" . $url[7] . "/" . $url[8]; } else { $task == "create" ? ($feature = "") : ($feature = $body["feature"]); } } if ($task == "delete") { $deleted = "true"; $body["menu"] ? ($body["menu"] = "true") : ($body["menu"] = "false"); $body["published"] ? ($body["published"] = "true") : ($body["published"] = "false"); $body["featured"] ? ($body["featured"] = "true") : ($body["featured"] = "false"); } else { $deleted = isset($page["deleted"]) ? $page["deleted"] : "false"; } $created = $task != "create" ? new \Moment\Moment($page["rawCreated"]) : new \Moment\Moment(); $updated = new \Moment\Moment(); //grab current index from settings and update $id = $task != "create" ? $body["id"] : Settings::getCurrentIndex(); $uuid = $task != "create" ? $body["uuid"] : StringTools::createUUID(); // now that variables are done, set to body object and then convert to markdown to save $body["id"] = $id; $body["uuid"] = $uuid; $body["feature"] = $feature; $body["path"] = $path; $body["author"] = $member["handle"]; $body["created"] = $created->format("Y-m-d\TH:i:sP"); $body["updated"] = $updated->format("Y-m-d\TH:i:sP"); $body["deleted"] = $deleted; $write = DocTools::objectToMD($body); // if layout is index, change path to file if ($body["layout"] == "index") { $writePath = "../content/pages/start/index.md"; } else { $writePath = "../content/pages/" . $path . "/" . $body["slug"] . ".md"; } $status = DocTools::writePages($task, $path, $writePath, $write); if ($status) { $config = new Settings(); $settings = $config->getSettings(); $message = ""; if ( $settings["global"]["renderOnSave"] == "true" && $settings["global"]["dynamicRender"] == "false" ) { $render = new Render(); $render->renderTags(); $render->renderArchive(); $render->renderPages(); $message = "Filed edited and rendered. NOICE."; } else { $message = "File edited. Nice work"; } $response = [ "message" => $message, "type" => $task == "write" ? "postUpdated" : "postAdded", "id" => $uuid, ]; //TODO: When form submission is successful, make new form token //Session token doesn't reset on the front end, so turning this off for now //$form_token = md5(uniqid(microtime(), true)); //Session::set("form_token", $form_token); //once saved, update menu $body["path"] = $path; Settings::updateMenu($body); Settings::updateTags(); //if new page added, update current index in Settings file if ($task == "create") { Settings::updateIndex(); } } else { $response = [ "message" => "Uh oh. File save problem. Don't panic", "type" => "postError", "id" => $uuid, ]; } return $response; } public function getPages(int $page, int $limit, string $sort = null) { $content = $this->getContents(); $published = filter($content, function ($item) { return $item["published"] == true && $item["deleted"] == false; }); $deleted = filter($content, function ($item) { return $item["deleted"] == true; }); $all = $content; $filter = isset($sort) ? $sort : "all"; switch ($filter) { case "published": $filtered = $published; break; case "deleted": $filtered = $deleted; break; default: $filtered = $content; break; } $numOfPages = ceil(count($filtered) / ($limit + 1)); $folder = []; if (count($filtered) != 0) { if (count($filtered) < $limit) { $limit = count($filtered) - 1; } $range = $page * $limit - $limit; if ($range != 0) { $range = $range + 1; } for ($i = 0; $i <= $limit; $i++) { if (isset($filtered[$i + $range])) { array_push($folder, $filtered[$i + $range]); } else { //chill out } } } $prev = $page - 1; if ($prev <= 0) { $prev = $numOfPages; } $next = $page + 1; if ($next > $numOfPages) { $next = 1; } return [ "pages" => $folder, "numOfPages" => $numOfPages, "entryCount" => count($filtered), "paginate" => [ "sort" => $sort, "nextPage" => $next, "prevPage" => $prev, ], "stats" => [ "all" => count($all), "published" => count($published), "deleted" => count($deleted), ], ]; } public function getContents() { //move page collection to utiltiy class $parser = new Parser(); $contents = []; foreach ($this->files as $file) { $doc = $parser->parse(file_get_contents($file), false); $meta = $doc->getYAML(); $page = [ "id" => $meta["id"], "uuid" => $meta["uuid"], "title" => $meta["title"], "feature" => $meta["feature"], "path" => $meta["path"], "layout" => $meta["layout"], "tags" => $meta["tags"], "author" => $meta["author"], "created" => date("Y M D d", $meta["created"]), "updated" => date("Y M D d", $meta["updated"]), "rawCreated" => $meta["created"], "rawUpdated" => $meta["updated"], "createdYear" => date("Y", $meta["created"]), "createdMonth" => date("m", $meta["created"]), "deleted" => $meta["deleted"], "menu" => $meta["menu"], "featured" => $meta["featured"], "published" => $meta["published"], "slug" => $meta["slug"], "filePath" => $file, "content" => $doc->getContent(), ]; //checks for duplicates $uuid = $meta["uuid"]; $found = current( array_filter($contents, function ($item) use ($uuid) { return isset($item["uuid"]) && $uuid == $item["uuid"]; }) ); // if uuid is not present, add it if (!$found) { array_push($contents, $page); } } $contents = orderBy($contents, ["id"], ["desc"]); return $contents; } }