Шифрование ссылки в TV-параметре

Приветствую.
Есть задача: у меня на сайте с MODx Revo есть TV-параметр offsite, в который я прописываю адрес какого-либо сайта, например,
http://offsite.ru
Мне необходимо эту ссылку зашифровать и превратить во внутренний редирект, чтобы вместо адреса сайта показывался
http://mysite.ru/goto/948f3hdc8d4k9fjf
или типа того.

Шаблон вывода
<a href="[[*offsite]]" target="_blank" onclick="yaCounter.reachGoal('regOffic'); return true;">[[*offsite]]</a>
Нужно получить на выходе:
<a href="http://mysite.ru/goto/948f3hdc8d4k9fjf" target="_blank" onclick="yaCounter.reachGoal('regOffic'); return true;">http://offsite.ru</a>
Плагин нашел только для Evo и то заброшенный судя по всему.

Готов оплатить работу или купить готовое решение, ибо обыскался.
Demios
28 мая 2014, 04:09
modx.pro
1
1 521
0

Комментарии: 9

Василий Наумкин
28 мая 2014, 08:56
+1
Сделать несложно, можно даже без отдельной таблицы, чисто ТВ параметрами.

Например, пишем в ТВ
948f3hdc8d4k9fjf==offsite.ru

Затем выводим где нужно этот ТВ через фильтр вывода get_code:
if (!empty($input) {
	$tmp = explode('==', $input);
	return $tmp[0];
}

В чанке оформления добавляем ссылку на редирект и выходит вот так:
<a href="http://mysite.com/goto/[[*link:get_code]]">Перейти по ссылке</a>

И пишем плагин для OnPageNotFound:
if ($modx->event->name != 'OnPageNotFound') {return;}
$tvid = '15'; // id ТВ со ссылками-кодами
if (preg_match('/goto/(.*)', $_SERVER['REQUEST_URI'], $matches) {
	$code = $matches[1];
	// Здесь ищем нужный тв по коду и выделяем ссылку
	if ($tv = $modx->getObject('modTemplateVarResource', array('tmplvarid' => $tvid, 'value:LIKE' => "$code==%"))) {
		$tmp = explode('==', $tv->get('value'));
		// Редирект на адрес
		$modx->sendRedirect('http://' . $tmp[1]);
	}
}

Написал всё без проверки, это просто общий принцип. Можно сделать и более круто: со страницей в админке и таблицей код-ссылка.
    Demios
    28 мая 2014, 13:24
    0
    Спасибо, Василий.

    Не понял только как вписать в шаб
    if (!empty($input) {
    	$tmp = explode('==', $input);
    	return $tmp[0];
    }
        Demios
        28 мая 2014, 15:43
        0
        Прочитал. Если правильно понял — создал снипет с кодом
        if (!empty($input) {
        	$tmp = explode('==', $input);
        	return $tmp[0];
        }
        Назвал его getCrypto и в шаблоне вызывал /goto/[[*offsite:getCrypto]]

        Не заработало. Вижу только в консоли браузера 500-я ошибка.
          Василий Наумкин
          28 мая 2014, 16:04
          +1
          Ну ты хоть количество скобок посчитай на первой строчке.

          Я ж без проверки писал — исправляй.
            Demios
            28 мая 2014, 17:28
            0
            Визуально работает, но не редиректит. В коде плагина тоже скобочку добавил. Но на 404-ю на моем сайте кидает
      Илья Уткин
      28 мая 2014, 20:38
      1
      +2
      Можно использовать обратимое шифрование.

      1. Сниппет getCrypto (фильтр вывода для шифрование адреса сайта):

      $key = "qie1GllccDadnmZvhpcM0WK18vfVScxBKeM";
      $str = $input;
      //открываем модуль шифрования и получаем его дискриптор
      $td = mcrypt_module_open(MCRYPT_BLOWFISH,'',MCRYPT_MODE_CFB,'');
      //  получаем размер вектора шифрования на основе дискриптора.
      $iv_size = mcrypt_enc_get_iv_size($td);
      // Создание вектора шифрования
      $iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
      // открытие буфера обмена обмена для шифровки данных
      mcrypt_generic_init($td,$key,$iv);
      //  шифруем даные
      $crypt_text = mcrypt_generic($td,$str);
      //  закрываем буфер обмена и модуль
      mcrypt_generic_deinit($td);
      mcrypt_module_close($td);
      
      return 'goto/?code='.base64_encode($iv.$crypt_text);


      2. Создаем страничку site.ru/goto/ и на ней помещяем НЕкешируемый вызов сниппета sendCriptoRedirect:

      if (!$_GET['code']) return;
      $key = "qie1GllccDadnmZvhpcM0WK18vfVScxBKeM";
      $code = base64_decode($_GET['code']);
      
      $td = mcrypt_module_open(MCRYPT_BLOWFISH,'',MCRYPT_MODE_CFB,'');
      $iv_size = mcrypt_enc_get_iv_size($td);
      $iv = substr($code,0,$iv_size);
      $crypt_text = substr($code,$iv_size);
      mcrypt_generic_init($td,$key,$iv);
      $url = mdecrypt_generic($td,$crypt_text);
      mcrypt_generic_deinit($td);
      mcrypt_module_close($td);
      $modx->sendRedirect($url);

      В итоге первый сниппет будет зашифровывать, а второй расшифровывать и редиректить.

      Код взят отсюда: webformyself.com/shifrovanie-dannyx-na-php/
        Zulya
        07 октября 2017, 18:30
        0
        Здравствуйте, Илья.
        Я сделала все по той инструкции, где начинается ваш ответ modx.pro/help/3246/#comment-25516.
        Ссылки шифруются, но при переходе по зашифрованным ссылкам, сайт выдает ошибку 500.
        С чем это может быть связано и как можно решить? Вы можете помочь?
        Заранее спасибо!
        Demios
        28 мая 2014, 22:16
        0
        Решено. Работает.
        Подытожу:

        Сниппет getCrypto создаем.
        Далее сниппет sendCriptoRedirect создаем.
        В шаблоне пишем, где offsite — это название моего ТВ параметра, куда помещаю URL.
        <a href="http://mysite.ru/[[*offsite:getCrypto]]" target="_blank" onclick="yaCounter2223334.reachGoal('regOffic'); return true;">[[*offsite]]</a>
        Создаю страницу Goto с шаблоно «Пустой», где отключаю кэширование на вкладке «Настройки» и в поле «Заморозить URI» прописываю «goto/», а в поле «Содержимое ресурса» вызываю сниппет [[sendCriptoRedirect]]
          Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
          9