Автор Тема: Тия два кода еднакви ли са?  (Прочетена 6910 пъти)

a_panov

  • Напреднали
  • *****
  • Публикации: 62
    • Профил
Код
GeSHi (PHP):
  1. <?php
  2.  
  3. if (!isset($_SESSION['lang']))
  4. {
  5. $lang = substr($_SERVER["HTTP_ACCEPT_LANGUAGE"], 0, 2);
  6. switch ($lang)
  7. {
  8. case "ru":
  9. include ($_SERVER['DOCUMENT_ROOT']."/include/ru.php");
  10. $_SESSION['lang']="ru";
  11. break;
  12. case "bg":
  13. include ($_SERVER['DOCUMENT_ROOT']."/include/bg.php");
  14. $_SESSION['lang']="bg";
  15. break;
  16. default:
  17. include ($_SERVER['DOCUMENT_ROOT']."/include/en.php");
  18. $_SESSION['lang']="en";
  19. break;
  20. }
  21. }
  22. else
  23. {
  24. include ($_SERVER['DOCUMENT_ROOT']."/include/".$_SESSION['lang'].".php");
  25. }
  26. ?>
И
Код
GeSHi (PHP):
  1. <?php
  2.  
  3. if (!isset($_SESSION['lang']))
  4. {
  5. if (substr($_SERVER["HTTP_ACCEPT_LANGUAGE"],0,2) == "ru")
  6. {
  7. include ($_SERVER['DOCUMENT_ROOT']."/include/ru.php");
  8. $_SESSION['lang']="ru";
  9. }
  10. else
  11. {
  12. if (substr($_SERVER["HTTP_ACCEPT_LANGUAGE"],0,2) == "bg")
  13. {
  14. include ($_SERVER['DOCUMENT_ROOT']."/include/bg.php");
  15. $_SESSION['lang']="bg";
  16. }
  17. else
  18. {
  19. include ($_SERVER['DOCUMENT_ROOT']."/include/en.php");
  20. $_SESSION['lang']="en";
  21. }
  22. }
  23. }
  24. else
  25. {
  26. include ($_SERVER['DOCUMENT_ROOT']."/include/".$_SESSION['lang'].".php");
  27. }
  28. ?>
  29.  
При мене горния с кейсовете не суичва файла и се сгомнясва интерфейса. Аз ли греша някъде?
« Последна редакция: Oct 29, 2008, 13:44 от zeridon »
Активен

VladSun

  • Moderator
  • Напреднали
  • *****
  • Публикации: 2166
    • Профил
Тия два кода еднакви ли са?
« Отговор #1 -: Oct 20, 2008, 01:13 »
Аз не виждам проблем в работата на горния код - ОК си работи.
Само не ми харесва как го правиш - имаш прекалено много повторение на код  ;)

Код
GeSHi (PHP):
  1. $languageFileMapping = Array(
  2.    'en' => 'en',
  3.    'bg' => 'bg',
  4.    'ru' => 'russian',
  5. );
  6.  
  7. $defaultLanguage = 'en';
  8.  
  9. if (empty($_SESSION['language']))
  10. {
  11.    $language = substr($_SERVER["HTTP_ACCEPT_LANGUAGE"], 0, 2);
  12.    $_SESSION['language'] = array_key_exists($language, $languageFileMapping) ? $language : $defaultLanguage;
  13. }
  14.  
  15. include($_SERVER['DOCUMENT_ROOT']."/print/".$languageFileMapping[$_SESSION['language']].".php");
  16.  

Освен това проверяваш само за първия препдпочитан език, а не за всички...
Код
GeSHi (PHP):
  1. $languageFileMapping = Array(
  2.    'en' => 'en',
  3.    'bg' => 'bg',
  4.    'ru' => 'russian',
  5. );
  6.  
  7. $defaultLanguage = 'en';
  8.  
  9. if (empty($_SESSION['language']))
  10. {
  11.    $parsedLanguages = explode(',', $_SERVER["HTTP_ACCEPT_LANGUAGE"]);
  12.    foreach ($parsedLanguages as $parsedLanguage)
  13.    {
  14.        $language = substr($parsedLanguage, 0, 2);
  15.        if (array_key_exists($language, $languageFileMapping))
  16.        {
  17.            $_SESSION['language'] = $language;
  18.            break;          
  19.        }
  20.    }
  21. }
  22.  
  23. if (empty($_SESSION['language']))
  24.    $_SESSION['language'] = $defaultLanguage;
  25.  
  26. include($_SERVER['DOCUMENT_ROOT']."/print/".$languageFileMapping[$_SESSION['language']].".php");

