File indexing completed on 2024-12-22 05:33:33

0001 <?php
0002 
0003 /**
0004  *  ocs-webserver
0005  *
0006  *  Copyright 2016 by pling GmbH.
0007  *
0008  *    This file is part of ocs-webserver.
0009  *
0010  *    This program is free software: you can redistribute it and/or modify
0011  *    it under the terms of the GNU Affero General Public License as
0012  *    published by the Free Software Foundation, either version 3 of the
0013  *    License, or (at your option) any later version.
0014  *
0015  *    This program is distributed in the hope that it will be useful,
0016  *    but WITHOUT ANY WARRANTY; without even the implied warranty of
0017  *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
0018  *    GNU Affero General Public License for more details.
0019  *
0020  *    You should have received a copy of the GNU Affero General Public License
0021  *    along with this program.  If not, see <http://www.gnu.org/licenses/>.
0022  **/
0023 class ProductcommentController extends Local_Controller_Action_DomainSwitch
0024 {
0025 
0026     /** @var  Zend_Auth */
0027     protected $_auth;
0028 
0029     public function init()
0030     {
0031         parent::init();
0032 
0033         $this->auth = Zend_Auth::getInstance();
0034     }
0035 
0036     public function indexAction()
0037     {
0038         $this->_helper->layout->disableLayout();
0039         $project_id = (int)$this->getParam('p');
0040         $cmodel = new Default_Model_ProjectComments();
0041         $list = $cmodel->getCommentTreeForProjectList($project_id);          
0042         $this->_helper->json($list);
0043     }
0044     
0045     
0046 
0047     public function addreplyAction()
0048     {
0049         $this->_helper->layout->disableLayout();
0050         //$this->_helper->viewRenderer->setNoRender(true);
0051         
0052         header('Access-Control-Allow-Origin: *'); 
0053         
0054         $this->getResponse()
0055              ->setHeader('Access-Control-Allow-Origin', '*')
0056              ->setHeader('Access-Control-Allow-Credentials', 'true')
0057              ->setHeader('Access-Control-Allow-Methods', 'POST, GET, OPTIONS')
0058              ->setHeader('Access-Control-Allow-Headers', 'origin, content-type, accept')
0059         ;
0060 
0061         $data = array();
0062         $data['comment_target_id'] = (int)$this->getParam('p');
0063         $data['comment_parent_id'] = (int)$this->getParam('i');
0064         $data['comment_member_id'] = (int)$this->_authMember->member_id;
0065         if($this->getParam('t'))
0066         {
0067             $data['comment_type'] =(int)$this->getParam('t');
0068         }
0069         
0070         $data['comment_text'] = Default_Model_HtmlPurify::purify($this->getParam('msg'));
0071         $tableReplies = new Default_Model_ProjectComments();
0072         $result = $tableReplies->save($data);
0073         $status = count($result->toArray()) > 0 ? 'ok' : 'error';
0074         $message = '';
0075 
0076         $this->view->comments = $this->loadComments((int)$this->getParam('page'), (int)$this->getParam('p'),$this->getParam('t'));
0077         $this->view->product = $this->loadProductInfo((int)$this->getParam('p'));
0078         $this->view->member_id = (int)$this->_authMember->member_id;
0079 
0080         $this->updateActivityLog($result, $this->view->product->image_small);
0081 
0082         //Send a notification to the owner        
0083         $this->sendNotificationToOwner($this->view->product, $data['comment_text'],$data['comment_type']);
0084 
0085         //Send a notification to the parent comment writer
0086         $this->sendNotificationToParent($this->view->product, $data['comment_text'], $data['comment_parent_id'],$data['comment_type']);
0087 
0088         if ($this->_request->isXmlHttpRequest()) {
0089             
0090             if($this->getParam('t') && (int)$this->getParam('t')==30)
0091             {
0092                 $requestResult = $this->view->render('product/partials/productCommentsUX2.phtml');
0093             }else
0094             {
0095                 $requestResult = $this->view->render('product/partials/productCommentsUX1.phtml');
0096             }            
0097             $this->_helper->json(array('status' => $status, 'message' => $message, 'data' => $requestResult));
0098         } else {
0099             $helperBuildProductUrl = new Default_View_Helper_BuildProductUrl();
0100             $url = $helperBuildProductUrl->buildProductUrl($data['comment_target_id']);
0101             $this->redirect($url);
0102         }
0103     }
0104 
0105     private function loadComments($page_offset, $project_id,$comment_type)
0106     {
0107         $modelComments = new Default_Model_ProjectComments();
0108         $paginationComments = $modelComments->getCommentTreeForProject($project_id,$comment_type);
0109         $paginationComments->setItemCountPerPage(25);
0110         $paginationComments->setCurrentPageNumber($page_offset);
0111 
0112         return $paginationComments;
0113     }
0114 
0115     private function loadProductInfo($param)
0116     {
0117         $tableProject = new Default_Model_Project();
0118 
0119         return $tableProject->fetchProductInfo($param);
0120     }
0121 
0122     private function updateActivityLog($data, $image_small)
0123     {
0124         if ($data['comment_parent_id']) {
0125             $activity_type = Default_Model_ActivityLog::PROJECT_COMMENT_REPLY;
0126         } else {
0127             $activity_type = Default_Model_ActivityLog::PROJECT_COMMENT_CREATED;
0128         }
0129 
0130         Default_Model_ActivityLog::logActivity($data['comment_id'], $data['comment_target_id'],
0131             $data['comment_member_id'], $activity_type,
0132             array('title' => '', 'description' => $data['comment_text'], 'image_small' => $image_small));
0133     }
0134 
0135     /**
0136      * @param Zend_Db_Table_Row_Abstract $product
0137      * @param string                     $comment
0138      */
0139     private function sendNotificationToOwner($product, $comment,$comment_type=null)
0140     {
0141         //Don't send email notification for comments from product owner
0142         if ($this->_authMember->member_id == $product->member_id) {
0143             return;
0144         }
0145 
0146         $productData = new stdClass();
0147         $productData->mail = $product->mail;
0148         $productData->username = $product->username;
0149         $productData->username_sender = $this->_authMember->username;
0150         $productData->title = $product->title;
0151         $productData->project_id = $product->project_id;
0152 
0153         $queue = Local_Queue_Factory::getQueue();
0154         if(!empty($comment_type)&& $comment_type=='30')
0155         {   
0156             $command = new Backend_Commands_SendCommentNotification('tpl_user_comment_note_'.$comment_type, $productData, $comment);
0157         }else
0158         {
0159             $command = new Backend_Commands_SendCommentNotification('tpl_user_comment_note', $productData, $comment);
0160         }        
0161         $queue->send(serialize($command));
0162     }
0163 
0164     private function sendNotificationToParent($product, $comment, $parent_id,$comment_type)
0165     {
0166         if (0 == $parent_id) {
0167             return;
0168         }
0169 
0170         $tableReplies = new Default_Model_ProjectComments();
0171         $parentComment = $tableReplies->getCommentWithMember($parent_id);
0172         if (0 == count($parentComment)) {
0173             return;
0174         }
0175 
0176         if ($this->_authMember->member_id == $parentComment['member_id']) {
0177             return;
0178         }
0179 
0180         // email sent by sendNotificationToOwner already
0181         if ($product->member_id == $parentComment['member_id']) {
0182             return;
0183         }
0184 
0185         $productData = new stdClass();
0186         $productData->mail = $parentComment['mail'];
0187         $productData->username = $parentComment['username'];
0188         $productData->username_sender = $this->_authMember->username;
0189         $productData->title = $product->title;
0190         $productData->project_id = $product->project_id;
0191 
0192         $queue = Local_Queue_Factory::getQueue();
0193         if(!empty($comment_type)&& $comment_type=='30')
0194         {   
0195             $command = new Backend_Commands_SendCommentNotification('tpl_user_comment_reply_note_'.$comment_type, $productData, $comment);
0196         }else
0197         {
0198             $command = new Backend_Commands_SendCommentNotification('tpl_user_comment_reply_note', $productData, $comment);
0199         } 
0200        
0201         $queue->send(serialize($command));
0202     }
0203 
0204     public function addreplyreviewAction()
0205     {
0206         $this->_helper->layout->disableLayout();
0207         $msg = trim($this->getParam('msg'));
0208         $project_id = (int)$this->getParam('p');
0209         $comment_id = null;
0210         $status = 'ok';
0211         $message = '';
0212         
0213         
0214         
0215         //Only Supporter can make a review
0216         if(Zend_Auth::getInstance()->hasIdentity() ) {
0217             if ($msg != '' && strlen($msg)>0) {
0218 
0219                 
0220                 // $data = array();
0221                 // $data['comment_target_id'] = (int)$this->getParam('p');
0222                 // $data['comment_parent_id'] = (int)$this->getParam('i');
0223                 // $data['comment_member_id'] = (int)$this->_authMember->member_id;
0224                 // $data['comment_text'] = Default_Model_HtmlPurify::purify($this->getParam('msg'));
0225              
0226                 $voteup = (int)$this->getParam('v');
0227 
0228                 // negative voting msg length > 5 
0229                 if($voteup ==2 && strlen($msg) < 5)
0230                 {
0231                     $this->_helper->json(array('status' => 'error', 'message' => ' At least 5 chars. ', 'data' => ''));
0232                     return;
0233                 }
0234                 $modelRating = new Default_Model_DbTable_ProjectRating();                
0235                 $modelRating->rateForProject($project_id, $this->_authMember->member_id, $voteup, $msg);
0236 
0237                
0238                 $this->view->product = $this->loadProductInfo((int)$this->getParam('p'));
0239                 $this->view->member_id = (int)$this->_authMember->member_id;
0240 
0241                 if($this->view->product){                    
0242                     //Send a notification to the owner
0243                     $this->sendNotificationToOwner($this->view->product, Default_Model_HtmlPurify::purify($this->getParam('msg')));
0244                    
0245                 }
0246             } 
0247            
0248 
0249             $this->_helper->json(array('status' => $status, 'message' => $message, 'data' => '','laplace_score' =>$this->view->product->laplace_score));
0250         } else {
0251             $this->_helper->json(array('status' => 'error', 'message' => 'Only registered members with an active supporting can vote!', 'data' => ''));
0252         }
0253         
0254         
0255     }
0256 
0257     public function addreplyreviewnewAction()
0258     {
0259         $this->_helper->layout->disableLayout();
0260         $msg = trim($this->getParam('msg'));
0261         $project_id = (int)$this->getParam('p');
0262         $comment_id = null;
0263         $status = 'ok';
0264         $message = '';
0265                 
0266                 
0267         if(Zend_Auth::getInstance()->hasIdentity() ) {
0268             if ($msg != '' && strlen($msg)>0) {                                            
0269                 $score = (int)$this->getParam('s');
0270                 // negative voting msg length > 5 
0271                 if($score < 6 && strlen($msg) < 5)
0272                 {
0273                     $this->_helper->json(array('status' => 'error', 'message' => ' At least 5 chars. ', 'data' => ''));
0274                     return;
0275                 }
0276 
0277                 $this->view->product = $this->loadProductInfo((int)$this->getParam('p'));
0278                 $this->view->member_id = (int)$this->_authMember->member_id;
0279 
0280                 if($this->view->product->member_id==$this->view->member_id)
0281                 {
0282                     $this->_helper->json(array('status' => 'error', 'message' => ' Not allowed. ', 'data' => ''));
0283                     return;   
0284                 }
0285                 $modelRating = new Default_Model_DbTable_ProjectRating();                
0286                 $modelRating->scoreForProject($project_id, $this->_authMember->member_id, $score, $msg);
0287                
0288                 
0289 
0290                 if($this->view->product){                    
0291                     //Send a notification to the owner
0292                     $this->sendNotificationToOwner($this->view->product, Default_Model_HtmlPurify::purify($this->getParam('msg')));                   
0293                 }
0294             } 
0295            
0296 
0297             $this->_helper->json(array('status' => $status, 'message' => $message, 'data' => '','laplace_score' =>$this->view->product->laplace_score));
0298         } else {
0299             $this->_helper->json(array('status' => 'error', 'message' => 'Only registered members with an active supporting can vote!', 'data' => ''));
0300         }
0301         
0302         
0303     }
0304 
0305 }