NFL

Untitled

NFL
Apr 2nd, 2014
86
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PHP 48.94 KB | None | 0 0
  1. <?php
  2.  
  3. /**
  4.  * @author S.Serdyuk
  5.  * @copyright (c) 2013, WebAkula
  6.  * @title Рассылка
  7.  * @description Управление рассылками и подписками
  8.  */
  9. class Newsletter_AdminController extends Core_Admin {
  10.  
  11.     protected $_templatesPath = '';
  12.  
  13.     public function init() {
  14.         parent::init();
  15.         $this->_templatesPath = Zend_Controller_Front::getInstance()->getModuleDirectory() . DIRECTORY_SEPARATOR . 'templates';
  16.         $this->_breadcrumbs->addUrl('Рассылка', array(), 'newsletter', 'index');
  17.     }
  18.  
  19.     /**
  20.      * @title Подписчики
  21.      * @description ...
  22.      */
  23.     public function indexAction() {
  24.  
  25.         $this->_breadcrumbs->addUrl('Управление подписчиками', array(), 'newsletter', 'index');
  26.         $action = $this->_getParam('action');
  27.         $this->view->headScript()->appendFile('/admin_style/js/admin/newsletter.js');
  28.         switch ($action) {
  29.             case 'index': default:
  30.                 $model = new Newsletter_Model_List;
  31.                 $this->view->lists = $model->getAll();
  32.                 $model = new Newsletter_Model_Subscribers;
  33.                 $page = $this->_getParam('page', 1);
  34.                 $id = $this->_getParam('id', false);
  35.                 //$this->view->subscribers = $model->getGroup($id, $page);
  36.                 $subscribers = $model->getGroup($id, $page);
  37.                 $this->view->subscribers = (array) $subscribers->getItemsByPage($page);
  38.                 $this->view->paginator = $subscribers;
  39.                 $this->render('index');
  40.                 break;
  41.             case 'edit-newsletter':
  42.                 $model = new Newsletter_Model_List;
  43.                 $form = new Newsletter_Form_List_Edit;
  44.                 if ($this->getRequest()->isPost()) {
  45.                     $data = $this->getRequest()->getPost();
  46.                     $id = $data['id'];
  47.                     unset($data['id'], $data['submit']);
  48.                     $model->update($data, 'id=' . $id);
  49.                     $this->_redirect($this->view->adminUrl('newsletter', 'index'));
  50.                 } else {
  51.                     $id = $this->_getParam('id');
  52.                     $data = $model->getByPk($id);
  53.                     $this->view->form = $form->populate($data);
  54.                     $this->render('list/edit');
  55.                 }
  56.                 break;
  57.             case'show-newsletter':
  58.                 $model = new Newsletter_Model_List;
  59.                 $listId = $this->_getParam('id');
  60.                 $this->view->listId = $listId;
  61.                 if ($listId)
  62.                     $list = $model->getByPk($listId);
  63.                 $this->_breadcrumbs->addUrl($list['title'], array('action' => 'show-newsletter', 'id' => $list['id']), 'newsletter', 'index');
  64.                 $this->_breadcrumbs->addNode('Просмотр списка рассылки');
  65.                 $this->view->lists = $model->getAll();
  66.                 $id = $this->_getParam('id');
  67.                 $model = new Newsletter_Model_Subscribers;
  68.                 $page = $this->_getParam('page', 1);
  69.                 $subscribers = $model->getGroup($id, $page);
  70.                 $this->view->list = (array) $subscribers->getItemsByPage($page);
  71.                 $this->view->paginator = $subscribers;
  72.                 $this->render('list/show');
  73.                 break;
  74.             case 'add-newsletter':
  75.                 $this->_breadcrumbs->addNode('Добавление списка рассылки');
  76.                 $form = new Newsletter_Form_List_Add;
  77.                 $model = new Newsletter_Model_List;
  78.                 if ($this->getRequest()->isPost()) {
  79.                     $settings = new Newsletter_Model_Settings;
  80.                     $data = $this->getRequest()->getPost();
  81.  
  82.                     unset($data['submit']);
  83.                     $listId = $model->insert($data);
  84.  
  85.                     if ($settings->enable_uni) {
  86.                         //Интеграция с UniSender
  87.                         $uni = new Newsletter_Plugin_Uni;
  88.                         $res = $uni->createList(array('title' => $data['title']));
  89.                         if ($res['result']['id']) {
  90.                             $model->update(array('uni_id' => $res['result']['id']), 'id=' . $listId);
  91.                         }
  92.                     }
  93.  
  94.                     $this->_redirect($this->view->adminUrl('newsletter', 'index'));
  95.                 } else {
  96.                     $this->view->form = $form;
  97.                 }
  98.                 $this->render('list/edit');
  99.                 break;
  100.             case'del-newsletter':
  101.  
  102.                 $id = $this->_getParam('id');
  103.                 $model = new Newsletter_Model_List;
  104.                 $model->update(array('deleted' => 1), 'id=' . $id);
  105.                 $this->_redirect($this->view->adminUrl('newsletter', 'index'));
  106.                 break;
  107.             case 'search':
  108.                 $this->_breadcrumbs->addNode('Поиск');
  109.                 $query = $this->_getParam('q');
  110.                 $model = new Newsletter_Model_List;
  111.                 $this->view->lists = $model->getAll();
  112.                 $model = new Newsletter_Model_Subscribers;
  113.                 $result = $model->searchSubscribers($query);
  114.                 $this->view->list = $result;
  115.                 $this->render('list/search');
  116.                 break;
  117.             case 'edit-subscriber':
  118.                 $this->_breadcrumbs->addNode('Редактирование подписчика');
  119.                 $form = new Newsletter_Form_Subscriber_Edit;
  120.                 $model = new Newsletter_Model_Subscribers;
  121.  
  122.                 if ($this->getRequest()->isPost()) {
  123.                     $data = $this->getRequest()->getPost();
  124.                     //Zend_Debug::dump($data);
  125.                     $subscriber = $model->getByPk($data['id']);
  126.                     //exit(Zend_Debug::dump($subscriber));
  127.                     $model->delete($model->getAdapter()->quoteInto('email = ?', $subscriber['email']));
  128.                     $lists = array(); //Списки рассылок в которые включить пользователя
  129.                     foreach ($data['lists'] as $list) {
  130.                         $model->insert(array(
  131.                             'user_id' => $subscriber['user_id'],
  132.                             'name' => $data['name'],
  133.                             'email' => $data['email'],
  134.                             'list_id' => $list,
  135.                             'status' => $data['status']
  136.                         ));
  137.                         $lists[] = $list;
  138.                     }
  139.                     //$lists[] = 0;
  140.                     $model->insert(array(
  141.                         'user_id' => $subscriber['user_id'],
  142.                         'name' => $data['name'],
  143.                         'email' => $data['email'],
  144.                         'list_id' => 0,
  145.                         'status' => $data['status']
  146.                     ));
  147.                     //exit('aaa');
  148.                     $settings = new Newsletter_Model_Settings;
  149.                     //exit(var_dump($settings->enable_uni));
  150.                     if ($settings->enable_uni) {
  151.                         $uniSettings = new Newsletter_Model_Uni_Settings;
  152.                         $defaultList = $uniSettings->default_list_id;
  153.                         $uni = new Newsletter_Plugin_Uni;
  154.                         $res = $uni->exclude(array(
  155.                             'contact_type' => 'email',
  156.                             'contact' => $data['email']
  157.                         ));
  158.  
  159.                         $nList = new Newsletter_Model_List;
  160.                         $lists = $nList->getLists($lists);
  161.                         //exit(Zend_Debug::dump($lists));
  162.                         $subscribeLists = array();
  163.                         foreach ($lists as $v) {
  164.                             $subscribeLists[] = $v['uni_id'];
  165.                         }
  166.                         $subscribeLists[] = $defaultList;
  167.                         //exit(Zend_Debug::dump($subscribeLists));
  168.                         $res = $uni->subscribe(
  169.                                 array('list_ids' => implode(',', $subscribeLists),
  170.                                     'fields' => array('name' => $data['name'], 'email' => $data['email']),
  171.                                     'double_optin' => 3));
  172.  
  173.                         if ($personId = $res['result']['person_id']) {
  174.                             $model->update(array('uni_person_id' => $personId), "email = '" . $data['email'] . "'");
  175.                         }
  176.                     }
  177.  
  178.  
  179.  
  180.                     $this->_redirect($this->view->adminUrl('newsletter', 'index', array('action' => 'show-newsletter', 'id' => $this->_getParam('list'))));
  181.                 } else {
  182.                     $id = $this->_getParam('id');
  183.                     $data = $model->getByPk($id);
  184.                     $userSubscriptions = $model->getUserSubscriptions($data['email']);
  185.                     //Zend_Debug::dump($userSubscriptions);
  186.                     $lists = array();
  187.                     foreach ($userSubscriptions as $v) {
  188.                         $lists[] = $v['list_id'];
  189.                     }
  190.                     $lists = array_combine(array_values($lists), array_values($lists));
  191.                     $data['lists'] = $lists;
  192.                     $this->view->form = $form->populate($data);
  193.                 }
  194.                 $this->render('list/edit');
  195.                 break;
  196.             case 'del-subscriber':
  197.                 $this->_helper->layout()->disableLayout();
  198.                 $listId = $this->_getParam('list');
  199.                 $model = new Newsletter_Model_Subscribers;
  200.                 $id = $this->_getParam('id');
  201.                 if ($listId) {
  202.                     $model->delete(
  203.                             array(
  204.                                 $model->getAdapter()->quoteInto('id = ?', $id)
  205.                     ));
  206.                 } else {
  207.                     $data = $model->getByPk($id);
  208.                     $model->delete(array($model->getAdapter()->quoteInto('email = ?', $email)));
  209.                 }
  210.                 $this->_redirect($_SERVER['HTTP_REFERER']);
  211.                 break;
  212.         }
  213.     }
  214.  
  215.     /**
  216.      * @title Импорт и создание подписчиков
  217.      * @description Управление импортом подписчиков
  218.      * @service
  219.      */
  220.     public function importAction() {
  221.  
  222.         $type = $this->_getParam('type');
  223.  
  224.         switch ($type) {
  225.             case 'csv':
  226.                 $model = new Newsletter_Model_Subscribers;
  227.                 $modelLists = new Newsletter_Model_List; //Списки подписчиков
  228.                 $this->_breadcrumbs->addUrl('Управление подписчиками', array(), 'newsletter', 'index');
  229.                 $this->_breadcrumbs->addNode('Импорт из CSV');
  230.                 $form = new Newsletter_Form_Csv_Import;
  231.                 if ($this->getRequest()->isPost()) {
  232.                     $data = $this->getRequest()->getPost();
  233.  
  234.                     $settings = new Newsletter_Model_Settings;
  235.                     $uniEnabled = $settings->enable_uni;
  236.                     //exit(var_dump($uniEnabled));
  237.                     if ($uniEnabled) {
  238.                         $uni = new Newsletter_Plugin_Uni;
  239.                     }
  240.                     $list = array(); //Список после преобразования.
  241.                     $subscribers = $newSubscribers = array();
  242.                     if (!mb_strlen($data['csv_text'])) {
  243.                         $file = file($_FILES['file']['tmp_name']);
  244.                         $name = time();
  245.                         $form->file->addFilter('Rename', APPLICATION_TMP_PATH . $name);
  246.                         $form->file->receive();
  247.                         $list = file(APPLICATION_TMP_PATH . $name);
  248.                         //Zend_Debug::dump($list);
  249.                     } else {
  250.                         $list = explode("\n", $data['csv_text']);
  251.                     }
  252.  
  253.                     foreach ($list as $i => $v) {
  254.                         $list[$i] = explode(';', trim($v));
  255.                         $newSubscribers[$i] = $list[$i][0]; //Получаем E-Mail
  256.                     }
  257.                     //Zend_Debug::dump($list);
  258.                     $groupId = $this->_getParam('id', 0);
  259.                     $group = $model->getFullGroup($groupId);
  260.  
  261.                     //exit(Zend_Debug::dump($group));
  262.  
  263.                     foreach ($group as $v) {
  264.                         $subscribers[] = $v['email'];
  265.                     }
  266.                     //Zend_Debug::dump($subscribers);exit;
  267.                     $insertList = array();
  268.                     $keys = array_keys(array_diff($newSubscribers, $subscribers));
  269.                     foreach ($keys as $v) {
  270.                         $insertList[] = $list[$v];
  271.                     }
  272.                     // exit(var_dump($uniEnabled));
  273.                     if ($uniEnabled) {
  274.                         //exit('e');
  275.                         $settings = new Newsletter_Model_Uni_Settings;
  276.                         if (!$groupId) {
  277.                             $uniGroupId = $settings->default_list_id;
  278.                         } else {
  279.                             $group = $modelLists->getByPk($groupId);
  280.                             $uniGroupId = $group['uni_id'];
  281.                         }
  282.                     }
  283.  
  284.  
  285.                     $import = array();
  286.  
  287.                     $insert = array();
  288.                     foreach ($insertList as $v) {
  289.                         $insert = array(
  290.                             'list_id' => $groupId,
  291.                             'email' => $v[0],
  292.                             'name' => $v[1],
  293.                             'status' => 'confirmed',
  294.                             'created' => time()
  295.                         );
  296.                         if ($uniEnabled && $uniGroupId) {
  297.                             if (mb_strlen($v[0]) && mb_strlen($v[1])) {
  298.                                 $import['emails'][] = $v[0];
  299.                                 $import['names'][] = $v[1];
  300.                             }
  301.                         }
  302.  
  303.                         $fields = array('email', 'name', 'email_list_ids', 'email_status');
  304.                         $data = array('field_names' => $fields);
  305.                         $model->insert($insert);
  306.                     }
  307.                     //Zend_Debug::dump($import, 'IMPORT');
  308.                     foreach ($import['emails'] as $i => $v) {
  309.                         $data['data'][$i][0] = $v;
  310.                         $data['data'][$i][1] = $import['names'][$i];
  311.                         $data['data'][$i][2] = $uniGroupId;
  312.                         $data['data'][$i][3] = 'active';
  313.                     }
  314.                     $data['double_optin'] = 1;
  315.  
  316.                     $uni->importContacts($data);
  317.                     $this->_redirect($this->view->adminUrl('newsletter', 'index', array('action' => 'show-newsletter', 'id' => $groupId)));
  318.                 } else {
  319.                     $this->view->form = $form;
  320.                 }
  321.                 $this->render('import/csv');
  322.                 break;
  323.             case 'single':
  324.                 $this->_breadcrumbs->addNode('Создание подписчика');
  325.                 $id = $this->_getParam('id', null);
  326.                 $form = new Newsletter_Form_Subscriber_Add(array('id' => $id));
  327.                 if ($this->getRequest()->isPost()) {
  328.                     $data = $this->getRequest()->getPost();
  329.                     if ($form->isValid($data)) {
  330.                         $lists = $data['lists'];
  331.                         foreach ($lists as $id => $v) {
  332.                             if (!$v) {
  333.                                 unset($lists[$id]);
  334.                             }
  335.                         }
  336.                         unset($data['lists'], $data['submit']);
  337.                         $model = new Newsletter_Model_Subscribers;
  338.                         //exit(Zend_Debug::dump($lists));
  339.                         foreach ($lists as $listId => $v) {
  340.                             $model->insert(array(
  341.                                 'email' => $data['email'],
  342.                                 'name' => $data['name'],
  343.                                 'status' => $data['status'],
  344.                                 'list_id' => $listId,
  345.                                 'created' => time()
  346.                             ));
  347.                         }
  348.                         $model->insert(array(
  349.                             'email' => $data['email'],
  350.                             'name' => $data['name'],
  351.                             'status' => $data['status'],
  352.                             'list_id' => 0,
  353.                             'created' => time()
  354.                         ));
  355.                         $settings = new Newsletter_Model_Settings;
  356.                         if ($settings->enable_uni) {
  357.                             $userLists = $model->getUserSubscriptions($data['email']);
  358.                             //exit(Zend_Debug::dump($userLists));
  359.                             $listsIds = array();
  360.                             foreach ($userLists as $v) {
  361.                                 $listsIds[] = $v['list_id'];
  362.                             }
  363.                             $lists = new Newsletter_Model_List();
  364.                             $lists = $lists->getLists($listsIds);
  365.                             $str = array();
  366.  
  367.                             foreach ($lists as $v) {
  368.                                 if (strlen($v['uni_id']))
  369.                                     $str[] = $v['uni_id'];
  370.                             }
  371.                             $uniSettings = new Newsletter_Model_Uni_Settings;
  372.                             $str[] = $uniSettings->default_list_id;
  373.  
  374.                             $lists = implode(',', $str);
  375.                             $uni = new Newsletter_Plugin_Uni;
  376.                             $uni->updateOptInEmail(array(
  377.                                 'sender_name' => 'WebAkula',
  378.                                 'sender_email' => 'info@webakula.ua',
  379.                                 'subject' => 'Подтвердите Вашу подписку',
  380.                                 'body' => 'Здравствуйте! Ваша ссылка для подписки <a href="{{ConfirmUrl}}">{{ConfirmUrl}}</a>',
  381.                                 'list_id' => $str[0]));
  382.                             $res = $uni->subscribe(
  383.                                     array('list_ids' => $lists,
  384.                                         'fields' => array('name' => $data['name'], 'email' => $data['email'], 'double_optin' => 0)));
  385.                             if ($res['result']['person_id']) {
  386.                                 $model->update(array('uni_person_id' => $res['result']['person_id']), "email='" . $data['email'] . "'");
  387.                             }
  388.                         }
  389.                         $this->_redirect($this->view->adminUrl('newsletter', 'index'));
  390.                     } else {
  391.                         $this->view->form = $form;
  392.                     }
  393.                 } else {
  394.                     $id = $this->_getParam('id');
  395.                     $this->view->form = $form->populate(array($lists));
  396.                 }
  397.                 $this->render('import/single');
  398.                 break;
  399.             case 'users':
  400.                 if ($this->getRequest()->isPost()) {
  401.                     $this->_helper->layout()->disableLayout();
  402.                     $data = $this->getRequest()->getPost();
  403.                     $model = new Newsletter_Model_List();
  404.                     //exit(Zend_Debug::dump($data));
  405.                     $table = new Users_Model_Table;
  406.  
  407.                     $subscribers = unserialize($data['users']);
  408.                     $usersList = $table->getList($subscribers);
  409.                     $subsList = $emailToId = array();
  410.                     foreach ($usersList as $v) {
  411.                         $subsList[] = $v['email'];
  412.                         $emailToId[$v['email']] = $v;
  413.                     }
  414.                     if (mb_strlen($data['title'])) {
  415.                         //exit('aaa');
  416.                         $listId = $model->insert(array('title' => $data['title']));
  417.                     } else {
  418.                         $listId = $data['list_id'];
  419.                     }
  420.  
  421.                     //exit(var_dump('foo'));
  422.                     $model = new Newsletter_Model_Subscribers();
  423.                     $list = $model->getList($subsList, $listId);
  424.                     $newEmails = array_diff($subsList, $list);
  425.                     foreach ($newEmails as $v) {
  426.                         $model->insert(array(
  427.                             'email' => $v,
  428.                             'user_id' => $emailToId[$v]['id'],
  429.                             'list_id' => $listId,
  430.                             'name' => $emailToId[$v]['first_name'],
  431.                             'status' => 'confirmed',
  432.                             'created' => time()
  433.                         ));
  434.                     }
  435.                 }
  436.                 exit('success');
  437.                 break;
  438.         }
  439.     }
  440.  
  441.     /**
  442.      * @title Экспорт списков подписчиков
  443.      * @description Экспорт отдельных списков или всего массива подписчиков
  444.      * @service
  445.      */
  446.     public function exportAction() {
  447.         $this->_helper->layout()->disableLayout();
  448.         $delimiter = ';'; //Допиливать ли передачу делимитра?
  449.         $model = new Newsletter_Model_Subscribers;
  450.         $id = $this->_getParam('id');
  451.         $group = $model->getFullGroup($id);
  452.         $file = APPLICATION_TMP_PATH . time() . '.csv';
  453.         //var_dump();
  454.  
  455.         $fields = array();
  456.         foreach ($group as $v) {
  457.             $fields[] = array($v['email'], $v['name']);
  458.         }
  459.         //exit(Zend_Debug::dump($fields));
  460.         $fp = fopen($file, 'w');
  461.         foreach ($fields as $v) {
  462.             fputcsv($fp, $v, $delimiter);
  463.         }
  464.         fclose($fp);
  465.         header('Content-Description: File Transfer');
  466.         header('Content-Type: application/octet-stream');
  467.         header('Content-Disposition: attachment; filename=export-' . $id . '.csv');
  468.         header('Content-Transfer-Encoding: binary');
  469.         header('Expires: 0');
  470.         header('Cache-Control: must-revalidate');
  471.         header('Pragma: public');
  472.         header('Content-Length: ' . filesize($file));
  473.         readfile($file);
  474.         exit;
  475.     }
  476.  
  477.     /**
  478.      * @title Шаблоны писем
  479.      * @description Управление шаблонами рассылок
  480.      */
  481.     public function templatesAction() {
  482.         $this->_breadcrumbs->addNode('Шаблоны писем');
  483.         $action = $this->_getParam('action');
  484.         switch ($action) {
  485.             case 'index': default:
  486.                 $templates = scandir($this->_templatesPath);
  487.  
  488.                 unset($templates[0], $templates[1]); //. и ..
  489.                 $this->view->path = $this->_templatesPath;
  490.                 $this->view->list = $templates;
  491.                 break;
  492.             case 'create':
  493.                 if ($this->getRequest()->isPost()) {
  494.                    
  495.                 } else {
  496.                    
  497.                 }
  498.                 $this->render('templates/create');
  499.                 break;
  500.             case 'img':
  501.                 $this->_helper->layout()->disableLayout();
  502.                 $template = $this->_getParam('template');
  503.                 $path = $this->_templatesPath . DIRECTORY_SEPARATOR . $template . DIRECTORY_SEPARATOR . 'preview.png';
  504.                 $img = imagecreatefrompng($path);
  505.                 header("Content-type: image/png");
  506.                 echo imagepng($img);
  507.                 exit;
  508.                 break;
  509.             case 'edit':
  510.                 $this->view->headScript()->appendFile('/admin_style/js/codemirror/codemirror.js');
  511.                 $template = $this->_getParam('template');
  512.                 $path = $this->_templatesPath . DIRECTORY_SEPARATOR . $template . DIRECTORY_SEPARATOR . 'index.phtml';
  513.                 $content = file_get_contents($path);
  514.                 $this->view->template = $content;
  515.                 $this->render('templates/edit');
  516.                 break;
  517.         }
  518.     }
  519.  
  520.     /**
  521.      * @title Рассылки
  522.      * @description Управление непосредственно рассылками (создание, отправка, etc.)
  523.      */
  524.     public function processAction() {
  525.  
  526.         $action = $this->_getParam('action');
  527.         switch ($action) {
  528.             case 'index': default:
  529.                 $model = new Newsletter_Model_Mailings;
  530.                 $this->_breadcrumbs->addNode('Список рассылок');
  531.                 $data = $model->getAll(); //Вызов getAll(true) для
  532.                 $this->view->data = $data;
  533.                 $this->render('mailings/index');
  534.                 break;
  535.             case 'create':
  536.                 $this->_breadcrumbs->addNode('Создание рассылки');
  537.                 $step = $this->_getParam('step', 1);
  538.                 switch ($step) {
  539.                     case 1:
  540.                         $templates = scandir($this->_templatesPath);
  541.                         unset($templates[0], $templates[1]); //. и ..
  542.                         $this->view->path = $this->_templatesPath;
  543.                         $this->view->list = $templates;
  544.                         $this->_breadcrumbs->addNode('Шаг 1: Выбор шаблона');
  545.                         $this->render('process/create/step1');
  546.                         break;
  547.                     case 2:
  548.                         $this->_breadcrumbs->addNode('Шаг 2: Выбор получателей');
  549.                         $template = $this->_getParam('template');
  550.                         $this->view->template = $template;
  551.                         $model = new Newsletter_Model_List;
  552.                         $this->view->lists = $model->getAll(true);
  553.                         $this->render('process/create/step2');
  554.                         break;
  555.                     case 3:
  556.                         $this->_breadcrumbs->addNode('Шаг 3: Добавление материалов');
  557.                         if ($this->getRequest()->isPost()) {
  558.                             $data = $this->getRequest()->getPost();
  559.                             //exit(Zend_Debug::dump($data));
  560.                             $session = new Zend_Session_Namespace('Newsletter_Create');
  561.                             $session->data['news'] = $data['news'];
  562.                             $url = $this->view->adminUrl('newsletter', 'process', array(
  563.                                 'lists' => $this->_getParam('lists'),
  564.                                 'action' => 'create',
  565.                                 'step' => 4,
  566.                                 'template' => $this->_getParam('template')));
  567.                             $this->_redirect($url);
  568.                         } else {
  569.                             $news = new News_Model_Table;
  570.                             $list = $news->getPublished();
  571.                             $this->view->news = $list;
  572.                             $model = new Catalog_Model_Categories;
  573.                             $data = $model->getJSON($this->_currentLanguageId);
  574.                             $this->view->catalog = json_decode($data, true);
  575.                         }
  576.                         $this->render('process/create/step3');
  577.                         break;
  578.                     case 4:
  579.                         $this->_breadcrumbs->addNode('Шаг 4: Оформление контента рассылки');
  580.                         $form = new Newsletter_Form_Newsletter_Create;
  581.                         $model = new Newsletter_Model_Mailings;
  582.                         if ($this->getRequest()->isPost()) {
  583.                             $data = $this->getRequest()->getPost();
  584.  
  585.                             if ($form->isValid($data)) {
  586.                                 unset($data['submit']);
  587.                                 $data['created'] = time();
  588.                                 $settings = new Newsletter_Model_Settings;
  589.  
  590.                                 if ($settings->enable_uni) {
  591.                                     $uni = new Newsletter_Plugin_Uni;
  592.                                     $lists = unserialize($data['lists']);
  593.                                     //exit(Zend_Debug::dump($data));
  594.                                     $parser = new Newsletter_Plugin_Parser;
  595.                                    
  596.                                     $listsModel = new Newsletter_Model_List();
  597.                                     $lists = $listsModel->getLists($lists);
  598.                                     //  exit(Zend_Debug::dump($lists));
  599.                                     $uniLists = array();
  600.                                     $id = $model->insert($data);
  601.                                     $data['content'] = $parser->parseContent($data['content'], array('site_newsletter_id'=>$id));
  602.                                     foreach ($lists as $list) {
  603.                                         $result = $uni->createEmailMessage(array(
  604.                                             'sender_name' => $settings->sender_name,
  605.                                             'sender_email' => $settings->sender_email,
  606.                                             'sender_name' => $settings->sender_name,
  607.                                             'subject' => $data['title'],
  608.                                             'body' => $data['content'],
  609.                                             'text_body' => $data['plain_text'],
  610.                                             'list_id' => $list['uni_id']
  611.                                         ));
  612.                                         if (!$result['error'])
  613.                                             $uniMessages[] = $result['result']['message_id'];
  614.                                     }
  615.                                     $data['uni_messages'] = serialize($uniMessages);
  616.                                     $model->update($data, 'id='.$id);
  617.                                 }//exit(Zend_Debug::dump($result));;
  618.                                
  619.                                 $session = new Zend_Session_Namespace('Newsletter_Create');
  620.                                 $session->unsetAll();
  621.                                 $this->_redirect($this->view->adminUrl('newsletter', 'process'));
  622.                             } else {
  623.                                 $this->view->form = $form->populate($data);
  624.                             }
  625.                         } else {
  626.                             $session = new Zend_Session_Namespace('Newsletter_Create');
  627.                             $data = $session->data;
  628.                             //Zend_Debug::dump($data);
  629.                             //exit;
  630.                             $template = $this->_getParam('template');
  631.                             $path = $this->_templatesPath . DIRECTORY_SEPARATOR . $template . DIRECTORY_SEPARATOR; //Путь к папке шаблона
  632.                             $content = file_get_contents($path . 'index.phtml'); //Главный файл шаблона
  633.                             $viewObj = Zend_Layout::getMvcInstance()->getView(); //Для доступа к текущему окружению view из партиалов новотей и каталога
  634.                             /**
  635.                              * Для рендеринга вставки материалов (контента новостей и каталога)
  636.                              */
  637.                             $view = new Zend_View;
  638.                             $view->setScriptPath($path);
  639.                             /**
  640.                              * Обработка вставки из модуля "новости"
  641.                              */
  642.                             if (file_exists($path . 'news_items.phtml')) {
  643.                                 if (count($data['news'])) {
  644.                                     $model = new News_Model_Table;
  645.                                     $newsList = array();
  646.                                     foreach ($data['news'] as $v) {
  647.                                         $newsList[] = $model->get($v, $this->_currentLanguageId);
  648.                                     }
  649.                                 }
  650.  
  651.                                 $view = new Zend_View;
  652.                                 $view->setScriptPath($path);
  653. //                                Zend_Debug::dump($newsList);return false;
  654.                                 $newsContent = $view->partial('news_items.phtml', array('data' => $newsList, 'view' => $viewObj));
  655.                                 $content = str_ireplace('{NEWS_ITEMS}', $newsContent, $content); //Парсим тег {NEWS_ITEMS}
  656.                             }
  657.  
  658.                             /**
  659.                              * Обработка вставки товаров из модуля "каталог"
  660.                              */
  661.                             if (file_exists($path . 'catalog_items.phtml')) {
  662.                                 //exit(Zend_Debug::dump($session->data));
  663.                                 if (count($data['products'])) {
  664.                                     $catList = array();
  665.                                     $model = new Catalog_Model_Products;
  666.                                     foreach ($data['products'] as $v) {
  667.                                         $catList[] = $model->get($v, $this->_currentLanguageId);
  668.                                     }
  669.                                     // exit(Zend_Debug::dump($catList));
  670.                                     //exit(Zend_Debug::dump($data['products']));
  671.                                     $productsContent = $view->partial('catalog_items.phtml', array('data' => $catList, 'view' => $viewObj));
  672.                                     $content = str_ireplace('{CATALOG_ITEMS}', $productsContent, $content); //Парсим тег {CATALOG_ITEMS}
  673.                                 }
  674.                             }
  675.                             //$session->unsetAll();
  676.                             $parser = new Newsletter_Plugin_Parser; //Базовый парсер контента
  677.                             $content = $parser->parseContent($content, array(
  678.                                 'site_url' => 'http://' . $_SERVER['HTTP_HOST'],                                
  679.                             )); //Подставляем site_url
  680.                             //exit(var_dump($content));
  681.                             $this->view->form = $form->populate(array(
  682.                                 'content' => $content,
  683.                                 'template' => $this->_getParam('template'),
  684.                                 'lists' => serialize($this->_getParam('lists'))
  685.                             ));
  686.  
  687.                             $this->render('process/create/step4');
  688.                         }
  689.  
  690.                         break;
  691.                 }
  692.                 break;
  693.             case 'test':
  694.                 $uni = new Newsletter_Plugin_Uni;
  695.                 $result = $uni->createCampaign(array(
  696.                     'message_id' => 17384937
  697.                 ));
  698.                 exit(var_dump($result));
  699.                 break;
  700.             case 'add-contents':
  701.                 $session = new Zend_Session_Namespace('Newsletter_Create');
  702.  
  703.                 $id = $this->_getParam('id');
  704.  
  705.                 if (is_null($session->data['products'])) {
  706.                     $session->data['products'] = array();
  707.                 }
  708.                 $session->data['products'][] = $id;
  709.                 $session->data['products'] = array_unique($session->data['products']);
  710.                 //exit(Zend_Debug::dump($session->data['products']));
  711.                 //  exit(var_dump($id, $session->data['products']));
  712.                 $model = new Catalog_Model_Products;
  713.                 if (count($session->data['products'])) {
  714.                     $list = $model->getArray($session->data['products']);
  715.                 } else {
  716.                     $list = array();
  717.                 }
  718.                 //Zend_Debug::dump($list);exit;
  719.                 $ret = array();
  720.                 foreach ($list as $v) {
  721.                     $ret[$v['data_id']] = $v['title'];
  722.                 }
  723.                 exit(json_encode($ret));
  724.                 break;
  725.             case 'del-contents':
  726.                 $session = new Zend_Session_Namespace('Newsletter_Create');
  727.                 //  $session->unsetAll();exit;
  728.                 $id = $this->_getParam('id');
  729.                 $type = $this->_getParam('type');
  730.  
  731.                 switch ($type) {
  732.                     case 'catalog':
  733.                         $key = array_search($id, $session->data['products']);
  734.                         if ($key !== false) {
  735.                             unset($session->data['products'][$key]);
  736.                         }
  737.  
  738.                         $model = new Catalog_Model_Products;
  739.                         if (count($session->data['products'])) {
  740.                             $list = $model->getArray($session->data['products']);
  741.                         } else {
  742.                             $list = array();
  743.                         }
  744.                         $ret = array();
  745.                         foreach ($list as $v) {
  746.                             $ret[$v['data_id']] = $v['title'];
  747.                         }
  748.                         //exit(Zend_Debug::dump($session->data['products']));
  749.                         exit(json_encode($ret));
  750.                         break;
  751.                 }
  752.                 break;
  753.             case 'test':
  754.                 $session = new Zend_Session_Namespace('Newsletter_Create');
  755.                 // exit(Zend_Debug::dump($session->data));
  756.                 break;
  757.             case 'edit':
  758.                 $this->_breadcrumbs->addNode('Редактирование рассылки');
  759.                 $form = new Newsletter_Form_Newsletter_Edit;
  760.                 $model = new Newsletter_Model_Mailings;
  761.                 if ($this->getRequest()->isPost()) {
  762.                     $data = $this->getRequest()->getPost();
  763.                     $id = $data['id'];
  764.                     unset($data['submit'], $data['id']);
  765.                     $model->update($data, 'id=' . $id);
  766.                     $this->_redirect($this->view->adminUrl('newsletter', 'process'));
  767.                 } else {
  768.                     $id = $this->_getParam('id');
  769.                     $data = $model->getByPk($id);
  770.                     $this->view->form = $form->populate($data);
  771.                     $this->render('process/edit');
  772.                 }
  773.                 break;
  774.             case 'stats':
  775.                 $this->_breadcrumbs->addNode('Информация о рассылке');
  776.                 $id = $this->_getParam('id');
  777.                 $model = new Newsletter_Model_Mailings;
  778.                 $data = $model->getByPk($id);
  779.                 if ($data['status'] == 'new') {
  780.                     $lists = unserialize($data['lists']);
  781.                     $model = new Newsletter_Model_Subscribers;
  782.                     $subscribers = $model->getMailingList($lists);
  783.                     $data['approximate_receivers'] = count($subscribers);
  784.                 }
  785.                 if ($data['status'] == 'formed') {
  786.                     $this->view->headScript()->appendFile('/admin_style/js/admin/newsletter.js');
  787.                     $model = new Newsletter_Model_Mailings_Stats;
  788.                     $data['receivers'] = $model->countReceivers($data['id']);
  789.                     $data['sent'] = $model->countSent($data['id']);
  790.                 }
  791.                 if ($data['status'] == 'completed') {
  792.                     $model = new Newsletter_Model_Mailings_Stats;
  793.                     $stats = $model->getStats($id);
  794.                     $this->view->stats = $stats;
  795.                 }
  796.                 $this->view->data = $data;
  797.                 $this->render('process/stats');
  798.                 break;
  799.             case 'confirm':
  800.                 $id = $this->_getParam('id');
  801.                 $model = new Newsletter_Model_Mailings;
  802.                 $data = $model->getByPk($id);
  803.                 $lists = unserialize($data['lists']);
  804.                 $model->update(array('status' => 'formed'), 'id=' . $id);
  805.                 //
  806.  
  807.                 $settings = new Newsletter_Model_Settings;
  808.                 if ($settings->enable_uni) {
  809.                     //exit(Zend_Debug::dump($data));
  810.                     $uni = new Newsletter_Plugin_Uni;
  811.                     $lists = unserialize($data['lists']);
  812.                     $subscribers = array();
  813.                     //exit(Zend_Debug::dump($lists));
  814.                     $listsModel = new Newsletter_Model_List;
  815.                     $lists = $listsModel->getLists($lists);
  816.                     // exit(Zend_Debug::dump($lists));
  817.                     foreach ($lists as $v) {
  818.                         $data = $uni->exportContacts(array(
  819.                             'list_id' => $v['uni_id'],
  820.                             'field_names' => array('email'),
  821.                             'email_status' => 'active'
  822.                         ));
  823.                         foreach ($data['result']['data'] as $email) {
  824.                             $subscribers[] = $email[0];
  825.                         }
  826.                         $data = $uni->exportContacts(array(
  827.                             'list_id' => $v['uni_id'],
  828.                             'field_names' => array('email'),
  829.                             'email_status' => 'new'
  830.                         ));
  831.                         foreach ($data['result']['data'] as $email) {
  832.                             $subscribers[] = $email[0];
  833.                         }
  834.  
  835.                         //Zend_Debug::dump($data);
  836.                     }
  837.                     $subscribersModel = new Newsletter_Model_Subscribers;
  838.                     $subscribers = $subscribersModel->getEmails($subscribers);
  839.                     //exit('foo');
  840.                 } else {
  841.                     $model = new Newsletter_Model_Subscribers;
  842.                     $subscribers = $model->getMailingList($lists);
  843.                 }
  844.                 //$data['approximate_receivers'] = count($subscribers);
  845.                 $model = new Newsletter_Model_Mailings_Stats;
  846.  
  847.                 //exit(Zend_Debug::dump($subscribers));
  848.                 $insert = array();
  849.                 foreach ($subscribers as $v) {
  850.                     $insert[] = array(
  851.                         'mailing_id' => $id,
  852.                         'receiver_id' => $v['id'],
  853.                         'receiver_data' => serialize($v),
  854.                         'created' => time()
  855.                     );
  856.                 }
  857.                 $model->multiInsert($insert);
  858.                 $this->_redirect($this->view->adminUrl('newsletter', 'process', array('action' => 'stats', 'id' => $id)));
  859.                 break;
  860.             case 'send':
  861.                 $this->_helper->layout()->disableLayout();
  862.                 $count = $this->_getParam('count'); //Количество писем
  863.                 $id = $this->_getParam('id'); // ИД рассылки
  864.                 $model = new Newsletter_Model_Mailings;
  865.                 $mail = $model->getByPk($id);
  866.                 $model->update(array('status' => 'process'), 'id=' . $id);
  867.                 $receiversTable = new Newsletter_Model_Mailings_Stats;
  868.                 $receivers = $receiversTable->getReceivers($id, $count);
  869.                 $settings = new Newsletter_Model_Settings;
  870.                 $from = $settings->sender_email;
  871.                 $fromName = $settings->sender_name;
  872.                 $replyTo = $settings->reply_to;
  873.                 $transport = null;
  874.                 if ($settings->enable_smtp) {
  875.                     $config = array(
  876.                         'auth' => 'login',
  877.                         'username' => $settings->smtp_login,
  878.                         'password' => $settings->smtp_password
  879.                     );
  880.                     if (mb_strlen($port = $settings->smtp_port)) {
  881.                         $config['port'] = $port;
  882.                     }
  883.                     $transport = new Zend_Mail_Transport_Smtp($settings->smtp_host, $config);
  884.                 }
  885.                 $mailer = new Core_Mail_Sender('UTF-8');
  886.                 foreach ($receivers as $v) {
  887.                     $receiverData = unserialize($v['receiver_data']);
  888.                     $receiverData['mailing_id'] = $id;
  889.                     $receiverData['row_id'] = $v['id'];
  890.                     $sender = clone $mailer;
  891.                     $sender->addTo($receiverData['email'], $receiverData['email']);
  892.                     $sender->setFrom($from, $fromName);
  893.                     $sender->setBodyHtml($mailer->parseContent($mail['content'], $receiverData), 'UTF-8', Zend_Mime::ENCODING_BASE64);
  894.                     $sender->setBodyText($mail['plain_text'], 'UTF-8', Zend_Mime::ENCODING_BASE64);
  895.                     $sender->addHeader('X-MailGenerator', 'WebakulaAngryCms');
  896.                     $sender->addHeader('Precedence', 'bulk');
  897.                     $sender->addHeader('List-Unsubscribe', $mailer->getUnsubscribeLink($receiverData['email']));
  898.                     $sender->setSubject($mail['title']);
  899.                     $sender->setReplyTo($replyTo);
  900.                     $sender->send($transport);
  901.                     $receiversTable->update(array('processed' => 1), 'id=' . $v['id']);
  902.                 }
  903.                 $total = $receiversTable->countReceivers($id);
  904.                 $sent = $receiversTable->countSent($id);
  905.                 $finished = ($total == $sent);
  906.                 if ($finished) {
  907.                     $model->update(array('status' => 'completed'), 'id=' . $id);
  908.                 }
  909.                 exit(json_encode(array('total' => $total, 'sent' => $sent, 'finished' => $finished)));
  910.                 break;
  911.             case 'delete':
  912.                 $id = $this->_getParam('id');
  913.                 $this->_helper->layout()->disableLayout();
  914.                 $model = new Newsletter_Model_Mailings;
  915.                 $model->update(array('deleted' => 1), 'id=' . $id);
  916.                 $this->_redirect($_SERVER['HTTP_REFERER']);
  917.                 exit;
  918.                 break;
  919.             case 'confirm-uni':
  920.                 $this->_helper->layout()->disableLayout();
  921.                 $model = new Newsletter_Model_Mailings;
  922.                 $id = $this->_getParam('id');
  923.                 $url = 'http://' . $_SERVER['HTTP_HOST'] . $this->view->url(array('module' => 'newsletter',
  924.                             'controller' => 'index', 'action' => 'mail-list', 'id' => strrev(md5($id))), 'default');
  925.                 $data = $model->getByPk($id);
  926.                 //exit(var_dump($data));
  927.                 $msg = unserialize($data['uni_messages']);
  928.                 $messageId = $msg[0]; //TODO: Убрать сериализацию нафиг!
  929.                 $uni = new Newsletter_Plugin_Uni;
  930.                 $result = $uni->createCampaign(array(
  931.                     'message_id' => $messageId,
  932.                     'track_read' => 1,
  933.                     'contacts_url' => $url
  934.                 ));
  935.                 //
  936.                 if ($result['result']['status'] != 'waits_censor') {
  937.                     $model->update(array('uni_campaign_id' => $result['result']['campaign_id']), 'id=' . $id);
  938.                 }
  939.                 exit(Zend_Debug::dump($result));
  940.                 break;
  941.             case 'uni-stats':
  942.                 $this->_breadcrumbs->addNode('Статистика');
  943.                 $id = $this->_getParam('id'); //Внутренний ID рассылки
  944.                 $mailings = new Newsletter_Model_Mailings;
  945.                 $stats = new Newsletter_Model_Mailings_Stats;
  946.                 $mailing = $mailings->getByPk($id);
  947.                 Zend_Debug::dump($mailing);
  948.                 $this->view->data = $mailing;
  949.                 $this->render('process/uni-stats');
  950.                 break;
  951.         }
  952.     }
  953.  
  954.     /**
  955.      * @title Настройки модуля
  956.      * @description Управление настройками модуля
  957.      */
  958.     public function settingsAction() {
  959.         $this->_breadcrumbs->addNode('Настройки модуля');
  960.         $form = new Newsletter_Form_Settings;
  961.         $model = new Newsletter_Model_Settings;
  962.         if ($this->getRequest()->isPost()) {
  963.             $data = $this->getRequest()->getPost();
  964.             foreach ($data as $k => $v) {
  965.                 $model->update(array('value' => $v), "prop='$k'");
  966.             }
  967.             $this->_redirect($this->view->adminUrl('newsletter', 'settings'));
  968.         } else {
  969.             $this->view->form = $form;
  970.         }
  971.     }
  972.  
  973.     /**
  974.      * @title UniSender
  975.      * @description Управление подпиской через UniSender
  976.      */
  977.     public function uniAction() {
  978.         $this->_breadcrumbs->addNode('UniSender');
  979.         $action = $this->_getParam('action', 'index');
  980.         switch ($action) {
  981.             case 'index': default:
  982.  
  983.                 break;
  984.         }
  985.     }
  986.  
  987. }
Add Comment
Please, Sign In to add comment