Модуль Разные цены для разных IP

babahalki

Постоялец
Регистрация
6 Май 2016
Сообщения
247
Реакции
107
Ребята, помогите. Не могу разобраться самостоятельно.
Задача такая, хочу сделать так, чтобы сотрудникам яндекса сайт выдавал цены, отличные от всех остальных людей. Узнал диапазон адресов яндекса, нашел функцию php, которая может проверять вхождение IP в диапазон. В php все супер - работает. Уже второй день пытаюсь заставить это все работать в simpla.

У меня есть функция php:
Код:
function ip_in_range( $ip, $range ) {
    if ( strpos( $range, '/' ) == false ) {
        $range .= '/32';
    }
    // $range is in IP/CIDR format eg 127.0.0.1/24
    list( $range, $netmask ) = explode( '/', $range, 2 );
    $range_decimal = ip2long( $range );
    $ip_decimal = ip2long( $ip );
    $wildcard_decimal = pow( 2, ( 32 - $netmask ) ) - 1;
    $netmask_decimal = ~ $wildcard_decimal;
    return ( ( $ip_decimal & $netmask_decimal ) == ( $range_decimal & $netmask_decimal ) );
}

Я хочу эту функцию использовать в шаблоне product.tpl, чтобы выводить цену в зависимости от результата выполнения этой функции. Прочитал, что можно сделать через plugins к smarty, сделал файл в каталоге Smarty/libs/plugins


function.ip_in_range.php
Код:
<?php
/*
 * Smarty plugin
 * -------------------------------------------------------------
 * File:     function.ip_in_range.php
 * Type:     function
 * Name:     ip_in_range
 * Purpose:  check ip address in range
 * -------------------------------------------------------------
 */
function smarty_function_ip_in_range( $params, &$smarty ) {
    if ( strpos( $params['range'], '/' ) == false ) {
        $params['range'] .= '/32';
    }
    // $params['range'] is in IP/CIDR format eg 127.0.0.1/24
    list( $params['range'], $netmask ) = explode( '/', $params['range'], 2 );
    $range_decimal = ip2long( $params['range'] );
    $ip_decimal = ip2long( $params['ip'] );
    $wildcard_decimal = pow( 2, ( 32 - $netmask ) ) - 1;
    $netmask_decimal = ~ $wildcard_decimal;
    return ( ( $ip_decimal & $netmask_decimal ) == ( $range_decimal & $netmask_decimal ) );
}
?>

Тренируюсь на боевом сайте, поэтому работаю в register.tpl
Пытаюсь вызывать - не выходит.
{ip_in_range ip="5.255.254.1" range="5.255.192.0/18"}


Код обновил, теперь все работает.

Теперь, когда у нас на сайте кто-то с айпишниками яндекса, у них одни цены, для остальных другие цены.
 
Последнее редактирование:
Plugin для SIMPLAA 2.3.x позволяет отображать разную информацию для пользователей по IP. У меня настроено, что для всех IP адресов яндекса, другая цена товара.


ПЛУГИН ПОЗВОЛЯЕТ ОТОБРАЖАТЬ ИНФОРМАЦИЮ В ЗАВИСИМОСТИ ОТ ТОГО, ВХОДИТ ЛИ IP В ЗАДАННЫЙ ДИАПАЗОН АДРЕСОВ

Установка:
1. function.ip_in_range.php положить Smarty/libs/plugins
2. ip_in_range.tpl положить в папку html своего шаблона.


Настройка, использование и принцип работы:
В качестве образца я приложил свой файл шаблона, в котором используется данная функция. Можно использовать в любом шаблоне.
Настройка делается через файл ip_in_range.tpl, в котором сейчас забиты диапазоны адресов ЯНДЕКСА.

Работает очень просто, в шаблон делается include ip_in_range.tpl, который проверяет значение remote_address (адрес клиента) и заданные диапазоны адресов, результаты проверки каждого диапазона пишутся в переменные $range**. Если адрес клиента попадает хотя бы в 1 диапазон в переменную $ip_in_range пишется 1. Значение этой переменной и используется в шаблоне.

{* Разные цены для ip из диапазона и не из него *}

{include file='ip_in_range.tpl'}

{if $ip_in_range}

{assign var=price value=$product->variant->price * 0.98}

{else}

{assign var=price value=$product->variant->price}

{/if}
 

Вложения

  • ip_in_range plugin simpla.rar
    5 KB · Просмотры: 16
Plugin для SIMPLAA 2.3.x позволяет отображать разную информацию для пользователей по IP. У меня настроено, что для всех IP адресов яндекса, другая цена товара.

Данное решение на 2.3.6 будет работать?
 
Назад
Сверху