La date/heure via un menu déroulant pour les champs extra

Ceci est une ARCHIVE, peut-être périmée. Vérifiez bien les compatibilités !

Attention ! Cette contribution modifie des fichiers du noyau de SPIP !

Même si elle a été testée par plusieurs utilisateurs nous ne pouvons garantir qu’il n’y aura pas d’effets secondaires dommageables sur votre SPIP. Conservez toujours les fichiers d’origine pour pouvoir revenir au noyau originel.

De plus, elle n’est compatible qu’avec une version précise de SPIP et sera perdue à la prochaine mise à jour : vous devrez donc recommencer.

Par défaut, quand on utilise les champs extra pour des dates, la date et l’heure se complètent via un champ de texte où l’on doit rentrer la date en respectant scrupuleusement JJ/MM/AAAA et HH/MM/SS.

Via cette contribution vous pourrez entrez la date et heure grace à six listes de selection du jour, du mois, de l’année, de l’heures, des minutes et des secondes.

Apparence visuelle de champs date-heure

Attention : il n’est pas conseillé de faire cette modification directement sur votre site en ligne. Il sera plus judicieux de créer une copie en local ou dans un répertoire de test afin de ne pas jouer sur la stabilité de votre site SPIP. Une fois que vous êtes sûr du bon fonctionnement sur votre installation, vous pourrez passer la contribution sur votre site en production.

Introduction

Nous mettrons en place ce système en modifiant deux fichier se situant le le repertoire ecrire/ de votre site : mes_options.php3, inc_extra.php3.

mes_options.php3

Pour définir un champ extra il faut créer un tableau contenant la forme de nos champs extra.

$champs_extra = true;

$GLOBALS['champs_extra'] = Array(
	'articles'=>Array(
"date_debut"=>"date|brut|Date de début(Obligatoire)|||",
"date_fin"=>"date|brut|Date de fin|||",
"heure_debut"=>"heures|brut|Heure de début|||",
"heure_fin"=>"heures|brut|Heure de fin|||",
	),
	'rubriques'=>Array(
	),
	'breves'=>Array(
	),
	'auteurs'=>Array(
	),
);

Dans notre cas on définit une date de début/fin et une heure de début/fin.

Voilà la première partie effectuée !

inc_extra.php3

Ensuite il faut modifier le fichier inc_extra.php3, en déclarant la façon de travailler pour ces champs qui ne seront plus des « input text » mais des « select ».

Modifions ainsi le script :

case "date":
				$choix = explode(",",$choix);
				if (!is_array($choix)) {
					$affiche .= "Pas de choix définis.\n";
					break;
				}
				// si valeur okay alors :
				$tempori = $extra["$champ"];
				$tempori = explode("-", $tempori);
				
				$affiche .= "<SELECT NAME='suppl_j_$champ'>";
				for ($i="1"; $i < "32"; $i++){
				if($tempori[2]==$i){ $selectj="SELECTED"; } else { $selectj=""; }
				$affiche .= "<OPTION VALUE='$i' $selectj>$i</option>";
				}
				$affiche .= "</SELECT>";
				
				$mois = array('', 'Janvier','Février','Mars','Avril','Mai','Juin', 'Juillet', 'Aoüt', 'Septembre', 'Octobre', 'Novembre', 'Décembre');
				$affiche .= "<SELECT NAME='suppl_m_$champ'>";
				for ($i="1"; $i < "13"; $i++){
				$affiche_mois = $mois[$i];
				if($tempori[1]==$i){ $selectm="SELECTED"; } else { $selectm=""; }
				$affiche .= "<OPTION VALUE='$i' $selectm>$affiche_mois</option>";
				}
				$affiche .= "</SELECT>";
				
				$year = date("Y");
				$affiche .= "<SELECT NAME='suppl_a_$champ'>";
				for ($i="$year" ; $i < $year+10; $i++){
				if($tempori[0]==$i){ $selecta="SELECTED"; } else { $selecta=""; }
				$affiche .= "<OPTION VALUE='$i' $selecta>$i</option>";
				}
				$affiche .= "</SELECT>\n";
				break;
				
				
				case "heures":
				$choix = explode(",",$choix);
				if (!is_array($choix)) {
					$affiche .= "Pas de choix d&eacute;finis.\n";
					break;
				}
				// si valeur okay alors :
				$temporih = $extra["$champ"];
				$temporih = explode(":", $temporih);
				
				$affiche .= "<SELECT NAME='suppl_h_$champ'>";
				for ($i="0"; $i < "24"; $i++){
				if($temporih[0]==$i){ $selectj="SELECTED"; } else { $selectj=""; }
				if($i=="0"){ 
					$affiche .= "<OPTION VALUE='0' $selectj>NC</option>";
					}else{
					$affiche .= "<OPTION VALUE='$i' $selectj>$i</option>";
					}
				}
				$affiche .= "</SELECT> H ";
				
				$affiche .= "<SELECT NAME='suppl_m_$champ'>";
				for ($i="0"; $i < "60"; $i++){
				if($temporih[1]==$i){ $selectm="SELECTED"; } else { $selectm=""; }
				if($i=="0"){ 
					$affiche .= "<OPTION VALUE='0' $selectm>NC</option>";
					}else{
					$affiche .= "<OPTION VALUE='$i' $selectm>$i</option>";
					}
				}
				$affiche .= "</SELECT> min ";
				
				$affiche .= "<SELECT NAME='suppl_s_$champ'>";
				for ($i="0"; $i < "60"; $i++){
				if($temporih[2]==$i){ $selecta="SELECTED"; } else { $selecta=""; }
				if($i=="0"){ 
					$affiche .= "<OPTION VALUE='0' $selecta>NC</option>";
					}else{
					$affiche .= "<OPTION VALUE='$i' $selecta>$i</option>";
					}
				}
				$affiche .= "</SELECT> sec \n";
				break;

