Попробуйте preg_replace раздел URL для использования в качестве переменной php - PullRequest
0 голосов
/ 22 февраля 2011

Наш сайт вначале вызывает этот запрос, чтобы найти имя страницы (например, product.html, product = name), и добавляет к нему «-tabs» для создания переменной $ block_name:

    <? $current_url = $_SERVER['REQUEST_URI']; // this will return everything after the http://www.domain.xx including preceding "/"
$block_name = preg_replace ("/^(?:.*)\/(.*).html$/", "$1-tabs" , $current_url); ?>

Затем переменная используется для вызова статического блока с помощью этого:

    <?php echo $this->getLayout()->createBlock('cms/block')->setBlockId($block_name)->toHtml() ?> 

Работает нормально, если кто-то переходит на http://example.com/product.html,, но если я использую какое-либо отслеживание URL-адресов, например, Google Analytics, и в конце URL-адреса есть это:

http://example.com/product.html?utm_source=newsletter&utm_campaign=product_launch&utm_medium=email

Тогда переменная не создана должным образом и статический блок не загружается.

Есть ли способ игнорировать что-либо после .html, чтобы любое добавление отслеживания не влияло на загрузку статического блока?

Спасибо!

Ответы [ 3 ]

2 голосов
/ 22 февраля 2011

preg_replace("/^(?:.*)\/(.*).html\??.*$/", "$1-tabs" , $current_url)

0 голосов
/ 22 февраля 2011

Поскольку вы используете Magento и, кажется, пишете код внутри шаблона, вы можете сделать это:

$_product = Mage::registry('product');
if ($_product) $block_name = $_product->getUrlKey();

Несколько шаблонов на странице продукта уже определяют для вас $_product, что делает его еще проще.

Этот способ работает, когда страница запрашивается не-SEO способом, например "http://www.example.com/catalog/product/view/id/123/"," или когда имя категории находится в URL. $_SERVER не может обработать эти случаи. Использование неподтвержденного значения из $ _SERVER позволяет злоумышленнику вставлять значения в ваш код, что, безусловно, плохо.

0 голосов
/ 22 февраля 2011

Я бы порекомендовал сначала использовать parse_url для местоположения, что исключит переменные get.Оттуда вы можете манипулировать им, как и сейчас.

$pathOnly = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH);
$block_name = preg_replace(...);
...