8796 sujets

Développement web côté serveur, CMS

Pages :
Salut,

Non, il ne s'agit pas d'une blague salace mais d'une vrai question... Smiley lol

J'ai un module multilingue avec çà :
<?php
require("lang/decide-lang.php");
?>

et donc 1 fichier par langue qui appelle mes traductions par "define".

Le truc c'est que j'ai de grandes listes et que j'aimerai pour des questions de
praticité, pouvoir les appeler avec un
<?php include('inc/liste1.inc.php'); ?>

dans chaque fichier "Langue.php".

En gros ça donnerait çà :

define('LIST_ORATEURS_1', '<?php include('/inc/liste1.inc.php'); ?>');


et évidemmment je me retrouve avec çà :

Parse error: syntax error, unexpected '<' in C:\wamp\www\EFTA\lang\fr-lang.php on line 84


Faute de novice quoi...

Une idée ?

Merci,
Sam
Modifié par Samiaule (30 Oct 2009 - 16:19)
Modérateur
Hello Samiaule,

À propos des constantes (de mémoire) :
- une constante se définit par l'instruction « define » ;
- il est de rigueur d'écrire les constantes en majuscule ;
- la valeur d'une constante doit être figé ;
- la valeur d'une constante ne peut être par le résultat d'une opération (résultat d'un fonction, instruction, méthode, modèle, etc.)

ex juste :

//accès répoertoires
define ("INCLUDE","include/");
define ("IMAGES","images/");

//accès à la base de données
define ("UTILISATEUR","moi");
define ("MOT_DE_PASSE","123456");


ex erroné :

define ("UTILISATEUR",$uneVariable);
define ("IMAGES",getRepImages($uneAutreVar));

//etc.


De manière générale, ton écriture est fausse. Ce serait plutôt :

define('LIST_ORATEURS_1', include '/inc/liste1.inc.php');
// et encore là, je crois que ça ne passera pas. 

Pour ton soucis, je verrai bien une structure de contrôle qui va bien (switch, if, ...). Après, tu peux faire appel à une constante.

ex :

$accesFichiersFR = REP_INCLUDE.FICHIER_FR;
if($_GET['langue'] === FR)
	require_once $accesFichiersFR;


Je sais que sur Alsacréations, il y a un tuto sur les styles switcher. Peut être que tu peux t'en inspirer pour tes propres besoins.

Bonne journée à toi

Au passage, « require_once » (exiger une fois seulement) est mieux, je crois. Smiley smile
Modifié par Nolem (27 Oct 2009 - 12:21)
Salut Nolem,

Fidèle au poste je constate ! Merci d'être là.
Tu m'as un peu éclairci...

Mais je suis vraiment bourré de lacunes en la matière et les pistes
que tu indiques sont très insuffisantes pour un profane comme moi...

Bon, quoi qu'il en soit je continue de chercher la solution et "tâtonnant" !

@+
Modérateur
Attention, je viens de rééditer mon premier message...

Si tu as un bout de code à nous montrer, je pense que l'on pourrait mieux te venir en aide.
Arf... oui on s'est croisé ! Smiley smile


Donc voici le binz'

1 - Page xhtml.php avec :

<?php
require("lang/decide-lang.php");
?>


2 - Dans mon <body>


<?php echo LISTE1; ?>
<?php echo LISTE2; ?>


3 - Mes fichiers de choix de langues : fr-lang.php et en-lang.php contiennent
les même "define" traduits qu'on choisit avec le switch "decide-lang.php".


<?php
// LISTES NOMS
//---------------------------------------------------------
define('LISTE1', "<h1>Nom1, Prénom1</h1><p>Spécialité 1</p>");
define('LISTE2', "<h1>Nom2, Prénom2</h1><p>Spécialité 2</p>");
// etc...... etc....
?>


J'aimerai juste pourvoir remplacer :
<h1>Nom1, Prénom1</h1><p>Spécialité 1</p>

par un "include" qui appelerai un fichier "LISTE1-fr.inc.php" et idem
dans le fichier Anglais par "LISTE1-en.inc.php"...

genre :
define('LISTE1', '<?php include('inc/liste1.inc.php'); ?>');


J'espère être clair... Smiley confus

Merci encore Nolem !
Modifié par Samiaule (27 Oct 2009 - 14:00)
Salut,
Nolem a écrit :
À propos des constantes (de mémoire) :
- la valeur d'une constante ne peut être par le résultat d'une opération (résultat d'un fonction, instruction, méthode, modèle, etc.)

ex erroné :

define ("UTILISATEUR",$uneVariable);
define ("IMAGES",getRepImages($uneAutreVar));

//etc.

C'est totalement faux ... Tu peux très bien définir une constante à partir d'une variable ou d'une fonction ou même d'une autre constante.

La seule restriction des constantes est qu'elles ne peuvent pas être de type composé (tableau, objet), juste de type scalaire (entier, float, booléen, chaine).

Il est donc tout à fait possible de mettre un include ou même tout autre structure de contrôle à l'intérieur. La chaine correspondant à la valeur de la constante sera alors tout ce qui s'affichera dans la page incluse plus la valeur du retour de l'include.

Donc par exemple :

page1 :
<?php
define( 'MA_CONSTANTE', include( 'page2.php' ) );

echo MA_CONSTANTE; // Affiche ok1
?>


page2 :
<?php
echo 'ok';
?>


Pour ne pas avoir la valeur 1 (true) de retour de la structure include, il faut nous-même retourner le résultat attendu.

Donc :

page1 :
<?php
define( 'MA_CONSTANTE', include( 'page2.php' ) );

echo MA_CONSTANTE; // Affiche ok
?>


page2 :
<?php
return 'ok';
?>
Salut Agylus et merci de nous rejoindre...
y'a du neuf...

Avec çà :

define('LISTE1', include('inc/liste1.inc.php'));


Le problème c'est que çà se pose avant mon code html... du coup c'est le boxon mais
bon, déjà mes listes sont affichées...

Pourtant mon
<?php echo LISTE1; ?>
est bien dans le <body>, y'a qq chose qui doit m'échapper ! Smiley sweatdrop
Parce que comme précisé dans mon message précédent, tu ne dois pas faire un echo dans le fichier inclus mais un return. Si tu fais un echo, il va te l'afficher à l'endroit où tu fais l'include et l'include te retournera 1 qui sera la valeur de la constante.

Faut lire les posts correctement ...
Modifié par Agylus (27 Oct 2009 - 15:03)
Modérateur
Hello Agylus,

Agylus a écrit :

C'est totalement faux ... Tu peux très bien définir une constante à partir d'une variable ou d'une fonction ou même d'une autre constante.

La seule restriction des constantes est qu'elles ne peuvent pas être de type composé (tableau, objet), juste de type scalaire (entier, float, booléen, chaine).


Oui moi aussi, lorsque j'ai lu ceci, j'ai eu la même remarque que toi.

En réfléchissant bien...
Qu'est ce qu'une constante ?
Qu'est ce qu'une variable ?


// syntaxiquement juste - sémantiquement faut !
//La lune est carrée
define ("TIMESTAMP",time());

Smiley biggol

Au passage, comment sont les exemples sur le manuel PHP ?
Modifié par Nolem (27 Oct 2009 - 16:13)
Agylus a écrit :
Parce que comme précisé dans mon message précédent, tu ne dois pas faire un echo dans le fichier inclus mais un return. Si tu fais un echo, il va te l'afficher à l'endroit où tu fais l'include et l'include te retournera 1 qui sera la valeur de la constante.

Faut lire les posts correctement ...


Yes effectivement, c'est ce que se passe... mea maxima culpa et merci encore !
Smiley confused
Modifié par Samiaule (27 Oct 2009 - 15:36)
Modérateur
J'ai à peu près saisie ton soucis Samiaule. Toutefois, il manque quelques lignes de codes à voir pour que je puisse t'aider d'avantage... Tu as au moins 4 fichiers apparemment (fichier français + fichier anglais avec les constantes qui vont biens pour les deux + decide-lang.php + ton fichier réception des données)


<?php
require_once "decide-lang.php";
//instruction php
?>
<html ... >
<!-- code html -->
<body>
<!-- code html -->
<h1><?php echo UNE_CONSTANTE ; // instructions php etc. ?></h1>
<!-- code html -->


un des fichier (Français - Anglais) où il y a les constantes :


define("UNE_CONSTANTE","une valeur");


fichier : decide-lang.php

if($_GET['langue'] === FR)
	require_once REP_INCLUSION.LANG_FR; // inc/lang_fr.php
else
	require_once REP_INCLUSION.LANG_EN; // inc/lang_en.php

Modifié par Nolem (27 Oct 2009 - 16:03)
Nolem a écrit :
Tu as au moins 4 fichiers apparemment (fichier français + fichier anglais avec les constantes qui vont biens pour les deux + decide-lang.php + ton fichier réception des données)


Absolument mon cher Watson !! Smiley smile

et mon "decide-lang.php" est comme suit :


session_start();
$lang = (isset($_GET["lang"])) ? $_GET["lang"] :  $_COOKIE["lang"];
if ($lang) {
   $expire = 365*24*3600;
   setcookie("lang", $lang, time() + $expire,'/');
   $_COOKIE["lang"] = $lang;
}
if (isset($_REQUEST["lang"])) {
$langue = $_REQUEST["lang"];
} else if (isset($_SERVER['HTTP_ACCEPT_LANGUAGE'])) {
$langue = $_SERVER['HTTP_ACCEPT_LANGUAGE'];
$langue = $lang[0].$lang[1];
} else {
$langue = "fr";
}
switch($lang) {
case "fr":
   default: include("lang/fr-lang.php");
     break;
case "en":
    include("lang/en-lang.php");
     break;
}



Et donc si je colle mes listes comme ceci :
define("UNE_CONSTANTE","
<div class="ma_css_kivabien">
<dl>
<dd>M. Machin : spécialité 24</dd>
<dd>Mark Truc :  spécialité 25</dd>
<dd>Guy Bidule :  spécialité 26</dd>
</dl>
</div>
");

çà le fait sans pb... par contre, si je veux garder ces listes dans un fichier "liste1.php" externe
et le poser genre avec une include dans ma page principale, c'est possible mais pas en "include" via
mes fichiers "francais.php" et anglais.php"...

Bref, le pb est vraiment de simplifier en compliquant !!! Smiley biggol
Modérateur
J'ai l'impression que ton erreur vient de là :


if ($lang) {
// [...]
$langue = $lang[0].$lang[1];
// [...]
$lang = "fr";


Que vaut $lang[0] et $lang[1] ?
En restant dans ta logique, j'écrirai :

$lang = (isset($_GET["lang"])) ? $_GET["lang"] :  $_COOKIE["lang"]; 
if (!isset($lang)) { 
   $expire = 365*24*3600; 
   setcookie("lang", $lang, time() + $expire,'/'); 
   $_COOKIE["lang"] = $lang; 
}else if (isset($_REQUEST["lang"])) { 
   $lang = $_REQUEST["lang"]; 
}else if (isset($_SERVER['HTTP_ACCEPT_LANGUAGE'])) { 
   $lang = $_SERVER['HTTP_ACCEPT_LANGUAGE']; 
   $lang = $lang[0]; // à vérifier
} else { 
   $lang = "fr"; 
}

// mauvaise idée (quoi que...)
switch($lang) { 
   case "fr": 
      include("lang/fr-lang.php"); 
      break; 
   case "en": 
      include("lang/en-lang.php"); 
      break; 
   default :
     die("ne doit pas arriver !");
} 

//plus élégant 
switch($lang) { 
   case "fr": 
      include("lang/fr-lang.php"); 
      break; 
   default : 
      include("lang/en-lang.php"); 
} 

code fait de tête. Je peux m'être trompé.

<<<EDIT
Une question que je me pose, pourquoi utilises tu $_REQUEST ?
Dans quel cas tu reçois une donnée émanant de $_REQUEST ? d'un cookie ?

Pour ma part, $_REQUEST est à utiliser avec parcimonie d'un point de vue sécurité.
EDIT;

De mémoire, un switch peut être combiné. Il est vraisemblable que ta série de if peut être combiné avec ton switch final. À essayer peut être, si ton code fonctionne correctement afin d'optimiser le tout.

Au passage, ton code html est erroné. Je crois que tu veux plutôt dire ceci, n'est ce pas ?

<div class="ma_css_kivabien"> 
   <dl> 
      <dt>M. Machin : </dt>
         <dd> spécialité 24</dd> 
      <dt>Mark Truc : </dt>
         <dd> spécialité 25</dd> 
      <dt>Guy Bidule : </dt>
         <dd> spécialité 26</dd> 
   </dl> 
</div> 

Modifié par Nolem (27 Oct 2009 - 17:07)
@Nolem : Tu confonds constante dans le temps et constante dans un script. Une constante en programmation est inhérent à un script et non dans le temps. Donc quand tu fais un define, c'est forcément pour une constante liée au script (c'est logique), donc je ne vois pas en quoi mettre un time() dans une constante en début de script est sémantiquement incorrect, c'est au contraire tout ce qu'il y a de plus correct.

Un autre exemple tout con : Je gère trois ou quatre serveurs load-balancés, je veux faire un script de logs dont le nom du fichier va par exemple prendre le nom du serveur en question. Je vais donc créer une constante qui prendra pour valeur le nom du serveur puis l'extension et ça me donnera le nom du fichier en constante pour ce script.
On a donc :
define( 'NOM_DU_FICHIER', $_ENV['HOSTNAME'] . '.log' );

Et il n'y a rien de sémantiquement incorrect.
Agylus a écrit :
Et il n'y a rien de sémantiquement incorrect.


Ca dépasse de très loin mon champ de connaissances mais je suis tout à fait d'accord avec toi...
Smiley lol
Modérateur
Agylus a écrit :

Tu confonds constante dans le temps et constante dans un script. Une constante en programmation est inhérent à un script et non dans le temps. Donc quand tu fais un define, c'est forcément pour une constante liée au script (c'est logique), donc je ne vois pas en quoi mettre un time() dans une constante en début de script est sémantiquement incorrect, c'est au contraire tout ce qu'il y a de plus correct.

Un autre exemple tout con : Je gère trois ou quatre serveurs load-balancés, je veux faire un script de logs dont le nom du fichier va par exemple prendre le nom du serveur en question. Je vais donc créer une constante qui prendra pour valeur le nom du serveur puis l'extension et ça me donnera le nom du fichier en constante pour ce script.
On a donc :
define( 'NOM_DU_FICHIER', $_ENV['HOSTNAME'] . '.log' );

Et il n'y a rien de sémantiquement incorrect.


N'oublions pas que le but n'est pas d'avoir la qualité suprême pour qu'une application tourne correctement. Cependant, si une personne reprend le code, il peut y avoir des des ambiguïtés ou des difficultés pour ajouter des greffons.

Ton exemple est pertinent. Cependant, c'est une « exception » puisque ce sont des variables prédéfinies et figées. Au même titre qu'un dsn de base de données (HOST, USER, BDD, PASSWORD).

La valeur d'un constante est une valeur fixe sur lequel tu peux t'appuyer partout dans le code.

Dans ton exemple la valeur de ta constante est l'addition de deux strings. Donc, tu sors de la définition puisque cette constante est égale à ceci + cela (données prédéfinies + données « variables »).

define( 'NOM_DU_FICHIER', $_ENV['HOSTNAME']);
define('EXTENSION_FICHIER_JOURNAL','.log');

$journalServeur = NOM_DU_FICHIER.EXTENSION_FICHIER_JOURNAL;

J'avoue que peut être j'aurai écris comme toi, puisque c'est du texte en dure. (Je ne connaissais pas $_ENV['HOSTNAME']. merci Smiley smile

À propos de la sémantique :
Wikipedia a écrit :

En particulier, la sémantique possède plusieurs objets d'étude :

* la signification des mots composés,
* les rapports de sens entre les mots (relations d'homonymie, de synonymie, d'antonymie, de polysémie, d'hyperonymie, d'hyponymie, etc.),
* la distribution des actants au sein d'un énoncé,
* les conditions de vérité d'un énoncé,
* l'analyse critique du discours,
* la pragmatique, en tant qu'elle est considérée comme une branche de la sémantique.

Le terme de sémantique est utilisé en opposition à celui de syntaxe dans l'étude des langages de programmation en informatique, pour laquelle elle a été développée de manière formelle (voir sémantique des langages de programmation). Il y a entre la sémantique et la syntaxe le même rapport qu'entre le fond et la forme.
[...]


Ormis les constantes magiques :
définition (qui à mon goût manque d'être explicite. Comment est obtenu la valeur d'une constante ?)
php.net a écrit :

Une constante est un identifiant (un nom) qui représente une valeur simple. Comme son nom le suggère, cette valeur ne peut jamais être modifiée durant l'exécution du script (sauf les constantes magiques). Par défaut, le nom d'une constante est sensible à la casse. Par convention, les constantes sont toujours en majuscules.


À propos de la syntaxe
php.net a écrit :

Vous pouvez définir une constante en utilisant la fonction define() ou en utilisant le mot-clé const en dehors d'une définition de classe à partir de PHP 5.3.0. Une fois qu'une constante est définie, elle ne peut jamais être modifiée, ou détruite.

Seuls les types de données scalaires peuvent être placés dans une constante : c'est à dire les types booléen, entier, double et chaîne de caractères (soit bool, entier, double et string. Il est possible de définir des constantes en tant que resource, mais cet usage est déconseillé, car il peut mener à des résultats inattendus.


source :
* constante (sommaire)
* constante (syntaxe)



Partant de ce raisonnement et de la définition d'une constante, une constante est donc une valeur écrite en dure (figée).

// syntaxiquement juste 
// sémantiquement faut :
// <quote source="php.net">[...] Comme son nom le suggère, cette valeur ne peut jamais être modifiée durant l'exécution du script. [...]</quote>
// quel est le temps d'exécution du script ? zéro ? TIMESTAMP de l'utilisateur A aura la même valeur que TIMESTAMP de l'utilisateur B ?

//La lune est carrée 
define ("TIMESTAMP",time()); 


Alors tu vas me dire :
Une constante est accessible partout. Si j'utilise des variables, il faut les globaliser. bonjour le code Smiley sweatdrop :

function uneFonction(){
	global $uneVar1 ;
	global $uneVar2 ;
	global $uneVar3 ;
	global $uneVar4 ;
	global $uneVar5 ;
	//fermer pas la porte, il y en a encore

	//traitement fonction
}

function uneAutre(){
	global $uneVar4, $uneVar5, $uneVar6, $uneVar7,$uneVar8, $uneVar9;
	//fermer pas la porte, il y en a encore

	//traitement fonction
}

// etc.


En effet, le code.... Mmmmh, réfléchissons un instant... Et si on fait une pierre deux coups ! regrouper les types de données (catégories) et accessibles partout dans le code. Oui mais comment ? Sachant qu'une variable est potentiellement disponible partout dans le code :

fichier 1 :

define("REP_INCL","include/");
define("REP_CLASS","class/");
define("REP_MEDIA","media/");

$tabConfig = array(
    "class" => REP_INCL.REP_CLASS,
    "images" => REP_INCL.REP_MEDIA
);

fichier 2 :

require_once "file1.php";

function uneFonction(){
    if(!empty($GLOBALS))
        print_r($GLOBALS["tabConfig"]);   
}
uneFonction();


À noter que le tableau $GLOBALS a toutes les données globales disponibles ($_ENV - $_SERVER - $_POST - etc.)
Modifié par Nolem (27 Oct 2009 - 21:47)
Hello...

bon, merci à vous de vous donner tant de peine, mais j'avoue être un peu paumé par le débat ! Smiley smile

Ce que j'aimerai faire, donc, je (re)précise au cas où :

-J'ai 1 dossier "lang" avec lang-fr.php / lang-en.php / decide-lang.php.
- Dedans, et pour les besoins de multilinguisme, il y à uniquement des "define" :

exemple :

lang-fr.php
define("TEXTE1","<p>salut poulet!</p>");


lang-en.php
define("TEXTE1","<p>hi chicken!</p>");


-Ma page.php avec :


<?php
require("lang/decide-lang.php");
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
   "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/> 
<meta http-equiv="Content-Language" content="fr,en" />
<link rel="stylesheet" type="text/css" href="styles/style.css" media="screen" />
<!--[if IE]>
<link rel="stylesheet" type="text/css" href="styles/ie-only.css" />
<![endif]-->
</head>
<body>


<?php echo TEXTE1; ?>


</body>
</html>



Jusqu'à là tout fonctionne impec, choix de langue, traduc, mémorisation du choix via cookie etc...
Mais pour compliquer afin de simplifier par la suite je veux faire çà :

define("TEXTE1","include ('fichier-liste1.php')");
define("TEXTE2","include ('fichier-formulaire.php')");
//etc...


Pour pouvoir traiter mes différentes traductions dans des fichiers externes à lang-fr.php et/ou lang-en.php et éviter ainsi de surcharger "lang-xx.php" trop long et difficile à organiser...

Je sais c'est difficile de se faire bien comprendre... mais merci pour votre aide ô combien précieuse !!

Bonne journée
Smiley cligne
Modifié par Samiaule (28 Oct 2009 - 07:00)
Modérateur
hello Samiaule,

oups, j'ai un peu débordé du sujet...

Ce que j'ai fini par comprendre, tu souhaites scinder par exemple le fichier lang-fr.php ou lang-en.php afin de répartir les constantes par catégorie (bonne initiative en passant). Si c'est cela, c'est très simple :

fichier lang-fr.php :

require_once "fichier-liste1-fr.php";
require_once "fichier-formulaire-fr.php";
require_once "fichier-accueil-fr.php";
//etc.

Je te recommande d'utiliser soit include_once ou mieux require_once.


exemple de fichier fichier-accueil-fr.php :

define ("CONSTANTE","valeur");
define ("UNE_AUTRE_CONSTANTE","autre valeur");
//etc.


Il est évident que le fichier EN (sera dans le même esprit). Il y a néanmoins de fortes chances d'éviter un code redondant (c'est une des base de la programmation). Là, comme je te l'ai expliqué, c'est simple à mettre en place. Mais redondant !

J'espère que cette fois ci, j'ai compris et pu t'aider.

nb :
* As tu lu ma réponse à propos du choix de la langue ?
* Pourquoi n'utilises tu pas une SGBDR ou un bon fichier xml, csv pour ton application multilingue ?
* mp envoyé
Modifié par Nolem (28 Oct 2009 - 12:37)
Arf... ça me gène d'être aussi piètre !

Bref, en tout cas, et pour info, mon affaire roule impec' tant que j'essaie pas d'appeler
mon code à afficher via "include" (ou autre) dans ma "define"...

Genre si je fais çà :

define('LISTE_1', '
<ul>
<li>Mister Jack</li>
<li>Mister Marc</li>
<li>Mister Guy</li>
</ul>');


pas de problème...

Par contre si je met la même chose dans un fichier "liste1-en.inc.php" et que j'essaie
de "l'appeler" genre :

define('LISTE_1', (include ("inc/FR_LISTE1.inc.php")));


pour que le tout soit enfin affiché dans ma page par html via "echo":

<?php
require("lang/decide-lang.php");
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
   "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> 
<meta http-equiv="Content-Language" content="fr,en" />
<link rel="stylesheet" type="text/css" href="style.css" media="screen" />
<title>Test</title>
</head>

<body>
			<?php echo LISTE_1; ?>
</body>
</html>


Ca affiche la liste avant le DOCTYPE !!


Bref... je vous tiens au courant car je suis quasi sûr que le plus gros du pb est ma
difficulté à expliquer mon probleme !
Smiley biggol
Modifié par Samiaule (28 Oct 2009 - 18:01)
Pages :