too much changes

This commit is contained in:
Florian Bouillon 2019-02-25 16:48:51 +01:00
parent 13303e50d4
commit 208863abed
27 changed files with 2410 additions and 480 deletions

2
.gitignore vendored
View File

@ -6,3 +6,5 @@ build/
ops/terraform/secrets.tf
.DS_Store
**/.idea
/vendor/

20
composer.json Normal file
View File

@ -0,0 +1,20 @@
{
"name": "avior/blog_imie",
"type": "project",
"require": {
},
"authors": [
{
"name": "Avior",
"email": "florian.bouillon@delta-wings.net"
}
],
"require-dev": {
"phpunit/phpunit": "^8"
},
"autoload": {
"classmap": [
"project/assets/php/"
]
}
}

1489
composer.lock generated Normal file

File diff suppressed because it is too large Load Diff

View File

@ -61,7 +61,7 @@ body{
}
h2{
font-weight: 600;
font-size: 17px;
font-size: 17px;
}
.title-second{
font-weight: 400;
@ -99,8 +99,8 @@ h2{
text-decoration: none;
color: white;
-webkit-transition: 400ms;
-o-transition: 400ms;
transition: 400ms;
-o-transition: 400ms;
transition: 400ms;
}
.item_nav_imie a:hover{
color: #a5a5a5;
@ -138,8 +138,8 @@ h2{
float: right;
font-weight: bold;
-webkit-transition: 400ms;
-o-transition: 400ms;
transition: 400ms;
-o-transition: 400ms;
transition: 400ms;
}
.item_nav_blog_droite:hover{
@ -192,9 +192,9 @@ h2{
background-color: #150032;
font-family: 'Open Sans', sans-serif;
font-size: 20px;
color: white;
color: white;
}
.test2{
.cover-text {
padding: 0px 90px;
margin-top: 100px;
text-align: center;
@ -215,9 +215,9 @@ h2{
padding: 10px 15px;
color: white;
-webkit-transition: 300ms;
-o-transition: 300ms;
transition: 300ms;
-o-transition: 300ms;
transition: 300ms;
}
.bloc-plus:hover{
background-color: #42027e;
@ -360,7 +360,7 @@ input {outline: none}
}
.post .text{
font-size: 14px;
color: #737272ee;
color: #737272ee;
line-height: 1.5;
margin-top: 28px;
}
@ -491,8 +491,8 @@ input {outline: none}
}
@media screen and (max-width: 640px) {
.nav_imie {
height: 0;
.nav_imie {
height: 0;
}
#twi{
height: 0;
@ -552,4 +552,4 @@ input {outline: none}
.bloc_principal{
height: 650px;
}
}
}

View File

@ -1,23 +1,23 @@
<div class="container-fluid">
<div class="row">
<div class="col-12 pad">
<div class="fullFooter">
<div class="upFooter">
<ul>
<li class="iconOnFooter"><a><tag type="svg" file="facebook" style="color: white; width: 18px; height: 18px"/></a></li>
<li class="iconOnFooter"><a><tag type="svg" file="twitter" style="color: white; width: 18px; height: 18px"/></a></li>
</ul>
<p class="phraseFooter">Suivez-nous sur les réseaux</p>
</div>
<div class="lowFooter">
<ul>
<li class="lowFooterItem">Politique et confidentialité</li>
<li class="lowFooterItem">Mentions légales</li>
<li class="lowFooterItem">Contact</li>
<li class="lowFooterItem">Connexion</li>
</ul>
</div>
</div>
</div>
</div>
</div>
<div class="container-fluid">
<div class="row">
<div class="col-12 pad">
<div class="fullFooter">
<div class="upFooter">
<ul>
<li class="iconOnFooter"><a><tag type="svg" file="facebook" style="color: white; width: 18px; height: 18px"/></a></li>
<li class="iconOnFooter"><a><tag type="svg" file="twitter" style="color: white; width: 18px; height: 18px"/></a></li>
</ul>
<p class="phraseFooter">Suivez-nous sur les réseaux</p>
</div>
<div class="lowFooter">
<ul>
<li class="lowFooterItem">Politique et confidentialité</li>
<li class="lowFooterItem">Mentions légales</li>
<li class="lowFooterItem">Contact</li>
<li class="lowFooterItem">Connexion</li>
</ul>
</div>
</div>
</div>
</div>
</div>

View File

@ -1,37 +1,37 @@
<div>
<div class="nav_imie">
<div class="container-fluid">
<div class="container">
<div class="row">
<div class="col-xs-12 col-sm-12 col-md-12 col-lg-12">
<ul>
<li class="item_nav_imie link" ><a>Connexion</a></li>
<li class="item_nav_imie link" ><a href="https://imie44.ymag.cloud">Accès Net-Yparéo</a></li>
<li class="item_nav_imie link" ><a href="https://www.imie.fr">IMIE Numérique</a></li>
<li class="item_nav_imie social" ><a href="https://twitter.com/EcoleIMIE"><tag type="svg" file="twitter" style="color: white; width: 18px; height: 18px"/></a></li>
<li class="item_nav_imie social" ><a href="https://www.facebook.com/EcolesIMIE/"><tag type="svg" file="facebook" style="color: white; width: 18px; height: 18px"/></a></li>
</ul>
</div>
</div>
</div>
</div>
</div>
<nav class="nav_blog">
<div class="container-fluid">
<div class="container">
<div class="row">
<div class="col-xs-12 col-sm-12 col-md-12 col-lg-12">
<ul>
<li class="item_nav_blog_logo" ><a href="/"><tag type="svg" file="logo-imie-blog" style="color: white; width: 200px; height: 64px; margin-top: 6px;"/></a></li>
<li class="item_nav_blog_droite_icon"><input id="search" type="text" placeholder="Recherche"><a><tag type="svg" file="mignify" style="color: rgba(0, 0, 0, .5); width: 18px; height: 18px"/></a></li>
<li class="item_nav_blog_droite devops"><a>DEVOPS</a></li>
<li class="item_nav_blog_droite ops"><a>OPS</a></li>
<li class="item_nav_blog_droite digi"><a>DIGI</a></li>
<li class="item_nav_blog_droite dev"><a>DEV</a></li>
</ul>
</div>
</div>
</div>
</div>
</div>
<div class="nav_imie">
<div class="container-fluid">
<div class="container">
<div class="row">
<div class="col-xs-12 col-sm-12 col-md-12 col-lg-12">
<ul>
<li class="item_nav_imie link" ><a>Connexion</a></li>
<li class="item_nav_imie link" ><a href="https://imie44.ymag.cloud">Accès Net-Yparéo</a></li>
<li class="item_nav_imie link" ><a href="https://www.imie.fr">IMIE Numérique</a></li>
<li class="item_nav_imie social" ><a href="https://twitter.com/EcoleIMIE"><tag type="svg" file="twitter" style="color: white; width: 18px; height: 18px"/></a></li>
<li class="item_nav_imie social" ><a href="https://www.facebook.com/EcolesIMIE/"><tag type="svg" file="facebook" style="color: white; width: 18px; height: 18px"/></a></li>
</ul>
</div>
</div>
</div>
</div>
</div>
<nav class="nav_blog">
<div class="container-fluid">
<div class="container">
<div class="row">
<div class="col-xs-12 col-sm-12 col-md-12 col-lg-12">
<ul>
<li class="item_nav_blog_logo" ><a href="/"><tag type="svg" file="logo-imie-blog" style="color: white; width: 200px; height: 64px; margin-top: 6px;"/></a></li>
<li class="item_nav_blog_droite_icon"><input id="search" type="text" placeholder="Recherche"><a><tag type="svg" file="mignify" style="color: rgba(0, 0, 0, .5); width: 18px; height: 18px"/></a></li>
<li class="item_nav_blog_droite devops"><a>DEVOPS</a></li>
<li class="item_nav_blog_droite ops"><a>OPS</a></li>
<li class="item_nav_blog_droite digi"><a>DIGI</a></li>
<li class="item_nav_blog_droite dev"><a>DEV</a></li>
</ul>
</div>
</div>
</div>
</div>
</div>
</div>

View File

@ -12,9 +12,9 @@
<div class="bloc_principal">
<div class="cover-black">
<div class="bloc_principal_titre">
<h1>L'actualité de nos campus...</h1>
<h1>L'actualitée de nos campus...</h1>
</div>
<div class="test2">
<div class="cover-text">
<h2 id="titre-home">Ceci est un magnifique titre</h2>
<p class="p-home">
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed

View File

@ -7,7 +7,7 @@
<tag type="includes" file="header" />
</header>
<main class="test container">
<div class="bloc-post">
<div class="bloc-post">
<div class="container-post post ops">
<h2 class="title">Mettre en place un serveur web sous linux</h2>
<div class="etiquettes">
@ -34,9 +34,9 @@
</div>
</div>
</div>
</div>
</div>
<div class="bloc-filter">
<div class="bloc-filter">
<p class="title-second">Plus d'articles</p>
<div class="filtre dev-color">dev</div>
<div class="filtre digi-color">digi</div>
@ -77,4 +77,4 @@
</fotter>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js" integrity="sha384-Tc5IQib027qvyjSMfHjOMaLkfuWVxZxUPnCJA7l2mCWNIpG9mGCD8wGNIcPD7Txa" crossorigin="anonymous"></script>
</body>
</html>
</html>

View File

@ -10,7 +10,7 @@
<div class="bloc-recent">
<div class="contenue-recent">
<div class="titre-recent">
<p>récent</p>
<p>récent</p>
</div>
<div class="icon-recent">
<tag type="svg" file="arrow" style="color: #848484; width: 18px; height: 18px"/>
@ -36,4 +36,4 @@
</main>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js" integrity="sha384-Tc5IQib027qvyjSMfHjOMaLkfuWVxZxUPnCJA7l2mCWNIpG9mGCD8wGNIcPD7Txa" crossorigin="anonymous"></script>
</body>
</html>
</html>

View File

@ -0,0 +1,148 @@
<?php
namespace App;
use DOMDocument;
use DOMNode;
use PDO;
/**
* @author Avior <florian.bouillon@delta-wings.net>
* @author Clément Fourrier
*/
class Functions {
public static function endsWith($haystack, $needle) {
$length = strlen($needle);
if ($length == 0) {
return true;
}
return (substr($haystack, -$length) === $needle);
}
public static function connect() {
$host = "127.0.0.1";
$db = "blog";
$user = "blog";
$pass = "blog";
$charset="utf8mb4";
$dsn = "mysql:host=$host;dbname=$db;charset=$charset";
try {
$pdo = new PDO($dsn, $user, $pass, null);
} catch (\PDOException $e) {
throw new \PDOException($e->getMessage(), (int)$e->getCode());
}
return $pdo;
}
/**
* Undocumented function
*
* @param DOMNode $parent
* @param [type] $source
*
* @var DOMNode $node
*
* @return void
*/
public static function appendHTML(DOMNode $parent, $source) {
$tmpDoc = new DOMDocument("1.0", "UTF-8");
$html = "<html><body>";
$html .= $source;
$html .= "</body></html>";
$tmpDoc->loadHTML($html);
// $tmpDoc->loadHTML('<?xml encoding="UTF-8">'.$html);
// foreach ($tmpDoc->childNodes as $item)
// if ($item->nodeType == XML_PI_NODE)
// $tmpDoc->removeChild($item);
// $tmpDoc->encoding = 'UTF-8';
/** @var DOMNode $node */
foreach($tmpDoc->getElementsByTagName('body')->item(0)->childNodes as $node) {
$importedNode = $parent->ownerDocument->importNode($node, true);
$parent->appendChild($importedNode);
}
}
public static function loadRoutes() {
//recupération du router
$router = Router::getRouter();
$postCharacters = "[a-z0-9-]";
//page d'accueil
$home = function () {
return file_get_contents("../html/index.html");
};
$router->addRoute("/^\/$/", $home); // route : "/"
//page de post
$post = function () {
return file_get_contents("../html/post.html");
};
$router->addRoute("/^\/post\/" . $postCharacters . "+\/*$/", $post); // route "/post/*"
//page de recherche
$search = function () {
return file_get_contents("../html/search.html");
};
$router->addRoute("/^\/search\/$/", $search); // route "/search/*"
$edit = function() {
$_POST = array_merge($_POST, $_GET); //debug uniquement
var_dump($_POST);
/*
$_POST should contain
post :
id
title
content
category
author
UPDATE posts
SET
title = title,
url = strtolower(preg_replace(["/\ /", '/[\'\/~`\!@#\$%\^&\*\(\)\+=\{\}\[\]\|;:"\<\>,\.\?\\\]/'], ["_", ""], title));
content = content,
short = substr(content, 0, 253) . "...";
category = categoryId
author = authorId
WHERE id = id
*/
$request = "UPDATE posts SET `title`=:title, `url`=:url, `content`=:content, `short`=:short, `category`=:category, `author`=:author, WHERE `id`=:id";
$title = $_POST["title"];
$url = strtolower(preg_replace(["/\ /", '/[\'\/~`\!@#\$%\^&\*\(\)\+=\{\}\[\]\|;:"\<\>,\.\?\\\]/'], ["_", ""], $title));
$content = $_POST["content"];
$short = substr($content, 0, 253) . "...";
$category = intval($_POST["category"]);
$author = intval($_POST["author"]);
$id = intval($_POST["id"]);
$pdo = Functions::connect();
$prepared = $pdo->prepare($request);
$prepared->bindParam(":title", $title);
$prepared->bindParam(":url", $url);
$prepared->bindParam(":content", $content);
$prepared->bindParam(":short", $short);
$prepared->bindParam(":category", $category, PDO::PARAM_INT);
$prepared->bindParam(":author", $author, PDO::PARAM_INT);
$prepared->bindParam(":id", $id, PDO::PARAM_INT);
$prepared->execute();
};
$router->addRoute("/^\/post\/" . $postCharacters . "+\/edit\/*$/", $edit);
}
}

View File

@ -1,5 +1,7 @@
<?php
namespace App;
/**
* classe pour gerer le routage des pages
* la variable static $router sert a utiliser le router dans plusieurs fichier
@ -44,10 +46,4 @@ class Router {
return file_get_contents("../html/404.html");
};
}
public function redirecter($source, $redirectPage) {
$this->addRoute($source, function() {
header("Location: " . $redirectPage);
});
}
}

View File

@ -0,0 +1,33 @@
<?php
namespace App\Tags;
use App\Tags\Tag;
use App\Functions;
/**
* inputs <tag type="article" column="(voir les collones de la table post)/>
* return text
*/
class Article extends Tag {
public function render() {
$post = array( //testing purpose
'title'=> "test",
'url'=> "pokemongo",
'content'=> "<p>azerthjjhhdsqmlkjhgfd</p>"
);
$pok = $this->getElement();
$attr = $pok->getAttribute("column");
$doc = $this->getDoc();
if($attr == "content") {
Functions::appendHTML($pok->parentNode, $post[$attr]);
} else {
$txt = $doc->createTextNode($post[$attr]);
$pok->parentNode->insertBefore($txt, $pok);
}
}
}

View File

@ -0,0 +1,31 @@
<?php
namespace App\Tags;
use App\Tags\Tag;
/**
* input <tag type="author" column="(column name)"/>
* return text
*/
class Author extends Tag {
public function render() {
$post = array( //testing purpose
'name'=> "test",
'image'=> "pokemon",
'linkedin'=> "pouet"
);
$pok = $this->getElement();
$attr = $pok->getAttribute("column");
$doc = $this->getDoc();
$txt = $doc->createTextNode($post[$attr]);
$pok->parentNode->insertBefore($txt, $pok);
}
}

View File

@ -0,0 +1,29 @@
<?php
namespace App\Tags;
use App\Tags\Tag;
//ce tag est juste la pour donner les possibilité de mon composant
/**
* input <tag type="bold">test</tag>
* result <span style="font-weight: bold">test</span>
*/
class Bold extends Tag {
public function render() {
//recuperation de la balise de base (<tag type="bold">pouet</tag>)
$pok = $this->getElement();
//recuperation du document (necessaire a la création de balises
$doc = $this->getDoc();
//creation de la balise "span"
$res = $doc->createElement("span");
//creation du texte et assignation du texte se trouvant dans la balise de base
$text = $doc->createTextNode($pok->textContent);
//rajout dans la balise span notre texte
$res->appendChild($text);
//on rajoute a la balise span du style pour le mettre en gras
$res->setAttribute("style", "font-weight: bold");
//enfin on met la div final dans le fichier
$pok->parentNode->insertBefore($res, $pok);
}
}

View File

@ -0,0 +1,22 @@
<?php
namespace App\Tags;
use App\Tags\Tag;
use App\Functions;
/**
* input <tag type="includes" file="(html file in includes folder)"/>
* return the content of the file
*/
class Includes extends Tag {
public function render() {
$el = $this->getElement();
$attr = $el->getAttribute("file");
$p = file_get_contents("../html/includes/".$attr.".html");
// var_dump($p);
Functions::appendHTML($el->parentNode, $p);
}
}

View File

@ -0,0 +1,36 @@
<?php
namespace App\Tags;
use App\Tags\Tag;
/**
*
* <tag type="isloggedin">
* <if true>
*
* </if>
* <if false>
*
* </if>
* </tag>
*/
class IsLoggedIn extends Tag {
public function render() {
$el = $this->getElement();
//debugging purpose
$loggedin = false;
foreach ($el->getElementsByTagName("if") as $element) {
if($element->hasAttribute("true") && $loggedin) {
$r = $element->childNodes->item(1);
$el->parentNode->insertBefore($r, $el);
} elseif ($element->hasAttribute("false")) {
$r = $element->childNodes->item(1);
$el->parentNode->insertBefore($r, $el);
}
}
}
}

View File

@ -0,0 +1,70 @@
<?php
namespace App\Tags;
use App\Tags\Tag;
use DomXPath;
use App\Functions;
use App\DB\Post;
/**
* input
* <tag type="loop" for="(table)" limit="(nombre-max g<>n<EFBFBD>r<EFBFBD>)">
* <loop column="element"/>
* </tag>
*/
class Loop extends Tag {
public function render() {
$el = $this->getElement();
$doc = $this->getDoc();
$limit = (int) $el->getAttribute("limit");
$posts = Post::list($limit);
$pdo = Functions::connect();
$query = $pdo->query("SELECT title, categories.name as categorie, dt as date, short as content
FROM posts
INNER JOIN categories ON categories.id=posts.categorie
ORDER BY date DESC
LIMIT 6;");
$posts = $query->fetchAll();
$parent = $el->parentNode;
//var_dump($parent);
$limit = $limit > count($posts) ? count($posts) : $limit;
for ($i=0; $i < $limit; $i++) {
$pok = $el->childNodes->item(0)->cloneNode(true);
$parent->insertBefore($pok, $el);
$elements = $pok->getElementsByTagName("loop");
foreach ($elements as $ele) {
if($ele->getAttribute("column") == "content") {
Functions::appendHTML($ele->parentNode, $posts[$i]["content"]);
} else {
$txt = $doc->createTextNode($posts[$i][$ele->getAttribute("column")]);
$ele->parentNode->insertBefore($txt, $ele);
}
}
$finder = new DomXPath($doc);
$nodes = $finder->query("//*[contains(@class, 'column-cat')]");
if(count($nodes) >= 1) $nodes[0]->setAttribute("class", str_replace("column-categorie", $posts[$i]["categorie"], $nodes[0]->getAttribute("class")));
$loop = $pok->getElementsByTagName("loop");
while ($loop->count() >= 1) {
$loop->item(0)->parentNode->removeChild($loop->item(0));
}
}
}
}

View File

@ -0,0 +1,20 @@
<?php
namespace App\Tags;
use App\Tags\Tag;
use App\Functions;
/**
* <tag type="svg" style="color: white; width: 18px; height: 18px""/>
*/
class Svg extends Tag {
public function render() {
$el = $this->getElement();
$attr = $el->getAttribute("file");
$t = $this->getDoc()->createDocumentFragment();
$p = file_get_contents("../img/".$attr.".svg");
Functions::appendHTML($el->parentNode, $p);
$el->nextSibling->setAttribute("style", $el->getAttribute("style"));
}
}

View File

@ -0,0 +1,110 @@
<?php
namespace App\Tags;
use DOMDocument;
use DOMElement;
use DOMNode;
/**
* @author Avior <florian.bouillon@delta-wings.net>
*
* @version 1.0.0
*/
class Tag {
/** @var DOMDocument */
private $document;
/** @var DOMElement */
private $element;
/** @var boolean */
private $debug;
/**
* Tag Constructor (will receive variables used in the tags)
*
* @param DOMDocument $doc the document
* @param DOMElement $DOMContent the element
* @param boolean $debug is debug enable or not ?
*/
public function __construct(DOMDocument $document, DOMElement $element, bool $debug) {
$this->document = $document;
$this->element = $element;
$this->debug = $debug;
}
/** @return DOMDocument return the document */
public function getDoc(): DOMDocument {
return $this->document;
}
/**
* get the element
*
* @return DOMElement the element
*/
public function getElement(): DOMElement {
return $this->element;
}
/** @return boolean */
public function isDebugging(): bool {
return $this->debug;
}
public function render() {}
/**
* Load tags from html $content and return the resulting String
*
* @param String $content base html file containing <tag />
*
* @return String the result html
*/
public static function loadTags(String $content): String {
$dom = new DOMDocument('1.0', 'UTF-8');
libxml_use_internal_errors(true);
$dom->loadHTML('<?xml encoding="UTF-8">'.$content);
libxml_clear_errors();
// fix UTF-8 problem
/** @var DOMNode $item */
foreach ($dom->childNodes as $item)
if ($item->nodeType == XML_PI_NODE)
$dom->removeChild($item);
$dom->encoding = 'UTF-8';
$head = $dom->getElementsByTagName("head");
if($head->count() >= 1) {
$t = $dom->createDocumentFragment();
$p = file_get_contents("../html/includes/head.html");
$t->appendXML($p);
$head->item(0)->appendChild($t);
}
$list = $dom->getElementsByTagName("tag");
//charge et supprimme les tags
while($lst = $list->item(0)) {
$tgs = "\\App\\Tags\\" . ucfirst($lst->getAttribute("type"));
$tg = new $tgs($dom, $lst, false);
$tg->render();
$lst->parentNode->removeChild($lst);
$list = $dom->getElementsByTagName("tag");
}
$res = $dom->saveHTML();
return $res;
}
}

View File

@ -0,0 +1,12 @@
<?php
namespace App\DB;
class Author {
private $id;
private $username;
private $linkedin;
}

View File

@ -0,0 +1,99 @@
<?php
namespace App\DB;
use App\Functions;
use PDO;
class Categorie {
private $id;
private $name;
public function __construct($id, $name) {
$this->id = $id;
$this->name = $name;
}
public static function fromArray($array) {
return new Self($array["id"], $array["name"]);
}
/**
* Undocumented function
*
* @param boolean $recent sort by most recent of less recent
* @param int $limit
*
* @return Categorie[]
*/
public static function list($recent = true, $limit = 100) {
$sort = $recent ? "DESC" : "ASC";
$query = "SELECT * FROM categories ORDER BY " . $sort . " LIMIT " . $limit;
$pdo = Functions::connect();
$cats = $pdo->query($query)->fetchAll();
$res = array();
foreach ($cats as $cat) {
$res[] = new Categorie($cat["id"], $cat["name"]);
}
return $res;
}
public static function get(int $id) {
return Categorie::fromArray(Functions::connect()->query("SELECT * FROM categories WHERE id=" . $id)->fetch());
}
public static function add(Categorie $categorie) {
$query = "INSERT INTO categories (id, name)
VALUES (NULL, ':name');";
$pdo = Functions::connect();
$prepared = $pdo->prepare($query);
$prepared->bindParam(":name", $categorie->getName());
$prepared->execute();
}
public static function remove(Categorie $categorie) {
Functions::connect()->prepare("DELETE FROM categories WHERE id=" . $categorie->getName())->execute();
}
public static function update(Categorie $categorie) {
$query = ""
}
/**
* Get the value of name
*/
public function getName()
{
return $this->name;
}
/**
* Set the value of name
*
* @return self
*/
public function setName($name)
{
$this->name = $name;
return $this;
}
/**
* Get the value of id
*/
public function getId()
{
return $this->id;
}
}

View File

@ -0,0 +1,71 @@
<?php
namespace App\DB;
class Post {
private $id;
private $title;
private $url;
private $content;
private $short;
private $categorie;
private $author;
private $dt;
/**
* list of posts
*
* @param boolean $recent sort by most recent or not
* @param integer $limit limit the number of result
*
* @return array(Post)
*/
public static function list($recent = true, $limit = 100) {
}
/**
*
* get a specific Post
*
* @param integer $id the id
*
* @return Post
*/
public static function get(int $id) {
}
/**
* add a post to the db
*
* @param Post $post
*
*/
public static function add(Post $post) {
}
/**
* remove the post
*
* @param Post $post
*
*/
public static function remove(Post $post) {}
/**
* update the post data on the db
*
* @param Post $post
*
* @return void
*/
public static function update(Post $post) {}
}

View File

@ -0,0 +1,57 @@
<?php
namespace App\DB;
class Tag {
private $id;
private $name;
/**
* list of posts
*
* @param boolean $recent sort by most recent or not
* @param integer $limit limit the number of result
*
* @return array(Post)
*/
public static function list($recent = true, $limit = 100) {
}
/**
*
* get a specific Post
*
* @param integer $id the id
*
* @return Post
*/
public static function get(int $id) {
}
/**
* add a post to the db
*
* @param Post $post
*
*/
public static function add(Post $post) {
}
/**
* remove the post
*
* @param Post $post
*
*/
public static function remove(Post $post) {}
/**
* update the post data on the db
*
* @param Post $post
*
* @return void
*/
public static function update(Post $post) {}
}

View File

@ -1,27 +0,0 @@
<?php
//function pour voir la fin d'un texte
function endsWith($haystack, $needle) {
$length = strlen($needle);
if ($length == 0) {
return true;
}
return (substr($haystack, -$length) === $needle);
}
function connect() {
$host = "127.0.0.1";
$db = "blog";
$user = "blog";
$pass = "blog";
$charset="utf8mb4";
$dsn = "mysql:host=$host;dbname=$db;charset=$charset";
try {
$pdo = new PDO($dsn, $user, $pass);
} catch (\PDOException $e) {
throw new \PDOException($e->getMessage(), (int)$e->getCode());
}
return $pdo;
}

View File

@ -1,17 +1,21 @@
<?php
require_once "functions.php";
error_reporting(E_ALL);
ini_set('display_errors', 'On');
require_once "../../../vendor/autoload.php";
use App\Router;
use App\Functions;
use App\Tags\Tag;
//renvoie vers le fichier css si il est demandé
if(endsWith($_GET["page"], ".css")) {
if(Functions::endsWith($_GET["page"], ".css")) {
echo file_get_contents("../css/style.css");
die;
}
//renvoie vers le fichier js si demandé
if(endsWith($_GET["page"], ".js")) {
if(Functions::endsWith($_GET["page"], ".js")) {
echo file_get_contents("../js/script.js");
die;
}
@ -19,7 +23,7 @@ if(endsWith($_GET["page"], ".js")) {
// var_dump(sizeof($_GET));
// si page non / & finit pas par / at pas de ?
if($_GET["page"] != "" && !endsWith($_GET["page"], "/") && sizeof($_GET) <= 1) {
if($_GET["page"] != "" && !Functions::endsWith($_GET["page"], "/") && count($_GET) <= 1) {
header("Location: /".$_GET["page"]."/");
die;
}
@ -28,7 +32,7 @@ if($_GET["page"] != "" && !endsWith($_GET["page"], "/") && sizeof($_GET) <= 1) {
$_GET['page'] = trim($_GET['page'], '/');
// si taille supérieur à 1 $_getpost = element
if(sizeof(explode("/", $_GET["page"])) > 1) {
if(count(explode("/", $_GET["page"])) > 1) {
$_GET["post"] = explode("/", $_GET["page"])[1];
}
@ -46,7 +50,7 @@ if(strlen($_GET['page']) > 1) {
// A ENLEVER LORS DES COMMITS DE FIN
// var_dump($_GET);
if($_GET["page"] == "/test/") {
include_once "test.php";
require_once "test.php";
die;
}
@ -54,13 +58,14 @@ if($_GET["page"] == "/test/") {
* Démarrage du routage du contenu
*/
include_once "router.php";
$router = new Router();
include_once "pages.php";
Functions::loadRoutes();
//chargement des tags contenu sur la page
include_once "tagHandler.php";
$pokemon = loadTags($router->search($_GET["page"])(), false);
$pokemon = Tag::loadTags($router->search($_GET["page"])(), false);
echo $pokemon;

View File

@ -1,81 +1,83 @@
<?php
include_once "router.php";
// // include_once "router.php";
//recupération du router
$router = Router::getRouter();
// use App\Router;
$postCharacters = "[a-z0-9-]";
// //recupération du router
// $router = Router::getRouter();
//page d'accueil
$home = function () {
return file_get_contents("../html/index.html");
};
// $postCharacters = "[a-z0-9-]";
$router->addRoute("/^\/$/", $home); // route : "/"
// //page d'accueil
// $home = function () {
// return file_get_contents("../html/index.html");
// };
//page de post
$post = function () {
return file_get_contents("../html/post.html");
};
// $router->addRoute("/^\/$/", $home); // route : "/"
$router->addRoute("/^\/post\/" . $postCharacters . "+\/*$/", $post); // route "/post/*"
// //page de post
// $post = function () {
// return file_get_contents("../html/post.html");
// };
//page de recherche
$search = function () {
return file_get_contents("../html/search.html");
};
// $router->addRoute("/^\/post\/" . $postCharacters . "+\/*$/", $post); // route "/post/*"
$router->addRoute("/^\/search\/$/", $search); // route "/search/*"
// //page de recherche
// $search = function () {
// return file_get_contents("../html/search.html");
// };
$edit = function() {
$_POST = array_merge($_POST, $_GET); //debug uniquement
var_dump($_POST);
/*
$_POST should contain
post :
id
title
content
category
author
// $router->addRoute("/^\/search\/$/", $search); // route "/search/*"
UPDATE posts
SET
title = title,
url = strtolower(preg_replace(["/\ /", '/[\'\/~`\!@#\$%\^&\*\(\)\+=\{\}\[\]\|;:"\<\>,\.\?\\\]/'], ["_", ""], title));
content = content,
short = substr(content, 0, 253) . "...";
category = categoryId
author = authorId
WHERE id = id
*/
// $edit = function() {
// $_POST = array_merge($_POST, $_GET); //debug uniquement
// var_dump($_POST);
// /*
// $_POST should contain
// post :
// id
// title
// content
// category
// author
require_once "functions.php";
// UPDATE posts
// SET
// title = title,
// url = strtolower(preg_replace(["/\ /", '/[\'\/~`\!@#\$%\^&\*\(\)\+=\{\}\[\]\|;:"\<\>,\.\?\\\]/'], ["_", ""], title));
// content = content,
// short = substr(content, 0, 253) . "...";
// category = categoryId
// author = authorId
// WHERE id = id
// */
// require_once "functions.php";
$request = "UPDATE posts SET `title`=:title, `url`=:url, `content`=:content, `short`=:short, `category`=:category, `author`=:author, WHERE `id`=:id";
// $request = "UPDATE posts SET `title`=:title, `url`=:url, `content`=:content, `short`=:short, `category`=:category, `author`=:author, WHERE `id`=:id";
$title = $_POST["title"];
$url = strtolower(preg_replace(["/\ /", '/[\'\/~`\!@#\$%\^&\*\(\)\+=\{\}\[\]\|;:"\<\>,\.\?\\\]/'], ["_", ""], $title));
$content = $_POST["content"];
$short = substr($content, 0, 253) . "...";
$category = intval($_POST["category"]);
$author = intval($_POST["author"]);
// $title = $_POST["title"];
// $url = strtolower(preg_replace(["/\ /", '/[\'\/~`\!@#\$%\^&\*\(\)\+=\{\}\[\]\|;:"\<\>,\.\?\\\]/'], ["_", ""], $title));
// $content = $_POST["content"];
// $short = substr($content, 0, 253) . "...";
// $category = intval($_POST["category"]);
// $author = intval($_POST["author"]);
$id = intval($_POST["id"]);
// $id = intval($_POST["id"]);
$pdo = connect();
$prepared = $pdo->prepare($request);
$prepared->bindParam(":title", $title);
$prepared->bindParam(":url", $url);
$prepared->bindParam(":content", $content);
$prepared->bindParam(":short", $short);
$prepared->bindParam(":category", $category, PDO::PARAM_INT);
$prepared->bindParam(":author", $author, PDO::PARAM_INT);
$prepared->bindParam(":id", $id, PDO::PARAM_INT);
// $pdo = connect();
// $prepared = $pdo->prepare($request);
// $prepared->bindParam(":title", $title);
// $prepared->bindParam(":url", $url);
// $prepared->bindParam(":content", $content);
// $prepared->bindParam(":short", $short);
// $prepared->bindParam(":category", $category, PDO::PARAM_INT);
// $prepared->bindParam(":author", $author, PDO::PARAM_INT);
// $prepared->bindParam(":id", $id, PDO::PARAM_INT);
$prepared->execute();
};
// $prepared->execute();
// };
$router->addRoute("/^\/post\/" . $postCharacters . "+\/edit\/*$/", $edit);
// $router->addRoute("/^\/post\/" . $postCharacters . "+\/edit\/*$/", $edit);

View File

@ -1,295 +0,0 @@
<?php
class Tag {
private $DOM;
private $doc;
private $debug;
public function __construct(DOMDocument $doc, DOMElement $DOMContent, bool $debug) {
$this->doc = $doc;
$this->DOM = $DOMContent;
$this->debug = $debug;
}
public function getDoc() {
return $this->doc;
}
public function getDOM() {
return $this->DOM;
}
public function isDebugging() {
return $this->debug;
}
public function render() {}
}
//ce tag est juste la pour donner les possibilité de mon composant
/**
* input <tag type="bold">test</tag>
* result <span style="font-weight: bold">test</span>
*/
class Bold extends Tag {
public function render() {
//recuperation de la balise de base (<tag type="bold">pouet</tag>)
$pok = $this->getDOM();
//recuperation du document (necessaire a la cr<63>ation de balises
$doc = $this->getDoc();
//creation de la balise "span"
$res = $doc->createElement("span");
//creation du texte et assignation du texte se trouvant dans la balise de base
$text = $doc->createTextNode($pok->textContent);
//rajout dans la balise span notre texte
$res->appendChild($text);
//on rajoute a la balise span du style pour le mettre en gras
$res->setAttribute("style", "font-weight: bold");
//enfin on met la div final dans le fichier
$pok->parentNode->insertBefore($res, $pok);
}
}
/**
* inputs <tag type="article" column="(voir les collones de la table post)/>
* return text
*/
class Article extends Tag {
public function render() {
$post = array( //testing purpose
'title'=> "test",
'url'=> "pokemongo",
'content'=> "<p>azerthjjhhdsqmlkjhgfd</p>"
);
$pok = $this->getDOM();
$attr = $pok->getAttribute("column");
$doc = $this->getDoc();
$parent = $pok->parentNode;
if($attr == "content") {
appendHTML($pok->parentNode, $post[$attr]);
} else {
$txt = $doc->createTextNode($post[$attr]);
$pok->parentNode->insertBefore($txt, $pok);
}
}
}
/**
* input
* <tag type="isloggedin">
* <if true>
*
* </if>
* <if false>
*
* </if>
* </tag>
*/
class IsLoggedIn extends Tag {
public function render() {
$el = $this->getDOM();
//debugging purpose
$loggedin = false;
foreach ($el->getElementsByTagName("if") as $element) {
if($element->hasAttribute("true") && $loggedin) {
$r = $element->childNodes->item(1);
$el->parentNode->insertBefore($r, $el);
} elseif ($element->hasAttribute("false")) {
$r = $element->childNodes->item(1);
$el->parentNode->insertBefore($r, $el);
}
}
}
}
/**
* input <tag type="author" column="(column name)"/>
* return text
*/
class Author extends Tag {
public function render() {
$post = array( //testing purpose
'name'=> "test",
'image'=> "pokemon",
'linkedin'=> "pouet"
);
$pok = $this->getDOM();
$attr = $pok->getAttribute("column");
$doc = $this->getDoc();
$txt = $doc->createTextNode($post[$attr]);
$pok->parentNode->insertBefore($txt, $pok);
}
}
/**
* input <tag type="includes" file="(html file in includes folder)"/>
* return the content of the file
*/
class Includes extends Tag {
public function render() {
$el = $this->getDOM();
$attr = $el->getAttribute("file");
$p = file_get_contents("../html/includes/".$attr.".html");
// var_dump($p);
appendHTML($el->parentNode, $p);
}
}
/**
* input <tag type="svg" style="color: white; width: 18px; height: 18px""/>
*/
class Svg extends Tag {
public function render() {
$el = $this->getDOM();
$attr = $el->getAttribute("file");
$t = $this->getDoc()->createDocumentFragment();
$p = file_get_contents("../img/".$attr.".svg");
appendHTML($el->parentNode, $p);
$el->nextSibling->setAttribute("style", $el->getAttribute("style"));
}
}
/**
* input
* <tag type="loop" for="(table)" limit="(nombre-max g<>n<EFBFBD>r<EFBFBD>)">
* <loop column="element"/>
* </tag>
* return something
*/
class Loop extends Tag {
public function render() {
$el = $this->getDOM();
$doc = $this->getDoc();
$limit = (int) $el->getAttribute("limit");
require_once 'functions.php';
$pdo = connect();
$query = $pdo->query("SELECT title, categories.name as categorie, dt as date, short as content
FROM posts
INNER JOIN categories ON categories.id=posts.categorie
ORDER BY date DESC
LIMIT 6;");
$posts = $query->fetchAll();
$parent = $el->parentNode;
//var_dump($parent);
$limit = $limit > sizeof($posts) ? sizeof($posts) : $limit;
for ($i=0; $i < $limit; $i++) {
//var_dump($i);
$pok = $el->childNodes->item(0)->cloneNode(true);
$parent->insertBefore($pok, $el);
$elements = $pok->getElementsByTagName("loop");
foreach ($elements as $ele) {
if($ele->getAttribute("column") == "content") {
appendHTML($ele->parentNode, $posts[$i]["content"]);
} else {
$txt = $doc->createTextNode($posts[$i][$ele->getAttribute("column")]);
$ele->parentNode->insertBefore($txt, $ele);
}
}
$finder = new DomXPath($doc);
$nodes = $finder->query("//*[contains(@class, 'column-cat')]");
// var_dump($nodes);
if(sizeof($nodes) >= 1) $nodes[0]->setAttribute("class", str_replace("column-categorie", $posts[$i]["categorie"], $nodes[0]->getAttribute("class")));
$loop = $pok->getElementsByTagName("loop");
while ($loop->count() >= 1) {
$loop->item(0)->parentNode->removeChild($loop->item(0));
}
}
}
}
//function qui ajoute du html dans la node
function appendHTML(DOMNode $parent, $source) {
$tmpDoc = new DOMDocument();
$html = "<html><body>";
$html .= $source;
$html .= "</body></html>";
$tmpDoc->loadHTML('<?xml encoding="UTF-8">'.$html);
foreach ($tmpDoc->childNodes as $item)
if ($item->nodeType == XML_PI_NODE)
$tmpDoc->removeChild($item);
$tmpDoc->encoding = 'UTF-8';
foreach ($tmpDoc->getElementsByTagName('body')->item(0)->childNodes as $node) {
$importedNode = $parent->ownerDocument->importNode($node, true);
$parent->appendChild($importedNode);
}
}
// function de gestion
function loadTags($ctnt) {
$dom = new DOMDocument();
libxml_use_internal_errors(true);
$dom->loadHTML('<?xml encoding="UTF-8">'.$ctnt);
libxml_clear_errors();
// fix UTF-8 problem
foreach ($dom->childNodes as $item)
if ($item->nodeType == XML_PI_NODE)
$dom->removeChild($item);
$dom->encoding = 'UTF-8';
$head = $dom->getElementsByTagName("head");
if($head->count() >= 1) {
$t = $dom->createDocumentFragment();
$p = file_get_contents("../html/includes/head.html");
$t->appendXML($p);
$head->item(0)->appendChild($t);
}
$list = $dom->getElementsByTagName("tag");
//charge et supprimme les tags
while($lst = $list->item(0)) {
$tgs = ucfirst($lst->getAttribute("type"));
$tg = new $tgs($dom, $lst, false);
$tg->render();
$lst->parentNode->removeChild($lst);
$list = $dom->getElementsByTagName("tag");
}
$res = $dom->saveHTML();
return $res;
}