Транзитные ссылки.

Что такое транзитная ссылка, и зачем она нужна?

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

Сделать это ничуть не сложно, но только на уровне опознания адресата Почтовой Наной. То, что следует за этим дальше, будете сочинять и прицеплять сами.

Таким образом, транзитная ссылка представляет собой обычную ссылку с хэшем в URL-е, генерируемую шаблоном письма из макроса. Было бы логично, чтобы при переходе по такой ссылке в месте приёма трафика рождалась информация по ряду позиций:

  1. Время перехода.
    В Unix таймстампе и в привычном виде дата-время.

  2. Номер письма серийной рассылки, из которого случился переход.

  3. Сведения о пользователе.
    Его e-mail, имя, дата и время подписки.

  4. Сведения о службе.
    Идентификатор, название, число писем в службе, адреса баз.

  5. Компоненты URL-а (там может быть много параметров).

Примечание:

Если транзитная ссылка ведёт не с письма серийной службы, а разослана как новость, все данные о пользователе всё равно приводятся относительно службы, задействованной в новостийной рассылке.

Какие далее действия Вы будете предпринимать, зная вот это всё, дело хозяйское. Можно переходы в лог писать, а потом куда-то редиректить, а можно делать что-то хитрое. Собственно Почтовой Наны это никак не касается.

Макрос для транзитной ссылки.

В списке макросов админки он не фигурирует, но вполне традиционен.
Может использоваться как в одиночестве, так и с параметрами:

   ---Transit---
   ---
Transit_yyy---
   ---
Transit_yyy_zzz_qqq-www---

В схематическом виде получившиеся из макроса ссылки выглядят соответственно:

   http://site.ru/postman/index_xxx.htm
   
http://site.ru/postman/index_xxx_yyy.htm
   
http://site.ru/postman/index_xxx_yyy_zzz_qqq-www.htm

На месте xxx будет хэш, в котором зашифрована указанная выше информация, а все остальные параметры транслируются в адрес ссылки так, как указаны. Причём ничто не мешает этим параметрам быть макросами. Важно лишь, чтобы они генерировали последовательности символов, разрешённых ЧПУ Наны.

Куда приводит транзитная ссылка.

Очевидно, что приводит она в файл пользовательского интерфейса, который на схеме дистрибутива расположен по относительному адресу ./data/content/postman/index.php (если его исчислять от корневой папки скрипта).

В самом файле есть такой фрагмент:

      case 'Transit\': # http://nanocms.name/postman/spy.htm
         $arr=array(
            '
unix'      => $_s['unix'],
            '
time'      => date('d.m.Y H:i:s',$_s['unix']),
            '
letter'    => $letter,
            '
user'      => array(
               '
email'  => $user[0],
               '
name'   => $user[1],
               '
letter' => $user[2],
               '
subscr' => date('d.m.Y H:i:s',$user[4]),
            ),
            '
service'   => array(
               '
id'     => $config[0],
               '
name'   => $config[1],
               '
letter' => $config[6],
               '
db'     => $config[3],
               '
db.us'  => $config[3].'.us',
            ),
            '
vars'      => $_s['loc']['vars],
         );

         
pr($arr);
      break;

Собственно, это всё, что касается транзитных ссылок. Вместо pr($arr); (вывод массива на экран) вебмастеру надо написать свой кусок кода, работающий с данными адресата, оформленными в виде массива.

Пример 1. Запись в лог.

Предположим, вебмастер страдает наивностью, и не верит, что только от 3 до 5 процентов подписчиков переходят по ссылке из письма, пропагандирующего какую-нибудь очередную крутотень. Если копирайт очень хорош, то процент может быть и выше, но это всяко не половина, не треть и не четверть подписной базы. И вебмастеру очень хочется узнать, какая же именно часть.

Ну и заодно познакомиться с персоналиями.
Кто из его подписчиков наиболее доверчив.