Il vous suffit de remplacer le case« date » et le case« heure » par ce code.

Ensuite il faut descendre un peu plus bas dans la page au niveau de la function « extra_recup_saisie » et dans le while rajouter ce code qui concatène toutes les variables définis ci-dessus.

switch ($style) {

			case "date":
			$date_debut_ok = $GLOBALS["suppl_a_$champ"];
			$date_debut_ok .= "-";
			$date_debut_ok .= $GLOBALS["suppl_m_$champ"];
			$date_debut_ok .= "-";
			$date_debut_ok .= $GLOBALS["suppl_j_$champ"];
			$extra["$champ"] = $date_debut_ok;
			
			if($GLOBALS["suppl_a_date_debut"] > $GLOBALS["suppl_a_date_fin"]) {
			$extra["date_fin"] = $extra["date_debut"];
			 }
			 if($GLOBALS["suppl_m_date_debut"] > $GLOBALS["suppl_m_date_fin"]) {
			$extra["date_fin"] = $extra["date_debut"];
			 }
			 if($GLOBALS["suppl_j_date_debut"] > $GLOBALS["suppl_j_date_fin"]) {
			$extra["date_fin"] = $extra["date_debut"];
			 }
				break;	
				
			case "heures":
			$heures_debut_ok = $GLOBALS["suppl_h_$champ"];
			$heures_debut_ok .= ":";
			$heures_debut_ok .= $GLOBALS["suppl_m_$champ"];
			$heures_debut_ok .= ":";
			$heures_debut_ok .= $GLOBALS["suppl_s_$champ"];
			$extra["$champ"] = $heures_debut_ok;
					
			break;

Le tour est joué, chaque article sera composé avec les champs extras heure début, heure fin, date début et date fin.

Discussion

4 discussions

  • Bonjour, est-il possible d’adapter cette contrib à champs extra 2 ?

    Répondre à ce message

  • 1

    C’est une erreur de considérer que 00h00m00s est NC NC NC

    Si on peut se passer des secondes, il vaudrait mieux considérer que

    • si les secondes valent 0, c’est NChNCm
    • si elles valent autre chose que 0 (autant mettre 1), alors les valeurs de h et m sont renseignées

    Cela permet d’avoir une heure renseignée à 00h00m (genre le 1er de l’An).

    • Novispip

      Merci pour cette contrib !

      Petite question :

      Mon but est de lister des évènements :
      je souhaiterais via une boucle spip
      -  afficher SEULEMENT les articles dont la date et heure de fin n’est pas dépassée
      -  lister ces articles par date et heure de début (du plus proche au plus tard)

      Avez-vous des astuces ?

      Merci beaucoup pour le coup de main !

    Répondre à ce message

  • hubombing

    Ben moi j’adore, ça m’aide beaucoup !
    Par contre je n’ai installé que la date et constaté une erreur.....

    Il faut absolument créer un champ caché :
    Sinon, ça ne marche pas.... cad que le stockage de la saisie en bdd ne se fait pas...

    Le code devient alors, avec 2 ou 3 menues amélioration de style... :
    Dans le fichier extras.php
    Dans la fonction extra_form
    Dans le switch/case, au-dessus de case « ligne » :


                            case "date":
                                    $choix = explode(",",$choix);
                                    if (!is_array($choix)) {
                                            $affiche .= "Pas de choix d&eacute;finis.\n";
                                            break;
                                    }
                                    // si valeur okay alors :
                                    $tempori = $extra["$champ"];
                                    $tempori = explode("-", $tempori);
                                    
                                    $affiche .= "<INPUT NAME='suppl_$champ' type='hidden' />";
                                    $affiche .= "<SELECT NAME='suppl_j_$champ' style='width: 40px;'>";
                                    $affiche .= "<OPTION VALUE='0'>--</option>";
                                    for ($i="1"; $i < "32"; $i++){
                                            if($tempori[2]*1==$i){ $selectj="SELECTED"; } else { $selectj=""; }
                                            $affiche .= "<OPTION VALUE='$i' $selectj>$i</option>";
                                    }
                                    $affiche .= "</SELECT>";
                                    
                                    $mois = array('', 'Janvier','Fevrier','Mars','Avril','Mai','Juin', 'Juillet', 'Aout', 'Septembre', 'Octobre', 'Novembre', 'Decembre');
                                    $affiche .= "<SELECT NAME='suppl_m_$champ' style='width: 80px;'>";
                                    $affiche .= "<OPTION VALUE='0'>--</option>";
                                    for ($i="1"; $i < "13"; $i++){
                                            $affiche_mois = $mois[$i];
                                            if($tempori[1]*1==$i){ $selectm="SELECTED"; } else { $selectm=""; }
                                            $affiche .= "<OPTION VALUE='$i' $selectm>$affiche_mois</option>";
                                    }
                                    $affiche .= "</SELECT>";
                                    
                                    $year = date("Y");
                                    $affiche .= "<SELECT NAME='suppl_a_$champ' style='width: 60px;'>";
                                    $affiche .= "<OPTION VALUE='0'>--</option>";
                                    for ($i="$year" ; $i < $year+10; $i++){
                                            if($tempori[0]==$i){ $selecta="SELECTED"; } else { $selecta=""; }
                                            $affiche .= "<OPTION VALUE='$i' $selecta>$i</option>";
                                    }
                                    $affiche .= "</SELECT>\n";
                                    break;

    D’autre part, dans la fonction de traitement, j’ai simplifié les choses et veillé à ce qu’il y ait bien un formatage AAAA-MM-JJ....

    Ca donne :

    Dans le fichier extras.php
    Dans la fonction extra_recup_saisie
    Dans le switch/case, au-dessus de case ’case’ :


                            case "date":
                                    $j=$GLOBALS["suppl_j_$champ"];
                                    $m=$GLOBALS["suppl_m_$champ"];
                                    $a=$GLOBALS["suppl_a_$champ"];
                                    if ($j*1<10){
                                            $j="0".$j*1;
                                    }
                                    if ($m*1<10){
                                            $m="0".$j*1;
                                    }
                                    if ($a=="0"){
                                            $a="0000";
                                    }
                                    $extra[$champ] = $a."-".$m."-".$j;
                                    
                                    break;        

    Hope it helps !

    Répondre à ce message

  • pff c’est bien compliqué tout ca, ou en tout cas super long pour ce que c’est

    Répondre à ce message

Ajouter un commentaire

Qui êtes-vous ?
  • [Se connecter]

Pour afficher votre trombine avec votre message, enregistrez-la d’abord sur gravatar.com (gratuit et indolore) et n’oubliez pas d’indiquer votre adresse e-mail ici.

Ajoutez votre commentaire ici

Ce champ accepte les raccourcis SPIP {{gras}} {italique} -*liste [texte->url] <quote> <code> et le code HTML <q> <del> <ins>. Pour créer des paragraphes, laissez simplement des lignes vides.

Ajouter un document

Suivre les commentaires : RSS 2.0 | Atom

Dernière modification de cette page le 18 janvier 2006