Creer une routine sur 52 semaines, comment faire ?

Eléphanteau du PHP | 15 Messages

29 mai 2016, 10:15

:mrgreen:

Bon, il y a du boulot je vois...
Suite à mes lectures sur le Net et pour me faire gagner un peu (beaucoup) de temps Saian,
aurais tu un départ de routine pour le short code à coller sur le site
que je puisses étudier les fonctions et la forme de cela ?

Sous WP, j'utilise PHP CODE pour lancer les snippets.
ça suffirait pour mon besoin ?

ça va ? je connais un peu plus de mots maintenant ? :lol:

Je t'en remercie par avance

Eléphanteau du PHP | 15 Messages

29 mai 2016, 13:11

Eh bien par exemple, imaginons que tes noms de fichiers soient stockés dans une base de données, avec une date à partir de la laquelle ils seront disponibles en téléchargement (au format AAAA-MM-JJ). Quand l'utilisateur arrive sur la page, le code suivant pourrait fonctionner :
<?php

// Définition de la date d'aujourd'hui
$aujourdhui = date('Y-m-d');

// Récupération des fichiers disponibles au téléchargement
// (si leur date est en dessous ou égale à celle d'aujourd'hui)
$result = mysqli_query($db, "SELECT * FROM table_des_fichiers WHERE date<='".$aujourdhui."'");
while($row = mysqli_fetch_array($result))
{
          echo "<a href='Repertoire/".$row['nom_du_fichier']."'>".$row['nom_du_fichier']."</a>";
}

?>
Bon évidemment, c'est basique, faudrait quelques vérifications de sécurité pour éviter que n'importe qui télécharge n'importe quel fichier sans que ce soit autorisé, mais sur le principe ça évite un CRON.
finipe,
Pourrais tu maintenant me montrer un exemple de routine sans cron et avec les avancées de Saian ?
2 points de vue me permettront de mieux analyser vos réponses pour réussir mon projet.
merci bien :)
Modifié en dernier par jeanbianne le 29 mai 2016, 22:33, modifié 1 fois.

Eléphant du PHP | 337 Messages

29 mai 2016, 19:50

Je ne suis pas sûre d'avoir compris ta question... le petit bout de script que je t'ai fourni fait exactement ce que tu cherches à faire. Après, comme l'a dit Saian, il y a d'autres façons similaires d'utiliser ce principe.

Par exemple, sans utiliser de base de données et en nommant tes fichiers de façon à inclure la date de disponibilité :

- nom_de_fichier1_2016_05_01.pdf
- nom_de_fichier2_2016_06_01.pdf
- nom_de_fichier3_2016_07_01.pdf
- nom_de_fichier4_2016_08_01.pdf
- etc...

Tu fais un scan de ton dossier source, et tu affiches uniquement les fichiers dont la date correspond :
<?php

$_FICHIERS = scandir("./Repertoire_source");
for($i=0 ; $i<=sizeof($_FICHIERS) ; $i++)
{
	// Définition de la date d'aujourd'hui
	$aujourdhui = date("Y-m-d");

	// On récupère la date dans le titre du fichier (d'abord année, puis mois, puis jour)
	$date = substr($_FICHIERS[$i], -14, 4)."-".substr($_FICHIERS[$i], -9, 2)."-".substr($_FICHIERS[$i], -6, 2);

	// On compare la date, et on affiche si c'est bon
	if($date <= $aujourdhui) echo "<a href='Repertoire_source/".$_FICHIERS[$i]."'>".$_FICHIERS[$i]."</li>";
}

?>
Un script comme ça fait le boulot sans problème, c'est juste un peu emmerdant de nommer les fichiers à chaque fois.

Eléphanteau du PHP | 15 Messages

29 mai 2016, 21:47

Merci finipe,
Je suis débutant, c'est le moins qu'on puisse dire
donc je n'exprime surement pas assez précisément et clairement mon besoin...
vraiment l'idéal pour moi est de travailler sans bases de données.
Nommer les fichiers à la "mano" n'est rien par rapport à un langage que je ne maitrise pas !
Je n'aurais à renommer qu'une fois par an 52 fichiers, c'est pas la mer à boire.

J'ai installéta routine,
j'ai mis le bon répertoire à la place de /Repertoire_source :

<?php

$_FICHIERS = scandir("./wp-content/uploads/001/");
for($i=0 ; $i<=sizeof($_FICHIERS) ; $i++)
{
// Définition de la date d'aujourd'hui
$aujourdhui = date("Y-m-d");

// On récupère la date dans le titre du fichier (d'abord année, puis mois, puis jour)
$date = substr($_FICHIERS[$i], -14, 4)."-".substr($_FICHIERS[$i], -9, 2)."-".substr($_FICHIERS[$i], -6, 2);

// On compare la date, et on affiche si c'est bon
if($date <= $aujourdhui) echo "<a href='./wp-content/uploads/001/".$_FICHIERS[$i]."'>".$_FICHIERS[$i]."</li>";
}

?>
Je vois bien le lien "...semaine1_2016_05_29.pdf" apparaitre sur la page, nickel !

