23 декабря 2011 г.

Падающие снежинки на css3


В канун нового года на своем сайте хочется навести красоту и украсить "по новогоднему" некоторые страницы падающими снежинками.

Выбор инструментов реализации пал на css3 анимацию. И как не трудно догадаться у такого решения есть и положительные и отрицательные стороны.
К положительным сторонам можно отнести:
  • относительную простоту реализации;
  • и отсутствие необходимости в сторонних компонентов.
К минусам:
  • Поддерживает только FireFox и Chrome(Webkit) (Opera 11.5x не поддерживает css3 анимацию).
В интернете я нашел уже готовый демонстрационный пример http://natbat.net/code/clientside/css/snowflakes/, который я взял за основу.
Переделать мне его пришлось дважды:
  • Первый пример использует в качестве снежинок символы юникод.
  • Второй пример где используются спрайтовые картинки для снежинок.
Как показало тестирование на разных компьютерах, символы юникода в качестве снежинок - не самый лучший выбор. Так как на некоторых компьютерах вместо снежинок падали квадратики или иероглифы.
Пересказывать как сделаны падающие снежинки на css3 довольно скучно, поэтому ограничусь демонстрацией исходников:
Первый пример - Рабочий пример на jsfiddle
Второй пример - исходники на Googlcode

20 декабря 2011 г.

Интересные моменты настройки почтовой рассылки Битрикс

... Или как добавить ссылку на отписку от рассылки в письме

Если посмотреть шире на проблему, то можно задаться вопросом, как можно добавить параметры вида #param# в отсылаемые подписчикам почтовые сообщения. Так же как это делается в шаблонах почтовых сообщениях. Таким образом, в отсылаемое письмо мы сможем разместить не только ссылку на отписку от рассылки, которая для каждого подписчика должна быть уникальной, но и добавить другие параметры:
  • Имя, фамилию, отчество;
  • Код подтверждения подписчика;
  • Id подписчика;
  • и др. параметры.
В документации Битрикса я нашел страницу c описанием необходимого функционала http://dev.1c-bitrix.ru/user_help/service/subscribe/rubric_edit.php?print=Y .

В принципе в нем описан все необходимые действия, но я приведу свой пример реализации.
В файле /bitrix/php_interface/init.php храняться обработччики выполняющихся событий.
В этот файл необходимо добавить следующий код:
Copy Source | Copy HTML
  1. // регистрируем обработчик 
  2. AddEventHandler("subscribe", "BeforePostingSendMail", Array("CatchSubscriter", "beforePostingSendMailHandler"));
  3. class CatchSubscriter{
  4.     // создаем обработчик события "BeforePostingSendMail" 
  5.     function beforePostingSendMailHandler(&$arFields){
  6.         //$USER_NAME = "Подписчик"; 
  7.         //Попробуем найти подписчика. 
  8.         $rs = CSubscription::GetByEmail($arFields["EMAIL"]);
  9.         if($ar = $rs->Fetch()){
  10.             //echo "<p>[</p>";
  11.             //print_r($ar);
  12.             //echo "<p>]</p>";
  13.             $arFields["BODY"] = str_replace("#CONFIRM_CODE#", $ar["CONFIRM_CODE"], $arFields["BODY"]);
  14.             $arFields["BODY"] = str_replace("#ID#", $ar["ID"], $arFields["BODY"]);
  15.             $arFields["BODY"] = str_replace("#EMAIL#", $ar["EMAIL"], $arFields["BODY"]);
  16.         }
  17.         //$arFields["BODY"] = str_replace("#NAME#", $USER_NAME, $arFields["BODY"]); 
  18.         return $arFields;
  19.     }
  20. }
Здесь в функции AddEventHandler("subscribe", "BeforePostingSendMail", Array("CatchSubscriter", "beforePostingSendMailHandler"));
Первый аргумент — название  используемого модуля подписки и рассылок.
Второй аргумент — название события.
Третий аргумент — массив с параметрами обработчика события.

Так при возникновении события BeforePostingSendMail т. е перед самой отправкой письма извлекаются почтовый адрес и текст письма из переменной $arFields. Зная email на который отправляется письмо — устанавливаем личность получателя, его ID и т. п. Текст письма проверяем на наличие ключей заданного формата (#EMAIL#, #ID#), и тут же их подменяем на нужные значения. Не трудно догадаться, что стандартный письмо рассылки можно расширить и другими парметрами.

Чтобы проверить работу можно отправить рассылку с следующим содержанием:
Copy Source | Copy HTML
  1. <p>email: #EMAIL#</p>
  2. <p>id: #ID#</p>
  3. <p>confirm code: #CONFIRM_CODE#"</p>
  4. <a href="http://www.tetrapolis.ru/service/edit_subscribe.php?ID=#ID#&CONFIRM_CODE=#CONFIRM_CODE#">Сменить адрес подписки</a>
  5. <a href="http://www.tetrapolis.ru/service/edit_subscribe.php?ID=#ID#&CONFIRM_CODE=#CONFIRM_CODE#&action=unsubscribe">Отписаться</a>
Ссылки должны вести на страницу с компонентом редактирования рассылки.
Если Вас заинтересовал метод Csubscription::GetByEmail() то у меня есть пример на работу с ним:
Copy Source | Copy HTML
  1. <?
  2. if(CModule::IncludeModule("subscribe")){
  3.     class CatchSubscriter {
  4.         // создаем обработчик события "BeforePostingSendMail" 
  5.         function BeforePostingSendMailHandler(&$arFields){
  6.             //Попробуем найти подписчика. 
  7.             $rs = CSubscription::GetByEmail($arFields["EMAIL"]);
  8.             if($ar = $rs->Fetch()){
  9.                 echo "<p>[</p>";
  10.                 print_r($ar);// посмотрим какие еще параметры можно получить
  11.                 echo "<p>]</p>";
  12.                 $arFields["BODY"] = str_replace("#CONFIRM_CODE#", $ar["CONFIRM_CODE"], $arFields["BODY"]);
  13.                 $arFields["BODY"] = str_replace("#ID#", $ar["ID"], $arFields["BODY"]);
  14.                 $arFields["BODY"] = str_replace("#EMAIL#", $ar["EMAIL"], $arFields["BODY"]);
  15.             }
  16.             return $arFields;
  17.         }
  18.     }
  19.     $cs1= new CatchSubscriter();
  20.     $ar=array("EMAIL" => "vklad@tetrapolis.spb.ru", "BODY" => " body ");
  21.     $rez=$cs1->BeforePostingSendMailHandler($ar);
  22.     print_r($rez);
  23. }else{
  24.     echo "nothing to load";
  25. }
  26. ?>