XCL Web Application Platform 2.5.0
The XoopsCube Legacy Project
Loading...
Searching...
No Matches
SmilesUploadAction.class.php
1<?php
10
11if (!defined('XOOPS_ROOT_PATH')) {
12 exit();
13}
14
15require_once XOOPS_MODULE_PATH . '/legacy/class/AbstractEditAction.class.php';
16require_once XOOPS_MODULE_PATH . '/legacy/admin/forms/SmilesUploadForm.class.php';
17
18class Legacy_SmilesUploadAction extends Legacy_Action
19{
20 public $mActionForm = null;
21 public $mErrorMessages = [];
22 public $mAllowedExts = ['gif' =>'image/gif', 'jpg' =>'image/jpeg', 'jpeg' =>'image/jpeg', 'png' =>'image/png'];
23
24 public function prepare(&$controller, &$xoopsUser)
25 {
26 $this->mActionForm =new Legacy_SmilesUploadForm();
27 $this->mActionForm->prepare();
28 }
29
30 public function getDefaultView(&$controller, &$xoopsUser)
31 {
32 return LEGACY_FRAME_VIEW_INPUT;
33 }
34
35 public function _addErrorMessage($msg)
36 {
37 $this->mErrorMessages[] = $msg;
38 }
39
40 public function execute(&$controller, &$xoopsUser)
41 {
42 $form_cancel = $controller->mRoot->mContext->mRequest->getRequest('_form_control_cancel');
43 if (null !== $form_cancel) {
44 return LEGACY_FRAME_VIEW_CANCEL;
45 }
46
47 $this->mActionForm->fetch();
48 $this->mActionForm->validate();
49
50 if ($this->mActionForm->hasError()) {
51 return $this->getDefaultView($controller, $xoopsUser);
52 }
53
54 $formFile = $this->mActionForm->get('upload');
55 $formFileExt = $formFile->getExtension();
56 $files = [];
57 $smilesimages = [];
58
59 if ('zip' === strtolower($formFileExt)) {
60 if (!file_exists(XOOPS_ROOT_PATH . '/class/Archive_Zip.php')) {
61 return LEGACY_FRAME_VIEW_ERROR;
62 }
63 require_once XOOPS_ROOT_PATH . '/class/Archive_Zip.php';
64 $zip = new Archive_Zip($formFile->_mTmpFileName) ;
65 $files = $zip->extract(['extract_as_string' => true]) ;
66 if (! is_array(@$files)) {
67 return LEGACY_FRAME_VIEW_ERROR;
68 }
69 if (!$this->_fetchZipSmilesImages($files, $smilesimages)) {
70 return LEGACY_FRAME_VIEW_ERROR;
71 }
72 }//if zip end
73 else {
74 require_once XOOPS_ROOT_PATH . '/class/class.tar.php';
75 $tar =new tar();
76 $tar->openTar($formFile->_mTmpFileName);
77 if (!is_array(@$tar->files)) {
78 return LEGACY_FRAME_VIEW_ERROR;
79 }
80 if (!$this->_fetchTarSmilesImages($tar->files, $smilesimages)) {
81 return LEGACY_FRAME_VIEW_ERROR;
82 }
83 }//end tar
84
85 if (!$this->_saveSmilesImages($smilesimages)) {
86 return LEGACY_FRAME_VIEW_ERROR;
87 }
88 return LEGACY_FRAME_VIEW_SUCCESS;
89 }
90
91 public function _fetchZipSmilesImages(&$files, &$smilesimages)
92 {
93 foreach ($files as $file) {
94 $file_pos = strrpos($file['filename'], '/') ;
95 if (false !== $file_pos) {
96 $file['filename'] = substr($file['filename'], $file_pos+1);
97 }
98 if (!empty($file['filename']) && preg_match("/(.*)\.(gif|jpg|jpeg|png)$/i", $file['filename'], $match) && !preg_match('/[' . preg_quote('\/:*?"<>|', '/') . ']/', $file['filename'])) {
99 $smilesimages[] = ['name' => $file['filename'], 'content' => $file['content']];
100 }
101 unset($file);
102 }
103 return true;
104 }
105
106 public function _fetchTarSmilesImages(&$files, &$smilesimages)
107 {
108 foreach ($files as $id => $info) {
109 $file_pos = strrpos($info['name'], '/') ;
110 if (false !== $file_pos) {
111 $info['name'] = substr($info['name'], $file_pos+1);
112 }
113 if (!empty($info['name']) && preg_match("/(.*)\.(gif|jpg|jpeg|png)$/i", $info['name'], $match) && !preg_match('/[' . preg_quote('\/:*?"<>|', '/') . ']/', $info['name'])) {
114 $smilesimages[] = ['name' => $info['name'], 'content' => $info['file']];
115 }
116 unset($info);
117 }
118 return true;
119 }
120
121 public function _saveSmilesImages(&$smilesimages)
122 {
123 if (0 === (is_countable($smilesimages) ? count($smilesimages) : 0)) {
124 return true;
125 }
126
127 $smileshandler =& xoops_getmodulehandler('smiles');
128
129 for ($i = 0; $i < (is_countable($smilesimages) ? count($smilesimages) : 0); $i++) {
130 $ext_pos = strrpos($smilesimages[$i]['name'], '.') ;
131 if (false === $ext_pos) {
132 continue ;
133 }
134 $ext = strtolower(substr($smilesimages[$i]['name'], $ext_pos + 1)) ;
135 if (empty($this->mAllowedExts[$ext])) {
136 continue ;
137 }
138 $file_name = substr($smilesimages[$i]['name'], 0, $ext_pos) ;
139 $save_file_name = uniqid('smil') . '.' . $ext ;
140 $filehandle = fopen(XOOPS_UPLOAD_PATH.'/'.$save_file_name, 'w') ;
141 if (! $filehandle) {
142 $this->_addErrorMessage(XCube_Utils::formatString(_AD_LEGACY_ERROR_COULD_NOT_SAVE_SMILES_FILE, $file_name));
143 continue ;
144 }
145 if (!@fwrite($filehandle, $smilesimages[$i]['content'])) {
146 $this->_addErrorMessage(XCube_Utils::formatString(_AD_LEGACY_ERROR_COULD_NOT_SAVE_SMILES_FILE, $file_name));
147 @fclose($filehandle) ;
148 continue;
149 };
150 @fclose($filehandle) ;
151
152 $smiles =& $smileshandler->create();
153 $smiles->set('code', $file_name);
154 $smiles->set('emotion', $file_name);
155 $smiles->set('smile_url', $save_file_name);
156 $smiles->set('display', 1);
157
158 if (!$smileshandler->insert($smiles)) {
159 $this->_addErrorMessage(XCube_Utils::formatString(_AD_LEGACY_ERROR_COULD_NOT_SAVE_SMILES_FILE, $file_name));
160 }
161 unset($smiles);
162 }
163
164 return true;
165 }
166
167 public function executeViewInput(&$controller, &$xoopsUser, &$render)
168 {
169 $render->setTemplateName('smiles_upload.html');
170 $render->setAttribute('actionForm', $this->mActionForm);
171 }
172
173 public function executeViewSuccess(&$controller, &$xoopsUser, &$render)
174 {
175 $controller->executeForward('./index.php?action=SmilesList');
176 }
177
178 public function executeViewError(&$controller, &$xoopsUser, &$render)
179 {
180 if (0 == count($this->mErrorMessages)) {
181 $controller->executeRedirect('./index.php?action=SmilesList', 1, _AD_LEGACY_ERROR_DBUPDATE_FAILED);
182 } else {
183 $render->setTemplateName('smiles_upload_error.html');
184 $render->setAttribute('errorMessages', $this->mErrorMessages);
185 }
186 }
187
188 public function executeViewCancel(&$controller, &$xoopsUser, &$render)
189 {
190 $controller->executeForward('./index.php?action=SmilesList');
191 }
192}
static formatString()
[Static] Formats string with special care for international.