Mais 1-Des que je clique dessus le message suivant apparait :
Oops! That page can’t be found.
It looks like nothing was found at this location. Maybe try one of the links below or a search?

2-Je tente d'enregistrer le fichier avec un clic droit,
ça le fait, mais quand je tente de lire ce fichier, le lecteur pdf trouve qu'il est illisible,
ou corrompu

EDIT: Je vois que le lien est "assujeti" à la page.
Lorsque je remplace ./wp-content/uploads/001/
par: lenomdusite.com/wp-content/uploads/001/
là ça part en cacahuète...

une idée ?

Ceci étant,
j'ai l'impression que le code permet d'afficher les fichiers aux fur et à mesure du temps qui passe,
les uns après les autres.
Mon besoin est : afficher sur la page un seul fichier , pendant pratiquement une semaine,
du vendredi 8h30 au jeudi 23h59.
suis je plus clair ? 8-|
et cela 52 fois dans l'année..voir 53 :P

merci bien

Eléphant du PHP | 337 Messages

30 mai 2016, 00:07

Je me suis gourée dans le code précédent, en mettant un </li> à la place du </a>. A tout hasard, ne mets pas de "./" devant le répertoire source dans le lien <a href='....'>

Pour chercher le fichier de la semaine en cours et uniquement celui-là, c'est encore plus simple finalement.
Il suffit de renommer les fichiers comme ceci :

- fichier1_01.pdf
- fichier2_02.pdf
- fichier3_03.pdf
- ...
- fichier51_51.pdf
- fichier52_52.pdf

Puis le code suivant fait l'affaire :
<?php