И последно - преди време ти бях писал едно лично съобщение за сайта, който правиш - прочете ли го? ;)
« Последна редакция: Oct 29, 2008, 03:28 от VladSun »
Активен

KISS Principle ( Keep-It-Short-and-Simple )
http://openfmi.net/projects/flattc/
Има 10 вида хора на този свят - разбиращи двоичния код и тези, които не го разбират :P

a_panov

  • Напреднали
  • *****
  • Публикации: 62
    • Профил
Тия два кода еднакви ли са?
« Отговор #2 -: Oct 20, 2008, 09:33 »
Цитат (VladSun @ Окт. 20 2008,02:13)
Аз не виждам проблем в работата на горния код - ОК си работи.
Само не ми харесва как го правиш - имаш прекалено много повторение на код '<img'>

И последно - преди време ти бях писал едно лично съобщение за сайта, който правиш - прочете ли го? '<img'>

При мене първия код не ми включва файловете а втория си работи. Днес ще направя още една проверка която се сетих като се събудих днес сутринта. От 6 до 8 часа циклих на тоя проблем и когато тръгнах да ставам от компютъра писах по форумите.

ДА, да, да и затова съм се разбързал да то преработвам. Това е "парче лайно" от тоя сайт за който говориш.
Активен

a_panov

  • Напреднали
  • *****
  • Публикации: 62
    • Профил
Тия два кода еднакви ли са?
« Отговор #3 -: Oct 20, 2008, 12:25 »
Код
GeSHi (PHP):
  1. <?php
  2.  
  3. $languageFileMapping = Array('ru' => 'ru', 'bg' => 'bg', 'en' => 'en');
  4. $defaultLanguage = 'en';
  5.  
  6. if (empty($_SESSION['language']))
  7. {
  8.   $parsedLanguages = explode(',', $_SERVER["HTTP_ACCEPT_LANGUAGE"]);
  9.   foreach ($parsedLanguages as $parsedLanguage)
  10.   {
  11.       $language = substr($parsedLanguage, 0, 2);
  12.       if (array_key_exists($language, $languageFileMapping))
  13.       {
  14.           $_SESSION['language'] = $language;
  15.           break;          
  16.       }
  17.   }
  18. }
  19.  
  20. if (empty($_SESSION['language']))
  21. {
  22. $_SESSION['language'] = $defaultLanguage;
  23. }
  24. include($_SERVER['DOCUMENT_ROOT']."/print/".$languageFileMapping[$_SESSION['language']].".php");
  25.  
Това е кода който сложих в сайта си сега и работи!!! Благодарности! Даже ако в хедърите браузъра прати de, fr-bl, ru, bg, en скрипта превключва на първия срещтнат "познат" език.
« Последна редакция: Jul 07, 2009, 11:22 от VladSun »
Активен

a_panov

  • Напреднали
  • *****
  • Публикации: 62
    • Профил
Тия два кода еднакви ли са?
« Отговор #4 -: Oct 20, 2008, 14:15 »
Примерен код

<?php
session_start();

$languageFileMapping = Array('ru' => 'ru', 'bg' => 'bg', 'en' => 'en');
$defaultLanguage = 'en';

if (empty($_SESSION['lang']))
{
   $parsedLanguages = explode(',', $_SERVER["HTTP_ACCEPT_LANGUAGE"]);
   foreach ($parsedLanguages as $parsedLanguage)
   {
       $language = substr($parsedLanguage, 0, 2);
       if (array_key_exists($language, $languageFileMapping))
       {
         $_SESSION['lang'] = $language;
         break;          
       }
   }
}

if (empty($_SESSION['lang']))
   {
      $_SESSION['lang'] = $defaultLanguage;
   }
   
if ($_GET[lang])
{
   if (array_key_exists($_GET[lang], $languageFileMapping))
   {
      $_SESSION['lang'] = $_GET[lang];
   }
}