Очевидно, в простейшем случае код логирования может быть на единственном операторе:

         file_put_contents(
            
'./data/logs/postman_transit_link_'.date('Y-m-d').'.txt',
            
implode(' ',
               array(
                  
$arr['time'],
                  
$arr['service']['id'],
                  
$arr['user']['email'],
                  
$arr['user']['letter'],
                  
$arr['user']['name'],
               )
            ).
$oslen,
            
FILE_APPEND LOCK_EX
         
);
         
redirect('http://nanocms.name/postman/spy.htm');

Набор сведений о пользователе может быть каким угодно. Тут это дата перехода по ссылке, идентификатор службы, номер письма в рамках этой службы, e-mail пользователя, его имя, под которым он подписывался на рассылку. В логе всё это пишется в одну строчку, каждая новая транзитная ссылка формирует новую строку лога. Понятно, что Вас могут интересовать и иные сведения, либо более короткий их список.

Как нетрудно видеть, лог размещается в стандартной папке логов Наны, с посуточной разбивкой. Можно всё валить и в один файл, без разбивки. Или лить лог в разные файлы, с селекцией по службам - достаточно в имени файла лога употребить переменную с идентификатором службы.

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

Пример 2. Перенос пользователя в другую рассылку.

В случае разного рода коучинга, когда подписчик чувствует, что толку от рассылки, на которую он подписан, нет никакого, ибо она об элементарном, с помощью транзитной ссылки можно повысить уровень преподавания. Пользователь кликнет в неё, и переподпишется на другую рассылку, более продвинутого уровня.

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

         foreach (fr(get_db_path('dbmain')) as $v) {
            if (
$v[0]=='level2') { # Идентификатор рассылки повышенной сложности
               
file_put_contents(
                  
$v[3].'.us',
                  
implode('|',
                     array(
                        
$arr['user']['email'],
                        
$arr['user']['name'],
                        
0,
                        
$v[0],
                        
$arr['unix'],
                        
0,
                        
'','',
                     )
                  ).
$oslen,
                  
FILE_APPEND LOCK_EX
               
);
               
file_put_contents(
                  
$arr['service']['db.us'],
                  
implode('|',
                     array(
                        
$arr['user']['email'],
                        
$arr['user']['name'],
                        
1000,
                        
$arr['service']['id'],
                        
$arr['unix'],
                        
$user[4],
                        
'','',
                     )
                  ).
$oslen,
                  
FILE_APPEND LOCK_EX
               
);
            }
         }
         
desman(
            
'Подписка переоформлена.','
            <p>Вы отписаны от рассылки "'
.$arr['service']['name'].'" 
            и оформлены на рассылку "'
.$v[1].'"</p>'
         
);
         
finita();

Ничего сложного тут нет - просканировав данные обо всех существующих службах, мы находим сведения о службе с идентификатором level2 (для примера), и добавляем в её временную базу данных пользователя, помечая его заодно как подтвердившего подписку, дабы не вовлекать юзера в ненужную ему суету с подтверждением подписки. Одновременно этого же пользователя отписываем от той рассылки, из письма которой он кликнул в транзитную ссылку.

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

О многообразии алгоритмов работы с транзитными ссылками.

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

Для этого у него есть элемент массива $arr['vars']
Он содержит все элементы URL-a:

   # пусть URL будет http://site.ru/postman/index_xxx_yyy_zzz_qqq-www.htm
   
Array
(
    [
0] => xxx
    
[1] => yyy
    
[2] => zzz
    
[3] => qqq-www
)

Нулевым элементом массива будет хэш с данными подписчика (именно этот хэш разбирается Почтовой Наной в массив данных), а вот все последующие элементы в полном Вашем распоряжении.

Переключайте логику обработки транзитных ссылок в зависимости от этих дополнительных параметров, которых может быть много, а сами они способны быть какими угодно (латинские буквы, цифры, тире). Для начала достаточно одного дополнительного элемента.