diff --git a/application/module/Files/Event/FileEvent.php b/application/module/Files/Event/FileEvent.php new file mode 100644 index 00000000..edc86e9b --- /dev/null +++ b/application/module/Files/Event/FileEvent.php @@ -0,0 +1,13 @@ +db = \Zend_Registry::get('db'); + }else{ + $this->db = $db; + } + + $this->config = \Zend_Registry::get('config'); + + $this->event = new \Zend_EventManager_EventManager(); + } + + public function events(\Zend_EventManager_EventCollection $events = NULL) + { + if ($events !== NULL) { + $this->events = $events; + } elseif ($this->events === NULL) { + $this->events = new \Zend_EventManager_EventManager(__CLASS__); + } + return $this->events; + } + + //上传申请表 + public function uploadApplicationForm($file,$orderid) + { + try{ + if (empty($file) !== false) { + return array("error"=>"请选择要上传的文件"); + } + + if (@is_uploaded_file($file['tmp_name']) === false) { + return array("error"=>"文件上传失败,请重新上传"); + } + + $ext = $this->getFileTextExt($file['name']); + $filename = $orderid.".".$ext; + + $dir = "../data/application_form/"; + + if (!file_exists($dir)) { + mkdir($dir); + } + + $dir.=date("Y")."/"; + + if (!file_exists($dir)) { + mkdir($dir); + } + + $new_filepath = $dir.$filename; + + if (move_uploaded_file($file['tmp_name'], $new_filepath) === false) { + return array("error"=>"上传失败,请重试"); + } + + return array("file"=>$new_filepath); + + }catch(Exception $e) + { + return array("error"=>$e->getMessage()); + } + + } + + /** + * upload + * + * 文件上传 + * + * @param Array $files e.g. $_FILES['Filedata'] + * + * return Array $msg e.g. if($msg['error']) + */ + public function upload($files,$dir = "",$filename="",$makeThumb = false) + { + if (empty($files) !== false) { + return array("error"=>"请选择要上传的文件"); + } + + if (@is_uploaded_file($files['tmp_name']) === false) { + return array("error"=>"文件上传失败,请重新上传"); + } + + $conf = new \Zend_Config_Ini("../application/conf/file.ini", "files"); + + $source = $this->source; + $file = $files; + + $results = $this->events()->trigger('upload.checkExt', $this, compact('source','file','conf')); + $cache_data = $results->bottom(); + + if($cache_data !== true) + { + return $cache_data; + } + + $results = $this->events()->trigger('upload.checkSize', $this, compact('file','conf')); + $cache_data = $results->bottom(); + + if($cache_data !== true) + { + return $cache_data; + } + + $msg = array(); + + $file_name = $files['name']; //原文件名 + $file_size = $files['size']; //文件大小 + + $results = $this->makeUploadTarget($conf); + + if(isset($results['error'])) + { + return $results; + }//文件夹问题 + + $new_file_basename = $this->gen_uuid(); + $file_ext = $this->getFileTextExt($file_name); + $new_file_name = $new_file_basename . '.' . $file_ext;//新文件名 + + //移动文件 + $file_path = $results['save_path'] . $new_file_name ; + + if (move_uploaded_file($file['tmp_name'], $file_path) === false) { + return array("error"=>"上传失败,请重试"); + } + + $dbsave = $db_path = $results['dbsave']; + $dbsave .= $new_file_name;//数据库最终存储的文件 + $file_url = $dbsave;//文件链接 + + $results = $this->events()->trigger('upload.makeThumb', $this, compact('conf','file_path','db_path','file_ext','new_file_basename')); + $thumbnail = $results->bottom(); + + $msg['file_url'] = $file_url; + $msg['file_size'] = $file_size; + $msg['db_path'] = $conf->upload . $dbsave; + $msg['realname'] = $file_name; + $msg['file_ext'] = $file_ext; + $msg['file_type'] = $this->getFileMime($file_path); + $msg['thumb'] = $thumbnail; + + return $msg; + }//文件上传 + + //生成上传文件的地址 + public function makeUploadTarget($conf) + { + //文件保存目录路径 + $save_path = $conf->upload; + + if (@is_dir($save_path) === false) { + return array("error"=>"上传目录不存在。请联系管理员"); + } + + if (@is_writable($save_path) === false) { + return array("error"=>"上传目录没有写权限。请联系管理员"); + } + + $dbsave = ""; //数据库中存放的路径 + + $y = date("Y"); + $m = date("m"); + $d = date("d"); + + $save_path .= $y . "/"; + $dbsave .= $y.'/'; + if (!file_exists($save_path)) { + mkdir($save_path); + } + + $save_path .= $m . "/"; + $dbsave .= $m.'/'; + if (!file_exists($save_path)) { + mkdir($save_path); + } + + $save_path .= $d . "/"; + $dbsave .= $d.'/'; + if (!file_exists($save_path)) { + mkdir($save_path); + } + + return array("save_path"=>$save_path,"dbsave"=>$dbsave); + }//创建上传文件的地址 + + //获取文件扩展名 + public function getFileTextExt($file_name) + { + $temp_arr = explode(".", $file_name); + $file_ext = array_pop($temp_arr); + $file_ext = trim($file_ext); + $file_ext = strtolower($file_ext); + return $file_ext; + } + + //获取文件Mime,通过finfo扩展 + public function getFileMime($file_name) + { + $finfo = finfo_open(FILEINFO_MIME_TYPE); + $filetype = finfo_file($finfo, $file_name) ; //文件mime类型 + finfo_close($finfo); + return $filetype; + } + + //文件名uuid + public function gen_uuid() { + return sprintf( '%04x%04x-%04x-%04x-%04x-%04x%04x%04x', + // 32 bits for "time_low" + mt_rand( 0, 0xffff ), mt_rand( 0, 0xffff ), + + // 16 bits for "time_mid" + mt_rand( 0, 0xffff ), + + // 16 bits for "time_hi_and_version", + // four most significant bits holds version number 4 + mt_rand( 0, 0x0fff ) | 0x4000, + + // 16 bits, 8 bits for "clk_seq_hi_res", + // 8 bits for "clk_seq_low", + // two most significant bits holds zero and one for variant DCE1.1 + mt_rand( 0, 0x3fff ) | 0x8000, + + // 48 bits for "node" + mt_rand( 0, 0xffff ), mt_rand( 0, 0xffff ), mt_rand( 0, 0xffff ) + ); + } + + /** + * getOne() + * + * 从数据库获取单个文件的信息 + * + * @param int id + * + * return array + */ + public function getOne($id){ + $db = $this->db; + //下载单个附件 + $sql = $db->query("select a.* from ".$this->tbl_att." a where a.id=$id order by a.ts_created desc"); + $att = $sql->fetch(); + if(empty($att['id'])) + { + return false; + } + return $att; + } + + public function delete($id){ + $att = $this->getOne($id); + if(!empty($att['thumb'])) + { + $thumbs = json_decode($att['thumb'],true); + if(count($thumbs)>0) + { + foreach($thumbs as $v) + { + @unlink($v['file']); + } + } + } + if(file_exists($att['filename'])){ + if(unlink($att['filename'])) + { + $sql = "DELETE FROM ".$this->tbl_att." WHERE id=$id"; + return $this->db->exec($sql); + }else{ + return "删除失败"; + } + }else{ + $sql = "DELETE FROM ".$this->tbl_att." WHERE id=$id"; + if($this->db->exec($sql)) + { + return "文件不存在,数据库记录删除成功"; + }else{ + return "文件不存在,数据库记录删除失败"; + } + } + } + + public function getAll($fields = ""){ + + $wheresql = array(); + if($fields!="") + { + $wheresql[] = " a.id IN ($fields) "; + } + if(count($wheresql)>0) + { + $wheresql = " WHERE ".join(",",$wheresql); + }else{ + $wheresql = ""; + } + + $sql = "SELECT a.*,u.username,u.id as uid FROM ".$this->tbl_att." a + LEFT JOIN tbl_member u ON a.userid=u.id + $wheresql + ORDER BY a.id DESC"; + $rs = $this->db->query($sql); + $rows = $rs->fetchAll(); + return $rows; + } + + + /** + * downloadFile + * + * 文件下载 + * + * @param String $fullPath e.g. Zend_Registry::get('upload').$fileurl + * + * return file + */ + static function downloadFile( $fullPath ){ + + //判断是否已经输出头部 + if( headers_sent() ) + { + return false; + } + else{ + + // Required for some browsers + @apache_setenv('no-gzip', 1); + @ini_set('zlib.output_compression', 0); + + // File Exists? + if( file_exists($fullPath) ){ + + // Parse Info / Get Extension + $fsize = filesize($fullPath); + $path_parts = pathinfo($fullPath); + $ext = strtolower($path_parts["extension"]); + + // Determine Content Type + switch ($ext) { + case "pdf": $ctype="application/pdf"; break; + case "exe": $ctype="application/octet-stream"; break; + case "zip": $ctype="application/zip"; break; + case "doc": $ctype="application/msword"; break; + case "xls": $ctype="application/vnd.ms-excel"; break; + case "ppt": $ctype="application/vnd.ms-powerpoint"; break; + case "gif": $ctype="image/gif"; break; + case "png": $ctype="image/png"; break; + case "jpeg": + case "jpg": $ctype="image/jpg"; break; + default: $ctype="application/force-download"; + } + + header('Content-Description: File Transfer'); + header("Cache-Control: private",false); + header("Content-Type: $ctype"); + header("Content-Disposition: attachment; filename=\"".basename($fullPath)."\";" ); + header("Content-Transfer-Encoding: binary\n"); + header("Expires: 0"); + header("Cache-Control: must-revalidate, post-check=0, pre-check=0"); + header("Pragma: public"); + header("Content-Length: ".$fsize); + ob_clean(); + flush(); + if(readfile($fullPath)) + return true; + else + return false; + } else + {return false;} + } + } //文件下载 +} \ No newline at end of file diff --git a/application/module/Files/Listener/FileListener.php b/application/module/Files/Listener/FileListener.php new file mode 100644 index 00000000..bd9723ad --- /dev/null +++ b/application/module/Files/Listener/FileListener.php @@ -0,0 +1,28 @@ +event = new \Zend_EventManager_EventManager(); + } + + public function attach(\Zend_EventManager_EventCollection $events) + { + $_Events = new FileOperate(); + $events->attach('upload.checkExt', array($_Events, 'checkExt'), 100); + $events->attach('upload.checkSize', array($_Events, 'checkSize'), 80); + $events->attach('upload.makeThumb', array($_Events, 'makeThumb'), 70); + } + + public function detach(\Zend_EventManager_EventCollection $events) + { + + } + +} diff --git a/application/module/Files/Operation/FileOperate.php b/application/module/Files/Operation/FileOperate.php new file mode 100644 index 00000000..9d591836 --- /dev/null +++ b/application/module/Files/Operation/FileOperate.php @@ -0,0 +1,158 @@ +db = \Zend_Registry::get('db'); + }else{ + $this->db = $db; + } + + $this->config = \Zend_Registry::get('config'); + $this->source = $this->loadFileSource(); + } + + private function loadFileSource() + { + return array( + 'voiceimage'=> array('gif','jpg','jpeg','png'), + 'voice'=>array('audio/mpeg') + ); + } + + public function checkExt(\Zend_EventManager_Event $e){ + $source = (string)$e->getParam('source'); + $file = $e->getParam('file'); + $conf = $e->getParam('conf'); + + if(empty($source)) + { + //定义允许上传的文件扩展名 + if(isset($conf->ext) && !empty($conf->ext)) + { + $ext_arr = explode(",",$conf->ext); + }else{ + $ext_arr = $this->def_allow_ext; + } + }else{ + if(!in_array($source,$this->allow_source)){ + return array("error"=>'错误的来源'); + }else{ + $ext_arr = $this->source[$source]; + } + } + + $finfo = finfo_open(FILEINFO_MIME_TYPE); + $filetype = finfo_file($finfo, $file['tmp_name']) ; //文件mime类型 + finfo_close($finfo); + + foreach($ext_arr as $v) + { + if(strpos($filetype,$v) !== false) + { + return true; + } + } + + return array("error"=>"您上传的文件不在允许的范围内".$filetype." was not in ".join(",",$ext_arr)); + }//checkParam + + public function checkSize(\Zend_EventManager_Event $e){ + $file = $e->getParam('file'); + + $file_size = $file['size']; + + if(!isset($conf->maxsize) && !empty($conf->maxsize)) + { + $max_size = (int)$conf->maxsize; + }else{ + $max_size = 10*1024*1024; + } + + if($file_size > $max_size) + { + return array("error"=>'上传的文件超过了允许的文件大小'); + } + + return true; + }//checkSize + + public function makeThumb(\Zend_EventManager_Event $e) + { + $file_path = $e->getParam('file_path'); + $conf = $e->getParam('conf'); + $save_path = $conf->upload; + $dbsave = $e->getParam('db_path'); + $file_ext = $e->getParam('file_ext'); + $new_file_basename = $e->getParam('new_file_basename'); + + $finfo = finfo_open(FILEINFO_MIME_TYPE); + $filetype = finfo_file($finfo, $file_path) ; //文件mime类型 + finfo_close($finfo); + + $thumb_conf = new \Zend_Config_Ini("../application/conf/thumb.ini", "thumb"); + + if($thumb_conf->makethumb != "on") + { + return array(); + } + + $allowmime = $thumb_conf->imagemime; + if(empty($allowmime)) + { + $allowmime = array('image/jpeg','image/png','image/gif'); + }else{ + $allowmime = explode(",",$allowmime); + } + + if(!in_array($filetype,$allowmime)) + { + return array(); + } + + $thumb_size = explode(",",$thumb_conf->thumbsize); + + $thumbnail = array(); + + foreach($thumb_size as $v) + { + $v = (int)$v; + $thumb = new Thumbnail($v, $v); + $image = file_get_contents($file_path); + $thumb->loadData($image, $filetype); + $thumbfile = $save_path.$dbsave.$new_file_basename.'_'.$v. '.' .$file_ext; + $thumbnail[$v] = array( + 'size' => $v, + 'ext' => $file_ext, + 'file' => $thumbfile, + 'url' => $dbsave.$new_file_basename.'_'.$v. '.' .$file_ext , + ); + $thumb->buildThumb($thumbfile); + } + + return $thumbnail; + + }//makeThumb +} \ No newline at end of file diff --git a/application/module/Files/Output.php b/application/module/Files/Output.php new file mode 100644 index 00000000..30d45125 --- /dev/null +++ b/application/module/Files/Output.php @@ -0,0 +1,194 @@ +db = $db; + } + + //输出下载 + public function Download($filename,$content,$filetype="JSON",$zfmvc=""){ + + if(empty($filename) || empty($content) || empty($filetype)) + { + return false; + } + + $filetype = strtolower($filetype); + + //支持的输出类型 + $functions = array( + "json"=>"JsonOutPut", + "xml"=>"XMLOutPut", + "csv"=>"CSVOutPut", + ); + + $file_type_functions = array(); + foreach($functions as $k=>$v) + { + $file_type_functions[] = $k; + } + + if(!in_array($filetype,$file_type_functions)) + { + return false; + } + + $output_body = $this->$functions[$filetype]($content); + + $this->pushDownload($output_body,$filename,$filetype,$zfmvc); + + }//Download + + //输出JSON内容 + public function JsonOutPut($content,$numeric = true){ + + if($numeric == true) + { + return json_encode($content,JSON_NUMERIC_CHECK); + }else{ + return json_encode($content); + } + + }//JsonOutPut() + + //输出XML内容 + public function XMLOutPut($content){ + + + }//JsonOutPut() + + //输出CSV内容 + public function CSVOutPut($data,$head = ""){ + + $split = ","; + + $content = ""; + + //如果是windows,输出一个BOM头 + if(strpos($_SERVER["HTTP_USER_AGENT"],"Windows")) + { + $content = "\xEF\xBB\xBF"; + }else{ + $content = ""; + } + + if(!empty($head)) + { + $content .= join($split,$head)."\r\n"; + } + + + foreach($data as $k=>$v) + { + + foreach($v as $kk=>$vv) + { + if(strpos($vv,",")) + { + $v[$kk] = "\"".$vv."\""; + } + } + + $content .= join($split,$v)."\r\n"; + } + + return $content; + }//JsonOutPut() + + //输出下载 + public function pushDownload($content,$filename,$type="",$zfmvc="") + { + if(headers_sent()) + { + return false; + } + + if(empty($filename) || empty($content)) + { + return false; + } + + $content_type = $this->ContentTypes($type); + $fsize = strlen($content); + + //没有在zf controller 中使用 + if(empty($zfmvc)) + { + + header('Content-Description: File Transfer'); + header("Cache-Control: private",false); + header("Content-Type: ".$content_type); + header("Content-Disposition: attachment; filename=\"".$filename."\";" ); + header("Content-Transfer-Encoding: binary\n"); + header("Expires: 0"); + header("Cache-Control: must-revalidate, post-check=0, pre-check=0"); + header("Pragma: public"); + header("Content-Length: ".$fsize); + ob_clean(); + flush(); + + echo $content; + + exit(); + }else{ + $zfmvc->getResponse()->setHeader('Content-Type', $content_type) + ->setHeader('Content-Disposition','attachment; filename="'.$filename.'"') + ->setHeader('Content-Length', strlen($content)) + ->setHeader('Content-Type','application/force-download') + ->setHeader('Content-Type','application/download') + ->setHeader('Content-Description','File Transfer') + ->setHeader('Content-Transfer-Encoding','binary') + ->setHeader('Expires',0) + ->setHeader('Cache-Control','must-revalidate, post-check=0, pre-check=0') + ->setHeader('Pragma','public') + ->setBody($content); + exit(); + } + + }//pushDownload + + //Content-Type + public function ContentTypes($ext){ + + $ext = strtolower($ext); + + $def = "application/force-download"; + + if(empty($ext)) + { + return $def; + } + + $content_types = array( + "csv" => "text/csv", + "pdf"=>"application/pdf", + "exe"=>"application/octet-stream", + "gzip"=>"application/zip", + "doc"=>"application/msword", + "xls"=>"application/vnd.ms-excel", + "ppt"=>"application/vnd.ms-powerpoint", + "gif"=>"image/gif", + "png"=>"image/png", + "jpeg"=>"image/jpg", + "jpg"=>"image/jpg", + "xml"=>"text/xml", + "xsl"=>"text/xml" + ); + + if(!isset($content_types[$ext])) + { + return $def; + }else{ + return $content_types[$ext]; + } + + }//ContentTypes + +} diff --git a/application/module/Files/Thumbnail.php b/application/module/Files/Thumbnail.php new file mode 100644 index 00000000..6d63fa79 --- /dev/null +++ b/application/module/Files/Thumbnail.php @@ -0,0 +1,176 @@ +maxWidth = $maxWidth; + $this->maxHeight = $maxHeight; + $this->scale = $scale; + $this->inflate = $inflate; + $this->types = array( + 'image/jpeg', + 'image/png', + 'image/gif' + ); + //加载MIME类型图像的函数名称 + $this->imgLoaders = array( + 'image/jpeg' => 'imagecreatefromjpeg', + 'image/png' => 'imagecreatefrompng', + 'image/gif' => 'imagecreatefromgif' + ); + //储存创建MIME类型图片的函数名称 + $this->imgCreators = array( + 'image/jpeg' => 'imagejpeg', + 'image/png' => 'imagepng', + 'image/gif' => 'imagegif' + ); + } + /** + * 文件方式加载图片 + * @param string $image 源图片 + * @return bool + */ + public function loadFile($image){ + if(!$dims = @getimagesize($image)){ + trigger_error("源图片不存在"); + } + if(in_array($dims['mime'], $this->types)){ + $loader = $this->imgLoaders[$dims['mime']]; + $this->source = $loader($image); + if($dims['mime'] == 'image/png' || $dims['mime'] == 'image/gif'){ + imagesavealpha($this->source, true); + } + $this->sourceWidth = $dims[0]; + $this->sourceHeight = $dims[1]; + $this->sourceMime = $dims['mime']; + $this->initThumb(); + return TRUE; + }else{ + trigger_error('不支持'.$dims['mime']."图片类型"); + } + } + /** + * 字符串方式加载图片 + * @param string $image 字符串 + * @param string $mime 图片类型 + * @return type + */ + public function loadData($image,$mime){ + if(in_array($mime, $this->types)){ + if($this->source = @imagecreatefromstring($image)){ + $this->sourceWidth = imagesx($this->source); + $this->sourceHeight = imagesy($this->source); + $this->sourceMime = $mime; + $this->initThumb(); + return TRUE; + }else{ + trigger_error("不能从字符串加载图片"); + } + }else{ + trigger_error("不支持".$mime."图片格式"); + } + } + /** + * 生成缩略图 + * @param string $file 文件名。如果不为空则储存为文件,否则直接输出到浏览器 + */ + public function buildThumb($file = NULL){ + $creator = $this->imgCreators[$this->sourceMime]; + if(isset($file) && $this->thumb !== NULL){ + return $creator($this->thumb,$file); + }else{ + return false; + } + } + /** + * 处理缩放 + */ + public function initThumb(){ + if($this->scale){ + if($this->sourceWidth > $this->sourceHeight){ + $this->thumbWidth = $this->maxWidth; + $this->thumbHeight = floor($this->sourceHeight*($this->maxWidth/$this->sourceWidth)); + }elseif($this->sourceWidth < $this->sourceHeight){ + $this->thumbHeight = $this->maxHeight; + $this->thumbWidth = floor($this->sourceWidth*($this->maxHeight/$this->sourceHeight)); + }else{ + $this->thumbWidth = $this->maxWidth; + $this->thumbHeight = $this->maxHeight; + } + } + + if($this->sourceWidth <= $this->maxWidth && $this->sourceHeight <= $this->maxHeight && $this->inflate == FALSE){ + $this->thumb = NULL; + }else{ + $this->thumb = imagecreatetruecolor($this->thumbWidth, $this->thumbHeight); + if($this->sourceMime == 'image/png' || $this->sourceMime == 'image/gif') + { + + imagealphablending($this->thumb, true); + imagesavealpha($this->thumb, true); + if($this->sourceMime == 'image/gif') + { + $bgcolor=imagecolorallocate($this->thumb,0,0,0); + $transparent = imagecolortransparent($this->thumb,$bgcolor) ; + } + if($this->sourceMime == 'image/png') + { + $transparent = imagecolorallocatealpha($this->thumb, 0, 0, 0, 127); + } + imagefill($this->thumb, 0, 0, $transparent); + } + imagecopyresampled($this->thumb, $this->source, 0, 0, 0, 0, $this->thumbWidth, $this->thumbHeight, $this->sourceWidth, $this->sourceHeight); + } + } + + public function getMine(){ + return $this->sourceMime; + } + + public function getThumbWidth(){ + return $this->thumbWidth; + } + + public function getThumbHeight(){ + return $this->thumbHeight; + } + +} + +/** + * 缩略图类调用示例(文件) + +$thumb = new Thumbnail(200, 200); +$thumb->loadFile('wap.gif'); +header('Content-Type:'.$thumb->getMine()); +$thumb->buildThumb(); +/** + * 缩略图类调用示例(字符串) + +$thumb = new Thumbnail(200, 200); +$image = file_get_contents('wap.gif'); +$thumb->loadData($image, 'image/jpeg'); +$thumb->buildThumb('wap_thumb.gif'); + */ \ No newline at end of file diff --git a/application/module/Helpers/View.php b/application/module/Helpers/View.php new file mode 100644 index 00000000..5c46c3ac --- /dev/null +++ b/application/module/Helpers/View.php @@ -0,0 +1,132 @@ +db = \Zend_Registry::get('db'); + }else{ + $this->db = $db; + } + } + + static function addPaginator($data,$ctl,$limit = 10) + { + $request = $ctl->getRequest(); + $page = $request->getParam('page'); + + $paginator = \Zend_Paginator::factory($data); + $paginator->setCurrentPageNumber($page); + $paginator->setItemCountPerPage($limit); + $paginator->setView($ctl->view); + \Zend_View_Helper_PaginationControl::setDefaultViewPartial('pagination_param.phtml'); + $ctl->view->paginator = $paginator; + } + + static function Msg($type,$content,$url=''){ + $html = '
"; + var_dump($data); + echo ""; + if($exit) + { + exit(); + } + } + + static function Post(\Zend_Controller_Action $ctl,$msg,$url=""){ + + if(empty($msg)) + { + return false; + } + if(!is_array($msg)) + { + $msg = array('content'=>$msg,'url'=>$url); + } + + $helper = new \Zend_Controller_Action_HelperBroker($ctl); + $helper->viewRenderer->setNoRender(); + echo $ctl->view->partial('post-message.phtml', $msg); + return true; + } + + static function HttpError($ctl,$code = 404){ + $ctl->getResponse()->setHttpResponseCode($code); + $helper = new \Zend_Controller_Action_HelperBroker($ctl); + $helper->layout->setLayout('layout'); + $helper->viewRenderer->setNoRender(); + echo $ctl->view->partial('error/404.phtml'); + return true; + } + + static function getHostLink() + { + $protocol = "http"; + if(strpos(strtolower($_SERVER['SERVER_PROTOCOL']),"https")) + { + $protocol = "https"; + } + return $protocol."://".$_SERVER['SERVER_NAME']; + } +} \ No newline at end of file