Compare commits

..

38 commits

Author SHA1 Message Date
Yasder5
d2549828d0 jolie beau
Some checks are pending
Deploy production (servyass) / deploy (push) Waiting to run
2026-03-04 22:29:15 +01:00
Yasder5
c5acb87ccb jolie beau 2026-03-04 22:27:34 +01:00
Yasder5
f663b33c77 pseudo remplace espace par _ 2026-03-04 21:18:52 +01:00
Yasder5
da33d61b69 nice 2026-03-03 23:29:33 +01:00
Yass
ef21c4b33d
Delete .htaccess 2026-03-03 23:01:23 +01:00
Yasder5
41880662a6 correction soft delete 2026-03-03 22:41:28 +01:00
Yasder5
b75ae2542a htaccess fini 2026-03-03 22:23:25 +01:00
Yasder5
5071d5f2f3 pouloulou 2026-03-03 20:46:56 +01:00
Yasder5
480559ba48 wtf 2026-03-03 20:42:46 +01:00
Yasder5
c8343faec7 .env en moins normalement 2026-03-03 20:41:35 +01:00
Yass
0dcbaf8e7c
Delete .env 2026-03-03 20:39:15 +01:00
Bess1k
f1ef53c4ac
ajouter E.tpl 2026-03-03 16:17:33 +01:00
Yass
5541f7e604 minou 3 2026-03-03 13:13:06 +01:00
Yass
5c77c83349 MINOOOOOOOOUUUUUUU 2026-03-03 12:05:29 +01:00
Yass
4bddf0b409 MINOOOOOOOOUUUUUUU 2026-03-03 12:01:03 +01:00
Yass
5d03bf936d si j'oublie tout aussi 2026-03-03 11:16:46 +01:00
Yass
04d7d564f1 htaccess c'est vraiment de la merde 2026-03-03 11:16:14 +01:00
Yass
5638c0712d htacc'hess 2026-03-03 09:21:33 +01:00
Yass
bc05f1e7bd htacc'hess 2026-03-03 09:19:16 +01:00
Yasder5
7e0ba13ad5 my bad j'ai oublié un truc 2026-03-02 21:43:31 +01:00
Yasder5
31b2c00956 un peu de debuggage 2026-03-02 21:41:34 +01:00
Yasder5
334dd55dee jolie beau 2026-03-02 21:25:54 +01:00
Yasder5
42ec68178a jolie beau et ajax 2026-03-02 21:01:46 +01:00
GuillaumeH-Cci
7475c3ce49 Doxygen 2026-03-02 15:26:49 +01:00
laura.chevillet
444f6ee155 requete recherche en PDO 2026-03-02 14:59:40 +01:00
Yass
b88ff889a2 wink wink 2026-03-02 11:28:03 +01:00
Yass
e243169157 wink wink 2026-03-02 11:26:36 +01:00
Yass
01bf507879 ajoute regle passwd 2026-03-02 10:07:18 +01:00
Yass
13d64fa908 ajoute regle passwd 2026-03-02 10:05:06 +01:00
Yass
c147631bc1 ajoute regle passwd 2026-03-02 10:02:53 +01:00
Yass
017c46f6ba logo bas de mail 2026-03-02 09:52:38 +01:00
Yass
7de8462d7b logo bas de mail 2026-03-02 09:49:46 +01:00
Yass
4c40d2f591 pouloulou 2026-03-02 09:45:44 +01:00
Yass
dd9cf43c42 gestion affichage texte 2026-03-02 09:33:44 +01:00
Yass
ba75ac2dff changement taille image 2026-03-02 09:24:38 +01:00
Yass
3836927aa2 gestion si projet non existant 2026-03-02 09:17:41 +01:00
Yass
fd6f8829f4 hehe 2026-03-02 09:16:09 +01:00
Yass
e3d85f7946 Correction envoie mail 2026-03-02 09:13:53 +01:00
98 changed files with 1906 additions and 553 deletions

10
.env
View file

@ -1,10 +0,0 @@
# config BDD
DB_CONNECTION=mysql
DB_HOSTNAME=boulayoune.com
DB_DATABASE=projet_folliow
DB_USERNAME=
DB_PASSWORD=
IMG_PROJECT_PATH = uploads/projects/
IMG_USER_PATH = uploads/profiles/

1
.gitignore vendored
View file

@ -1,3 +1,4 @@
/templates_c/
/templates_c/**
.env
.htaccess

View file

@ -10,7 +10,12 @@ body {
background-color: #ffffff;
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
padding: 0.8rem 2rem;
min-height: 64px;
max-height: 64px;
}
.navbar .navbar-collapse {
align-items: center;
}
.navbar-brand {
font-size: 1.5rem;
@ -29,7 +34,13 @@ body {
margin: 0 0.2rem;
transition: color 0.3s;
}
.nav-avatar {
width: 36px;
height: 36px;
object-fit: cover;
border-radius: 50%;
display: block;
}
.navbar-nav .nav-link:hover {
color: #0d6efd;
}
@ -117,3 +128,51 @@ body {
.txt_title {
color: rgb(51, 152, 217);
}
/* On cible la card sans casser ses propriétés Bootstrap */
.tiger-theme {
background-color: #ff8c00 !important; /* Orange tigre */
background-image: repeating-linear-gradient(
45deg,
transparent,
transparent 30px,
rgba(0, 0, 0, 0.15) 30px,
rgba(0, 0, 0, 0.15) 60px
) !important;
border: 2px solid #000 !important;
color: #000 !important;
position: relative;
z-index: 1;
}
/* Style du texte pour qu'il ressorte sur l'orange */
.tiger-text {
font-weight: 800 !important;
text-transform: uppercase;
color: #000 !important;
}
.tiger-date {
font-size: 0.8rem;
font-weight: bold;
color: rgba(0, 0, 0, 0.7);
}
/* Bordure de l'image (n'affecte pas la taille de la card) */
.tiger-border {
box-shadow: 0 0 0 4px #000;
}
/* Bouton style tigre */
.btn-tiger {
background-color: #000 !important;
color: #ff8c00 !important;
border: none !important;
font-weight: bold !important;
transition: transform 0.2s;
}
.btn-tiger:hover {
transform: scale(1.05);
background-color: #222 !important;
}

View file

@ -21,8 +21,8 @@
public function admin(){
if (!isset($_SESSION['user']) && ($_SESSION['user']['user_status'] != 1 )){
header("Location:index.php?ctrl=error&action=error_403");
exit;
$error = new \Controllers\ErrorCtrl();
return $error->error_403();
}
$objCategoryModel = new CategoryModel;
@ -32,7 +32,7 @@
$newCat->setName($_POST['new_category']);
$objCategoryModel->insertCategory($newCat);
$_SESSION['success'] = "La catégorie a bien été ajoutée";
header('Location: index.php?ctrl=admin&action=admin');
header('Location: '.$_ENV['BASE_URL'].'/admin/admin');
exit;
}
@ -42,7 +42,7 @@
$editCat->setName($_POST['new_name']);
$objCategoryModel->editCategory($editCat);
$_SESSION['success'] = "La catégorie a bien été modifiée";
header('Location: index.php?ctrl=admin&action=admin');
header('Location: '.$_ENV['BASE_URL'].'/admin/admin');
exit;
}
@ -73,7 +73,7 @@
$objUserModel->delete_soft($intUserId);
$_SESSION['success'] = "L'utilisateur a été supprimé.";
}
header("Location: index.php?ctrl=admin&action=admin");
header('Location: '.$_ENV['BASE_URL'].'/admin/admin');
exit;
}
}

View file

@ -11,14 +11,18 @@
* Page erreur 404
*/
public function error_404(){
http_response_code(404);
$this->_display("error_404");
exit;
}
/**
* Page erreur 403
*/
public function error_403(){
http_response_code(403);
$this->_display("error_403");
exit;
}
}

View file

@ -23,6 +23,7 @@
$objSmarty = new Smarty();
$objSmarty->registerPlugin('modifier', 'vardump', 'var_dump');
$objSmarty->registerPlugin('modifier', 'file_exists', 'file_exists');
$objSmarty->registerPlugin('modifier', 'stripos', 'stripos');
$objSmarty->caching = false;
$objSmarty->force_compile = true;

View file

@ -79,7 +79,7 @@
*/
public function search(){
$strKeywords = $_POST['keywords']??'';
$strKeywords = $_POST['keywords']??"";
$intAuthor = $_POST['author']??0;
$intPeriod = $_POST['period']??0;
$strDate = $_POST['date']??'';
@ -124,8 +124,8 @@
*/
public function addedit_project() {
if (!isset($_SESSION['user'])){
header("Location:index.php?ctrl=error&action=error_403");
exit;
$error = new \Controllers\ErrorCtrl();
return $error->error_403();
}
$objProject = new Project;
@ -135,8 +135,8 @@
if (isset($_GET['id'])){
$arrProject = $objProjectModel->findOne($_GET['id']);
if($_SESSION['user']['user_id'] != $arrProject['project_user_id']){
header("Location:index.php?ctrl=error&action=error_403");
exit;
$error = new \Controllers\ErrorCtrl();
return $error->error_403();
}
$objProject->hydrate($arrProject);
$this->_arrData['arrImages'] = $objProjectModel->getImagesByProjectId($objProject->getId());
@ -200,7 +200,7 @@
$strSource = $_FILES['thumbnail']['tmp_name'];
list($intWidth, $intHeight) = getimagesize($strSource);
$intDestWidth = 200; $intDestHeight = 250;
$intDestWidth = 1280; $intDestHeight = 720;
$fltDestRatio = $intDestWidth / $intDestHeight;
$fltSourceRatio = $intWidth / $intHeight;
@ -325,7 +325,7 @@
}
$_SESSION['success'] = (!isset($_GET['id'])) ? "Le projet a bien été créé" : "Le projet a bien été modifié";
header("Location:index.php");
header('Location:'.$_ENV['BASE_URL']);
exit;
} else {
$arrError[] = "Erreur lors de l'enregistrement en base de données";
@ -360,9 +360,9 @@
$objProjectModel = new ProjectModel();
$arrProject = $objProjectModel->findOne((int)$intId);
$arrImages = $objProjectModel->getImagesByProjectId((int)$intId);
if ($arrProject) {
$arrImages = $objProjectModel->getImagesByProjectId((int)$intId);
$objProject = new Project();
$objProject->hydrate($arrProject);
@ -373,11 +373,11 @@
$this->_display("project_display");
} else {
header("Location: index.php?ctrl=project&action=home");
header('Location: '.$_ENV['BASE_URL'].'/project/home');
exit;
}
} else {
header("Location: index.php?ctrl=project&action=home");
header('Location: '.$_ENV['BASE_URL'].'/project/home');
exit;
}
}
@ -395,7 +395,7 @@
$arrProject = $objProjectModel->findOne($projectId);
if (!$arrProject) {
header("Location: index.php?ctrl=project&action=home");
header('Location: '.$_ENV['BASE_URL'].'/project/home');
exit;
}
@ -429,7 +429,7 @@
$objMail->Subject = "Projet : " . $objProject->getTitle();
$url = "https://php.boulayoune.com/index.php?ctrl=project&action=display&id=" . $projectId;
$url = $_ENV['BASE_URL'].'/project/display/'.$projectId;
$this->_arrData['projectTitle'] = $objProject->getTitle();
$this->_arrData['projectDescription'] = $objProject->getDescription();
@ -438,14 +438,14 @@
$objMail->Body = $this->_display("mail_message", false);
if ($objMail->Send()) {
header("Location: index.php?ctrl=project&action=display&id=".$projectId."&mail=ok");
header('Location: '.$_ENV['BASE_URL'].'/project/display/'.$projectId.'?mail=ok');
} else {
header("Location: index.php?ctrl=project&action=display&id=".$projectId."&mail=fail");
header('Location: '.$_ENV['BASE_URL'].'/project/display/'.$projectId.'?mail=fail');
}
exit;
}
header("Location: index.php?ctrl=project&action=home");
header('Location: '.$_ENV['BASE_URL'].'/project/home');
exit;
}
@ -459,7 +459,7 @@
$objProjectModel = new ProjectModel;
$objProjectModel->accept($intId);
header("Location: index.php");
header('Location: '.$_ENV['BASE_URL']);
exit;
}
@ -473,7 +473,7 @@
$objProjectModel = new ProjectModel;
$objProjectModel->refuse($intId);
header("Location: index.php");
header('Location: '.$_ENV['BASE_URL']);
exit;
}
@ -483,7 +483,7 @@
public function delete(){
if (!isset($_SESSION['user']) || $_SESSION['user']['user_status'] != 2) {
header("Location: index.php");
header('Location: '.$_ENV['BASE_URL']);
exit;
}
@ -498,7 +498,7 @@
}
}
header("Location: index.php");
header('Location: '.$_ENV['BASE_URL']);
exit;
}
@ -518,7 +518,7 @@
}
$urlRedirect = isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : "index.php";
header("Location: " . $urlRedirect);
header('Location: ' . $urlRedirect);
exit;
}
@ -541,7 +541,7 @@
}
$url = (isset($_SERVER['HTTP_REFERER'])) ? $_SERVER['HTTP_REFERER'] : "index.php";
header("Location: " . $url);
header('Location: ' . $url);
exit;
}

View file

