diff options
| author | polo <ordipolo@gmx.fr> | 2025-11-01 19:20:15 +0100 |
|---|---|---|
| committer | polo <ordipolo@gmx.fr> | 2025-11-01 19:20:15 +0100 |
| commit | 067ec55f13bd472c8d584d8e26d70a34cc9705f3 (patch) | |
| tree | b2861a285eb98876512943385efddd90628ea3cf | |
| parent | 46d3c239a7ad2b00e86373f2fd0e829fdcba57f7 (diff) | |
| download | cms-067ec55f13bd472c8d584d8e26d70a34cc9705f3.tar.gz cms-067ec55f13bd472c8d584d8e26d70a34cc9705f3.tar.bz2 cms-067ec55f13bd472c8d584d8e26d70a34cc9705f3.zip | |
contrôle sur les input type url
| -rw-r--r-- | public/js/Input.js | 4 | ||||
| -rw-r--r-- | public/js/main.js | 12 | ||||
| -rw-r--r-- | src/controller/ArticleController.php | 1 | ||||
| -rw-r--r-- | src/view/HeaderBuilder.php | 2 | ||||
| -rw-r--r-- | src/view/MenuBuilder.php | 4 | ||||
| -rw-r--r-- | src/view/templates/menu.php | 2 |
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 |
| 45 | class InputText extends InputToggler{ | 45 | class 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 | ||
| 39 | function 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 |
| 40 | document.addEventListener('DOMContentLoaded', () => { | 52 | document.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> |