include($_SERVER['DOCUMENT_ROOT']."/include/".$languageFileMapping[$_SESSION['lang']].".php");
...
...
Кода продължава тука с други неща...
...
...
?>

Това е крайния код на триезичен сайт!!!



Активен

VladSun

  • Moderator
  • Напреднали
  • *****
  • Публикации: 2166
    • Профил
Тия два кода еднакви ли са?
« Отговор #5 -: Oct 20, 2008, 15:09 »
Малко чистота на кода '<img'>

Не използвай това:
Примерен код
$_GET[lang]

Пълни ти се лог-а с предупреждения и забавяш работата.
Трябва да е:
Примерен код
$_GET['lang']


Същото се отнася за
Примерен код
if ($_GET[lang])

=>
Примерен код
if (empty($_GET['lang']))


И парчето:
Примерен код
if (empty($_SESSION['language']))
   $_SESSION['language'] = $defaultLanguage;

трябва да се намира след всички опити за установяване на езика - това е default value за езика.

Мое лично правило е, че ако имам switch в кода (или нужда от него) нещо не е наред '<img'>



Активен

KISS Principle ( Keep-It-Short-and-Simple )
http://openfmi.net/projects/flattc/
Има 10 вида хора на този свят - разбиращи двоичния код и тези, които не го разбират :P

senser

  • Напреднали
  • *****
  • Публикации: 1328
    • Профил
Тия два кода еднакви ли са?
« Отговор #6 -: Oct 20, 2008, 16:39 »
Цитат (VladSun @ Окт. 20 2008,15:09)
Същото се отнася за
Примерен код
if ($_GET[lang])

=>
Примерен код
if (empty($_GET['lang']))

От известно време ме гложди съмнението доколко е обосновано използването на empty() в условни конструкции вместо вътрешното преобразуване на типа .........
Не че е кой знае какъв дерт де - по скоро е за спорта, но все нямам време да направя някой тест скрипт

П.П. Какво напрЕко имаш против switch, или еквивалентни вложени if-ове?
Активен

VladSun

  • Moderator
  • Напреднали
  • *****
  • Публикации: 2166
    • Профил
Тия два кода еднакви ли са?
« Отговор #7 -: Oct 20, 2008, 17:03 »
Примерен код
if ($_GET['language'])
{
   
}

=>
error.log
Цитат
PHP Notice:  Undefined index:  language in ....


Примерен код
if ($_GET[language])
{
   
}

=>
Цитат
PHP Notice:  Use of undefined constant language - assumed 'language' in .....
PHP Notice:  Undefined index:  language in ...



Относно switch-a:
- в много случаи имплементира обект от data layer в application layer - както е в този случай;
- в повечето от останалите случаи използването се налага заради лош ООП подход.

Два интересни линка:
http://www-128.ibm.com/developerworks/library/os-php-designptrns/
http://www.ibm.com/develop....atterns

За втория - по-специално The state pattern

Искрено и чистосърдечно апелирам, всеки, който иска да се занимава с ООП, да прочете
Design Patterns: Elements of Reusable Object-Oriented Software

http://en.wikipedia.org/wiki/Design_Patterns



Активен

KISS Principle ( Keep-It-Short-and-Simple )
http://openfmi.net/projects/flattc/
Има 10 вида хора на този свят - разбиращи двоичния код и тези, които не го разбират :P

VladSun

  • Moderator
  • Напреднали
  • *****
  • Публикации: 2166
    • Профил
Тия два кода еднакви ли са?
« Отговор #8 -: Oct 20, 2008, 17:19 »
Да не говорим, че използването на $_GET[lang] може да доведе до доста трудно откриваема грешка:
Примерен код
define('lang', 'something')


Т.е. използването на нестриктните форми води до един вид използване на глобални променливи, които винаги могат да бъдат "замърсени".
Активен

KISS Principle ( Keep-It-Short-and-Simple )
http://openfmi.net/projects/flattc/
Има 10 вида хора на този свят - разбиращи двоичния код и тези, които не го разбират :P

senser

  • Напреднали
  • *****
  • Публикации: 1328
    • Профил
Тия два кода еднакви ли са?
« Отговор #9 -: Oct 20, 2008, 22:52 »
използването на неинициализирани променливи специално в РНР не мисля, че е кой знае какъв проблем - за мен това е толкова "несериозно", колкото и това, че не е нужно да се декларира типа на порменливата, но да не навлизаме в тази полемика .......... '<img'>

а това със switch-a изобщо не разбрах в какъв контекст се появи

иначе балгодарско за линковете - има смислени неща наистина '<img'>
Активен

VladSun

  • Moderator
  • Напреднали
  • *****
  • Публикации: 2166
    • Профил
Тия два кода еднакви ли са?
« Отговор #10 -: Oct 20, 2008, 23:00 »
Цитат
използването на неинициализирани променливи специално в РНР не мисля, че е кой знае какъв проблем - за мен това е толкова "несериозно", колкото и това, че не е нужно да се декларира типа на порменливата, но да не навлизаме в тази полемика ..........


Обичам в логовете ми за грешки да влизат само съобщения, само когато наистина има нещо. А, и аз повече наблегнах на използването на "неявни" стрингове.
В нестриктните езици дебъгването може да стане голям проблем, ако не се спазват някои определени правила '<img'>

Цитат
а това със switch-a изобщо не разбрах в какъв контекст се появи


Цитат
П.П. Какво напрЕко имаш против switch, или еквивалентни вложени if-ове?


Ми ... ти писа за него '<img'>
Активен

KISS Principle ( Keep-It-Short-and-Simple )
http://openfmi.net/projects/flattc/
Има 10 вида хора на този свят - разбиращи двоичния код и тези, които не го разбират :P

senser

  • Напреднали
  • *****
  • Публикации: 1328
    • Профил
Тия два кода еднакви ли са?
« Отговор #11 -: Oct 21, 2008, 12:11 »
Цитат (VladSun @ Окт. 20 2008,15:09)
Мое лично правило е, че ако имам switch в кода (или нужда от него) нещо не е наред '<img'>

ето заради това попитах за switch-a '<img'>

не видях никъде в кода на a_panov да го е изполвал и затова не разбрах защо го включи
Активен

VladSun

  • Moderator
  • Напреднали
  • *****
  • Публикации: 2166
    • Профил
Тия два кода еднакви ли са?
« Отговор #12 -: Oct 21, 2008, 13:36 »
В първото му съобщение, първото парче код ...
Активен

KISS Principle ( Keep-It-Short-and-Simple )
http://openfmi.net/projects/flattc/
Има 10 вида хора на този свят - разбиращи двоичния код и тези, които не го разбират :P

senser

  • Напреднали
  • *****
  • Публикации: 1328
    • Профил
Тия два кода еднакви ли са?
« Отговор #13 -: Oct 21, 2008, 14:42 »
Цитат (VladSun @ Окт. 21 2008,13:36)
В първото му съобщение, първото парче код ...

мда - прав си
пропуснал съм го
но въпреки това продължавам да не разбирам каква ти е основната идея срещу switch ........ ама това си е мой проблем де '<img'>
за да не цапаме темата на човека - спирам
Активен

VladSun

  • Moderator
  • Напреднали
  • *****
  • Публикации: 2166
    • Профил
Тия два кода еднакви ли са?
« Отговор #14 -: Oct 21, 2008, 15:49 »
Не я цапаме - заради този код е започната темата и именно използването на switch в този конкретен случай трябва да се избягва '<img'>

Най-лесно ми е да ти задам контра въпрос:
Ако използваме парчето код със switch-a, как ще изнесеш поддържаните езици в конфигурационен файл? Или в DB?
'<img'>

Кодът е чист пример за имплементирането на "данни" чрез използване на код. В един хипотетичен случай, някой може да реши, че не се нуждае от DB - ще си направи един огромен switch (primary key) със вложени switch-ове (foreign keys) и да връща някакви данни ...

По отношение на ООП - http://en.wikipedia.org/wiki/State_pattern

Цитат
The state pattern can be used to replace switch() statements and if {} statements which can be difficult to maintain and are less type-safe. For example, the following is similar to the above but adding a new tool type to this version would be much more difficult.
Активен

KISS Principle ( Keep-It-Short-and-Simple )
http://openfmi.net/projects/flattc/
Има 10 вида хора на този свят - разбиращи двоичния код и тези, които не го разбират :P