11522 sujets

JavaScript, DOM et API Web HTML5

Pages :
(reprise du message précédent)

Sauf que le soucis est que "affichephotolisteserv.php" est retournée dans le dossier CORE mais que le fichier actuellement nommé "banane.php" est resté dans le dossier "pages" de "view" sinon, il ne marche pas... Seul "banane.php" ne peut pas bouger sinon, ça ne marche plus.
Modifié par johuv (10 Feb 2019 - 17:59)
Modérateur
Bonjour,

Aucune solution simple : à distance c'est impossible de t'indiquer quoi faire !

Amicalement,
Salut,
J'avais utilisé le tuto de Grafikart, il semble que vous l'ayez un peu modifié (peut-être à cause de votre hébergeur qui ne propose pas de dossier privé). Normalement, le dossier webroot correspond au DOCUMENT_ROOT (point d'accès au site via http), il contient un fichier index.php qui gère le MVC, les ressources du site (JS, CSS, images publiques), un htaccess pour tout rediriger vers index.php (sauf pour les fichiers et dossiers existant sous ce webroot), et potentiellement quelques scripts PHP indépendants du MVC (des fichiers PHP adressables publiquement).
Le reste est privé, placé en amont de webroot, et donc naturellement inaccessible via http, seulement en FTP, car en général on vous donne un accès FTP un dossier au-dessus du webroot, justement pour avoir une zone privée. Quand ce n'est pas le cas, il faut protéger les dossiers privés avec un htaccess (ou comme ici, on redirige tout vers webroot, ce qui revient un peu au même mais n'est pas très académique).

Ceci étant dit, quand vous essayez d'accéder à ../core/banane.php, probablement depuis une adresse qui finit par webroot, vous tentez en réalité d'accéder à webroot/core/banane.php, à cause de votre premier htaccess.

Si votre fichier banane.php est indépendant du MVC (pas besoin de traitements communs, pas besoin du render avec ses layouts), vous le mettez sous webroot. Sinon, il vous faut respecter la philosophie du MVC, notamment l'URL avec la syntaxe "/nom-du-controller/nom-de-la-methode/paramètres".

Disons, pour faire simple, que votre URL est : -http://localhost/le-site/banane/
Il vous faut un fichier contrôleur banane.php, qui définit une classe BananeController qui dérive de la classe Controller, et une méthode index qui fait le boulot. Il vous faut aussi un fichier view/banane/index.php pour le rendu (HTML ou autre en fonction des besoins).

Autre exemple : -http://localhost/le-site/pages/banane/
-> fichier controller/pages.php, qui définit une classe PagesController, avec une méthode banane.
-> fichier view/pages/banane.php pour le rendu.

Le nom des fichiers contrôleurs est peut-être identique au nom de la classe, je ne me souviens plus très bien.

Avec ça, vous devriez déjà résoudre vos problèmes d'erreur 404.

Bon courage.
Modifié par Seven tears (10 Feb 2019 - 23:48)
Bonjour Seven tears,
D'abord un grand merci pour ton aide, voilà une explication qui m'aide, et qui m'aide également à me rappeler le fonctionnement. Une chose est sûre, je n'aurais pas dû prendre une telle pause avec le php et avec mon site... Mon niveau est encore bien trop faible pour prendre de telles libertés avec un langage qui m'était inconnu il y a seulement deux ans, un métier et une formation tout autre, et un projet aussi ambitieux...

Pour le fonctionnement, j'ai défini la méthode "banane", ce qui m'a aidé à pouvoir passer par le dossier "pages" pour faire fonctionner. Mon problème était de ne pas voir mon header et mon footer qui se mettent automatiquement dans mes pages.
Mais ton explication m'a logiquement conduit à placer mon fichier "banane.php" dans Webroot pour le faire fonctionner sans passer par le contrôler page, et donc, pas de footer ni de header en doublon.
Il faudra que j'analyse bien tout ce que j'avais fait pour pouvoir, un jour, mettre ce fichier "banane.php" à sa place.