$_FICHIERS = scandir("./Repertoire_source");
for($i=0 ; $i<sizeof($_FICHIERS) ; $i++)
{
	// On récupère le numéro de semaine dans le nom du fichier
	$semaine = intval(substr($_FICHIERS[$i], -6, 2);

	// On compare la semaine avec la fonction date(W) qui renvoie le numéro de semaine en cours
	if($semaine == date(W))
	{
		echo "<a href='Repertoire_source/".$_FICHIERS[$i]."'>".$_FICHIERS[$i]."</a>";

		// Inutile d'aller plus loin si le fichier est trouvé, on stoppe la boucle
		break;
	}
}

?>
Dans ce cas là, ça affichera du lundi 0h00 au dimanche 23h59. Si tu veux décaler le jour, faudra bidouiller un peu et rajouter quelques lignes de code !

Attention quand même, tu auras des problèmes si tes fichiers ont des extensions de 4 lettres (je ne sais pas ce que tu proposes de télécharger).

Eléphanteau du PHP | 15 Messages

30 mai 2016, 00:26

ce sont des pdf fait sur word au départ...

<?php

$_FICHIERS = scandir("./wp-content/uploads/001/");
for($i=0 ; $i<sizeof($_FICHIERS) ; $i++)
{
// On récupère le numéro de semaine dans le nom du fichier
$semaine = intval(substr($_FICHIERS[$i], -6, 2);

// On compare la semaine avec la fonction date(W) qui renvoie le numéro de semaine en cours
if($semaine == date(W))
{
echo "<a href='wp-content/uploads/001/".$_FICHIERS[$i]."'>".$_FICHIERS[$i]."</a>";

// Inutile d'aller plus loin si le fichier est trouvé, on stoppe la boucle
break;
}
}

?>

ça bloque sur la ligne 7
$semaine = intval(substr($_FICHIERS[$i], -6, 2);

mess error:

Parse error: syntax error, unexpected ';' in /homepages/5/d600267790/htdocs/menudelasemaine/wp-content/plugins/php-code-for-posts/Classes/Shortcode.php(81) : eval()'d code on line 7

mon fichier test : fichier22_22.pdf

Eléphant du PHP | 337 Messages

30 mai 2016, 00:42

J'ai oublié une parenthèse : $semaine = intval(substr($_FICHIERS[$i], -6, 2));

Eléphanteau du PHP | 15 Messages

30 mai 2016, 07:15

J'ai oublié une parenthèse : $semaine = intval(substr($_FICHIERS[$i], -6, 2));
ça y est c'est rajouté, le lien du fichier apparait.
j'ai toujours le pb au clic de l'origine du lien,
il va chercher le fichier sur http://www.monsite.com/page1/wp-content/uploads/001/ :non:
c'est en rapport au <a></a> ?

merci

EDIT:
j'ai ajouté un . avant /wp-content/uploads/001/,
même pb
puis je l'ai supprimé,
puis j'ai réessayer le clic su le lien:
eureka ça marche !!! :D :D :D

merci de cette aide précieuse, maintenant je vais essayer de décortiquer
le code et attendre la semaine prochaine pour voir si ca tourne toujours :roll: :priere:

merci beaucoup =D> =D> =D>

REEDIT:
pour éviter d'attendre 1 semaine j'ai changé l'heure de mon ordi,
c'est pas ça hein, la routine fait référence à la date du serveur de mon hébergeur ?
Je dois partir chez 1and1 (en allemagne) pour modifier son horloge et finir mon test ? :shock:

REREEDIT:
au fait, je m'emporte ...
1-Lorsque l'on copie l'adresse du lien,dans un navigateur on a accès directement au fichier:
Pas bon pour moi :non:
2-Comment modifier le code afin d'obtenir l'affichage de la semaine suivante,
il y a un Date+1 a placer qq part mais ou ?
3-Si la personne qui reçoit un mail avec le lien de la page de la semaine 21 mais qu'elle l'ouvre 2 semaines
plus tard,elle aura accès à la semaine 23.

Eléphant du PHP | 337 Messages

30 mai 2016, 09:25

Lorsqu'on copie l'adresse dans le navigateur on a accès au fichier : ben oui, évidemment... c'est le principe. Après si tu veux forcer le téléchargement, et non l'affichage, tu peux rajouter un élément à la balise <a> :
<a href='ici_lien_de_telechargement' download='nom_sous_lequel_le_fichier_sera_téléchargé'>...</a>
Attention toutefois, cet attribut download ne fonctionne pas parfaitement selon les navigateurs (ça marche pas sur Safari par exemple). Pour forcer le téléchargement, tu peux aussi zipper tes fichiers.

Quant au problème de cliquer sur le lien de la semaine 21 deux semaines plus tard, là c'est effectivement plus problématique, je n'avais pas compris que chaque utilisateur pouvait ne pas avoir à télécharger chaque fichier de chaque semaine... Pour ce faire, il faut imaginer une sorte de "code secret" qui permet l'affichage du fichier choisi, ça change tout !

Dans ce cas là, il faudrait construire un tableau qui associe le nom du fichier de la semaine choisie avec un code secret qui permet son téléchargement. Et pour éviter de s'embêter à générer soi-même des codes, une fonction qui génère un code secret et qui vérifie que ce code n'a pas déjà été utilisé pour un des éventuels 52 autres fichiers.
Modifié en dernier par finipe le 30 mai 2016, 09:49, modifié 3 fois.

Eléphant du PHP | 337 Messages

30 mai 2016, 09:47

// Variable de stockage des fichiers et codes secrets associés
$CODES = array(
				1 => array('nom_du_fichier_1', 'code_secret_1');
				2 => array('nom_du_fichier_2', 'code_secret_2');
				3 => array('nom_du_fichier_3', 'code_secret_3');
				...
				51 => array('nom_du_fichier_51', 'code_secret_51');
				52 => array('nom_du_fichier_52', 'code_secret_52');
			);


// URL de la page type http://www.monsite.com/page.php?code=XXXXX
if(isset($_GET['code']))
{
	// Boucle sur la variable $CODES
	for($i=1 ; $i<=52 ; $i++)
	{
		// Si le code de l'URL correspond au code de la variable, on affiche le lien
		if($CODES[$i][1] == $_GET['code'])
		{
			echo "<a href='Repertoire_source/".$CODES[$i][0]."'>".$CODES[$i][0]."</a>";

			// Et on arrête la boucle
			break;
		}
	}
}
Alors avec ça, n'importe qui ayant l'URL d'une semaine déterminée peut accéder au téléchargement, quelle que soit la semaine pendant laquelle il essaye d'accéder au fichier. Si tu veux qu'en plus on ne puisse télécharger un fichier donné que pendant la semaine donnée, il faut rajouter une condition :
// Variable de stockage des fichiers et codes secrets associés
$CODES = array(
				1 => array('nom_du_fichier_1', 'code_secret_1');
				2 => array('nom_du_fichier_2', 'code_secret_2');
				3 => array('nom_du_fichier_3', 'code_secret_3');
				...
				51 => array('nom_du_fichier_51', 'code_secret_51');
				52 => array('nom_du_fichier_52', 'code_secret_52');
			);


// URL de la page type http://www.monsite.com/page.php?code=XXXXX
if(isset($_GET['code']))
{
	// Boucle sur la variable $CODES
	for($i=1 ; $i<=52 ; $i++)
	{
		// Si le code de l'URL correspond au code de la variable,
		// ET si la semaine actuelle correspond, on affiche le lien
		if($CODES[$i][1] == $_GET['code'] && date(W) == $i)
		{
			echo "<a href='Repertoire_source/".$CODES[$i][0]."'>".$CODES[$i][0]."</a>";

			// Et on arrête la boucle
			break;
		}
	}
}
Après, une fonction supplémentaire pour générer des codes secret, c'est faisable, mais pas sans passer par une quelconque forme de stockage (base de données, fichier externe txt...). Mais si formater 52 noms de fichiers ne te fait pas peur, j'imagine qu'inventer 52 codes non plus. Par exemple, un mélange de 5 chiffres/lettres sensibles à la casse, ça te laisse déjà 62 puissance 5 possibilités, soit presque 1 milliard.

Eléphanteau du PHP | 15 Messages

30 mai 2016, 10:27

Finipe,
J'étudie tout ça à tête reposée et Je te tiens au courant.
Merci pour ton aide en tous les cas.
Là je m'occupe de ma fille :wink: