Как изменить сгенерированный плохой URL - PullRequest
0 голосов
/ 08 мая 2018

Я буду знать, как, если возможно, изменить этот элемент. проблема появляется, когда я хочу изменить язык на сайте

в моем индексе (обычный URL):

http://localhost/test/boutique/index.php?language=en
http://localhost/test/boutique/index.php?language=fr

После того, как это не проблема для навигации по сайту. Это правильно

Но если зайти внутрь моего товара Нормальный URL должен быть:

localhost/test/boutique/index.php?Products&Description&products_id=1

Если я поменяю язык, у меня будет:

локальный / тест / бутик / index.php? Продукты = & Description = & products_id = 1 & язык = фр

правильный URL должен быть:

localhost/test/boutique/index.php?Products&Description&products_id=1&language=en

Есть проблема с этим, я думаю: =&

Есть функция, связанная с этим.

    public function getLanguageText() {
      $languages_string = '';

      $get_params = [];

      foreach ( $_GET as $key => $value ) {
// I think somethinf must change here.
        if (($key != 'language') && ($key != Registry::get('Session')->getName()) && ($key != 'x') && ($key != 'y')) {
          $get_params[] = $key . '=' . $value;
        }
      }

//var_dump($get_params)

      $get_params = implode($get_params, '&');

      if ( !empty($get_params) ) {
        $get_params .= '&';
      }

      foreach ($this->getAll() as $value) {
        $languages_string .= ' ' . HTML::link(OSCOM::link('index.php', $get_params . 'language=' . $value['code']), $value['name']) . ' ';
      }

      return $languages_string;
    }

var_dump ($ get_params):

  0 => string 'Products=' (length=9)
  1 => string 'Description=' (length=12)
  2 => string 'products_id=1languageen' (length=23)  ===> pb here

Как исправить эту функцию?

Tk

элемент о:

var_dump($_GET);
var_dump($key);
var_dump($value);

array (size=4)
  'Products' => string '' (length=0)
  'Description' => string '' (length=0)
  'products_id' => string '2' (length=1)
  'language' => string 'fr' (length=2)

/home/www/test/boutique/includes/OM/Language.php:562:string 'Products' (length=8)

/home/www/test/boutique/includes/OM/Language.php:563:string '' (length=0)

/home/www/test/boutique/includes/OM/Language.php:561:
array (size=4)
  'Products' => string '' (length=0)
  'Description' => string '' (length=0)
  'products_id' => string '2' (length=1)
  'language' => string 'fr' (length=2)

/home/www/test/boutique/includes/OM/Language.php:562:string 'Description' (length=11)

/home/www/test/boutique/includes/OM/Language.php:563:string '' (length=0)

/home/www/test/boutique/includes/OM/Language.php:561:
array (size=4)
  'Products' => string '' (length=0)
  'Description' => string '' (length=0)
  'products_id' => string '2' (length=1)
  'language' => string 'fr' (length=2)

/home/www/test/boutique/includes/OM/Language.php:562:string 'products_id' (length=11)

/home/www/test/boutique/includes/OM/Language.php:563:string '2' (length=1)

/home/www/test/boutique/includes/OM/Language.php:561:
array (size=4)
  'Products' => string '' (length=0)
  'Description' => string '' (length=0)
  'products_id' => string '2' (length=1)
  'language' => string 'fr' (length=2)

/home/www/test/boutique/includes/OM/Language.php:562:string 'language' (length=8)

/home/www/test/boutique/includes/OM/Language.php:563:string 'fr' (length=2)

для информации:

ссылка на общедоступную статическую функцию ($ page, $ parameters = null, $ add_session_id = true, $ search_engine_safe = true) {

  $page = HTML::sanitize($page);

  $site = $req_site = static::$site;

  if ((strpos($page, '/') !== false) && (preg_match('/^([A-Z][A-Za-z0-9-_]*)\/(.*)$/', $page, $matches) === 1) && OSCOM::siteExists($matches[1], false)) {
      $req_site = $matches[1];
      $page = $matches[2];
  }

  if (!is_bool($add_session_id)) {
    $add_session_id = true;
  }

  if (!is_bool($search_engine_safe)) {
    $search_engine_safe = true;
  }

  if (($add_session_id === true) && ($site !== $req_site)) {
    $add_session_id = false;
  }

  $link = static::getConfig('http_server', $req_site) . static::getConfig('http_path', $req_site) . $page;

  if (!empty($parameters)) {
    $p = HTML::sanitize($parameters);

    $p = str_replace([
                      "\\", // apps
                      '{', // product attributes
                      '}' // product attributes
                      ], [
                        '%5C',
                        '%7B',
                        '%7D'
                      ], $p);



    $link .= '?' . $p;
    $separator = '&';
  } else {
    $separator = '?';
  }

  while((substr($link, -1) == '&') || (substr($link, -1) == '?')) {
    $link = substr($link, 0, -1);
  }

// Добавить идентификатор сеанса при перемещении с разных серверов HTTP и HTTPS или при определении SID if (($ add_session_id === true) && Registry :: exist ('Session')) { $ OSCOM_Session = Registry :: get ('Session');

    if ($OSCOM_Session->hasStarted() && ($OSCOM_Session->isForceCookies() === false)) {
      if ((strlen(SID) > 0) || (((HTTP::getRequestType() == 'NONSSL') && (parse_url(static::getConfig('http_server', $req_site), PHP_URL_SCHEME) == 'https')) || ((HTTP::getRequestType() == 'SSL') && (parse_url(static::getConfig('http_server', $req_site), PHP_URL_SCHEME) == 'http')))) {
        $link .= $separator . HTML::sanitize(session_name() . '=' . session_id());
      }
    }
  }

  while(strpos($link, '&&') !== false) {
    $link = str_replace('&&', '&', $link);
  }


  if ($search_engine_safe === true && defined('SEARCH_ENGINE_FRIENDLY_URLS') && (SEARCH_ENGINE_FRIENDLY_URLS == 'true') && SEFU::start() && static::getSite() != 'Admin') {
    $link = str_replace(['?', '&', '='], '/', $link);
  }

  return $link;
}

и SEFU:

класс SEFU реализует \ OM \ ServiceInterface { публичная статическая функция start () {

  if ( isset($_SERVER['ORIG_PATH_INFO']) ) {
    if ( isset($_SERVER['PATH_INFO']) && empty($_SERVER['PATH_INFO']) ) {
      $_SERVER['PATH_INFO'] = $_SERVER['ORIG_PATH_INFO'];
    }
  }

  if ( isset($_SERVER['PATH_INFO']) && (strlen($_SERVER['PATH_INFO']) > 1) ) {
    $parameters = explode('/', substr($_SERVER['PATH_INFO'], 1));

    $_GET = [];
    $GET_array = [];

    $i = 0;

    foreach ( $parameters as $parameter ) {
      $param_array = explode(',', $parameter, 2);

      if ( !isset($param_array[1]) ) {
        $param_array[1] = '';
      }

      if ( strpos($param_array[0], '[]') !== false ) {
        $GET_array[substr($param_array[0], 0, -2)][] = $param_array[1];
      } else {
        $_GET[$param_array[0]] = $param_array[1];
      }

      $i++;
    }

    if ( count($GET_array) > 0 ) {
      foreach ( $GET_array as $key => $value ) {
        $_GET[$key] = $value;
      }
    }
  }

  return true;
}

public static function stop() {
  return true;
}

1 Ответ

0 голосов
/ 08 мая 2018

Мне кажется, что строка запроса анализируется нормально.

<?php
parse_str('Products=&Description=&products_id=1&language=fr', $foo);

var_dump($foo);

$get_params = [];
foreach ($foo as $k => $v) {
  if (($k != 'language') && ($k != 'bar') && ($k != 'x') && ($k != 'y')) {
    $get_params[] = $k . '=' . $v;
  }
}

var_dump($get_params);

?>

array(4) {
  ["Products"]=>
  string(0) ""
  ["Description"]=>
  string(0) ""
  ["products_id"]=>
  string(1) "1"
  ["language"]=>
  string(2) "fr"
}

array(3) {
  [0]=>
  string(9) "Products="
  [1]=>
  string(12) "Description="
  [2]=>
  string(13) "products_id=1"
}

Возможно, я не показываю вам, в чем проблема, но я думаю, что я показываю вам, в чем не проблема.

Пожалуйста, поделитесь дампом вашего $_GET. Предполагая, что вы скопировали строку запроса правильно ... хорошо, посмотрите мой код. Я не знаю, что может происходить mod_rewrite или что-то еще. Не увидев дамп $ _GET, как только он достигнет вашего скрипта, я не смогу дать более глубокое понимание.

UPDATE

Это помогает? Честно говоря, не уверен, что это за хлам. Вероятно, даже не заслуживает функции ...

<?php

function getLanguageText($q) {
  if(!isset($q['language'])) return false;
  return $q['language'];
}

//$q = $_GET;
$q = [
    'Products' => '',
    'Description' => '',
    'products_id' => 123,
    'language' => 'en',
];

echo getLanguageText($q); 
//> en 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...