En attendant donc, ce fichier est opérationnel. Mercredi, les filles à l'école, je pourrais plancher sur la prochaine étape.
Merci encore Seven tears, et par avance, merci à parsimonhi pour le temps qu'il consacre à un "élève" tel que moi Smiley langue
Bonjour Parsimonhi,
je cherche l'url à utiliser pour le fichier banane.php. Il y a un détail que je n'ai pas compris donc, car d'entrée je me trouve devant un blocage:
Banane.php
<?php

$ref = $_POST['ref'];

echo $ref; 

?>

 Notice: Undefined index: ref [...]
Il ne devrait pas m'afficher ce que j'ai cliqué ?


Edit: Arf ! avec un isset, ça va mieux.

Edit 2: Je lutte, je lutte..;
Fonction JS:
function myGetByAJAX(ref) {
  var xhr = new XMLHttpRequest();
  xhr.onreadystatechange = function() {
    if (this.readyState == 4 && this.status == 200) {
      document.getElementById('data').innerHTML = this.responseText;
    }
  };
  xhr.open("POST","../webroot/banane.php",true);
  xhr.send("ref="+ref);
}

Ma page banane.php
<?php

if (isset($_POST['ref'])){
        $ref = $_POST['ref'];
	echo $ref;
}else{
	echo 'Il n\'y a rien';
}


Ma page "photo"
Il n'y a rien


Normalement, je devrais avoir l'url cliquée non ?
Modifié par johuv (13 Feb 2019 - 18:41)
Salut,
Ça paraît bon pourtant, le fichier php est trouvé (c'est une bonne chose !), mais la variable post ne semble pas transmise. Va falloir faire du debuggage :
- dans la console de votre navigateur, vous pouvez analyser les requêtes XHR (pour voir si "ref" est bien transmis, pour commencer)
- coté PHP, avant votre premier test, un var_dump de $_POST pour voir ce qui arrive.
On avisera ensuite.
Bonjour Seven,

Je n'ai rien qui s'affiche dans la console du navigateur. Aucun message d'erreur, pas de croix rouge. Tout semble correct.
J'avais fait un var dump en cherchant mon soucis, je viens de réitéré, voici le résultat.
<?php
var_dump($ref);
if (isset($_POST['ref'])){ 
	$ref = $_POST['ref'];
	echo $ref;
}else{
	echo 'Il n\'y a rien';
}

( ! ) Notice: Undefined variable: ref in E:\XXX\webroot\banane.php on line 3
Call Stack
#	Time	Memory	Function	Location
1	0.0006	138776	{main}( )	..\banane.php:0

null

J'ai essayé aussi
var_dump($_post['ref']);
: même résultat
Pour moi, c'est bien la variable qui ne passe pas, mais je ne comprends pas pourquoi...
Modifié par johuv (13 Feb 2019 - 20:44)
J'aurais dû être plus précis : essayez
var_dump($_POST);

mais là j'ai peu d'espoir.
Dans la console, ou plutôt dans "l'outil du développeur", ou je ne sais comment il s'appelle dans les autres navigateurs, vous devriez avoir un onglet "réseau" (network), et une sous-rubrique "XHR" ou XMLHttpRequest ou que sais-je, pour bien analyser les requêtes (et pas seulement les erreurs de script via la console). C'est là qu'il faut chercher.

Je suis désolé pour le manque de précision, mais j'ai mis le développement web en pause depuis quelques années et je suis un peu rouillé. Là je passais vraiment par hasard et votre code m'a interpelé. En espérant qu'une âme charitable vous aide plus que moi.
Bonne continuation.
Modifié par Seven tears (13 Feb 2019 - 21:09)
Merci Seven,
var_dump($_POST);
essayé aussi.

Sur la console, j'avais trouvé le XHR dans network.
Mais je ne sais pas trop quoi regarder. Tout semble normal. j'ai même trouvé la variable voulue (sur laquelle j'ai cliqué):
request Payload
ref=http://xxx/Medias/Photo/Michel%20et%20Lily/

