aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorpolo <ordipolo@gmx.fr>2025-11-01 19:20:15 +0100
committerpolo <ordipolo@gmx.fr>2025-11-01 19:20:15 +0100
commit067ec55f13bd472c8d584d8e26d70a34cc9705f3 (patch)
treeb2861a285eb98876512943385efddd90628ea3cf
parent46d3c239a7ad2b00e86373f2fd0e829fdcba57f7 (diff)
downloadcms-067ec55f13bd472c8d584d8e26d70a34cc9705f3.tar.gz
cms-067ec55f13bd472c8d584d8e26d70a34cc9705f3.tar.bz2
cms-067ec55f13bd472c8d584d8e26d70a34cc9705f3.zip
contrôle sur les input type url
-rw-r--r--public/js/Input.js4
-rw-r--r--public/js/main.js12
-rw-r--r--src/controller/ArticleController.php1
-rw-r--r--src/view/HeaderBuilder.php2
-rw-r--r--src/view/MenuBuilder.php4
-rw-r--r--src/view/templates/menu.php2
6 files changed, 18 insertions, 7 deletions
diff --git a/public/js/Input.js b/public/js/Input.js
index 0ebbbbb..854e5d1 100644
--- a/public/js/Input.js
+++ b/public/js/Input.js
@@ -11,7 +11,7 @@ class InputToggler{
11 this.submit_elem = this.parent.querySelector(options.submit_selector || `#${name}_submit`); 11 this.submit_elem = this.parent.querySelector(options.submit_selector || `#${name}_submit`);
12 this.cancel_elem = this.parent.querySelector(options.cancel_selector || `#${name}_cancel`); 12 this.cancel_elem = this.parent.querySelector(options.cancel_selector || `#${name}_cancel`);
13 13
14 // balises à ne pas gérer (fonctionne mais inutilisé pour l'instant) 14 // balises à ne pas gérer
15 this.ignored_tags = { 15 this.ignored_tags = {
16 has_content: options.has_content !== false, // => true sauf si le paramètre vaut false 16 has_content: options.has_content !== false, // => true sauf si le paramètre vaut false
17 has_input: options.has_input !== false, 17 has_input: options.has_input !== false,
@@ -42,7 +42,7 @@ class InputToggler{
42 42
43 43
44// enfants 44// enfants
45class InputText extends InputToggler{ 45class InputText extends InputToggler{ // pour input type text ou url
46 constructor(name, options = {}){ 46 constructor(name, options = {}){
47 super(name, options); 47 super(name, options);
48 this.fetcher = new Fetcher({ 48 this.fetcher = new Fetcher({
diff --git a/public/js/main.js b/public/js/main.js
index 42bae70..1e47ebe 100644
--- a/public/js/main.js
+++ b/public/js/main.js
@@ -36,6 +36,18 @@ function toastNotify(message){
36 setTimeout(function(){ toast.className = toast.className.replace('show', ''); }, 5000); 36 setTimeout(function(){ toast.className = toast.className.replace('show', ''); }, 5000);
37} 37}
38 38
39function controlURL(input){
40 const url = input.value.trim();
41 if(!url){
42 return;
43 }
44 if(/^[a-z][a-z0-9+.-]*:/i.test(url) // un "protocole" (https://, ftp://, mailto:, etc)
45 || url.startsWith('/') || url.startsWith('./') || url.startsWith('../')){ // Lien local (commence par /, ./ ou ../)
46 return;
47 }
48 input.value = 'https://' + url; // Cas par défaut
49}
50
39// exécuté à la fin du chargement de la page 51// exécuté à la fin du chargement de la page
40document.addEventListener('DOMContentLoaded', () => { 52document.addEventListener('DOMContentLoaded', () => {
41 53
diff --git a/src/controller/ArticleController.php b/src/controller/ArticleController.php
index 7061897..7dc7f49 100644
--- a/src/controller/ArticleController.php
+++ b/src/controller/ArticleController.php
@@ -14,7 +14,6 @@ class ArticleController
14 static public function fetch(EntityManager $entityManager, Request $request): void 14 static public function fetch(EntityManager $entityManager, Request $request): void
15 { 15 {
16 if($request->query->has('id') && !empty($request->query->get('id')) && $request->query->has('last_article')){ 16 if($request->query->has('id') && !empty($request->query->get('id')) && $request->query->has('last_article')){
17 //var_dump($request->query->get('last_article'));
18 $id = (int)$request->get('id'); // type et nettoie 17 $id = (int)$request->get('id'); // type et nettoie
19 $model = new Model($entityManager); 18 $model = new Model($entityManager);
20 $model->findNodeById($id); 19 $model->findNodeById($id);
diff --git a/src/view/HeaderBuilder.php b/src/view/HeaderBuilder.php
index 266aab8..c36f6a5 100644
--- a/src/view/HeaderBuilder.php
+++ b/src/view/HeaderBuilder.php
@@ -90,7 +90,7 @@ class HeaderBuilder extends AbstractBuilder
90 <a ' . $href . ' target="_blank" rel="noopener noreferrer">' 90 <a ' . $href . ' target="_blank" rel="noopener noreferrer">'
91 . $this->insertSVG(self::ICON_PATH . $network . '.svg', ['id' => 'header_' . $network . '_content', 'class' => ($checked ? 'svg_fill_red' : '')]) 91 . $this->insertSVG(self::ICON_PATH . $network . '.svg', ['id' => 'header_' . $network . '_content', 'class' => ($checked ? 'svg_fill_red' : '')])
92 . '</a> 92 . '</a>
93 <input type="text" id="header_' . $network . '_input" class="hidden" value="' . ($social[$network] ?? "") . '" placeholder="lien http://..." size="30"> 93 <input type="url" id="header_' . $network . '_input" class="hidden" value="' . ($social[$network] ?? "") . '" placeholder="https://..." size="30" onchange="controlURL(this)">
94 <img id="header_' . $network . '_open" class="action_icon" src="assets/edit.svg" onclick="header_' . $network . '.open()"> 94 <img id="header_' . $network . '_open" class="action_icon" src="assets/edit.svg" onclick="header_' . $network . '.open()">
95 <img id="header_' . $network . '_submit" class="action_icon hidden" src="assets/save.svg" onclick="header_' . $network . '.submit()"> 95 <img id="header_' . $network . '_submit" class="action_icon hidden" src="assets/save.svg" onclick="header_' . $network . '.submit()">
96 <img id="header_' . $network . '_cancel" class="action_icon hidden" src="assets/close.svg" onclick="header_' . $network . '.cancel()"> 96 <img id="header_' . $network . '_cancel" class="action_icon hidden" src="assets/close.svg" onclick="header_' . $network . '.cancel()">
diff --git a/src/view/MenuBuilder.php b/src/view/MenuBuilder.php
index 8e8b9a9..e9bc4bc 100644
--- a/src/view/MenuBuilder.php
+++ b/src/view/MenuBuilder.php
@@ -64,11 +64,11 @@ class MenuBuilder extends AbstractBuilder
64 <input type="image" class="move_entry_icon" src="assets/delete-bin.svg" alt="delete link button" onclick="return confirm(\'Voulez-vous vraiment supprimer cette entrée?\');"> 64 <input type="image" class="move_entry_icon" src="assets/delete-bin.svg" alt="delete link button" onclick="return confirm(\'Voulez-vous vraiment supprimer cette entrée?\');">
65 </form> 65 </form>
66 <span class="url_name"> 66 <span class="url_name">
67 <button class="url_name"><input type="" value="' . htmlspecialchars($entry->getPageName()) . '"></button> 67 <button class="url_name"><input type="text" value="' . htmlspecialchars($entry->getPageName()) . '"></button>
68 <img class="move_entry_icon" src="assets/save.svg" onclick="editUrl(' . $entry->getId() . ', \'url_name\')"> 68 <img class="move_entry_icon" src="assets/save.svg" onclick="editUrl(' . $entry->getId() . ', \'url_name\')">
69 </span> 69 </span>
70 <span class="url_content"> 70 <span class="url_content">
71 <input type="url" value="' . htmlspecialchars($entry->getEndOfPath()) . '"> 71 <input type="url" value="' . htmlspecialchars($entry->getEndOfPath()) . '" placeholder="https://..." onchange="controlURL(this)">
72 <img class="move_entry_icon" src="assets/save.svg" onclick="editUrl(' . $entry->getId() . ', \'url_content\')"> 72 <img class="move_entry_icon" src="assets/save.svg" onclick="editUrl(' . $entry->getId() . ', \'url_content\')">
73 </span>'; 73 </span>';
74 } 74 }
diff --git a/src/view/templates/menu.php b/src/view/templates/menu.php
index 4f11756..6ad4f7c 100644
--- a/src/view/templates/menu.php
+++ b/src/view/templates/menu.php
@@ -13,7 +13,7 @@
13 </p> 13 </p>
14 <p> 14 <p>
15 <label for="url_input">Adresse (collez votre lien):</label> 15 <label for="url_input">Adresse (collez votre lien):</label>
16 <input id="url_input" type="url" name="url_input" placeholder="http://"> 16 <input id="url_input" type="url" name="url_input" placeholder="https://..." onchange="controlURL(this)">
17 </p> 17 </p>
18 <p> 18 <p>
19 <label>Placer le lien juste après cette entrée:</label> 19 <label>Placer le lien juste après cette entrée:</label>