@ -48,7 +48,7 @@ class UserCtrl extends MotherCtrl {
setcookie('remember_me', $token, time() + (15*24*60*60), "/", "", true, true);
}
header("Location:index.php");
header("Location:".$_ENV['BASE_URL']);
exit;
}
}
@ -75,7 +75,7 @@ class UserCtrl extends MotherCtrl {
$_SESSION['success'] = "Vous êtes bien déconnecté";
header("Location:index.php");
header("Location:".$_ENV['BASE_URL']);
exit;
}
@ -143,7 +143,7 @@ class UserCtrl extends MotherCtrl {
if ($boolInsert === true) {
$_SESSION['success'] = "Compte créé avec succès";
header("Location:index.php?ctrl=user&action=login");
header("Location:".$_ENV['BASE_URL']."/user/login");
exit;
} else {
$arrError['global'] = "Erreur lors de l'ajout";
@ -169,7 +169,7 @@ class UserCtrl extends MotherCtrl {
$arrUserData = $objUserModel->findUserByPseudo($strPseudo);
if ($arrUserData === false) {
header("Location: index.php");
header("Location: ".$_ENV['BASE_URL']);
exit;
}
@ -195,7 +195,7 @@ class UserCtrl extends MotherCtrl {
*/
public function edit(){
if(!isset($_SESSION['user'])){
header("Location: index.php");
header("Location: ".$_ENV['BASE_URL']);
exit;
}
$objUserModel = new UserModel;
@ -244,6 +244,7 @@ class UserCtrl extends MotherCtrl {
}
}
if (count($arrError) == 0 && isset($strImageName)) {
$strDest = $_ENV['IMG_USER_PATH'] . $strImageName;
$strSource = $_FILES['image']['tmp_name'];
@ -279,17 +280,25 @@ class UserCtrl extends MotherCtrl {
}
if ($_POST['delete_image'] === '1') {
$strOldImg = $objUser->getImage();
if (!empty($strOldImg) && $strOldImg !== 'images.jpg') {
$strOldFile = $_ENV['IMG_USER_PATH'] . $strOldImg;
if (file_exists($strOldFile)) unlink($strOldFile);
}
$objUser->setImage('images.jpg');
}
$boolInsert = $objUserModel->update($objUser);
if ($boolInsert === true) {
if (isset($strOldImg) && !empty($strOldImg) && isset($strImageName)) {
if (isset($strOldImg) && !empty($strOldImg) && $strOldImg !== 'images.jpg' && isset($strImageName)) {
$strOldFile = $_ENV['IMG_USER_PATH'] . $strOldImg;
if (file_exists($strOldFile)) unlink($strOldFile);
}
$arrNewInfo = $objUserModel->findUserByPseudo($objUser->getPseudo());
$_SESSION['user'] = $arrNewInfo;
$_SESSION['success'] = "Compte modifier avec succès";
header("Location:?ctrl=user&action=user&pseudo=".$objUser->getPseudo());
header('Location:'.$_ENV['BASE_URL'].'/user/user/'.$objUser->getPseudo());
exit;
} else {
$arrError['global'] = "Erreur lors de l'update";

View file

@ -226,7 +226,7 @@ class Project extends Mother{
* Récupération de la date du projet supprimer
* @return string date du projet
*/
public function getProject_deleted_at(){
public function getDeleted_at(){
return $this->_project_deleted_at;
}
@ -234,7 +234,7 @@ class Project extends Mother{
* Mise à jour de la date de suppression de projet
* @param string date du projet
*/
public function setProject_deleted_at($project_deleted_at){
public function setDeleted_at($project_deleted_at){
$this->_project_deleted_at = $project_deleted_at;
}
}

View file

@ -90,7 +90,7 @@
* @return string le nouveau pseudo de l'utilisateur
*/
public function setPseudo(string $pseudo){
$this->_pseudo = $pseudo;
$this->_pseudo = str_replace(" ","_",$pseudo);
}
/**

2
env
View file

@ -1,7 +1,7 @@
# config BDD
DB_CONNECTION=mysql
DB_HOSTNAME=boulayoune.com
DB_HOSTNAME=localhost
DB_DATABASE=projet_folliow
DB_USERNAME=
DB_PASSWORD=

View file

@ -28,6 +28,7 @@
<td id="projectalign">
<div id="projectname">Folliow
</div>
<div id="projectbrief">Un projet de site web réaliser en PHP</div>
</td>
</tr>
</tbody>

View file

@ -28,6 +28,7 @@
<td id="projectalign">
<div id="projectname">Folliow
</div>
<div id="projectbrief">Un projet de site web réaliser en PHP</div>
</td>
</tr>
</tbody>
@ -135,7 +136,7 @@ array&#160;</td><td class="memItemRight"><b>$_arrData</b> = array()</td></tr>
</div>
</div>
<hr/>The documentation for this class was generated from the following file:<ul>
<li>controllers/<b>AdminCtrl.php</b></li>
<li>C:/Users/Guill/projet_php/controllers/<b>AdminCtrl.php</b></li>
</ul>
</div><!-- contents -->
</div><!-- doc-content -->

View file

@ -28,6 +28,7 @@
<td id="projectalign">
<div id="projectname">Folliow
</div>
<div id="projectbrief">Un projet de site web réaliser en PHP</div>
</td>
</tr>
</tbody>
@ -154,7 +155,7 @@ array&#160;</td><td class="memItemRight"><b>$_arrData</b> = array()</td></tr>
</div>
</div>
<hr/>The documentation for this class was generated from the following file:<ul>
<li>controllers/<b>ErrorCtrl.php</b></li>
<li>C:/Users/Guill/projet_php/controllers/<b>ErrorCtrl.php</b></li>
</ul>
</div><!-- contents -->
</div><!-- doc-content -->

View file

@ -28,6 +28,7 @@
<td id="projectalign">
<div id="projectname">Folliow
</div>
<div id="projectbrief">Un projet de site web réaliser en PHP</div>
</td>
</tr>
</tbody>
@ -155,7 +156,7 @@ array&#160;</td><td class="memItemRight"><b>$_arrData</b> = array()</td></tr>
</div>
</div>
<hr/>The documentation for this class was generated from the following file:<ul>
<li>controllers/<b>MotherCtrl.php</b></li>
<li>C:/Users/Guill/projet_php/controllers/<b>MotherCtrl.php</b></li>
</ul>
</div><!-- contents -->
</div><!-- doc-content -->

View file

@ -28,6 +28,7 @@
<td id="projectalign">
<div id="projectname">Folliow
</div>
<div id="projectbrief">Un projet de site web réaliser en PHP</div>
</td>
</tr>
</tbody>
@ -173,7 +174,7 @@ array&#160;</td><td class="memItemRight"><b>$_arrData</b> = array()</td></tr>
</div>
</div>
<hr/>The documentation for this class was generated from the following file:<ul>
<li>controllers/<b>PageCtrl.php</b></li>
<li>C:/Users/Guill/projet_php/controllers/<b>PageCtrl.php</b></li>
</ul>
</div><!-- contents -->
</div><!-- doc-content -->

View file

@ -28,6 +28,7 @@
<td id="projectalign">
<div id="projectname">Folliow
</div>
<div id="projectbrief">Un projet de site web réaliser en PHP</div>
</td>
</tr>
</tbody>
@ -306,7 +307,7 @@ array&#160;</td><td class="memItemRight"><b>$_arrData</b> = array()</td></tr>
</div>
</div>
<hr/>The documentation for this class was generated from the following file:<ul>
<li>controllers/<b>ProjectCtrl.php</b></li>
<li>C:/Users/Guill/projet_php/controllers/<b>ProjectCtrl.php</b></li>
</ul>
</div><!-- contents -->
</div><!-- doc-content -->

View file

@ -28,6 +28,7 @@
<td id="projectalign">
<div id="projectname">Folliow
</div>
<div id="projectbrief">Un projet de site web réaliser en PHP</div>
</td>
</tr>
</tbody>
@ -211,7 +212,7 @@ array&#160;</td><td class="memItemRight"><b>$_arrData</b> = array()</td></tr>
</div>
</div>
<hr/>The documentation for this class was generated from the following file:<ul>
<li>controllers/<b>UserCtrl.php</b></li>
<li>C:/Users/Guill/projet_php/controllers/<b>UserCtrl.php</b></li>
</ul>
</div><!-- contents -->
</div><!-- doc-content -->

View file

@ -28,6 +28,7 @@
<td id="projectalign">
<div id="projectname">Folliow
</div>
<div id="projectbrief">Un projet de site web réaliser en PHP</div>
</td>
</tr>
</tbody>
@ -221,7 +222,7 @@ string&#160;</td><td class="memItemRight"><b>$_prefix</b> = ''</td></tr>
</div>
</div>
<hr/>The documentation for this class was generated from the following file:<ul>
<li>entities/<b>Authorisation.php</b></li>
<li>C:/Users/Guill/projet_php/entities/<b>Authorisation.php</b></li>
</ul>
</div><!-- contents -->
</div><!-- doc-content -->

View file

@ -28,6 +28,7 @@
<td id="projectalign">
<div id="projectname">Folliow
</div>
<div id="projectbrief">Un projet de site web réaliser en PHP</div>
</td>
</tr>
</tbody>
@ -276,7 +277,7 @@ Additional Inherited Members</h2></td></tr>
</div>
</div>
<hr/>The documentation for this class was generated from the following file:<ul>
<li>entities/<b>Category.php</b></li>
<li>C:/Users/Guill/projet_php/entities/<b>Category.php</b></li>
</ul>
</div><!-- contents -->
</div><!-- doc-content -->

View file

@ -28,6 +28,7 @@
<td id="projectalign">
<div id="projectname">Folliow
</div>
<div id="projectbrief">Un projet de site web réaliser en PHP</div>
</td>
</tr>
</tbody>
@ -312,7 +313,7 @@ string&#160;</td><td class="memItemRight"><b>$_prefix</b> = ''</td></tr>
</div>
</div>
<hr/>The documentation for this class was generated from the following file:<ul>
<li>entities/<b>Image.php</b></li>
<li>C:/Users/Guill/projet_php/entities/<b>Image.php</b></li>
</ul>
</div><!-- contents -->
</div><!-- doc-content -->

View file

@ -28,6 +28,7 @@
<td id="projectalign">
<div id="projectname">Folliow
</div>
<div id="projectbrief">Un projet de site web réaliser en PHP</div>
</td>
</tr>
</tbody>
@ -123,7 +124,7 @@ string&#160;</td><td class="memItemRight"><b>$_prefix</b> = ''</td></tr>
<a name="details" id="details"></a><h2 id="header-details" class="groupheader">Detailed Description</h2>
<div class="textblock"><p>Classe d'un Mere de tout objet </p><dl class="section author"><dt>Author</dt><dd>Yass &amp; Laura </dd></dl>
</div><hr/>The documentation for this class was generated from the following file:<ul>
<li>entities/<b>Mother.php</b></li>
<li>C:/Users/Guill/projet_php/entities/<b>Mother.php</b></li>
</ul>
</div><!-- contents -->
</div><!-- doc-content -->

View file

@ -28,6 +28,7 @@
<td id="projectalign">
<div id="projectname">Folliow
</div>
<div id="projectbrief">Un projet de site web réaliser en PHP</div>
</td>
</tr>
</tbody>
@ -662,7 +663,7 @@ string&#160;</td><td class="memItemRight"><b>$_prefix</b> = ''</td></tr>
</div>
</div>
<hr/>The documentation for this class was generated from the following file:<ul>
<li>entities/<b>Project.php</b></li>
<li>C:/Users/Guill/projet_php/entities/<b>Project.php</b></li>
</ul>
</div><!-- contents -->
</div><!-- doc-content -->

View file

@ -28,6 +28,7 @@
<td id="projectalign">
<div id="projectname">Folliow
</div>
<div id="projectbrief">Un projet de site web réaliser en PHP</div>
</td>
</tr>
</tbody>
@ -696,7 +697,7 @@ string&#160;</td><td class="memItemRight"><b>$_prefix</b> = ''</td></tr>
</div>
</div>
<hr/>The documentation for this class was generated from the following file:<ul>
<li>entities/<b>User.php</b></li>
<li>C:/Users/Guill/projet_php/entities/<b>User.php</b></li>
</ul>
</div><!-- contents -->
</div><!-- doc-content -->

View file

@ -28,6 +28,7 @@
<td id="projectalign">
<div id="projectname">Folliow
</div>
<div id="projectbrief">Un projet de site web réaliser en PHP</div>
</td>
</tr>
</tbody>
@ -153,7 +154,7 @@ Additional Inherited Members</h2></td></tr>
</div>
</div>
<hr/>The documentation for this class was generated from the following file:<ul>
<li>models/<b>AuthorisationModel.php</b></li>
<li>C:/Users/Guill/projet_php/models/<b>AuthorisationModel.php</b></li>
</ul>
</div><!-- contents -->
</div><!-- doc-content -->

View file

@ -28,6 +28,7 @@
<td id="projectalign">
<div id="projectname">Folliow
</div>
<div id="projectbrief">Un projet de site web réaliser en PHP</div>
</td>
</tr>
</tbody>
@ -214,7 +215,7 @@ Additional Inherited Members</h2></td></tr>
</div>
</div>
<hr/>The documentation for this class was generated from the following file:<ul>
<li>models/<b>CategoryModel.php</b></li>
<li>C:/Users/Guill/projet_php/models/<b>CategoryModel.php</b></li>
</ul>
</div><!-- contents -->
</div><!-- doc-content -->

View file

@ -28,6 +28,7 @@
<td id="projectalign">
<div id="projectname">Folliow
</div>
<div id="projectbrief">Un projet de site web réaliser en PHP</div>
</td>
</tr>
</tbody>
@ -139,7 +140,7 @@ Additional Inherited Members</h2></td></tr>
</div>
</div>
<hr/>The documentation for this class was generated from the following file:<ul>
<li>models/<b>ImageModel.php</b></li>
<li>C:/Users/Guill/projet_php/models/<b>ImageModel.php</b></li>
</ul>
</div><!-- contents -->
</div><!-- doc-content -->

View file

@ -28,6 +28,7 @@
<td id="projectalign">
<div id="projectname">Folliow
</div>
<div id="projectbrief">Un projet de site web réaliser en PHP</div>
</td>
</tr>
</tbody>
@ -111,7 +112,7 @@ Protected Attributes</h2></td></tr>
&#160;</td><td class="memItemRight"><b>$_db</b></td></tr>
</table>
<hr/>The documentation for this class was generated from the following file:<ul>
<li>models/<b>MotherModel.php</b></li>
<li>C:/Users/Guill/projet_php/models/<b>MotherModel.php</b></li>
</ul>
</div><!-- contents -->
</div><!-- doc-content -->

View file

@ -28,6 +28,7 @@
<td id="projectalign">
<div id="projectname">Folliow
</div>
<div id="projectbrief">Un projet de site web réaliser en PHP</div>
</td>
</tr>
</tbody>
@ -339,7 +340,7 @@ Additional Inherited Members</h2></td></tr>
</table>
</dd>
</dl>
<dl class="section return"><dt>Returns</dt><dd>array </dd></dl>
<dl class="section return"><dt>Returns</dt><dd>array|bool </dd></dl>
</div>
</div>
@ -468,7 +469,7 @@ Additional Inherited Members</h2></td></tr>
</div>
</div>
<hr/>The documentation for this class was generated from the following file:<ul>
<li>models/<b>ProjectModel.php</b></li>
<li>C:/Users/Guill/projet_php/models/<b>ProjectModel.php</b></li>
</ul>
</div><!-- contents -->
</div><!-- doc-content -->

View file

@ -28,6 +28,7 @@
<td id="projectalign">
<div id="projectname">Folliow
</div>
<div id="projectbrief">Un projet de site web réaliser en PHP</div>
</td>
</tr>
</tbody>
@ -376,7 +377,7 @@ Additional Inherited Members</h2></td></tr>
</table>
</dd>
</dl>
<dl class="section return"><dt>Returns</dt><dd>array Tableau associatif (ou false si pas trouvé) </dd></dl>
<dl class="section return"><dt>Returns</dt><dd>bool Le pseudo existe ou pas </dd></dl>
</div>
</div>
@ -464,7 +465,7 @@ Additional Inherited Members</h2></td></tr>
</div>
</div>
<hr/>The documentation for this class was generated from the following file:<ul>
<li>models/<b>UserModel.php</b></li>
<li>C:/Users/Guill/projet_php/models/<b>UserModel.php</b></li>
</ul>
</div><!-- contents -->
</div><!-- doc-content -->

View file

@ -28,6 +28,7 @@
<td id="projectalign">
<div id="projectname">Folliow
</div>
<div id="projectbrief">Un projet de site web réaliser en PHP</div>
</td>
</tr>
</tbody>

View file

@ -5,7 +5,7 @@
<meta http-equiv="X-UA-Compatible" content="IE=11"/>
<meta name="generator" content="Doxygen 1.16.1"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>Folliow: models Directory Reference</title>
<title>Folliow: C:/Users/Guill/projet_php/models Directory Reference</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
@ -28,6 +28,7 @@
<td id="projectalign">
<div id="projectname">Folliow
</div>
<div id="projectbrief">Un projet de site web réaliser en PHP</div>
</td>
</tr>
</tbody>
@ -62,7 +63,7 @@ $(function() {
</div>
</div>
<script type="text/javascript">
$(function(){initNavTree('dir_1ae4179d5e953611aae20c997279e02c.html','',''); });
$(function(){initNavTree('dir_1c617d677ef58765205e8a044aafa06e.html','',''); });
</script>
<div id="container">
<div id="doc-content">
@ -104,7 +105,7 @@ $(function(){initNavTree('dir_1ae4179d5e953611aae20c997279e02c.html','',''); });
<!-- start footer part -->
<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
<ul>
<li class="navelem"><b>models</b></li>
<li class="navelem"><a href="dir_3a74e34fc6fa82edd10e4beee4ded801.html">projet_php</a></li><li class="navelem"><b>models</b></li>
<li class="footer">Generated by <a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.16.1 </li>
</ul>
</div>

View file

@ -5,7 +5,7 @@
<meta http-equiv="X-UA-Compatible" content="IE=11"/>
<meta name="generator" content="Doxygen 1.16.1"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>Folliow: controllers Directory Reference</title>
<title>Folliow: C:/Users/Guill/projet_php/controllers Directory Reference</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
@ -28,6 +28,7 @@
<td id="projectalign">
<div id="projectname">Folliow
</div>
<div id="projectbrief">Un projet de site web réaliser en PHP</div>
</td>
</tr>
</tbody>
@ -62,7 +63,7 @@ $(function() {
</div>
</div>
<script type="text/javascript">
$(function(){initNavTree('dir_87b6ed4386158a4d6cd0ecd5fb5bd5c2.html','',''); });
$(function(){initNavTree('dir_2756e6070b02be5d362619ded783829c.html','',''); });
</script>
<div id="container">
<div id="doc-content">
@ -94,7 +95,7 @@ $(function(){initNavTree('dir_87b6ed4386158a4d6cd0ecd5fb5bd5c2.html','',''); });
<table class="memberdecls">
<tr class="heading"><td colspan="2"><h2 id="header-subdirs" class="groupheader"><a id="subdirs" name="subdirs"></a>
Directories</h2></td></tr>
<tr class="memitem:templates_5Fc" id="r_templates_5Fc"><td class="memItemLeft"><span class="iconfolder"><div class="folder-icon"></div></span>&#160;</td><td class="memItemRight"><a class="el" href="dir_78f8c0daf938bfa31437d013d3fc896d.html">templates_c</a></td></tr>
<tr class="memitem:templates_5Fc" id="r_templates_5Fc"><td class="memItemLeft"><span class="iconfolder"><div class="folder-icon"></div></span>&#160;</td><td class="memItemRight"><a class="el" href="dir_a64c5c967bbc6a18c5d8eb713e8e97ff.html">templates_c</a></td></tr>
</table>
</div><!-- contents -->
</div><!-- doc-content -->
@ -109,7 +110,7 @@ Directories</h2></td></tr>
<!-- start footer part -->
<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
<ul>
<li class="navelem"><b>controllers</b></li>
<li class="navelem"><a href="dir_3a74e34fc6fa82edd10e4beee4ded801.html">projet_php</a></li><li class="navelem"><b>controllers</b></li>
<li class="footer">Generated by <a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.16.1 </li>
</ul>
</div>

View file

@ -0,0 +1,201 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en-US">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=11"/>
<meta name="generator" content="Doxygen 1.16.1"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>Folliow: C:/Users/Guill/projet_php Directory Reference</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<script type="text/javascript" src="clipboard.js"></script>
<link href="navtree.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="navtreedata.js"></script>
<script type="text/javascript" src="navtree.js"></script>
<script type="text/javascript" src="cookie.js"></script>
<link href="search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="search/searchdata.js"></script>
<script type="text/javascript" src="search/search.js"></script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr id="projectrow">
<td id="projectalign">
<div id="projectname">Folliow
</div>
<div id="projectbrief">Un projet de site web réaliser en PHP</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.16.1 -->
<script type="text/javascript">
var searchBox = new SearchBox("searchBox", "search/",'.html');
</script>
<script type="text/javascript">
$(function() { codefold.init(); });
</script>
<script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script>
<script type="text/javascript">
$(function() {
initMenu('',true,false,'search.php','Search',true);
$(function() { init_search(); });
});
</script>
<div id="main-nav"></div>
</div><!-- top -->
<div id="side-nav" class="ui-resizable side-nav-resizable">
<div id="nav-tree">
<div id="nav-tree-contents">
<div id="nav-sync" class="sync"></div>
</div>
</div>
<div id="splitbar" style="-moz-user-select:none;"
class="ui-resizable-handle">
</div>
</div>
<script type="text/javascript">
$(function(){initNavTree('dir_2c23dcab3ba0e8633898b60485787967.html','',''); });
</script>
<div id="container">
<div id="doc-content">
<!-- window showing the filter options -->
<div id="MSearchSelectWindow"
onmouseover="return searchBox.OnSearchSelectShow()"
onmouseout="return searchBox.OnSearchSelectHide()"
onkeydown="return searchBox.OnSearchSelectKey(event)">
</div>
<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<div id="MSearchResults">
<div class="SRPage">
<div id="SRIndex">
<div id="SRResults"></div>
<div class="SRStatus" id="Loading">Loading...</div>
<div class="SRStatus" id="Searching">Searching...</div>
<div class="SRStatus" id="NoMatches">No Matches</div>
</div>
</div>
</div>
</div>
<div class="header">
<div class="headertitle"><div class="title">projet_php Directory Reference</div></div>
</div><!--header-->
<div class="contents">
<table class="memberdecls">
<tr class="heading"><td colspan="2"><h2 id="header-subdirs" class="groupheader"><a id="subdirs" name="subdirs"></a>
Directories</h2></td></tr>
<tr class="memitem:controllers" id="r_controllers"><td class="memItemLeft"><span class="iconfolder"><div class="folder-icon"></div></span>&#160;</td><td class="memItemRight"><a class="el" href="dir_bfcb6842af0098861ea59b43701e0022.html">controllers</a></td></tr>
<tr class="memitem:entities" id="r_entities"><td class="memItemLeft"><span class="iconfolder"><div class="folder-icon"></div></span>&#160;</td><td class="memItemRight"><a class="el" href="dir_6a59aaef8e4f4bee39467ed807742262.html">entities</a></td></tr>
<tr class="memitem:models" id="r_models"><td class="memItemLeft"><span class="iconfolder"><div class="folder-icon"></div></span>&#160;</td><td class="memItemRight"><a class="el" href="dir_f880fbcdfabe64616040b95a4e03089d.html">models</a></td></tr>
</table>
<a name="details" id="details"></a><h2 id="header-details" class="groupheader">Detailed Description</h2>
<div class="textblock"><h1 class="doxsection"><a class="anchor" id="autotoc_md0"></a>
Folliow Projet PHP</h1>
<p>A platform for sharing portfolios and projects, designed as a mix between Behance and LinkedIn. Folliow focuses on highlighting real projects while making it easy to connect with other users.</p>
<p>This project was developed as part of the <b>DWWM (Développeur Web et Web Mobile)</b> training.</p>
<hr />
<h1 class="doxsection"><a class="anchor" id="autotoc_md2"></a>
Features</h1>
<ul>
<li>User authentication and profile management</li>
<li>Portfolio and project creation</li>
<li>Project showcase with descriptions and technologies</li>
<li>User connections / follow system</li>
<li>Project feed and discovery</li>
<li>Profile and project search</li>
</ul>
<hr />
<h1 class="doxsection"><a class="anchor" id="autotoc_md4"></a>
Tech Stack</h1>
<p><b>Client:</b> HTML, CSS, JavaScript <br />
<b>Server:</b> PHP (MVC architecture) <br />
<b>Database:</b> MySQL <br />
<b>Web Server:</b> Apache</p>
<hr />
<h1 class="doxsection"><a class="anchor" id="autotoc_md6"></a>
Project Structure</h1>
<div class="fragment"><div class="line">folliow/</div>
<div class="line">├── app/</div>
<div class="line">│ ├── controllers/</div>
<div class="line">│ ├── models/</div>
<div class="line">│ └── views/</div>
<div class="line">├── public/</div>
<div class="line">│ ├── assets/</div>
<div class="line">│ └── index.php</div>
<div class="line">├── config/</div>
<div class="line">│ └── database.php</div>
<div class="line">├── sql/</div>
<div class="line">│ └── folliow.sql</div>
<div class="line">└── README.md</div>
</div><!-- fragment --><hr />
<h1 class="doxsection"><a class="anchor" id="autotoc_md8"></a>
Installation</h1>
<p>Clone the project</p>
<div class="fragment"><div class="line">git clone https://github.com/Yasder5/projet_php.git</div>
</div><!-- fragment --><p>Go to the project directory</p>
<div class="fragment"><div class="line">cd projet_php</div>
</div><!-- fragment --><p>Import the database</p>
<ul>
<li>Use the SQL file located in the <span class="tt">sql/</span> directory</li>
</ul>
<p>Configure database access</p>
<ul>
<li>Update credentials in <span class="tt">config/database.php</span></li>
</ul>
<p>Run the project</p>
<ul>
<li>Use a local server (XAMPP, WAMP, or Apache on Linux)</li>
</ul>
<hr />
<h1 class="doxsection"><a class="anchor" id="autotoc_md10"></a>
Learning Objectives</h1>
<ul>
<li>Build a complete PHP web application</li>
<li>Apply MVC architecture</li>
<li>Manage a relational database</li>
<li>Design a user-oriented portfolio platform</li>
</ul>
<hr />
<h1 class="doxsection"><a class="anchor" id="autotoc_md12"></a>
Future Improvements</h1>
<ul>
<li>Private messaging</li>
<li>Likes and comments on projects</li>
<li>Tags and categories</li>
<li>Improved responsive design</li>
<li>Advanced authentication and roles</li>
</ul>
<hr />
<h1 class="doxsection"><a class="anchor" id="autotoc_md14"></a>
License</h1>
<p>This project is for educational purposes. </p>
</div></div><!-- contents -->
</div><!-- doc-content -->
<div id="page-nav" class="page-nav-panel">
<div id="page-nav-resize-handle"></div>
<div id="page-nav-tree">
<div id="page-nav-contents">
</div><!-- page-nav-contents -->
</div><!-- page-nav-tree -->
</div><!-- page-nav -->
</div><!-- container -->
<!-- start footer part -->
<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
<ul>
<li class="navelem"><b>Users</b></li><li class="navelem"><b>Guill</b></li><li class="navelem"><a href="dir_2c23dcab3ba0e8633898b60485787967.html">projet_php</a></li>
<li class="footer">Generated by <a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.16.1 </li>
</ul>
</div>
</body>
</html>

View file

@ -0,0 +1,201 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en-US">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=11"/>
<meta name="generator" content="Doxygen 1.16.1"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>Folliow: C:/Users/Guill/projet_php Directory Reference</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<script type="text/javascript" src="clipboard.js"></script>
<link href="navtree.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="navtreedata.js"></script>
<script type="text/javascript" src="navtree.js"></script>
<script type="text/javascript" src="cookie.js"></script>
<link href="search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="search/searchdata.js"></script>
<script type="text/javascript" src="search/search.js"></script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr id="projectrow">
<td id="projectalign">
<div id="projectname">Folliow
</div>
<div id="projectbrief">Un projet de site web réaliser en PHP</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.16.1 -->
<script type="text/javascript">
var searchBox = new SearchBox("searchBox", "search/",'.html');
</script>
<script type="text/javascript">
$(function() { codefold.init(); });
</script>
<script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script>
<script type="text/javascript">
$(function() {
initMenu('',true,false,'search.php','Search',true);
$(function() { init_search(); });
});
</script>
<div id="main-nav"></div>
</div><!-- top -->
<div id="side-nav" class="ui-resizable side-nav-resizable">
<div id="nav-tree">
<div id="nav-tree-contents">
<div id="nav-sync" class="sync"></div>
</div>
</div>
<div id="splitbar" style="-moz-user-select:none;"
class="ui-resizable-handle">
</div>
</div>
<script type="text/javascript">
$(function(){initNavTree('dir_3a74e34fc6fa82edd10e4beee4ded801.html','',''); });
</script>
<div id="container">
<div id="doc-content">
<!-- window showing the filter options -->
<div id="MSearchSelectWindow"
onmouseover="return searchBox.OnSearchSelectShow()"
onmouseout="return searchBox.OnSearchSelectHide()"
onkeydown="return searchBox.OnSearchSelectKey(event)">
</div>
<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<div id="MSearchResults">
<div class="SRPage">
<div id="SRIndex">
<div id="SRResults"></div>
<div class="SRStatus" id="Loading">Loading...</div>
<div class="SRStatus" id="Searching">Searching...</div>
<div class="SRStatus" id="NoMatches">No Matches</div>
</div>
</div>
</div>
</div>
<div class="header">
<div class="headertitle"><div class="title">projet_php Directory Reference</div></div>
</div><!--header-->
<div class="contents">
<table class="memberdecls">
<tr class="heading"><td colspan="2"><h2 id="header-subdirs" class="groupheader"><a id="subdirs" name="subdirs"></a>
Directories</h2></td></tr>
<tr class="memitem:controllers" id="r_controllers"><td class="memItemLeft"><span class="iconfolder"><div class="folder-icon"></div></span>&#160;</td><td class="memItemRight"><a class="el" href="dir_2756e6070b02be5d362619ded783829c.html">controllers</a></td></tr>
<tr class="memitem:entities" id="r_entities"><td class="memItemLeft"><span class="iconfolder"><div class="folder-icon"></div></span>&#160;</td><td class="memItemRight"><a class="el" href="dir_91977dd5ba3542af9d4aecff9e888690.html">entities</a></td></tr>
<tr class="memitem:models" id="r_models"><td class="memItemLeft"><span class="iconfolder"><div class="folder-icon"></div></span>&#160;</td><td class="memItemRight"><a class="el" href="dir_1c617d677ef58765205e8a044aafa06e.html">models</a></td></tr>
</table>
<a name="details" id="details"></a><h2 id="header-details" class="groupheader">Detailed Description</h2>
<div class="textblock"><h1 class="doxsection"><a class="anchor" id="autotoc_md0"></a>
Folliow Projet PHP</h1>
<p>A platform for sharing portfolios and projects, designed as a mix between Behance and LinkedIn. Folliow focuses on highlighting real projects while making it easy to connect with other users.</p>
<p>This project was developed as part of the <b>DWWM (Développeur Web et Web Mobile)</b> training.</p>
<hr />
<h1 class="doxsection"><a class="anchor" id="autotoc_md2"></a>
Features</h1>
<ul>
<li>User authentication and profile management</li>
<li>Portfolio and project creation</li>
<li>Project showcase with descriptions and technologies</li>
<li>User connections / follow system</li>
<li>Project feed and discovery</li>
<li>Profile and project search</li>
</ul>
<hr />
<h1 class="doxsection"><a class="anchor" id="autotoc_md4"></a>
Tech Stack</h1>
<p><b>Client:</b> HTML, CSS, JavaScript <br />
<b>Server:</b> PHP (MVC architecture) <br />
<b>Database:</b> MySQL <br />
<b>Web Server:</b> Apache</p>
<hr />
<h1 class="doxsection"><a class="anchor" id="autotoc_md6"></a>
Project Structure</h1>
<div class="fragment"><div class="line">folliow/</div>
<div class="line">├── app/</div>
<div class="line">│ ├── controllers/</div>
<div class="line">│ ├── models/</div>
<div class="line">│ └── views/</div>
<div class="line">├── public/</div>
<div class="line">│ ├── assets/</div>
<div class="line">│ └── index.php</div>
<div class="line">├── config/</div>
<div class="line">│ └── database.php</div>
<div class="line">├── sql/</div>
<div class="line">│ └── folliow.sql</div>
<div class="line">└── README.md</div>
</div><!-- fragment --><hr />
<h1 class="doxsection"><a class="anchor" id="autotoc_md8"></a>
Installation</h1>
<p>Clone the project</p>
<div class="fragment"><div class="line">git clone https://github.com/Yasder5/projet_php.git</div>
</div><!-- fragment --><p>Go to the project directory</p>
<div class="fragment"><div class="line">cd projet_php</div>
</div><!-- fragment --><p>Import the database</p>
<ul>
<li>Use the SQL file located in the <span class="tt">sql/</span> directory</li>
</ul>
<p>Configure database access</p>
<ul>
<li>Update credentials in <span class="tt">config/database.php</span></li>
</ul>
<p>Run the project</p>
<ul>
<li>Use a local server (XAMPP, WAMP, or Apache on Linux)</li>
</ul>
<hr />
<h1 class="doxsection"><a class="anchor" id="autotoc_md10"></a>
Learning Objectives</h1>
<ul>
<li>Build a complete PHP web application</li>
<li>Apply MVC architecture</li>
<li>Manage a relational database</li>
<li>Design a user-oriented portfolio platform</li>
</ul>
<hr />
<h1 class="doxsection"><a class="anchor" id="autotoc_md12"></a>
Future Improvements</h1>
<ul>
<li>Private messaging</li>
<li>Likes and comments on projects</li>
<li>Tags and categories</li>
<li>Improved responsive design</li>
<li>Advanced authentication and roles</li>
</ul>
<hr />
<h1 class="doxsection"><a class="anchor" id="autotoc_md14"></a>
License</h1>
<p>This project is for educational purposes. </p>
</div></div><!-- contents -->
</div><!-- doc-content -->
<div id="page-nav" class="page-nav-panel">
<div id="page-nav-resize-handle"></div>
<div id="page-nav-tree">
<div id="page-nav-contents">
</div><!-- page-nav-contents -->
</div><!-- page-nav-tree -->
</div><!-- page-nav -->
</div><!-- container -->
<!-- start footer part -->
<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
<ul>
<li class="navelem"><a href="dir_3a74e34fc6fa82edd10e4beee4ded801.html">projet_php</a></li>
<li class="footer">Generated by <a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.16.1 </li>
</ul>
</div>
</body>
</html>

View file

@ -0,0 +1,113 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en-US">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=11"/>
<meta name="generator" content="Doxygen 1.16.1"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>Folliow: C:/Users/Guill/projet_php/controllers/templates_c Directory Reference</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<script type="text/javascript" src="clipboard.js"></script>
<link href="navtree.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="navtreedata.js"></script>
<script type="text/javascript" src="navtree.js"></script>
<script type="text/javascript" src="cookie.js"></script>
<link href="search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="search/searchdata.js"></script>
<script type="text/javascript" src="search/search.js"></script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr id="projectrow">
<td id="projectalign">
<div id="projectname">Folliow
</div>
<div id="projectbrief">Un projet de site web réaliser en PHP</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.16.1 -->
<script type="text/javascript">
var searchBox = new SearchBox("searchBox", "search/",'.html');
</script>
<script type="text/javascript">
$(function() { codefold.init(); });
</script>
<script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script>
<script type="text/javascript">
$(function() {
initMenu('',true,false,'search.php','Search',true);
$(function() { init_search(); });
});
</script>
<div id="main-nav"></div>
</div><!-- top -->
<div id="side-nav" class="ui-resizable side-nav-resizable">
<div id="nav-tree">
<div id="nav-tree-contents">
<div id="nav-sync" class="sync"></div>
</div>
</div>
<div id="splitbar" style="-moz-user-select:none;"
class="ui-resizable-handle">
</div>
</div>
<script type="text/javascript">
$(function(){initNavTree('dir_5498806e52ccd7d2d905ac8baf67301b.html','',''); });
</script>
<div id="container">
<div id="doc-content">
<!-- window showing the filter options -->
<div id="MSearchSelectWindow"
onmouseover="return searchBox.OnSearchSelectShow()"
onmouseout="return searchBox.OnSearchSelectHide()"
onkeydown="return searchBox.OnSearchSelectKey(event)">
</div>
<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<div id="MSearchResults">
<div class="SRPage">
<div id="SRIndex">
<div id="SRResults"></div>
<div class="SRStatus" id="Loading">Loading...</div>
<div class="SRStatus" id="Searching">Searching...</div>
<div class="SRStatus" id="NoMatches">No Matches</div>
</div>
</div>
</div>
</div>
<div class="header">
<div class="headertitle"><div class="title">templates_c Directory Reference</div></div>
</div><!--header-->
<div class="contents">
</div><!-- contents -->
</div><!-- doc-content -->
<div id="page-nav" class="page-nav-panel">
<div id="page-nav-resize-handle"></div>
<div id="page-nav-tree">
<div id="page-nav-contents">
</div><!-- page-nav-contents -->
</div><!-- page-nav-tree -->
</div><!-- page-nav -->
</div><!-- container -->
<!-- start footer part -->
<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
<ul>
<li class="navelem"><b>Users</b></li><li class="navelem"><b>Guill</b></li><li class="navelem"><a href="dir_2c23dcab3ba0e8633898b60485787967.html">projet_php</a></li><li class="navelem"><b>controllers</b></li><li class="navelem"><b>templates_c</b></li>
<li class="footer">Generated by <a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.16.1 </li>
</ul>
</div>
</body>
</html>

View file

@ -0,0 +1,113 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en-US">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=11"/>
<meta name="generator" content="Doxygen 1.16.1"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>Folliow: C:/Users/Guill/projet_php/entities Directory Reference</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<script type="text/javascript" src="clipboard.js"></script>
<link href="navtree.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="navtreedata.js"></script>
<script type="text/javascript" src="navtree.js"></script>
<script type="text/javascript" src="cookie.js"></script>
<link href="search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="search/searchdata.js"></script>
<script type="text/javascript" src="search/search.js"></script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr id="projectrow">
<td id="projectalign">
<div id="projectname">Folliow
</div>
<div id="projectbrief">Un projet de site web réaliser en PHP</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.16.1 -->
<script type="text/javascript">
var searchBox = new SearchBox("searchBox", "search/",'.html');
</script>
<script type="text/javascript">
$(function() { codefold.init(); });
</script>
<script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script>
<script type="text/javascript">
$(function() {
initMenu('',true,false,'search.php','Search',true);
$(function() { init_search(); });
});
</script>
<div id="main-nav"></div>
</div><!-- top -->
<div id="side-nav" class="ui-resizable side-nav-resizable">
<div id="nav-tree">
<div id="nav-tree-contents">
<div id="nav-sync" class="sync"></div>
</div>
</div>
<div id="splitbar" style="-moz-user-select:none;"
class="ui-resizable-handle">
</div>
</div>
<script type="text/javascript">
$(function(){initNavTree('dir_6a59aaef8e4f4bee39467ed807742262.html','',''); });
</script>
<div id="container">
<div id="doc-content">
<!-- window showing the filter options -->
<div id="MSearchSelectWindow"
onmouseover="return searchBox.OnSearchSelectShow()"
onmouseout="return searchBox.OnSearchSelectHide()"
onkeydown="return searchBox.OnSearchSelectKey(event)">
</div>
<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<div id="MSearchResults">
<div class="SRPage">
<div id="SRIndex">
<div id="SRResults"></div>
<div class="SRStatus" id="Loading">Loading...</div>
<div class="SRStatus" id="Searching">Searching...</div>
<div class="SRStatus" id="NoMatches">No Matches</div>
</div>
</div>
</div>
</div>
<div class="header">
<div class="headertitle"><div class="title">entities Directory Reference</div></div>
</div><!--header-->
<div class="contents">
</div><!-- contents -->
</div><!-- doc-content -->
<div id="page-nav" class="page-nav-panel">
<div id="page-nav-resize-handle"></div>
<div id="page-nav-tree">
<div id="page-nav-contents">
</div><!-- page-nav-contents -->
</div><!-- page-nav-tree -->
</div><!-- page-nav -->
</div><!-- container -->
<!-- start footer part -->
<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
<ul>
<li class="navelem"><b>Users</b></li><li class="navelem"><b>Guill</b></li><li class="navelem"><a href="dir_2c23dcab3ba0e8633898b60485787967.html">projet_php</a></li><li class="navelem"><b>entities</b></li>
<li class="footer">Generated by <a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.16.1 </li>
</ul>
</div>
</body>
</html>

View file

@ -5,7 +5,7 @@
<meta http-equiv="X-UA-Compatible" content="IE=11"/>
<meta name="generator" content="Doxygen 1.16.1"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>Folliow: controllers/templates_c Directory Reference</title>
<title>Folliow: C:/Users/Guill/projet_php/entities Directory Reference</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
@ -28,6 +28,7 @@
<td id="projectalign">
<div id="projectname">Folliow
</div>
<div id="projectbrief">Un projet de site web réaliser en PHP</div>
</td>
</tr>
</tbody>
@ -62,7 +63,7 @@ $(function() {
</div>
</div>
<script type="text/javascript">
$(function(){initNavTree('dir_78f8c0daf938bfa31437d013d3fc896d.html','',''); });
$(function(){initNavTree('dir_91977dd5ba3542af9d4aecff9e888690.html','',''); });
</script>
<div id="container">
<div id="doc-content">
@ -88,7 +89,7 @@ $(function(){initNavTree('dir_78f8c0daf938bfa31437d013d3fc896d.html','',''); });
</div>
<div class="header">
<div class="headertitle"><div class="title">templates_c Directory Reference</div></div>
<div class="headertitle"><div class="title">entities Directory Reference</div></div>
</div><!--header-->
<div class="contents">
</div><!-- contents -->
@ -104,7 +105,7 @@ $(function(){initNavTree('dir_78f8c0daf938bfa31437d013d3fc896d.html','',''); });
<!-- start footer part -->
<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
<ul>
<li class="navelem"><b>controllers</b></li><li class="navelem"><b>templates_c</b></li>
<li class="navelem"><a href="dir_3a74e34fc6fa82edd10e4beee4ded801.html">projet_php</a></li><li class="navelem"><b>entities</b></li>
<li class="footer">Generated by <a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.16.1 </li>
</ul>
</div>

View file

@ -5,7 +5,7 @@
<meta http-equiv="X-UA-Compatible" content="IE=11"/>
<meta name="generator" content="Doxygen 1.16.1"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>Folliow: templates_c Directory Reference</title>
<title>Folliow: C:/Users/Guill/projet_php/controllers/templates_c Directory Reference</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
@ -28,6 +28,7 @@
<td id="projectalign">
<div id="projectname">Folliow
</div>
<div id="projectbrief">Un projet de site web réaliser en PHP</div>
</td>
</tr>
</tbody>
@ -62,7 +63,7 @@ $(function() {
</div>
</div>
<script type="text/javascript">
$(function(){initNavTree('dir_2262efd7ced881ba2289deea4945d6ba.html','',''); });
$(function(){initNavTree('dir_a64c5c967bbc6a18c5d8eb713e8e97ff.html','',''); });
</script>
<div id="container">
<div id="doc-content">
@ -104,7 +105,7 @@ $(function(){initNavTree('dir_2262efd7ced881ba2289deea4945d6ba.html','',''); });
<!-- start footer part -->
<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
<ul>
<li class="navelem"><b>templates_c</b></li>
<li class="navelem"><a href="dir_3a74e34fc6fa82edd10e4beee4ded801.html">projet_php</a></li><li class="navelem"><b>controllers</b></li><li class="navelem"><b>templates_c</b></li>
<li class="footer">Generated by <a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.16.1 </li>
</ul>
</div>

View file

@ -0,0 +1,118 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en-US">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=11"/>
<meta name="generator" content="Doxygen 1.16.1"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>Folliow: C:/Users/Guill/projet_php/controllers Directory Reference</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<script type="text/javascript" src="clipboard.js"></script>
<link href="navtree.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="navtreedata.js"></script>
<script type="text/javascript" src="navtree.js"></script>
<script type="text/javascript" src="cookie.js"></script>
<link href="search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="search/searchdata.js"></script>
<script type="text/javascript" src="search/search.js"></script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr id="projectrow">
<td id="projectalign">
<div id="projectname">Folliow
</div>
<div id="projectbrief">Un projet de site web réaliser en PHP</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.16.1 -->
<script type="text/javascript">
var searchBox = new SearchBox("searchBox", "search/",'.html');
</script>
<script type="text/javascript">
$(function() { codefold.init(); });
</script>
<script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script>
<script type="text/javascript">
$(function() {
initMenu('',true,false,'search.php','Search',true);
$(function() { init_search(); });
});
</script>
<div id="main-nav"></div>
</div><!-- top -->
<div id="side-nav" class="ui-resizable side-nav-resizable">
<div id="nav-tree">
<div id="nav-tree-contents">
<div id="nav-sync" class="sync"></div>
</div>
</div>
<div id="splitbar" style="-moz-user-select:none;"
class="ui-resizable-handle">
</div>
</div>
<script type="text/javascript">
$(function(){initNavTree('dir_bfcb6842af0098861ea59b43701e0022.html','',''); });
</script>
<div id="container">
<div id="doc-content">
<!-- window showing the filter options -->
<div id="MSearchSelectWindow"
onmouseover="return searchBox.OnSearchSelectShow()"
onmouseout="return searchBox.OnSearchSelectHide()"
onkeydown="return searchBox.OnSearchSelectKey(event)">
</div>
<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<div id="MSearchResults">
<div class="SRPage">
<div id="SRIndex">
<div id="SRResults"></div>
<div class="SRStatus" id="Loading">Loading...</div>
<div class="SRStatus" id="Searching">Searching...</div>
<div class="SRStatus" id="NoMatches">No Matches</div>
</div>
</div>
</div>
</div>
<div class="header">
<div class="headertitle"><div class="title">controllers Directory Reference</div></div>
</div><!--header-->
<div class="contents">
<table class="memberdecls">
<tr class="heading"><td colspan="2"><h2 id="header-subdirs" class="groupheader"><a id="subdirs" name="subdirs"></a>
Directories</h2></td></tr>
<tr class="memitem:templates_5Fc" id="r_templates_5Fc"><td class="memItemLeft"><span class="iconfolder"><div class="folder-icon"></div></span>&#160;</td><td class="memItemRight"><a class="el" href="dir_5498806e52ccd7d2d905ac8baf67301b.html">templates_c</a></td></tr>
</table>
</div><!-- contents -->
</div><!-- doc-content -->
<div id="page-nav" class="page-nav-panel">
<div id="page-nav-resize-handle"></div>
<div id="page-nav-tree">
<div id="page-nav-contents">
</div><!-- page-nav-contents -->
</div><!-- page-nav-tree -->
</div><!-- page-nav -->
</div><!-- container -->
<!-- start footer part -->
<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
<ul>
<li class="navelem"><b>Users</b></li><li class="navelem"><b>Guill</b></li><li class="navelem"><a href="dir_2c23dcab3ba0e8633898b60485787967.html">projet_php</a></li><li class="navelem"><b>controllers</b></li>
<li class="footer">Generated by <a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.16.1 </li>
</ul>
</div>
</body>
</html>

View file

@ -5,7 +5,7 @@
<meta http-equiv="X-UA-Compatible" content="IE=11"/>
<meta name="generator" content="Doxygen 1.16.1"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>Folliow: entities Directory Reference</title>
<title>Folliow: C:/Users Directory Reference</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
@ -28,6 +28,7 @@
<td id="projectalign">
<div id="projectname">Folliow
</div>
<div id="projectbrief">Un projet de site web réaliser en PHP</div>
</td>
</tr>
</tbody>
@ -62,7 +63,7 @@ $(function() {
</div>
</div>
<script type="text/javascript">
$(function(){initNavTree('dir_9404ca00d5cf333c309ae0ebf80749c4.html','',''); });
$(function(){initNavTree('dir_d522931ffa1371640980b621734a4381.html','',''); });
</script>
<div id="container">
<div id="doc-content">
@ -88,7 +89,7 @@ $(function(){initNavTree('dir_9404ca00d5cf333c309ae0ebf80749c4.html','',''); });
</div>
<div class="header">
<div class="headertitle"><div class="title">entities Directory Reference</div></div>
<div class="headertitle"><div class="title">Users Directory Reference</div></div>
</div><!--header-->
<div class="contents">
</div><!-- contents -->
@ -104,7 +105,7 @@ $(function(){initNavTree('dir_9404ca00d5cf333c309ae0ebf80749c4.html','',''); });
<!-- start footer part -->
<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
<ul>
<li class="navelem"><b>entities</b></li>
<li class="navelem"><b>Users</b></li>
<li class="footer">Generated by <a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.16.1 </li>
</ul>
</div>

View file

@ -0,0 +1,118 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en-US">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=11"/>
<meta name="generator" content="Doxygen 1.16.1"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>Folliow: C:/Users/Guill Directory Reference</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<script type="text/javascript" src="clipboard.js"></script>
<link href="navtree.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="navtreedata.js"></script>
<script type="text/javascript" src="navtree.js"></script>
<script type="text/javascript" src="cookie.js"></script>
<link href="search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="search/searchdata.js"></script>
<script type="text/javascript" src="search/search.js"></script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr id="projectrow">
<td id="projectalign">
<div id="projectname">Folliow
</div>
<div id="projectbrief">Un projet de site web réaliser en PHP</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.16.1 -->
<script type="text/javascript">
var searchBox = new SearchBox("searchBox", "search/",'.html');
</script>
<script type="text/javascript">
$(function() { codefold.init(); });
</script>
<script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script>
<script type="text/javascript">
$(function() {
initMenu('',true,false,'search.php','Search',true);
$(function() { init_search(); });
});
</script>
<div id="main-nav"></div>
</div><!-- top -->
<div id="side-nav" class="ui-resizable side-nav-resizable">
<div id="nav-tree">
<div id="nav-tree-contents">
<div id="nav-sync" class="sync"></div>
</div>
</div>
<div id="splitbar" style="-moz-user-select:none;"
class="ui-resizable-handle">
</div>
</div>
<script type="text/javascript">
$(function(){initNavTree('dir_d6b6a3db1c3a00708b1a36123c6a63cc.html','',''); });
</script>
<div id="container">
<div id="doc-content">
<!-- window showing the filter options -->
<div id="MSearchSelectWindow"
onmouseover="return searchBox.OnSearchSelectShow()"
onmouseout="return searchBox.OnSearchSelectHide()"
onkeydown="return searchBox.OnSearchSelectKey(event)">
</div>
<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<div id="MSearchResults">
<div class="SRPage">
<div id="SRIndex">
<div id="SRResults"></div>
<div class="SRStatus" id="Loading">Loading...</div>
<div class="SRStatus" id="Searching">Searching...</div>
<div class="SRStatus" id="NoMatches">No Matches</div>
</div>
</div>
</div>
</div>
<div class="header">
<div class="headertitle"><div class="title">Guill Directory Reference</div></div>
</div><!--header-->
<div class="contents">
<table class="memberdecls">
<tr class="heading"><td colspan="2"><h2 id="header-subdirs" class="groupheader"><a id="subdirs" name="subdirs"></a>
Directories</h2></td></tr>
<tr class="memitem:projet_5Fphp" id="r_projet_5Fphp"><td class="memItemLeft"><span class="iconfolder"><div class="folder-icon"></div></span>&#160;</td><td class="memItemRight"><a class="el" href="dir_2c23dcab3ba0e8633898b60485787967.html">projet_php</a></td></tr>
</table>
</div><!-- contents -->
</div><!-- doc-content -->
<div id="page-nav" class="page-nav-panel">
<div id="page-nav-resize-handle"></div>
<div id="page-nav-tree">
<div id="page-nav-contents">
</div><!-- page-nav-contents -->
</div><!-- page-nav-tree -->
</div><!-- page-nav -->
</div><!-- container -->
<!-- start footer part -->
<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
<ul>
<li class="navelem"><b>Users</b></li><li class="navelem"><b>Guill</b></li>
<li class="footer">Generated by <a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.16.1 </li>
</ul>
</div>
</body>
</html>

View file

@ -0,0 +1,113 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en-US">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=11"/>
<meta name="generator" content="Doxygen 1.16.1"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>Folliow: C:/Users/Guill/projet_php/models Directory Reference</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<script type="text/javascript" src="clipboard.js"></script>
<link href="navtree.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="navtreedata.js"></script>
<script type="text/javascript" src="navtree.js"></script>
<script type="text/javascript" src="cookie.js"></script>
<link href="search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="search/searchdata.js"></script>
<script type="text/javascript" src="search/search.js"></script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr id="projectrow">
<td id="projectalign">
<div id="projectname">Folliow
</div>
<div id="projectbrief">Un projet de site web réaliser en PHP</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.16.1 -->
<script type="text/javascript">
var searchBox = new SearchBox("searchBox", "search/",'.html');
</script>
<script type="text/javascript">
$(function() { codefold.init(); });
</script>
<script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script>
<script type="text/javascript">
$(function() {
initMenu('',true,false,'search.php','Search',true);
$(function() { init_search(); });
});
</script>
<div id="main-nav"></div>
</div><!-- top -->
<div id="side-nav" class="ui-resizable side-nav-resizable">
<div id="nav-tree">
<div id="nav-tree-contents">
<div id="nav-sync" class="sync"></div>
</div>
</div>
<div id="splitbar" style="-moz-user-select:none;"
class="ui-resizable-handle">
</div>
</div>
<script type="text/javascript">
$(function(){initNavTree('dir_f880fbcdfabe64616040b95a4e03089d.html','',''); });
</script>
<div id="container">
<div id="doc-content">
<!-- window showing the filter options -->
<div id="MSearchSelectWindow"
onmouseover="return searchBox.OnSearchSelectShow()"
onmouseout="return searchBox.OnSearchSelectHide()"
onkeydown="return searchBox.OnSearchSelectKey(event)">
</div>
<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<div id="MSearchResults">
<div class="SRPage">
<div id="SRIndex">
<div id="SRResults"></div>
<div class="SRStatus" id="Loading">Loading...</div>
<div class="SRStatus" id="Searching">Searching...</div>
<div class="SRStatus" id="NoMatches">No Matches</div>
</div>
</div>
</div>
</div>
<div class="header">
<div class="headertitle"><div class="title">models Directory Reference</div></div>
</div><!--header-->
<div class="contents">
</div><!-- contents -->
</div><!-- doc-content -->
<div id="page-nav" class="page-nav-panel">
<div id="page-nav-resize-handle"></div>
<div id="page-nav-tree">
<div id="page-nav-contents">
</div><!-- page-nav-contents -->
</div><!-- page-nav-tree -->
</div><!-- page-nav -->
</div><!-- container -->
<!-- start footer part -->
<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
<ul>
<li class="navelem"><b>Users</b></li><li class="navelem"><b>Guill</b></li><li class="navelem"><a href="dir_2c23dcab3ba0e8633898b60485787967.html">projet_php</a></li><li class="navelem"><b>models</b></li>
<li class="footer">Generated by <a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.16.1 </li>
</ul>
</div>
</body>
</html>

View file

@ -157,11 +157,11 @@
<a href="class_models_1_1_user_model.html#ad83e4adc529c6c0a4925e4d74c7c7ae7"/>
<a href="class_models_1_1_user_model.html#add0b4b63ca02cb8b73ad136b93ccf52f"/>
<a href="classes.html"/>
<a href="dir_1ae4179d5e953611aae20c997279e02c.html"/>
<a href="dir_2262efd7ced881ba2289deea4945d6ba.html"/>
<a href="dir_78f8c0daf938bfa31437d013d3fc896d.html"/>
<a href="dir_87b6ed4386158a4d6cd0ecd5fb5bd5c2.html"/>
<a href="dir_9404ca00d5cf333c309ae0ebf80749c4.html"/>
<a href="dir_1c617d677ef58765205e8a044aafa06e.html"/>
<a href="dir_2756e6070b02be5d362619ded783829c.html"/>
<a href="dir_3a74e34fc6fa82edd10e4beee4ded801.html"/>
<a href="dir_91977dd5ba3542af9d4aecff9e888690.html"/>
<a href="dir_a64c5c967bbc6a18c5d8eb713e8e97ff.html"/>
<a href="doxygen_crawl.html"/>
<a href="functions.html"/>
<a href="functions_func.html"/>

View file

@ -28,6 +28,7 @@
<td id="projectalign">
<div id="projectname">Folliow
</div>
<div id="projectbrief">Un projet de site web réaliser en PHP</div>
</td>
</tr>
</tbody>

View file

@ -28,6 +28,7 @@
<td id="projectalign">
<div id="projectname">Folliow
</div>
<div id="projectbrief">Un projet de site web réaliser en PHP</div>
</td>
</tr>
</tbody>

View file

@ -28,6 +28,7 @@
<td id="projectalign">
<div id="projectname">Folliow
</div>
<div id="projectbrief">Un projet de site web réaliser en PHP</div>
</td>
</tr>
</tbody>

View file

@ -28,6 +28,7 @@
<td id="projectalign">
<div id="projectname">Folliow
</div>
<div id="projectbrief">Un projet de site web réaliser en PHP</div>
</td>
</tr>
</tbody>

10
html/search/all_10.js Normal file
View file

@ -0,0 +1,10 @@
var searchData=
[
['update_0',['update',['../class_models_1_1_user_model.html#a4f2888d0004092a367fa2d1b2620818f',1,'Models::UserModel']]],
['updateimagestatus_1',['updateImageStatus',['../class_models_1_1_project_model.html#aeb942ee7cfbea8509e49a5114228f53b',1,'Models::ProjectModel']]],
['updateproject_2',['updateProject',['../class_models_1_1_project_model.html#a1736ff58fc8fadf358ddb510b4c8d3f7',1,'Models::ProjectModel']]],
['user_3',['User',['../class_entities_1_1_user.html',1,'Entities']]],
['user_4',['user',['../class_controllers_1_1_user_ctrl.html#ae8a275690ff1b618e1947378b0ed73ae',1,'Controllers::UserCtrl']]],
['userctrl_5',['UserCtrl',['../class_controllers_1_1_user_ctrl.html',1,'Controllers']]],
['usermodel_6',['UserModel',['../class_models_1_1_user_model.html',1,'Models']]]
];

4
html/search/all_11.js Normal file
View file

@ -0,0 +1,4 @@
var searchData=
[
['verifuser_0',['verifUser',['../class_models_1_1_user_model.html#a04e007855c8aa842068779d8a871bb42',1,'Models::UserModel']]]
];

4
html/search/all_12.js Normal file
View file

@ -0,0 +1,4 @@
var searchData=
[
['_20projet_20php_0',['Folliow Projet PHP',['../dir_3a74e34fc6fa82edd10e4beee4ded801.html#autotoc_md0',1,'']]]
];

View file

@ -1,12 +1,15 @@
var searchData=
[
['findall_0',['findAll',['../class_models_1_1_project_model.html#acbfa7e289b7712cf5200f398cff05c43',1,'Models::ProjectModel']]],
['findallauthorisation_1',['findAllAuthorisation',['../class_models_1_1_authorisation_model.html#af7bd93cc2fd6ac548707d3a66a8380df',1,'Models::AuthorisationModel']]],
['findallcategory_2',['findAllCategory',['../class_models_1_1_category_model.html#a4e6d48b9130d9cb4cc08a88cef84e8f9',1,'Models::CategoryModel']]],
['findallimage_3',['findAllImage',['../class_models_1_1_image_model.html#aaf9e88eb8d1aff57a085e1d38de15060',1,'Models::ImageModel']]],
['findallusers_4',['findAllUsers',['../class_models_1_1_user_model.html#a404b6b890d58bfa7220da4a08a60f445',1,'Models::UserModel']]],
['findimage_5',['findImage',['../class_models_1_1_project_model.html#a0a8e47e6d6b839638ab85addfda45e3b',1,'Models::ProjectModel']]],
['findone_6',['findOne',['../class_models_1_1_project_model.html#ae0fabc6b177cda25efeee083f904c207',1,'Models::ProjectModel']]],
['finduserbyid_7',['findUserById',['../class_models_1_1_user_model.html#a6620c458b01ecbb1ed76083a4ac2345e',1,'Models::UserModel']]],
['finduserbypseudo_8',['findUserByPseudo',['../class_models_1_1_user_model.html#a9f95476e8b07dbc01f711f36672684ad',1,'Models::UserModel']]]
['features_0',['Features',['../dir_3a74e34fc6fa82edd10e4beee4ded801.html#autotoc_md2',1,'']]],
['findall_1',['findAll',['../class_models_1_1_project_model.html#acbfa7e289b7712cf5200f398cff05c43',1,'Models::ProjectModel']]],
['findallauthorisation_2',['findAllAuthorisation',['../class_models_1_1_authorisation_model.html#af7bd93cc2fd6ac548707d3a66a8380df',1,'Models::AuthorisationModel']]],
['findallcategory_3',['findAllCategory',['../class_models_1_1_category_model.html#a4e6d48b9130d9cb4cc08a88cef84e8f9',1,'Models::CategoryModel']]],
['findallimage_4',['findAllImage',['../class_models_1_1_image_model.html#aaf9e88eb8d1aff57a085e1d38de15060',1,'Models::ImageModel']]],
['findallusers_5',['findAllUsers',['../class_models_1_1_user_model.html#a404b6b890d58bfa7220da4a08a60f445',1,'Models::UserModel']]],
['findimage_6',['findImage',['../class_models_1_1_project_model.html#a0a8e47e6d6b839638ab85addfda45e3b',1,'Models::ProjectModel']]],
['findone_7',['findOne',['../class_models_1_1_project_model.html#ae0fabc6b177cda25efeee083f904c207',1,'Models::ProjectModel']]],
['finduserbyid_8',['findUserById',['../class_models_1_1_user_model.html#a6620c458b01ecbb1ed76083a4ac2345e',1,'Models::UserModel']]],
['finduserbypseudo_9',['findUserByPseudo',['../class_models_1_1_user_model.html#a9f95476e8b07dbc01f711f36672684ad',1,'Models::UserModel']]],
['folliow_20_20projet_20php_10',['Folliow Projet PHP',['../dir_3a74e34fc6fa82edd10e4beee4ded801.html#autotoc_md0',1,'']]],
['future_20improvements_11',['Future Improvements',['../dir_3a74e34fc6fa82edd10e4beee4ded801.html#autotoc_md12',1,'']]]
];

View file

@ -2,6 +2,8 @@ var searchData=
[
['image_0',['Image',['../class_entities_1_1_image.html',1,'Entities']]],
['imagemodel_1',['ImageModel',['../class_models_1_1_image_model.html',1,'Models']]],
['insert_2',['insert',['../class_models_1_1_project_model.html#ad2a2f3e436d06db0fc4af3c44c867805',1,'Models\\ProjectModel\\insert()'],['../class_models_1_1_user_model.html#ab0eb29a478a1230d479aee1046b0f1dc',1,'Models\\UserModel\\insert()']]],
['insertcategory_3',['insertCategory',['../class_models_1_1_category_model.html#a1102f9228de8f7938a1f35a3abbc2dc7',1,'Models::CategoryModel']]]
['improvements_2',['Future Improvements',['../dir_3a74e34fc6fa82edd10e4beee4ded801.html#autotoc_md12',1,'']]],
['insert_3',['insert',['../class_models_1_1_project_model.html#ad2a2f3e436d06db0fc4af3c44c867805',1,'Models\\ProjectModel\\insert()'],['../class_models_1_1_user_model.html#ab0eb29a478a1230d479aee1046b0f1dc',1,'Models\\UserModel\\insert()']]],
['insertcategory_4',['insertCategory',['../class_models_1_1_category_model.html#a1102f9228de8f7938a1f35a3abbc2dc7',1,'Models::CategoryModel']]],
['installation_5',['Installation',['../dir_3a74e34fc6fa82edd10e4beee4ded801.html#autotoc_md8',1,'']]]
];

View file

@ -1,5 +1,7 @@
var searchData=
[
['login_0',['login',['../class_controllers_1_1_user_ctrl.html#aa311da27ba5706f5710cea7706c8eae1',1,'Controllers::UserCtrl']]],
['logout_1',['logout',['../class_controllers_1_1_user_ctrl.html#a082405d89acd6835c3a7c7a08a7adbab',1,'Controllers::UserCtrl']]]
['learning_20objectives_0',['Learning Objectives',['../dir_3a74e34fc6fa82edd10e4beee4ded801.html#autotoc_md10',1,'']]],
['license_1',['License',['../dir_3a74e34fc6fa82edd10e4beee4ded801.html#autotoc_md14',1,'']]],
['login_2',['login',['../class_controllers_1_1_user_ctrl.html#aa311da27ba5706f5710cea7706c8eae1',1,'Controllers::UserCtrl']]],
['logout_3',['logout',['../class_controllers_1_1_user_ctrl.html#a082405d89acd6835c3a7c7a08a7adbab',1,'Controllers::UserCtrl']]]
];

View file

@ -1,8 +1,4 @@
var searchData=
[
['pagectrl_0',['PageCtrl',['../class_controllers_1_1_page_ctrl.html',1,'Controllers']]],
['project_1',['Project',['../class_entities_1_1_project.html',1,'Entities']]],
['projectctrl_2',['ProjectCtrl',['../class_controllers_1_1_project_ctrl.html',1,'Controllers']]],
['projectmodel_3',['ProjectModel',['../class_models_1_1_project_model.html',1,'Models']]],
['pseudoexists_4',['pseudoExists',['../class_models_1_1_user_model.html#aaf42cd7de4bddf6d3a075aa9bc252b8f',1,'Models::UserModel']]]
['objectives_0',['Learning Objectives',['../dir_3a74e34fc6fa82edd10e4beee4ded801.html#autotoc_md10',1,'']]]
];

View file

@ -1,5 +1,11 @@
var searchData=
[
['refuse_0',['refuse',['../class_controllers_1_1_project_ctrl.html#a68a43ec4877b5210ef8ad989fbc14d82',1,'Controllers\\ProjectCtrl\\refuse()'],['../class_models_1_1_project_model.html#a64714f38f74ab942d027f04e86e40d25',1,'Models\\ProjectModel\\refuse()']]],
['remember_1',['remember',['../class_models_1_1_user_model.html#a30563e7cabc0c9aa2bf4157b241ad55a',1,'Models::UserModel']]]
['pagectrl_0',['PageCtrl',['../class_controllers_1_1_page_ctrl.html',1,'Controllers']]],
['php_1',['Folliow Projet PHP',['../dir_3a74e34fc6fa82edd10e4beee4ded801.html#autotoc_md0',1,'']]],
['project_2',['Project',['../class_entities_1_1_project.html',1,'Entities']]],
['project_20structure_3',['Project Structure',['../dir_3a74e34fc6fa82edd10e4beee4ded801.html#autotoc_md6',1,'']]],
['projectctrl_4',['ProjectCtrl',['../class_controllers_1_1_project_ctrl.html',1,'Controllers']]],
['projectmodel_5',['ProjectModel',['../class_models_1_1_project_model.html',1,'Models']]],
['projet_20php_6',['Folliow Projet PHP',['../dir_3a74e34fc6fa82edd10e4beee4ded801.html#autotoc_md0',1,'']]],
['pseudoexists_7',['pseudoExists',['../class_models_1_1_user_model.html#aaf42cd7de4bddf6d3a075aa9bc252b8f',1,'Models::UserModel']]]
];

View file

@ -1,31 +1,5 @@
var searchData=
[
['search_0',['search',['../class_controllers_1_1_project_ctrl.html#a796bf438724e047aeef18579732a3780',1,'Controllers::ProjectCtrl']]],
['sendemail_1',['sendEmail',['../class_controllers_1_1_project_ctrl.html#a6665aeb6e312ea89283ce785f0dfad60',1,'Controllers::ProjectCtrl']]],
['setaccountcreation_2',['setAccountCreation',['../class_entities_1_1_user.html#aa8eb1e10f1ab32dcfa4df144fe02ba16',1,'Entities::User']]],
['setalt_3',['setAlt',['../class_entities_1_1_image.html#a23d9d1d65334db3a72b3c19e146cfe28',1,'Entities::Image']]],
['setbirth_4',['setBirth',['../class_entities_1_1_user.html#a4a6578fae7673e253c0ddb1f95cf227c',1,'Entities::User']]],
['setcategory_5',['setCategory',['../class_entities_1_1_project.html#a309475f82c8fca1a84f96f802f05a5fb',1,'Entities::Project']]],
['setcontent_6',['setContent',['../class_entities_1_1_project.html#a04a5eddb7c3abc7bf31fa25b58f046bf',1,'Entities::Project']]],
['setcreation_5fdate_7',['setCreation_date',['../class_entities_1_1_project.html#a547ac5297a9b9efc8a4b6bef00eb6c2e',1,'Entities::Project']]],
['setcreatorname_8',['setCreatorName',['../class_entities_1_1_project.html#aa37594941aea25a0f0d3a33d6a8757b7',1,'Entities::Project']]],
['setdescription_9',['setDescription',['../class_entities_1_1_project.html#a31fad3e39336ea079ea758e051866627',1,'Entities\\Project\\setDescription()'],['../class_entities_1_1_user.html#a3eda7afea80371b606cd289c66ab3e7c',1,'Entities\\User\\setDescription(string $description)']]],
['setfirstname_10',['setFirstname',['../class_entities_1_1_user.html#a102793bdeeaa7eaa2bca4e31eb3782e5',1,'Entities::User']]],
['setid_11',['setId',['../class_entities_1_1_authorisation.html#af8e956b8b0343ff7d1b955c26cb0c780',1,'Entities\\Authorisation\\setId()'],['../class_entities_1_1_category.html#a87313ad678fb2a2a8efb435cf0bdb9a0',1,'Entities\\Category\\setId()'],['../class_entities_1_1_image.html#a87313ad678fb2a2a8efb435cf0bdb9a0',1,'Entities\\Image\\setId()'],['../class_entities_1_1_project.html#af8e956b8b0343ff7d1b955c26cb0c780',1,'Entities\\Project\\setId()'],['../class_entities_1_1_user.html#af8e956b8b0343ff7d1b955c26cb0c780',1,'Entities\\User\\setId(int $id)']]],
['setimage_12',['setImage',['../class_entities_1_1_user.html#a6c7550f5363e74b3ee9225bf85e11b8d',1,'Entities::User']]],
['setlocation_13',['setLocation',['../class_entities_1_1_user.html#a4c5c6e78f1e8c0ae4bf416d0f0d73ef1',1,'Entities::User']]],
['setmail_14',['setMail',['../class_entities_1_1_user.html#ad5ba083b208ed11aa16938a8ba87a78c',1,'Entities::User']]],
['setname_15',['setName',['../class_entities_1_1_authorisation.html#a392752b62c4f6aacea5c269690921ef3',1,'Entities\\Authorisation\\setName()'],['../class_entities_1_1_category.html#a2fe666694997d047711d7653eca2f132',1,'Entities\\Category\\setName()'],['../class_entities_1_1_image.html#a2fe666694997d047711d7653eca2f132',1,'Entities\\Image\\setName()'],['../class_entities_1_1_user.html#a392752b62c4f6aacea5c269690921ef3',1,'Entities\\User\\setName()']]],
['setparent_16',['setParent',['../class_entities_1_1_category.html#a3b949fc022c82eb25e8650e0e01404fa',1,'Entities::Category']]],
['setphone_17',['setPhone',['../class_entities_1_1_user.html#a652bfdb5ce275246ece54449fe5ca59e',1,'Entities::User']]],
['setproject_5fdeleted_5fat_18',['setProject_deleted_at',['../class_entities_1_1_project.html#a621433ce4917a196047b78e58e38d7fe',1,'Entities::Project']]],
['setpseudo_19',['setPseudo',['../class_entities_1_1_user.html#a02d546b854db37406ec591d3e16809eb',1,'Entities::User']]],
['setpwd_20',['setPwd',['../class_entities_1_1_user.html#a9cc7dc33859895f98da4e22f5ae1a9bf',1,'Entities::User']]],
['setstatus_21',['setStatus',['../class_entities_1_1_image.html#a7d02c100d684fe1dffc6cb3486a48511',1,'Entities\\Image\\setStatus()'],['../class_entities_1_1_project.html#a7d02c100d684fe1dffc6cb3486a48511',1,'Entities\\Project\\setStatus()'],['../class_entities_1_1_user.html#a2f8308ff566858664b95361214f29eac',1,'Entities\\User\\setStatus()']]],
['setthumbnail_22',['setThumbnail',['../class_entities_1_1_project.html#a89bdfd911301f4ac284a937e93f4de50',1,'Entities::Project']]],
['settitle_23',['setTitle',['../class_entities_1_1_project.html#a884ba9bb0d54bde7839e798db7964476',1,'Entities::Project']]],
['setuser_5fid_24',['setUser_id',['../class_entities_1_1_project.html#a74bdd06d4bca0de42e55bdf7763ebfc4',1,'Entities::Project']]],
['setuser_5fimage_25',['setUser_image',['../class_entities_1_1_project.html#a17164d0ccbccaceb60280836d060e21f',1,'Entities::Project']]],
['setwork_26',['setWork',['../class_entities_1_1_user.html#ae6c2c46108019bd83091add6417eb894',1,'Entities::User']]],
['signup_27',['signup',['../class_controllers_1_1_user_ctrl.html#a852ed40b79f143c1478699d908f46957',1,'Controllers::UserCtrl']]]
['refuse_0',['refuse',['../class_controllers_1_1_project_ctrl.html#a68a43ec4877b5210ef8ad989fbc14d82',1,'Controllers\\ProjectCtrl\\refuse()'],['../class_models_1_1_project_model.html#a64714f38f74ab942d027f04e86e40d25',1,'Models\\ProjectModel\\refuse()']]],
['remember_1',['remember',['../class_models_1_1_user_model.html#a30563e7cabc0c9aa2bf4157b241ad55a',1,'Models::UserModel']]]
];

View file

@ -1,10 +1,33 @@
var searchData=
[
['update_0',['update',['../class_models_1_1_user_model.html#a4f2888d0004092a367fa2d1b2620818f',1,'Models::UserModel']]],
['updateimagestatus_1',['updateImageStatus',['../class_models_1_1_project_model.html#aeb942ee7cfbea8509e49a5114228f53b',1,'Models::ProjectModel']]],
['updateproject_2',['updateProject',['../class_models_1_1_project_model.html#a1736ff58fc8fadf358ddb510b4c8d3f7',1,'Models::ProjectModel']]],
['user_3',['User',['../class_entities_1_1_user.html',1,'Entities']]],
['user_4',['user',['../class_controllers_1_1_user_ctrl.html#ae8a275690ff1b618e1947378b0ed73ae',1,'Controllers::UserCtrl']]],
['userctrl_5',['UserCtrl',['../class_controllers_1_1_user_ctrl.html',1,'Controllers']]],
['usermodel_6',['UserModel',['../class_models_1_1_user_model.html',1,'Models']]]
['search_0',['search',['../class_controllers_1_1_project_ctrl.html#a796bf438724e047aeef18579732a3780',1,'Controllers::ProjectCtrl']]],
['sendemail_1',['sendEmail',['../class_controllers_1_1_project_ctrl.html#a6665aeb6e312ea89283ce785f0dfad60',1,'Controllers::ProjectCtrl']]],
['setaccountcreation_2',['setAccountCreation',['../class_entities_1_1_user.html#aa8eb1e10f1ab32dcfa4df144fe02ba16',1,'Entities::User']]],
['setalt_3',['setAlt',['../class_entities_1_1_image.html#a23d9d1d65334db3a72b3c19e146cfe28',1,'Entities::Image']]],
['setbirth_4',['setBirth',['../class_entities_1_1_user.html#a4a6578fae7673e253c0ddb1f95cf227c',1,'Entities::User']]],
['setcategory_5',['setCategory',['../class_entities_1_1_project.html#a309475f82c8fca1a84f96f802f05a5fb',1,'Entities::Project']]],
['setcontent_6',['setContent',['../class_entities_1_1_project.html#a04a5eddb7c3abc7bf31fa25b58f046bf',1,'Entities::Project']]],
['setcreation_5fdate_7',['setCreation_date',['../class_entities_1_1_project.html#a547ac5297a9b9efc8a4b6bef00eb6c2e',1,'Entities::Project']]],
['setcreatorname_8',['setCreatorName',['../class_entities_1_1_project.html#aa37594941aea25a0f0d3a33d6a8757b7',1,'Entities::Project']]],
['setdescription_9',['setDescription',['../class_entities_1_1_project.html#a31fad3e39336ea079ea758e051866627',1,'Entities\\Project\\setDescription()'],['../class_entities_1_1_user.html#a3eda7afea80371b606cd289c66ab3e7c',1,'Entities\\User\\setDescription(string $description)']]],
['setfirstname_10',['setFirstname',['../class_entities_1_1_user.html#a102793bdeeaa7eaa2bca4e31eb3782e5',1,'Entities::User']]],
['setid_11',['setId',['../class_entities_1_1_authorisation.html#af8e956b8b0343ff7d1b955c26cb0c780',1,'Entities\\Authorisation\\setId()'],['../class_entities_1_1_category.html#a87313ad678fb2a2a8efb435cf0bdb9a0',1,'Entities\\Category\\setId()'],['../class_entities_1_1_image.html#a87313ad678fb2a2a8efb435cf0bdb9a0',1,'Entities\\Image\\setId()'],['../class_entities_1_1_project.html#af8e956b8b0343ff7d1b955c26cb0c780',1,'Entities\\Project\\setId()'],['../class_entities_1_1_user.html#af8e956b8b0343ff7d1b955c26cb0c780',1,'Entities\\User\\setId(int $id)']]],
['setimage_12',['setImage',['../class_entities_1_1_user.html#a6c7550f5363e74b3ee9225bf85e11b8d',1,'Entities::User']]],
['setlocation_13',['setLocation',['../class_entities_1_1_user.html#a4c5c6e78f1e8c0ae4bf416d0f0d73ef1',1,'Entities::User']]],
['setmail_14',['setMail',['../class_entities_1_1_user.html#ad5ba083b208ed11aa16938a8ba87a78c',1,'Entities::User']]],
['setname_15',['setName',['../class_entities_1_1_authorisation.html#a392752b62c4f6aacea5c269690921ef3',1,'Entities\\Authorisation\\setName()'],['../class_entities_1_1_category.html#a2fe666694997d047711d7653eca2f132',1,'Entities\\Category\\setName()'],['../class_entities_1_1_image.html#a2fe666694997d047711d7653eca2f132',1,'Entities\\Image\\setName()'],['../class_entities_1_1_user.html#a392752b62c4f6aacea5c269690921ef3',1,'Entities\\User\\setName()']]],
['setparent_16',['setParent',['../class_entities_1_1_category.html#a3b949fc022c82eb25e8650e0e01404fa',1,'Entities::Category']]],
['setphone_17',['setPhone',['../class_entities_1_1_user.html#a652bfdb5ce275246ece54449fe5ca59e',1,'Entities::User']]],
['setproject_5fdeleted_5fat_18',['setProject_deleted_at',['../class_entities_1_1_project.html#a621433ce4917a196047b78e58e38d7fe',1,'Entities::Project']]],
['setpseudo_19',['setPseudo',['../class_entities_1_1_user.html#a02d546b854db37406ec591d3e16809eb',1,'Entities::User']]],
['setpwd_20',['setPwd',['../class_entities_1_1_user.html#a9cc7dc33859895f98da4e22f5ae1a9bf',1,'Entities::User']]],
['setstatus_21',['setStatus',['../class_entities_1_1_image.html#a7d02c100d684fe1dffc6cb3486a48511',1,'Entities\\Image\\setStatus()'],['../class_entities_1_1_project.html#a7d02c100d684fe1dffc6cb3486a48511',1,'Entities\\Project\\setStatus()'],['../class_entities_1_1_user.html#a2f8308ff566858664b95361214f29eac',1,'Entities\\User\\setStatus()']]],
['setthumbnail_22',['setThumbnail',['../class_entities_1_1_project.html#a89bdfd911301f4ac284a937e93f4de50',1,'Entities::Project']]],
['settitle_23',['setTitle',['../class_entities_1_1_project.html#a884ba9bb0d54bde7839e798db7964476',1,'Entities::Project']]],
['setuser_5fid_24',['setUser_id',['../class_entities_1_1_project.html#a74bdd06d4bca0de42e55bdf7763ebfc4',1,'Entities::Project']]],
['setuser_5fimage_25',['setUser_image',['../class_entities_1_1_project.html#a17164d0ccbccaceb60280836d060e21f',1,'Entities::Project']]],
['setwork_26',['setWork',['../class_entities_1_1_user.html#ae6c2c46108019bd83091add6417eb894',1,'Entities::User']]],
['signup_27',['signup',['../class_controllers_1_1_user_ctrl.html#a852ed40b79f143c1478699d908f46957',1,'Controllers::UserCtrl']]],
['stack_28',['Tech Stack',['../dir_3a74e34fc6fa82edd10e4beee4ded801.html#autotoc_md4',1,'']]],
['structure_29',['Project Structure',['../dir_3a74e34fc6fa82edd10e4beee4ded801.html#autotoc_md6',1,'']]]
];

View file

@ -1,4 +1,4 @@
var searchData=
[
['verifuser_0',['verifUser',['../class_models_1_1_user_model.html#a04e007855c8aa842068779d8a871bb42',1,'Models::UserModel']]]
['tech_20stack_0',['Tech Stack',['../dir_3a74e34fc6fa82edd10e4beee4ded801.html#autotoc_md4',1,'']]]
];

6
html/search/pages_0.js Normal file
View file

@ -0,0 +1,6 @@
var searchData=
[
['features_0',['Features',['../dir_3a74e34fc6fa82edd10e4beee4ded801.html#autotoc_md2',1,'']]],
['folliow_20_20projet_20php_1',['Folliow Projet PHP',['../dir_3a74e34fc6fa82edd10e4beee4ded801.html#autotoc_md0',1,'']]],
['future_20improvements_2',['Future Improvements',['../dir_3a74e34fc6fa82edd10e4beee4ded801.html#autotoc_md12',1,'']]]
];

5
html/search/pages_1.js Normal file
View file

@ -0,0 +1,5 @@
var searchData=
[
['improvements_0',['Future Improvements',['../dir_3a74e34fc6fa82edd10e4beee4ded801.html#autotoc_md12',1,'']]],
['installation_1',['Installation',['../dir_3a74e34fc6fa82edd10e4beee4ded801.html#autotoc_md8',1,'']]]
];

5
html/search/pages_2.js Normal file
View file

@ -0,0 +1,5 @@
var searchData=
[
['learning_20objectives_0',['Learning Objectives',['../dir_3a74e34fc6fa82edd10e4beee4ded801.html#autotoc_md10',1,'']]],
['license_1',['License',['../dir_3a74e34fc6fa82edd10e4beee4ded801.html#autotoc_md14',1,'']]]
];

4
html/search/pages_3.js Normal file
View file

@ -0,0 +1,4 @@
var searchData=
[
['objectives_0',['Learning Objectives',['../dir_3a74e34fc6fa82edd10e4beee4ded801.html#autotoc_md10',1,'']]]
];

6
html/search/pages_4.js Normal file
View file

@ -0,0 +1,6 @@
var searchData=
[
['php_0',['Folliow Projet PHP',['../dir_3a74e34fc6fa82edd10e4beee4ded801.html#autotoc_md0',1,'']]],
['project_20structure_1',['Project Structure',['../dir_3a74e34fc6fa82edd10e4beee4ded801.html#autotoc_md6',1,'']]],
['projet_20php_2',['Folliow Projet PHP',['../dir_3a74e34fc6fa82edd10e4beee4ded801.html#autotoc_md0',1,'']]]
];

5
html/search/pages_5.js Normal file
View file

@ -0,0 +1,5 @@
var searchData=
[
['stack_0',['Tech Stack',['../dir_3a74e34fc6fa82edd10e4beee4ded801.html#autotoc_md4',1,'']]],
['structure_1',['Project Structure',['../dir_3a74e34fc6fa82edd10e4beee4ded801.html#autotoc_md6',1,'']]]
];

4
html/search/pages_6.js Normal file
View file

@ -0,0 +1,4 @@
var searchData=
[
['tech_20stack_0',['Tech Stack',['../dir_3a74e34fc6fa82edd10e4beee4ded801.html#autotoc_md4',1,'']]]
];

4
html/search/pages_7.js Normal file
View file

@ -0,0 +1,4 @@
var searchData=
[
['_20projet_20php_0',['Folliow Projet PHP',['../dir_3a74e34fc6fa82edd10e4beee4ded801.html#autotoc_md0',1,'']]]
];

View file

@ -1,21 +1,24 @@
var indexSectionsWithContent =
{
0: "_acdefghilmprsuv",
0: "_acdefghilmoprstuv",
1: "aceimpu",
2: "_acdefghilmprsuv"
2: "_acdefghilmprsuv",
3: "filopst"
};
var indexSectionNames =
{
0: "all",
1: "classes",
2: "functions"
2: "functions",
3: "pages"
};
var indexSectionLabels =
{
0: "All",
1: "Data Structures",
2: "Functions"
2: "Functions",
3: "Pages"
};

View file

@ -2,12 +2,11 @@
session_start();
require(__DIR__ . "/vendor/autoload.php");
// Environnement
$dotenv = Dotenv\Dotenv::createImmutable(__DIR__);
$dotenv->safeLoad();
$strCtrl = $_GET['ctrl'] ?? 'project';
$strMethod = $_GET['action'] ?? 'home';
$strCtrl = preg_replace('/[^a-zA-Z]/', '', $_GET['ctrl'] ?? 'project');
$strMethod = preg_replace('/[^a-zA-Z_]/', '', $_GET['action'] ?? 'home');
$strClassName = "Controllers\\" . ucfirst($strCtrl) . "Ctrl";
@ -26,6 +25,8 @@
}
if ($boolError) {
header("Location: index.php?ctrl=error&action=error_404");
exit;
http_response_code(404); // ← important pour le SEO et les navigateurs
$error = new \Controllers\ErrorCtrl();
$error->error_404(); // ← pas de "return", juste l'appel
exit; // ← stoppe l'exécution après l'affichage
}

View file

@ -22,10 +22,18 @@
FROM category";
if ($intLimit > 0){
$strRq .= " LIMIT ".$intLimit;
$strRq .= " LIMIT :limit";
}
return $this->_db->query($strRq)->fetchAll();
$rqPrep = $this->_db->prepare($strRq);
if ($intLimit > 0){
$rqPrep->bindValue(":limit", $intLimit, PDO::PARAM_INT);
}
$rqPrep->execute();
return $rqPrep->fetchAll();
}
/**

View file

@ -22,11 +22,18 @@
$strRq = "SELECT image.*
FROM image";
if ($intLimit > 0){
$strRq .= " LIMIT :limit";
}
$rqPrep = $this->_db->prepare($strRq);
if ($intLimit > 0){
$strRq .= " LIMIT ".$intLimit;
$rqPrep->bindValue(":limit", $intLimit, PDO::PARAM_INT);
}
return $this->_db->query($strRq)->fetchAll();
$rqPrep->execute();
return $rqPrep->fetchAll();
}
}

View file

@ -10,9 +10,9 @@
public function __construct(){
try{
$this->_db = new PDO(
"mysql:host=localhost;dbname=projet_folliow",
"projet_user",
"F0lliowRules!",
"mysql:host=".$_ENV['DB_HOSTNAME'].";dbname=".$_ENV['DB_DATABASE'],
$_ENV['DB_USERNAME'],
$_ENV['DB_PASSWORD'],
array(PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC)
);
$this->_db->exec("SET CHARACTER SET utf8");

View file

@ -27,43 +27,37 @@
user_pseudo AS 'project_creatorname',
user_image
FROM project
INNER JOIN users ON user_id = project_user_id";
$strRq .= " WHERE project_deleted_at IS NULL";
$strAnd = " AND ";
INNER JOIN users ON user_id = project_user_id
WHERE 1=1";
if ($strKeywords != '') {
$strSafeKeywords = $this->_db->quote("%" . $strKeywords . "%");
$strRq .= $strAnd. " (project_title LIKE ".$strSafeKeywords."
OR project_content LIKE ".$strSafeKeywords.") ";
$strRq .= " AND (project_title LIKE :keywords OR project_content LIKE :keywords)";
}
if ($intAuthor > 0){
$strRq .= $strAnd." user_id = ".$intAuthor;
$strRq .= " AND project_user_id = :author";
}
}
if ($intCategory > 0){
$strRq .= $strAnd." project_category = ".$intCategory;
$strRq .= " AND project_category = :category";
}
if ($boolOlderThan6Months === true) {
$strRq .= $strAnd . " project_creation_date <= DATE_SUB(NOW(), INTERVAL 6 MONTH) ";
$strRq .= " AND project_creation_date <= DATE_SUB(NOW(), INTERVAL 6 MONTH)";
}
if ($intPeriod == 0){
if ($strDate != ''){
$strRq .= $strAnd." project_creation_date = '".$strDate."'";
$strRq .= " AND project_creation_date = :date_exacte";
}
}else{
} else {
if ($strStartDate != '' && $strEndDate != ''){
$strRq .= $strAnd." project_creation_date BETWEEN '".$strStartDate."' AND '".$strEndDate."'";
}else{
$strRq .= " AND project_creation_date BETWEEN :date_debut AND :date_fin";
} else {
if ($strStartDate != ''){
$strRq .= $strAnd." project_creation_date >= '".$strStartDate."'";
}else if ($strEndDate != ''){
$strRq .= $strAnd." project_creation_date <= '".$strEndDate."'";
$strRq .= " AND project_creation_date >= :date_debut";
} else if ($strEndDate != ''){
$strRq .= " AND project_creation_date <= :date_fin";
}
}
}
@ -71,10 +65,42 @@
$strRq .= " ORDER BY project_creation_date DESC";
if ($intLimit > 0){
$strRq .= " LIMIT ".$intLimit;
$strRq .= " LIMIT :limit";
}
return $this->_db->query($strRq)->fetchAll();
$rqPrep = $this->_db->prepare($strRq);
if ($strKeywords != '') {
$rqPrep->bindValue(':keywords', '%' . $strKeywords . '%', PDO::PARAM_STR);
}
if ($intAuthor > 0){
$rqPrep->bindValue(':author', $intAuthor, PDO::PARAM_INT);
}
if ($intCategory > 0){
$rqPrep->bindValue(':category', $intCategory, PDO::PARAM_INT);
}
if ($intPeriod == 0){
if ($strDate != ''){
$rqPrep->bindValue(':date_exacte', $strDate, PDO::PARAM_STR);
}
} else {
if ($strStartDate != '' && $strEndDate != ''){
$rqPrep->bindValue(':date_debut', $strStartDate, PDO::PARAM_STR);
$rqPrep->bindValue(':date_fin', $strEndDate, PDO::PARAM_STR);
} else {
if ($strStartDate != ''){
$rqPrep->bindValue(':date_debut', $strStartDate, PDO::PARAM_STR);
} else if ($strEndDate != ''){
$rqPrep->bindValue(':date_fin', $strEndDate, PDO::PARAM_STR);
}
}
}
if ($intLimit > 0){
$rqPrep->bindValue(':limit', $intLimit, PDO::PARAM_INT);
}
$rqPrep->execute();
return $rqPrep->fetchAll();
}
@ -110,9 +136,9 @@
/**
* Fonction de recherche d'un seul projet
* @param int $intId
* @return array
* @return array|bool
*/
public function findOne(int $intId) :array{
public function findOne(int $intId) :array|bool{
$strRq = "SELECT project.*,
users.user_pseudo AS 'project_creatorname',
users.user_image,
@ -168,7 +194,8 @@
public function delete_soft_project(int $intId): bool {
$strRq = "UPDATE project
SET project_deleted_at = NOW(),
project_edit_date = NOW()
project_edit_date = NOW(),
project_status = 'supprimé'
WHERE project_id = :id";
$rqPrep = $this->_db->prepare($strRq);

View file

@ -37,9 +37,15 @@
$strRq = "SELECT user_id, user_name, user_firstname, user_password, user_image, user_status, authorisation_name, user_pseudo
FROM users INNER JOIN authorisation ON authorisation.authorisation_id = users.user_status
WHERE user_mail = '".$strMail."'";
WHERE user_mail = :mail";
$arrUser = $this->_db->query($strRq)->fetch();
$rqPrep = $this->_db->prepare($strRq);
$rqPrep->bindValue(":mail", $strMail, PDO::PARAM_STR);
$rqPrep->execute();
$arrUser = $rqPrep->fetch();
if (password_verify($strPwd, $arrUser['user_password'])){
unset($arrUser['user_password']);
return $arrUser;
@ -236,7 +242,7 @@
/**
* Verifie sur le pseudo entré n'est pas déjà utilisé
* @param string $pseudo Pseudo a verifié
* @return array Tableau associatif (ou false si pas trouvé)
* @return bool Le pseudo existe ou pas
*/
public function pseudoExists(string $pseudo): bool{
@ -244,6 +250,6 @@
$rq->bindValue(":pseudo", $pseudo, PDO::PARAM_STR);
$rq->execute();
return $rq->fetchColumn();
return (bool)$rq->fetchColumn();
}
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 KiB

112
views/_partial/apigeo.tpl Normal file
View file

@ -0,0 +1,112 @@
<!-- Script d'autocomplétion ville/département — API Géo (gouvernement français) -->
<script>
(function () {
const input = document.getElementById('user_location');
const suggestions = document.getElementById('location-suggestions');
let debounceTimer = null;
// Ferme la liste si on clique ailleurs
document.addEventListener('click', function (e) {
if (!input.contains(e.target) && !suggestions.contains(e.target)) {
hideSuggestions();
}
});
input.addEventListener('input', function () {
const query = this.value.trim();
clearTimeout(debounceTimer);
if (query.length < 2) {
hideSuggestions();
return;
}
// Délai de 300 ms pour éviter trop d'appels API
debounceTimer = setTimeout(function () {
fetchCities(query);
}, 300);
});
// Navigation clavier dans la liste
input.addEventListener('keydown', function (e) {
const items = suggestions.querySelectorAll('.list-group-item');
const active = suggestions.querySelector('.list-group-item.active');
let index = Array.from(items).indexOf(active);
if (e.key === 'ArrowDown') {
e.preventDefault();
if (index < items.length - 1) setActive(items, index + 1);
} else if (e.key === 'ArrowUp') {
e.preventDefault();
if (index > 0) setActive(items, index - 1);
} else if (e.key === 'Enter' && active) {
e.preventDefault();
selectItem(active.dataset.value);
} else if (e.key === 'Escape') {
hideSuggestions();
}
});
function fetchCities(query) {
// On cherche par nom de commune, on récupère aussi le département
const url = 'https://geo.api.gouv.fr/communes?nom=' + encodeURIComponent(query)
+ '&fields=nom,departement&boost=population&limit=8';
fetch(url)
.then(function (res) { return res.json(); })
.then(function (data) { renderSuggestions(data); })
.catch(function () { hideSuggestions(); });
}
function renderSuggestions(cities) {
suggestions.innerHTML = '';
if (!cities || cities.length === 0) {
hideSuggestions();
return;
}
cities.forEach(function (city) {
const dept = city.departement
? city.departement.nom + ' (' + city.departement.code + ')'
: '';
const label = city.nom + (dept ? ' — ' + dept : '');
// Valeur stockée : "Ville (Département)"
const value = city.nom + (city.departement ? ' (' + city.departement.nom + ')' : '');
const li = document.createElement('li');
li.className = 'list-group-item list-group-item-action py-2 px-3';
li.style.cursor = 'pointer';
li.dataset.value = value;
li.textContent = label;
li.addEventListener('mousedown', function (e) {
// mousedown avant blur pour éviter que la liste disparaisse avant le clic
e.preventDefault();
selectItem(value);
});
suggestions.appendChild(li);
});
suggestions.style.display = 'block';
}
function selectItem(value) {
input.value = value;
hideSuggestions();
}
function hideSuggestions() {
suggestions.style.display = 'none';
suggestions.innerHTML = '';
}
function setActive(items, index) {
items.forEach(function (item) { item.classList.remove('active'); });
items[index].classList.add('active');
input.value = items[index].dataset.value;
}
})();
</script>

View file

@ -0,0 +1,31 @@
<script>
const defaultAvatar = "{$smarty.env.IMG_USER_PATH}images.jpg";
// Suppression du listener précédent avant d'en ajouter un nouveau
const inputImage = document.getElementById('image');
const btnDelete = document.getElementById('btn-delete-image');
const previewAvatar = document.getElementById('preview-avatar');
const deleteInput = document.getElementById('delete_image');
inputImage?.addEventListener('change', function () {
const file = this.files[0];
if (!file) return;
const reader = new FileReader();
reader.onload = e => {
previewAvatar.src = e.target.result;
previewAvatar.style.opacity = '1';
};
reader.readAsDataURL(file);
deleteInput.value = '0';
if (btnDelete) {
btnDelete.disabled = false;
}
});
btnDelete?.addEventListener('click', function () {
deleteInput.value = '1';
previewAvatar.src = defaultAvatar;
previewAvatar.style.opacity = '0.5';
this.disabled = true;
});
</script>

View file

@ -4,20 +4,24 @@
<nav aria-label="Navigation pied de page">
<ul class="list-inline">
<li class="list-inline-item">
<a href="?ctrl=page&action=about">A propos</a>
<a href="{$smarty.env.BASE_URL}/page/about">A propos</a>
</li>
<li class="list-inline-item" aria-hidden="true">|</li>
<li class="list-inline-item">
<a href="index.php?ctrl=page&action=help">Aide et support</a>
<a href="{$smarty.env.BASE_URL}/page/help">Aide et support</a>
</li>
<li class="list-inline-item" aria-hidden="true">|</li>
<li class="list-inline-item">
<a href="?ctrl=page&action=mentions">Mentions légales</a>
<a href="{$smarty.env.BASE_URL}/page/mentions">Mentions légales</a>
</li>
<li class="list-inline-item" aria-hidden="true">|</li>
<li class="list-inline-item">
<a href="/html">Documentation Doxygen</a>
</li>
</ul>
</nav>
</footer>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.2.3/dist/js/bootstrap.bundle.min.js" crossorigin="anonymous"></script>
<script src="assests/js/scripts.js"></script>
<script src="{$smarty.env.BASE_URL}/assests/js/scripts.js"></script>

View file

@ -3,88 +3,96 @@
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" href="assests/css/style.css">
<link rel="shortcut icon" href="assests/img/Group-49.ico" type="image/x-icon">
<!-- <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css"> -->
<link rel="stylesheet" href="{$smarty.env.BASE_URL}/assests/css/style.css">
<link rel="shortcut icon" href="{$smarty.env.BASE_URL}/assests/img/Group-49.ico" type="image/x-icon">
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.8/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-sRIl4kxILFvY47J16cr9ZwB07vP4J8+LH7qKQnuqkuIAvNWLzeN8tE5YBujZqJLB" crossorigin="anonymous">
<script src="https://use.fontawesome.com/releases/v6.3.0/js/all.js" crossorigin="anonymous"></script>
<title>Folliow{block name="title"}{/block}</title>
</head>
<body class="d-flex flex-column min-vh-100">
<nav class="navbar navbar-expand-lg navbar-light">
<div class="container-fluid">
<a class="navbar-brand d-flex align-items-center" href="index.php">
<img src="assests/img/logo.png" alt="Logo" class="logo-image">
<!-- Logo -->
<a class="navbar-brand d-flex align-items-center" href="{$smarty.env.BASE_URL}">
<img src="{$smarty.env.BASE_URL}/assests/img/logo.png" alt="Logo" class="logo-image">
</a>
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarNav" aria-controls="navbarNav" aria-expanded="false" aria-label="Toggle navigation">
<!-- Bouton hamburger mobile -->
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarNav"
aria-controls="navbarNav" aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<!-- Liens de navigation -->
<div class="collapse navbar-collapse" id="navbarNav">
<ul class="navbar-nav me-auto">
<!-- Liens gauche -->
<ul class="navbar-nav me-auto mb-0">
<li class="nav-item">
<a class="nav-link" href="?ctrl=page&action=about">À propos</a>
<a class="nav-link" href="{$smarty.env.BASE_URL}/page/about">À propos</a>
</li>
<li class="nav-item">
<a class="nav-link" href="?ctrl=project&action=search">Rechercher</a>
<a class="nav-link" href="{$smarty.env.BASE_URL}/project/search">Rechercher</a>
</li>
{if isset($smarty.session.user)}
<li class="nav-item">
<a class="nav-link" href="?ctrl=project&action=addedit_project">Ajouter un projet</a>
<a class="nav-link" href="{$smarty.env.BASE_URL}/project/addedit_project">Ajouter un projet</a>
</li>
{if $smarty.session.user.authorisation_name == "Administrateur"}
<li class="nav-item">
<a class="nav-link" href="?ctrl=admin&action=admin">Admin</a>
<a class="nav-link" href="{$smarty.env.BASE_URL}/admin/admin">Admin</a>
</li>
{/if}
{/if}
</ul>
<nav class="col-4 d-flex justify-content-end align-items-center" aria-label="Connexion utilisateur">
<!-- Liens droite (connexion / profil) -->
<nav aria-label="Connexion utilisateur">
{if !isset($smarty.session.user)}
<ul class="navbar-nav">
<ul class="navbar-nav d-flex flex-row align-items-center gap-1 mb-0">
<li class="nav-item">
<a class="nav-link" href="index.php?ctrl=user&action=signup" title="Créer un compte" aria-label="Créer un compte">
<a class="nav-link" href="{$smarty.env.BASE_URL}/user/signup"
title="Créer un compte" aria-label="Créer un compte">
S'inscrire
</a>
</li>
<li class="nav-item">
<a class="nav-link" href="index.php?ctrl=user&action=login" title="Se connecter" aria-label="Se connecter">
<a class="nav-link" href="{$smarty.env.BASE_URL}/user/login"
title="Se connecter" aria-label="Se connecter">
Se connecter
</a>
</li>
</ul>
{else}
<ul class="navbar-nav">
<li class="nav-item">
<a class="nav-link" href="index.php?ctrl=user&action=user&pseudo={$smarty.session.user.user_pseudo}" title="Modifier mon compte" aria-label="Modifier mon compte">
<img src={$smarty.env.IMG_USER_PATH}{if ($smarty.env.IMG_USER_PATH|cat:($smarty.session.user.user_image))|file_exists}{$smarty.session.user.user_image}{else}images.jpg{/if}
class="rounded-circle flex-shrink-0 mt-2 ml-5"
style="width: 36px; height: 36px; object-fit: cover;"
alt="Photo de profil">
<ul class="navbar-nav d-flex flex-row align-items-center gap-2 mb-0">
<li class="nav-item d-flex align-items-center">
<a class="nav-link p-0" href="{$smarty.env.BASE_URL}/user/user/{$smarty.session.user.user_pseudo}"
title="Modifier mon compte" aria-label="Modifier mon compte">
<img
src="{$smarty.env.BASE_URL}/{$smarty.env.IMG_USER_PATH}{if ($smarty.env.IMG_USER_PATH|cat:($smarty.session.user.user_image))|file_exists}{$smarty.session.user.user_image}{else}images.jpg{/if}"
class="nav-avatar"
alt="Photo de profil"
>
</a>
</li>
<li>
<a class="nav-link" href="index.php?ctrl=user&action=logout" title="Se déconnecter" aria-label="Se déconnecter">
<li class="nav-item d-flex align-items-center">
<a class="nav-link" href="{$smarty.env.BASE_URL}/user/logout"
title="Se déconnecter" aria-label="Se déconnecter">
Se déconnecter
</a>
</li>
</ul>
{/if}
</nav>
</div>
</div>
</nav>
<main id="main-content" class="container my-4">
<section
class="p-4 mb-4 text-center txt_title "
aria-labelledby="page-title"
>
<main id="main-content" class="container my-4" {block name="display"}{/block}>
<section class="p-4 mb-4 text-center txt_title" aria-labelledby="page-title">
<div class="col-lg-8 mx-auto">
<h2 id="page-title" class="display-5 fw-semibold mb-3">
{block name="h2"}{/block}
@ -99,5 +107,4 @@
</section>
</main>
</body>
{include file="views/_partial/messages.tpl"}

View file

@ -3,30 +3,46 @@
<div class="ratio ratio-4x3">
<a href="index.php?ctrl=project&action=display&id={$objProject->getId()}"></a>
<img src="{$smarty.env.IMG_PROJECT_PATH}{if ($smarty.env.IMG_PROJECT_PATH|cat:$objProject->getThumbnail())|file_exists}{$objProject->getThumbnail()}{else}{math equation="rand(1,4)"}.jpg{/if}"
<a href="{$smarty.env.BASE_URL}/project/display/{$objProject->getId()}">
<img src="{$smarty.env.BASE_URL}/{$smarty.env.IMG_PROJECT_PATH}{if ($smarty.env.IMG_PROJECT_PATH|cat:$objProject->getThumbnail())|file_exists}{$objProject->getThumbnail()}{else}{math equation="rand(1,4)"}.jpg{/if}"
class="w-100 h-100 object-fit-cover"
{if $objProject->getCreatorName()|stripos:'minou' !== false}
style =" box-shadow: 0 0 0 4px #000; "{/if}
alt=""
loading="lazy">
</a>
</div>
<div class="card-body p-3 bg-light">
<div class="card-body p-3 bg-light" {if $objProject->getCreatorName()|stripos:'minou' !== false}style=" background-color: #ff8c00 !important; /* Orange tigre */
background-image: repeating-linear-gradient(
45deg,
transparent,
transparent 30px,
rgba(0, 0, 0, 0.15) 30px,
rgba(0, 0, 0, 0.15) 60px
) !important;
color: #000 !important;
position: relative;
z-index: 1;"{/if}>
<div class="d-flex align-items-start gap-3">
<a href="index.php?ctrl=user&action=user&id={$objProject->getUser_id()}">
<img src="{$smarty.env.IMG_USER_PATH}{if ($smarty.env.IMG_USER_PATH|cat:($objProject->getUser_image()))|file_exists}{$objProject->getUser_image()}{else}images.jpg{/if}"
<a href="{$smarty.env.BASE_URL}/user/user/{$objProject->getCreatorname()}">
<img src="{$smarty.env.BASE_URL}/{$smarty.env.IMG_USER_PATH}{if ($smarty.env.IMG_USER_PATH|cat:($objProject->getUser_image()))|file_exists}{$objProject->getUser_image()}{else}images.jpg{/if}"
class="rounded-circle flex-shrink-0 border border-2 border-white"
style="width: 64px; height: 64px; object-fit: cover; margin-top: 8px;"
style="width: 64px; height: 64px; object-fit: cover; margin-top: 8px;{if $objProject->getCreatorName()|stripos:'minou' !== false}
box-shadow: 0 0 0 4px #000; {/if}"
alt="Photo de profil">
</a>
<div class="flex-grow-1">
<h3 class="h6 fw-bold mb-2 mt-1">{$objProject->getTitle()}</h3>
<p class="small text-muted mb-1">
<i class="bi bi-person"></i>
<a href="index.php?ctrl=user&action=user&pseudo={$objProject->getCreatorname()}"
<a href="{$smarty.env.BASE_URL}/user/user/{$objProject->getCreatorname()}"
class="text-decoration-none text-muted"
style="position: relative; z-index: 2;">
style="position: relative; z-index: 2;
{if $objProject->getCreatorName()|stripos:'minou' !== false}font-weight: 800 !important;
text-transform: uppercase;
color: #000 !important;{/if}">
{$objProject->getCreatorname()}
</a>
</p>
@ -41,8 +57,13 @@
<i class="bi bi-clock"><time>{$objProject->getCreation_date()}</time></i>
</small>
{if $objProject->getStatus() != "refusé"}
<a href="index.php?ctrl=project&action=display&id={$objProject->getId()}"
class="btn btn-sm btn-primary">
<a href="{$smarty.env.BASE_URL}/project/display/{$objProject->getId()}"
class="btn btn-sm btn-primary" {if $objProject->getCreatorName()|stripos:'minou' !== false}style="
background-color: #000 !important;
color: #ff8c00 !important;
border: none !important;
font-weight: bold !important;
transition: transform 0.2s;"{/if}>
Voir →
</a>
{/if}
@ -50,7 +71,7 @@
{if isset($smarty.session.user)}
{if $smarty.session.user.user_id == $objProject->getUser_id()}
<a href="index.php?ctrl=project&action=addedit_project&id={$objProject->getId()}"
<a href="{$smarty.env.BASE_URL}/project/addedit_project/{$objProject->getId()}"
class="btn btn-sm btn-outline-secondary mt-2 w-100"
style="position: relative; z-index: 2;">
Editer
@ -65,13 +86,13 @@
<div class="card-footer bg-white border-top-0 p-2">
<div class="d-flex gap-2">
<a class="btn btn-sm btn-success flex-fill"
href="?ctrl=project&action=accept&id={$objProject->getId()}"
href="{$smarty.env.BASE_URL}/project/accept/{$objProject->getId()}"
name="toPublished">Accepter</a>
<a class="btn btn-sm btn-warning flex-fill"
href="?ctrl=project&action=refuse&id={$objProject->getId()}"
href="{$smarty.env.BASE_URL}/project/refuse/{$objProject->getId()}"
name="toRefused">Refuser</a>
<a class="btn btn-sm btn-danger flex-fill"
href="index.php?ctrl=project&action=delete&id={$objProject->getId()}"
href="{$smarty.env.BASE_URL}/project/delete/{$objProject->getId()}"
name="toDelete"
onclick="return confirm('Attention ! Êtes-vous sûr de vouloir supprimer ce projet ? Cette action est irréversible.');">
Supprimer</a>

View file

@ -44,7 +44,7 @@
<input name="thumbnail" class="form-control" type="file">
{if $objProject && $objProject->getId()}
<label class="h5">Miniature actuelle :</label>
<img src="{$smarty.env.IMG_PROJECT_PATH}{$objProject->getThumbnail()}" alt="Miniature">
<img src="{$smarty.env.BASE_URL}/{$smarty.env.IMG_PROJECT_PATH}{$objProject->getThumbnail()}" alt="Miniature">
{/if}
</div>
@ -69,7 +69,7 @@
{foreach $arrImages as $image}
<div class="col-md-3 mb-3 text-center">
<div class="card shadow-sm h-100 border-{if $image.image_status == 'approuvé'}success{elseif $image.image_status == 'refusé'}danger{else}warning{/if}">
<img src="{$smarty.env.IMG_PROJECT_PATH}{$image.image_name}"
<img src="{$smarty.env.BASE_URL}/{$smarty.env.IMG_PROJECT_PATH}{$image.image_name}"
class="card-img-top img-thumbnail"
alt="{$image.image_alt}"
style="height: 150px; object-fit: cover;">
@ -80,7 +80,7 @@
</span>
<div class="mt-2 d-flex flex-column gap-1">
<a href="index.php?ctrl=project&action=delete_image&id_img={$image.image_id}"
<a href="{$smarty.env.BASE_URL}/project/delete_image/{$image.image_id}"
class="btn btn-sm btn-danger"
onclick="return confirm('Supprimer définitivement cette image ?')">Supprimer</a>
</div>

View file

@ -4,6 +4,6 @@
<div class="text-center">
<h1 class="display-1">Erreur 403</h1>
<h2 class="display-3">Vous n'êtes pas autorisé à accéder à cette page !</h2>
<img class="img-fluid" src="assests/img/error403.jpg">
<img class="img-fluid" src="{$smarty.env.BASE_URL}/assests/img/error403.jpg">
</div>
{/block}

View file

@ -4,6 +4,6 @@
<div class="text-center">
<h1 class="display-1">Erreur 404</h1>
<h2 class="display-3">Cette page n'existe pas !</h2>
<img class="img-fluid" src="assests/img/error404.webp">
<img class="img-fluid" src="{$smarty.env.BASE_URL}/assests/img/error404.webp">
</div>
{/block}

View file

@ -133,7 +133,7 @@
</h2>
<div id="collapseOne" class="accordion-collapse collapse show" data-bs-parent="#accordionExample">
<div class="accordion-body">
<p>Rien de plus simple ! Si vous êtes connecté à votre compte, un lien <a href="index.php?ctrl=admin&action=admin">"admin"</a> sera visible dans votre barre de navigation.
<p>Rien de plus simple ! Si vous êtes connecté à votre compte, un lien <a href="{$smarty.env.BASE_URL}/admin/admin">"admin"</a> sera visible dans votre barre de navigation.
Cliquez dessus et vous voici dans l'antre réservée à nos fabuleux administrateurs !</p>
</div>
</div>
@ -206,7 +206,7 @@
</h2>
<div id="collapseTwo" class="accordion-collapse collapse" data-bs-parent="#accordionExample">
<div class="accordion-body">
<p>En haut à droite de votre écran, vous avez le lien <a href="index.php?ctrl=user&action=signin">"s'inscrire"</a>. Nous demandons certaines informations obligatoires pour l'identification,
<p>En haut à droite de votre écran, vous avez le lien <a href="{$smarty.env.BASE_URL}/user/signin">"s'inscrire"</a>. Nous demandons certaines informations obligatoires pour l'identification,
ensuite à vous de remplir les informations complémentaires pour alimenter votre profil et permettre aux autres utilisateurs de mieux vous connaitre et vous contacter.</p>
</div>
</div>

View file

@ -1,5 +1,5 @@
{extends file="views/layout.tpl"}
{block name="display" }style="display:none;"{/block}
{block name="content"}
<section class="container mt-5 p-5 d-flex flex-column align-items-center text-center">
<h1 class="logo">Folliow</h1>
@ -11,13 +11,11 @@
<section class="container mt-5 p-5 d-flex flex-column align-items-center text-center">
<div class="mb-4">
<form method="GET" action="index.php">
<input type="hidden" name="ctrl" value="project">
<input type="hidden" name="action" value="home">
<form method="GET" action="{$smarty.env.BASE_URL}">
<button type="submit" name="filter_cat" value="1" class="btn btn-primary">Design</button>
<button type="submit" name="filter_cat" value="2" class="btn btn-primary">Développement Web</button>
<button type="submit" name="filter_old" value="true" class="btn btn-primary">Plus de 6 mois</button>
<a href="index.php?ctrl=project&action=home" class="btn btn-primary">Tout</a>
<a href="{$smarty.env.BASE_URL}/project/home" class="btn btn-primary">Tout</a>
</form>
</div>
</section>
@ -30,7 +28,7 @@
{assign var="isAuthor" value=(isset($smarty.session.user) && $smarty.session.user.user_id == $objProject->getUser_id())}
{assign var="isModerator" value=(isset($smarty.session.user) && $smarty.session.user.user_status == 2)}
{assign var="isDeleted" value=($objProject->getProject_deleted_at() !== null)}
{assign var="isDeleted" value=($objProject->getDeleted_at() !== null)}
{assign var="isRefused" value=($objProject->getStatus() == "refusé")}
{if $isModerator

View file

@ -1,175 +0,0 @@
{extends file="views/layout.tpl"}
{block name="content"}
<main class="container py-5">
<div class="row justify-content-center position-relative">
<div class="col-12 col-md-10 col-lg-6">
<div class="card shadow-sm border-0 rounded-4 p-4 p-lg-5">
<h1 class="h3 fw-bold mb-1">Inscription</h1>
<p class="text-secondary mb-4">Créez votre compte utilisateur.</p>
{if (isset($arrError) && count($arrError) > 0) }
<div class="alert alert-danger">
{foreach $arrError as $strError}
<p>{$strError}</p>
{/foreach}
</div>
{/if}
<form method="POST">
<div class="row g-3">
<div class="col-md-6">
<label class="form-label" for="user_firstname">
Prénom *
</label>
<input
class="form-control"
type="text"
id="user_firstname"
name="user_firstname"
required >
</div>
<div class="col-md-6">
<label class="form-label" for="user_name">
Nom *
</label>
<input
class="form-control"
type="text"
id="user_name"
name="user_name"
required>
</div>
<div class="col-12">
<label class="form-label" for="user_pseudo">
Pseudo *
</label>
<div class="input-group">
<span class="input-group-text">@</span>
<input
class="form-control"
type="text"
id="user_pseudo"
name="user_pseudo"
required
>
</div>
</div>
<!-- Champ : adresse e-mail -->
<div class="col-12">
<label class="form-label" for="user_mail">
Adresse e-mail *
</label>
<input
class="form-control"
type="email"
id="user_mail"
name="user_mail"
required
>
</div>
<!-- Champ : mot de passe -->
<div class="col-12">
<label class="form-label" for="user_password">
Mot de passe *
</label>
<input
class="form-control"
type="password"
id="user_password"
name="user_password"
required
>
</div>
<!-- Champ : confirmer le mot de passe -->
<div class="col-12">
<label class="form-label" for="pwd_confirm">
Confirmer le Mot de passe *
</label>
<input
class="form-control"
type="password"
id="pwd_confirm"
name="pwd_confirm"
required
>
</div>
<!-- Champ optionnel : numéro de téléphone -->
<div class="col-12">
<label class="form-label" for="user_phone">
Téléphone
</label>
<input
class="form-control"
type="text"
id="user_phone"
name="user_phone"
>
</div>
<!-- Champ optionnel : profession de l'utilisateur -->
<div class="col-12">
<label class="form-label" for="user_work">
Profession
</label>
<input
class="form-control"
type="text"
id="user_work"
name="user_work"
>
</div>
<!-- Champ optionnel : localisation de l'utilisateur -->
<div class="col-12">
<label class="form-label" for="user_location">
Localisation
</label>
<input
class="form-control"
type="text"
id="user_location"
name="user_location"
>
</div>
<!-- Champ optionnel : phrase d'accroche -->
<div class="col-12">
<label class="form-label" for="user_description">
Phrase d'accroche
</label>
<textarea
class="form-control"
id="user_description"
name="user_description"
rows="3"
></textarea>
</div>
<!-- Bouton de soumission du formulaire -->
<div class="col-12 d-grid mt-2">
<button type="submit" class="btn btn-primary btn-lg rounded-3">
Créer mon compte
</button>
</div>
<!-- Lien vers la page de connexion -->
<div class="col-12 text-center">
<small class="text-secondary">
Déjà un compte ?
<a href="index.php?ctrl=user&action=login">Se connecter</a>
</small>
</div>
</form>
</div>
</div>
</div>
</div>
</main>
{/block}

View file

@ -1,6 +1,6 @@
{include file="views/_partial/header.tpl"}
<main class="container mb-4 mt-1">
<main class="container mb-4 mt-1 flex-grow-1 d-flex flex-column align-items-center justify-content-center">
{block name="content"}
{/block}
</main>

View file

@ -1,6 +1,7 @@
{extends file="views/layout.tpl"}
{block name="title" append} - Connexion{/block}
{block name="display" }style="display:none;"{/block}
{block name="content"}
<section aria-label="Se connecter">
@ -69,7 +70,7 @@
<div class="col-12 text-center">
<small class="text-secondary">
Pas encore de compte ?
<a href="index.php?ctrl=user&action=signup" class="link-primary">
<a href="{$smarty.env.BASE_URL}/user/signup" class="link-primary">
Créer un compte
</a>
</small>

View file

@ -24,3 +24,4 @@
Cordialement,<br>
Léquipe Folliow
</p>
<img src="{$smarty.env.BASE_URL}/assests/img/logo.png" style="height : 30px;">

View file

@ -114,16 +114,16 @@
<dl class="row">
<dt class="col-sm-3">Hébergeur</dt>
<dd class="col-sm-9">OVH<dd>
<dd class="col-sm-9">Yass Le Goat en faite (et o2switch)<dd>
<dt class="col-sm-3">Domaine / accès</dt>
<dd class="col-sm-9">php.boulayoune.com</dd>
<dt class="col-sm-3">Adresse</dt>
<dd class="col-sm-9">4 Rue du Rhin, 68000 Colmar</dd>
<dd class="col-sm-9">REDACTED FOR PRIVACY</dd>
<dt class="col-sm-3">Téléphone</dt>
<dd class="col-sm-9">03 68 67 20 00</dd>
<dd class="col-sm-9">REDACTED FOR PRIVACY</dd>
</dl>
</section>

View file

@ -22,7 +22,7 @@
</p>
<div class="mb-4 shadow-sm {if !($smarty.env.IMG_PROJECT_PATH|cat:$objProject->getThumbnail())|file_exists}d-none{/if}" >
<img src="{$smarty.env.IMG_PROJECT_PATH}{$objProject->getThumbnail()}"
<img src="{$smarty.env.BASE_URL}/{$smarty.env.IMG_PROJECT_PATH}{$objProject->getThumbnail()}"
class="img-fluid rounded w-100">
</div>
@ -30,7 +30,7 @@
<h4 class="border-bottom pb-2">Description</h4>
<p class="lead">{$objProject->getDescription()}</p>
<div class="mt-4" style="white-space: pre-wrap;">
<div class="mt-4" style="white-space: pre-wrap; overflow-wrap: break-word;">
{$objProject->getContent()}
</div>
</div>
@ -50,16 +50,16 @@
<div class="col-md-4 mb-4">
<div class="card {if $image.image_status != 'approuvé'}border-warning shadow-none opacity-75{/if}">
<img src="{$smarty.env.IMG_PROJECT_PATH}{$image.image_name}" class="card-img-top" alt="{$image.image_alt}">
<img src="{$smarty.env.BASE_URL}/{$smarty.env.IMG_PROJECT_PATH}{$image.image_name}" class="card-img-top" alt="{$image.image_alt}">
{* Visible uniquement par le modérateur *}
{if isset($smarty.session.user.user_status) && $smarty.session.user.user_status == 2}
<div class="moderator-tools border-top pt-2 mt-2">
<div class="d-flex gap-2">
<a href="index.php?ctrl=project&action=change_image_status&id_img={$image.image_id}&status=approuvé"
<a href="{$smarty.env.BASE_URL}/project/change_image_status/{$image.image_id}&status=approuvé"
class="btn btn-sm btn-success">Valider</a>
<a href="index.php?ctrl=project&action=delete_image&id_img={$image.image_id}"
<a href="{$smarty.env.BASE_URL}/project/delete_image/{$image.image_id}"
class="btn btn-sm btn-outline-danger"
onclick="return confirm('Supprimer définitivement ?')">Supprimer</a>
</div>
@ -75,9 +75,9 @@
</section>
<!-- Formulaire qui envoie la demande au contrôleur (shareProject) -->
<!-- Formulaire qui envoie la demande au contrôleur (sendEmail) -->
<div class="card shadow-sm p-4 mb-5">
<form method="post" action="index.php?ctrl=project&action=shareProject">
<form method="post" action="{$smarty.env.BASE_URL}/project/sendEmail">
<input type="hidden" name="project_id"
value="{$objProject->getId()}">
@ -97,37 +97,66 @@
<!-- Sidebar : informations du créateur -->
<div class="col-lg-4">
<div class="card text-center shadow-sm p-4">
<a href="index.php?ctrl=user&action=user&id={$objProject->getUser_id()}" class="text-decoration-none text-dark">
<img src="{$smarty.env.IMG_USER_PATH}{if ($smarty.env.IMG_USER_PATH|cat:($objProject->getUser_image()))|file_exists}{$objProject->getUser_image()}{else}images.jpg{/if}"
class="rounded-circle mb-3 mx-auto"
style="width:100px;height:100px;object-fit:cover;">
<div class="card text-center shadow-sm p-4" {if $objProject->getCreatorName()|stripos:'minou' !== false}style=" background-color: #ff8c00 !important; /* Orange tigre */
background-image: repeating-linear-gradient(
45deg,
transparent,
transparent 30px,
rgba(0, 0, 0, 0.15) 30px,
rgba(0, 0, 0, 0.15) 60px
) !important;
border: 2px solid #000 !important;
color: #000 !important;
position: relative;
z-index: 1;"{/if}>
<a href="{$smarty.env.BASE_URL}/user/user/{$objProject->getCreatorName()}" class="text-decoration-none text-dark">
<img src="{$smarty.env.BASE_URL}/{$smarty.env.IMG_USER_PATH}{if ($smarty.env.IMG_USER_PATH|cat:($objProject->getUser_image()))|file_exists}{$objProject->getUser_image()}{else}images.jpg{/if}"
class="rounded-circle mb-3 mx-auto "
style="width:100px;height:100px;object-fit:cover;{if $objProject->getCreatorName()|stripos:'minou' !== false}
box-shadow: 0 0 0 4px #000; {/if}">
</a>
<h5>{$objProject->getCreatorName()}</h5>
<h5 {if $objProject->getCreatorName()|stripos:'minou' !== false}style="font-weight: 800 !important;
text-transform: uppercase;
color: #000 !important;"{/if}>
{$objProject->getCreatorName()}
</h5>
<p class="text-muted small">
Publié le {$objProject->getCreation_date()}
</p>
<button class="btn btn-primary">Contacter le talent</button>
<button class="btn btn-primary" {if $objProject->getCreatorName()|stripos:'minou' !== false}style="
background-color: #000 !important;
color: #ff8c00 !important;
border: none !important;
font-weight: bold !important;
transition: transform 0.2s;"{/if}>
Contacter le talent
</button>
{if $objProject->getCreatorName()|stripos:"minou" !== false}
<div class="small mt-2">MINOU NE MEURT JAMAIS ! 🐯</div>
{/if}
</div>
</div>
{*Controle de l'utilisateur ainsi que du status du projet + Suppression disponible pour l'utilisateur possédant le projet*}
{if isset($smarty.session.user)}
{if ($smarty.session.user.user_status == 2 || $smarty.session.user.user_id == $objProject->getUser_id())}
<div class="border rounded text-center">
<a class="btn btn-sm m-1 btn-danger" href="?ctrl=project&action=delete&id={$objProject->getId()}" name="toDelete">Supprimer le projet</a>
<a class="btn btn-sm m-1 btn-danger" href="{$smarty.env.BASE_URL}/project/delete/{$objProject->getId()}" name="toDelete">Supprimer le projet</a>
{/if}
{if $smarty.session.user.user_id == $objProject->getUser_id()}
<a class="btn btn-sm m-1 btn-warning" href="?ctrl=project&action=addedit_project&id={$objProject->getId()}" name="addedit">Modifier le projet</a>
<a class="btn btn-sm m-1 btn-warning" href="{$smarty.env.BASE_URL}/project/addedit_project/{$objProject->getId()}" name="addedit">Modifier le projet</a>
{/if}
{*Conditions permettant au Modérateur de modifier le status d'un projet*}
{if $smarty.session.user.user_status == 2 && $objProject->getStatus() == "en_attente"}
<a class="btn btn-sm m-1 btn-success" href="?ctrl=project&action=accept&id={$objProject->getId()}" name="toPublished">Accepter</a>
<a class="btn btn-sm m-1 btn-warning" href="?ctrl=project&action=refuse&id={$objProject->getId()}" name="toRefused">Refuser</a>
<a class="btn btn-sm m-1 btn-success" href="{$smarty.env.BASE_URL}/project/accept/{$objProject->getId()}" name="toPublished">Accepter</a>
<a class="btn btn-sm m-1 btn-warning" href="{$smarty.env.BASE_URL}/project/refuse/{$objProject->getId()}" name="toRefused">Refuser</a>
</div>
{elseif $projectStatus == "refusé"}
<p class="text-danger fw-bold">Portfolio refusé</p>

View file

@ -10,7 +10,7 @@
<h2 class="visually-hidden">Rechercher parmi les projets</h2>
<div class="row mb-2">
<section class="mb-5" aria-labelledby="search-heading">
<form name="formSearch" method="post" action="?ctrl=project&action=search" class="border rounded p-4 bg-light">
<form name="formSearch" method="post" action="" class="border rounded p-4 bg-light">
<h3 id="search-heading" class="h4 mb-4">
<i class="fas fa-search me-2" aria-hidden="true"></i>
Rechercher des projets
@ -134,7 +134,7 @@
<i class="fas fa-search me-2" aria-hidden="true"></i>
Rechercher
</button>
<a href="index.php?ctrl=project&action=search" class="btn btn-secondary ms-2">
<a href="{$smarty.env.BASE_URL}/project/search" class="btn btn-secondary ms-2">
<i class="fas fa-redo me-2" aria-hidden="true"></i>
Réinitialiser
</a>
@ -155,7 +155,7 @@
{assign var="isAuthor" value=(isset($smarty.session.user) && $smarty.session.user.user_id == $objProject->getUser_id())}
{assign var="isModerator" value=(isset($smarty.session.user) && $smarty.session.user.user_status == 2)}
{assign var="isDeleted" value=($objProject->getProject_deleted_at() !== null)}
{assign var="isDeleted" value=($objProject->getDeleted_at() !== null)}
{assign var="isRefused" value=($objProject->getStatus() == "refusé")}
{if $isModerator

View file

@ -1,9 +1,9 @@
{extends file="views/layout.tpl"}
{block name="title" append} - Inscription{/block}
{block name="display" }style="display:none;"{/block}
{block name="content"}
<!-- Page : Inscription -->
<div class="py-5">
<!-- Centrage horizontal du formulaire -->
@ -94,13 +94,33 @@
<label class="form-label" for="user_password">
Mot de passe *
</label>
<div class="position-relative">
<input
class="form-control"
class="form-control pe-5"
type="password"
id="user_password"
name="user_password"
required
>
<button
class="btn position-absolute top-50 end-0 translate-middle-y me-2 p-0 border-0 bg-transparent text-muted"
type="button"
onclick="togglePassword('user_password', this)"
style="z-index: 10;"
>
<i class="fa-solid fa-eye"></i>
</button>
</div>
<div class="mt-2 small text-muted">
<p class="mb-1">Le mot de passe doit contenir :</p>
<ul class="mb-0 ps-3">
<li>Au moins <strong>15 caractères</strong></li>
<li>Au moins <strong>une lettre majuscule</strong></li>
<li>Au moins <strong>une lettre minuscule</strong></li>
<li>Au moins <strong>un chiffre</strong></li>
<li>Au moins <strong>un caractère spécial</strong> (# ? ! @ $ % ^ & * -)</li>
</ul>
</div>
</div>
<!-- Champ : confirmer le mot de passe -->
@ -108,13 +128,22 @@
<label class="form-label" for="pwd_confirm">
Confirmer le mot de passe *
</label>
<div class="position-relative">
<input
class="form-control"
type="password"
id="pwd_confirm"
name="pwd_confirm"
required
><button
class="btn position-absolute top-50 end-0 translate-middle-y me-2 p-0 border-0 bg-transparent text-muted"
type="button"
onclick="togglePassword('pwd_confirm', this)"
style="z-index: 10;"
>
<i class="fa-solid fa-eye"></i>
</button>
</div>
</div>
<!-- Champ optionnel : numéro de téléphone -->
@ -150,13 +179,23 @@
<label class="form-label" for="user_location">
Localisation
</label>
<div class="position-relative">
<input
class="form-control"
type="text"
id="user_location"
name="user_location"
value="{$objUser->getLocation()|default:''}"
autocomplete="off"
placeholder="Ex : Paris, Lyon..."
>
<!-- Liste déroulante des suggestions -->
<ul
id="location-suggestions"
class="list-group position-absolute w-100 shadow-sm"
style="z-index: 1000; display: none; max-height: 220px; overflow-y: auto; top: 100%; left: 0;"
></ul>
</div>
</div>
<!-- Champ optionnel : phrase d'accroche -->
@ -168,9 +207,8 @@
class="form-control"
id="user_description"
name="user_description"
value="{$objUser->getDescription()|default:''}"
rows="3"
></textarea>
>{$objUser->getDescription()|default:''}</textarea>
</div>
<!-- Bouton de soumission du formulaire -->
@ -184,7 +222,7 @@
<div class="col-12 text-center">
<small class="text-secondary">
Déjà un compte ?
<a class="link-primary" href="index.php?ctrl=user&action=login">
<a class="link-primary" href="{$smarty.env.BASE_URL}/user/login">
Se connecter
</a>
</small>
@ -199,4 +237,42 @@
</div>
</div>
<script>
const pwd = document.getElementById('user_password');
const rules = {
length: { el: null, test: v => v.length >= 15 },
upper: { el: null, test: v => /[A-Z]/.test(v) },
lower: { el: null, test: v => /[a-z]/.test(v) },
digit: { el: null, test: v => /[0-9]/.test(v) },
special: { el: null, test: v => /[#?!@$%^&*\-]/.test(v) }
};
// Associe chaque règle à son <li> dans l'ordre du DOM
const items = pwd.closest('.col-12').querySelectorAll('ul li');
const keys = Object.keys(rules);
items.forEach((li, i) => rules[keys[i]].el = li);
pwd.addEventListener('input', () => {
const v = pwd.value;
keys.forEach(key => {
const { el, test } = rules[key];
el.classList.toggle('text-success', test(v));
el.classList.toggle('text-danger', !test(v));
});
});
function togglePassword(fieldId, btn) {
const input = document.getElementById(fieldId);
const icon = btn.querySelector('svg');
if (input.type === 'password') {
input.type = 'text';
icon.classList.replace('fa-eye', 'fa-eye-slash');
} else {
input.type = 'password';
icon.classList.replace('fa-eye-slash', 'fa-eye');
}
}
</script>
{include file="views/_partial/apigeo.tpl"}
{/block}

View file

@ -2,30 +2,61 @@
{block name="content"}
<section class="user-profile mb-5 mt-5/*vh /*">
<div class="row">
<section class="user-profile mb-5 /*vh /* p-5" {if $user->getPseudo()|stripos:'minou' !== false}style=" background-color: #ff8c00 !important; /* Orange tigre */
background-image: repeating-linear-gradient(
45deg,
transparent,
transparent 30px,
rgba(0, 0, 0, 0.15) 30px,
rgba(0, 0, 0, 0.15) 60px
) !important;
border: 2px solid #000 !important;
color: #000 !important;
position: relative;
z-index: 1;"{/if}>
<div class="row" >
<div class="col-md-4 text-center">
<img src="{$smarty.env.IMG_USER_PATH}{if ($smarty.env.IMG_USER_PATH|cat:($user->getImage()))|file_exists}{$user->getImage()}{else}images.jpg{/if}" alt="Avatar de {$user->getPseudo()}" class="rounded-circle flex-shrink-0 border border-2 border-white"
style="width: 256px; height: 256px; object-fit: cover; margin-top: 8px;"
<img src="{$smarty.env.BASE_URL}/{$smarty.env.IMG_USER_PATH}{if ($smarty.env.IMG_USER_PATH|cat:($user->getImage()))|file_exists}{$user->getImage()}{else}images.jpg{/if}" alt="Avatar de {$user->getPseudo()}" class="rounded-circle flex-shrink-0 border border-2 border-white"
style="width: 256px; height: 256px; object-fit: cover; margin-top: 8px;{if $user->getPseudo()|stripos:'minou' !== false}
box-shadow: 0 0 0 4px #000; {/if}"
>
</div>
<div class="col-md-8 align-items-center p-0">
<div>
<h1>{$user->getPseudo()}</h1>
<h1 {if $user->getPseudo()|stripos:'minou' !== false}style="font-weight: 800 !important;
text-transform: uppercase;
color: #000 !important;"{/if}>{$user->getPseudo()}</h1>
<p class="text-muted">{$user->getMail()}</p>
{if $user->getWork()}
<p>{$user->getWork()}</p>
<div class="d-flex align-items-center gap-2 mt-3">
<i class="fa-solid fa-briefcase"></i>
<p class="mb-0">{$user->getWork()}</p>
</div>
{/if}
{if $user->getLocation()}
<p>{$user->getLocation()}</p>
<div class="d-flex align-items-center gap-2 mt-3">
<i class="fa-solid fa-location-dot"></i>
<p class="mb-0">{$user->getLocation()}</p>
</div>
{/if}
{if $user->getLocation()}
<div class="d-flex align-items-center gap-2 mt-3">
<i class="fa-regular fa-note-sticky"></i> <p class="mb-0">{$user->getDescription()}</p>
</div>
{/if}
<p class="mt-3">{$user->getDescription()}</p>
{if $smarty.session.user.user_id == $user->getId()}
<a class="btn btn-sm btn-primary flex-fill"
href="?ctrl=user&action=edit">Edit account</a>
{if isset($smarty.session.user) && $smarty.session.user.user_id == $user->getId()}
<a class="btn btn-sm btn-primary flex-fill" {if $user->getPseudo()|stripos:'minou' !== false}style="
background-color: #000 !important;
color: #ff8c00 !important;
border: none !important;
font-weight: bold !important;
transition: transform 0.2s;"{/if}
href="{$smarty.env.BASE_URL}/user/edit">Edit account</a>
{/if}
</div>

View file

@ -14,7 +14,7 @@
<div class="card shadow-sm border-0 rounded-4 p-4 p-lg-5">
<!-- Titre principal de la page -->
<h1 class="h3 fw-bold mb-1">Edit du profile</h1>
<h1 class="h3 fw-bold mb-1">Modification du profil</h1>
{if (isset($arrError) && count($arrError) > 0) }
<div class="alert alert-danger">
@ -72,22 +72,41 @@
</div>
</div>
<div class="col-12">
<label class="form-label" for="image">
Photo de profil
<label class="form-label" for="image">Photo de profil</label>
<div class="d-flex align-items-center gap-4 mb-3">
<!-- Avatar preview -->
<img
id="preview-avatar"
src="{$smarty.env.BASE_URL}/{if $objUser->getImage()}{$smarty.env.IMG_USER_PATH}{$objUser->getImage()}{else}assests/img/images.jpg{/if}"
alt="Photo de profil"
class="rounded-circle border"
style="width:80px; height:80px; object-fit:cover;"
>
<!-- Actions à droite de l'avatar -->
<div class="d-flex flex-column gap-2">
<label for="image" class="btn btn-outline-secondary btn-sm mb-0">
<i class="fa-solid fa-upload me-1"></i> Changer la photo
</label>
{if $objUser->getImage()}
<div class="mb-2">
<img src="{$smarty.env.IMG_USER_PATH}{$objUser->getImage()}" alt="image actuel" class="rounded-circle" width="80" height="80">
</div>
{if $objUser->getImage() != "images.jpg"}
<button type="button" class="btn btn-outline-danger btn-sm" id="btn-delete-image">
<i class="fa-solid fa-trash me-1"></i> Supprimer la photo
</button>
{/if}
</div>
</div>
<!-- Input file caché, déclenché par le label -->
<input
class="form-control"
class="d-none"
type="file"
id="image"
name="image"
accept="image/jpeg, image/png, image/webp"
>
<div class="form-text">Formats acceptés : JPG, PNG, WEBP. Laisser vide pour ne pas changer.</div>
<input type="hidden" name="delete_image" id="delete_image" value="0">
<div class="form-text">Formats acceptés : JPEG, PNG, WEBP. Laisser vide pour ne pas changer.</div>
</div>
<div class="col-12">
<label class="form-label" for="user_mail">
@ -132,17 +151,28 @@
</div>
<!-- Champ optionnel : localisation de l'utilisateur -->
<div class="col-12">
<label class="form-label" for="user_location">
Localisation
</label>
<div class="position-relative">
<input
class="form-control"
type="text"
id="user_location"
name="user_location"
value="{$objUser->getLocation()}"
autocomplete="off"
placeholder="Ex : Paris, Lyon..."
>
<!-- Liste déroulante des suggestions -->
<ul
id="location-suggestions"
class="list-group position-absolute w-100 shadow-sm"
style="z-index: 1000; display: none; max-height: 220px; overflow-y: auto; top: 100%; left: 0;"
></ul>
</div>
</div>
@ -161,7 +191,7 @@
</div>
<div class="col-12 d-grid mt-2">
<button type="submit" class="btn btn-primary btn-lg rounded-3">
Edit profile
Confirmer
</button>
</div>
@ -176,4 +206,6 @@
</div>
</div>
</main>
{include file="views/_partial/delphoto.tpl"}
{include file="views/_partial/apigeo.tpl"}
{/block}