Modifié par johuv (13 Feb 2019 - 21:11)
johuv a écrit :
var_dump($_POST);
essayé aussi.

Je présume que ça donne un tableau vide ?
johuv a écrit :
je ne sais pas trop quoi regarder.

Les variables transmises (ça a l'air ok), la méthode (POST ?), l'URL (qui semble bonne)
Du coup, dernière tentative de ma part, envoyer les en-têtes avant les données (avant le send) :
xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded");

Après, franchement, je sèche Smiley confused Comme disais Murtaugh : "Je suis trop vieux pour ces conneries"...
Seven tears a écrit :

Je présume que ça donne un tableau vide ?


ba heu... non, pas trop, à moins que ce ne soit pas ce qu'il faut regarder...

Headers
General
Request URL:  http://XXX/webroot/banane.php
 
Request Method: POST
Status Code: 200 OK
Remote Address: [::1]:8080
Referrer Policy: no-referrer-when-downgrade

Response header
Connection: Keep-Alive
Content-Length: 1178
Content-Type: text/html
Date: Wed, 13 Feb 2019 20:35:48 GMT
Keep-Alive: timeout=5, max=98
Server: Apache/2.4.9 (Win32) OpenSSL/1.0.1g PHP/5.5.12
X-Powered-By: PHP/5.5.12

Requeste header
Accept: */*
Accept-Encoding: gzip, deflate, br
Accept-Language: fr-FR,fr;q=0.9
Connection: keep-alive
Content-Length: 61
Content-Type: text/plain;charset=UTF-8
Cookie: PHPSESSID=4etfbsug18dbg5n0ri8rgnthb0
Host: localhost:8080
Origin:  http://localhost:8080
 
Referer:  http://XXXpages/photo
 
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36

Request Payload
ref=http://XXX/Medias/Photo/Michel%20et%20Lily/


"Preview" et "response" , c'est la même chose que mon message d'erreur

( ! ) Notice: Undefined variable: _post in E:\Creation site internet\Wamp\wamp\www\XXX\webroot\banane.php on line 3
Call Stack
#	Time	Memory	Function	Location
1	0.0007	138800	{main}( )	..\banane.php:0
 null



Et ça, ça ne change rien non plus..
function myGetByAJAX(ref) {
  var xhr = new XMLHttpRequest();
  xhr.onreadystatechange = function() {
    if (this.readyState == 4 && this.status == 200) {
      document.getElementById('data').innerHTML = this.responseText;
    }
  };
  xhr.open("POST","../webroot/banane.php",true);
  xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
  xhr.send("ref="+ref);
}


Merci d'avoir essayé Seven. Ca aura fait avancer quand même...
Modifié par johuv (13 Feb 2019 - 22:00)
bonsoir

j'ai testé ton code et effectivement rien n'est passé en POST au php
avec un objet FormData cela a l'air de mieux fonctionner
j'ai modifié le JS par

    function myGetByAJAX(ref) {
        var data = new FormData();
        data.append('ref', ref);
        var xhr = new XMLHttpRequest();
        xhr.onreadystatechange = function() {
            if (this.readyState == 4 && this.status == 200) {
                document.getElementById('data').innerHTML = this.responseText;
            }
        };
        xhr.open("POST", "../webroot/banane.php", true);
        xhr.send(data);
    }


et PHP (j'ai rien touché, juste bien verifier que POST est en majuscule)

<?php
if (isset($_POST['ref'])){
        $ref = $_POST['ref'];
	echo $ref;
}else{
	echo 'Il n\'y a rien';
}


bon courage
a+
Modifié par paodao (13 Feb 2019 - 22:53)
Bonjour Paodao
J'ai remplacé le JS par le tien, l'erreur a en effet disparue. Seulement, c'est toujours vide: je devrais trouver dans la variable une url

Voici le var_dump($_POST)
array (size=0)
  empty
ok

maintenant il faut verifier que tu envoie bien quelque chose coté js
fait un console.log dans le js

    function myGetByAJAX(ref) {
    console.log(ref);
Je l'ai mi juste après le send.

Il envoie bien.
array (size=1)
  'ref' => string 'http://xxxx/Medias/Photo/Michel%20et%20Lily/' (length=57)


http://xxxx/Medias/Photo/Michel%20et%20Lily/
salut

le simple fait de rajouter le console.log fait que cela fonctionne ?

si oui regarde comment vider le cache de ton truc et/ou comment forcer la recompilation des fichiers et/ou vider le cache du navigateur. Un console.log ne sert a rien d'autre qu'afficher un truc dans la console, cela ne resoud en soit aucun problème

a+
C'est étrange... ça passe. Je ne sais pas si c'est le vidage du cache du navigateur ou si c'est le clearstatcache() que j'ai mit à la fin de mon script affichelistphoto.php, mais ça a l'air de fonctionner. Merci Paodao !
Parsimoni a écrit :
Mais après, il restera du boulot. Juste pour information pour l'instant :
- le code généré par webdav contient trop de chose qu'il va falloir retirer
- il va falloir modifier myGetByAJAX() pour qu'il crée dans la page principale le conteneur des liens que tu récupères de webdav
- il va falloir gérer le fait que si l'utilisateur a déjà cliqué sur un lien, ce n'est pas la peine d'aller les récupérer une nouvelle fois
- il va éventuellement falloir ajouter un mécanisme cachant/montrant l'arborescence des dossiers et fichiers dans la page principale pour que ce soit plus pratique pour l'utilisateur.

On n'a pas fini. Smiley cligne

Bon !maintenant que ça fonctionne, j'ai modifié mon fichier "banane.php"(que je renommerais plus tard) et j'arrive a traverser arborescence. Je suis prêt pour la suite
<?php
if (isset($_POST['ref'])){ 
	$ref = $_POST['ref'];
	// Connection au serveur
$url = $ref;
	Require_once '../core/connectwebdav.php';
	//-------------------------
	require_once '../core/simple_html_dom.php';
	$html2 = new simple_html_dom();
	$html2->load($serveur);
	foreach ($html2->find('h1') as $title):{
    $title->outertext = '';
	}
	endforeach;

	foreach ($html2->find('a') as $a):{ // je cherche les liens
	    $a->id="lien1";
	    $ref2 = $url.$a->href; //je fabrique la nouvelle adresse
	    $a->href = '#data'; // je change l'adresse du lien vers une ancre
	    $a->onclick="myGetByAJAX('".$ref2."')";
	}
	endforeach;

	$dossierphoto = $html2->save();  //je sauvegarde
}
?>

Modifié par johuv (16 Feb 2019 - 13:27)
Bonjour, je galère à fond... ça fait 6 jours que je m'efforce a trouver une solution.

Je souhaite, toujours dans mon dossier banane, trouver tous les liens qui se terminent par "jpg" ou "jpeg".
Seulement, tout ce que j'essaye n'est pas bon :

$dossierphoto est la variable où il y a tout le html du serveur fourni et modifié par le dom.
Donc, ce que je cherchais à faire est de trouver tous les liens qui se terminent par 'jpg' par exemple, sinon, si ce n'est pas le cas, continuer l'ouverture du dossier au onclick.
Donc faire un if/else après
$extension = array(strtolower(strrchr($dossierphoto, '.')));

Seulement, j'affiche ce que j'ai pour voir quoi utiliser (je Click au hasard sur un dossier):
	print_r($extension);
	var_dump($dossierphoto);

Array ( [0] => .jpg )
string '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN"> <html>  <head>   <title>Index of /Medias/Photo/Manon et Zoe</title>  </head>  <body>  <ul><li><a href="#data" id="lien1" onclick="myGetByAJAX('http://xxx/Medias/Photo/Manon%20et%20Zoe//Medias/Photo/')"> Parent Directory</a></li> <li><a href="#data" id="lien1" onclick="myGetByAJAX('http://xxx/Medias/Photo/Manon%20et%20Zoe/2013%20%c3%a0%202016/')"> 2013 à 2016/</a></li> <li><a href="#data" id="lien1" onclick="myGetByAJAX('htt'... (length=2238)

et je m’aperçois qu'en fait, $extension ne me donne que le dernier lien.

En toute logique( enfin pour moi), j'essaye un "while" sans rien pourvoir concrétiser... tout comme si $dossierphoto était un seul lien et non une liste de lien. Quelqu'un aurait une voie à me proposer ?
merci
Salut

Désolé je débarque sur le sujet, j'ai pas lu toute les pages avant.
Du coup.... Tu essaye de trouver un certains type de "liens" dans une GROS string c'est ça en résumé ?
salut !

Je vais essayer de faire une résumé.

J'ai une page photo.php qui affiche une liste de photos. Ces photos se trouvent sur mon serveur maison.
Cette liste est récupérée via la page "affichephotoservliste.php" en utilisant SimpleDom qui se connecte à Webdav. La liste est donc récupérée sous forme de "copie" et affichée sur ma page "photo.php". Grace à Parsimoni, en récupérant cette liste, nous profitons de manipuler SimpleDom pour changer les noms de la liste en liens cliquables, traités par le script JS nommé
"fonctionDevelop.js". 
function myGetByAJAX(ref) {
        var data = new FormData();
        data.append('ref', ref);
        var xhr = new XMLHttpRequest();
        xhr.onreadystatechange = function() {
            if (this.readyState == 4 && this.status == 200) {
                document.getElementById('data').innerHTML = this.responseText;
            }
        };
        xhr.open("POST", "../webroot/banane.php", true);
        xhr.send(data);
    }
Ce script envoie à la page nommée pour le moment "banane.php" pour doit soit faire en sorte de continuer à ouvrir le dossier suivant, soit afficher les photos.

Ce qui fonctionne, c'est la récupération de la liste, le changement de la liste en liens cliquable, l'affichage de la "nouvelle liste" (ouverture du dossier cliqué et affichage).

Ce que j'essaye de faire, c'est de demander à "Banane.php" la chose suivante:
"Si le lien est cliqué, afficher la liste du dossier. SI la liste est le dernier enfant, c'est à dire qu'il ne reste que des photos, afficher les photos, sinon, afficher les dossiers suivant. Si la liste contient des dossiers et des photos, afficher les deux."
Voici "Banane .php"
<?php
if (isset($_POST['ref'])){               // si le lien est cliqué
		$ref = $_POST['ref'];            // utiliser le lien comme adresse
		// Connection au serveur     
		$url = $ref;
		Require_once '../core/connectwebdav.php';        // connection à Webdav
		//-------------------------
		require_once '../core/simple_html_dom.php';
		$html2 = new simple_html_dom();
		$html2->load($serveur);                                     // récupération de la liste
		foreach ($html2->find('h1') as $title):{
	    	$title->outertext = '';                                           // je supprime le titre affiché
		}
		endforeach;

		foreach ($html2->find('a') as $a):{               // je cherche les liens
		    $a->id="lien1";
		    $ref2 = $url.$a->href;                           //je fabrique la nouvelle adresse
		    $a->href = '#data';            // je change l'adresse du lien vers une ancre
		    $a->onclick="myGetByAJAX('".$ref2."')";   // j'inscris le onclick
		}
		endforeach;

	$dossierphoto = $html2->save();                  //je sauvegarde
//  partie du dessus fonctionnelle. Affiche la nouvelle liste avec echo $dossierphoto;
	
$extension = array(strtolower(strrchr($dossierphoto, '.')));
	print_r($extension);
	var_dump($dossierphoto);

}
?>


J'essaie donc de faire vérifier les extentions pour détecter les jpg et jpeg. faire des "if il y a jpeg || jpg -> afficher les photos , else afficher echo $dossierphoto;

echo $dossierphoto;
m'affiche bien une liste (ul)
Mais quand je récupère les extensions, il me sort que la dernière.
Je ne parviens pas à sortir la liste de toutes les extensions. J'ai essayé avec "while" mais je m'y prends comme un manche, ou ce n'est pas la méthode appropriée...
Pages :