PageRenderTime 47ms CodeModel.GetById 20ms RepoModel.GetById 1ms app.codeStats 0ms

/baser/views/helpers/bc_upload.php

https://github.com/hashing/basercms
PHP | 315 lines | 226 code | 30 blank | 59 comment | 52 complexity | 9e7fd64e45454271ae5cf8d2ce75249f MD5 | raw file
Possible License(s): MIT
  1. <?php
  2. /* SVN FILE: $Id$ */
  3. /**
  4. * アップロードヘルパー
  5. *
  6. * PHP versions 5
  7. *
  8. * baserCMS : Based Website Development Project <http://basercms.net>
  9. * Copyright 2008 - 2012, baserCMS Users Community <http://sites.google.com/site/baserusers/>
  10. *
  11. * @copyright Copyright 2008 - 2012, baserCMS Users Community
  12. * @link http://basercms.net baserCMS Project
  13. * @package baser.view.helpers
  14. * @since baserCMS v 0.1.0
  15. * @version $Revision$
  16. * @modifiedby $LastChangedBy$
  17. * @lastmodified $Date$
  18. * @license http://basercms.net/license/index.html
  19. */
  20. /**
  21. * Include files
  22. */
  23. App::import('Helper', 'Form');
  24. /**
  25. * アップロードヘルパー
  26. *
  27. * @package baser.views.helpers
  28. */
  29. class BcUploadHelper extends FormHelper {
  30. /**
  31. * ファイルインプットボックス出力
  32. * 画像の場合は画像タグ、その他の場合はファイルへのリンク
  33. * そして削除用のチェックボックスを表示する
  34. * [カスタムオプション]
  35. * imgsize・・・画像のサイズを指定する
  36. *
  37. * @param string $fieldName
  38. * @param array $options
  39. * @return string
  40. * @access public
  41. */
  42. function file($fieldName, $options = array()) {
  43. $linkOptions = $_options = array('imgsize'=>'midium','rel'=>'','title'=>'');
  44. $options = $this->_initInputField($fieldName, Set::merge($_options,$options));
  45. $linkOptions['imgsize'] = $options['imgsize'];
  46. $linkOptions['rel'] = $options['rel'];
  47. $linkOptions['title'] = $options['title'];
  48. unset($options['imgsize']);
  49. unset($options['rel']);
  50. unset($options['title']);
  51. $view =& ClassRegistry::getObject('view');
  52. $_field = $view->entity();
  53. $modelName = $_field[0];
  54. $field = $_field[1];
  55. if (ClassRegistry::isKeySet($modelName)) {
  56. $model =& ClassRegistry::getObject($modelName);
  57. }else {
  58. return;
  59. }
  60. $fileLinkTag = $this->fileLink($fieldName, $linkOptions);
  61. $fileTag = parent::file($fieldName,$options);
  62. $delCheckTag = parent::checkbox($modelName.'.'.$field.'_delete').parent::label($modelName.'.'.$field.'_delete','削除する');
  63. $hiddenValue = $this->value($fieldName.'_');
  64. $fileValue = $this->value($fieldName);
  65. if(is_array($fileValue) && empty($fileValue['tmp_name']) && $hiddenValue) {
  66. $hiddenTag = parent::hidden($modelName.'.'.$field.'_',array('value'=>$hiddenValue));
  67. }else {
  68. $hiddenTag = parent::hidden($modelName.'.'.$field.'_',array('value'=>$this->value($fieldName)));
  69. }
  70. $out = $fileTag;
  71. if($fileLinkTag) {
  72. $out .= '&nbsp;'.$delCheckTag.$hiddenTag.'<br />'.$fileLinkTag;
  73. }
  74. return '<div class="upload-file">'.$out.'</div>';
  75. }
  76. /**
  77. * ファイルへのリンクを取得する
  78. *
  79. * @param string $fieldName
  80. * @param array $options
  81. * @return string
  82. */
  83. function fileLink($fieldName, $options = array()) {
  84. $_options = array('imgsize'=>'midium','rel'=>'','title'=>'');
  85. $options = $this->_initInputField($fieldName, Set::merge($_options,$options));
  86. $view =& ClassRegistry::getObject('view');
  87. $tmp = false;
  88. $_field = $view->entity();
  89. $modelName = $_field[0];
  90. $field = $_field[1];
  91. if (ClassRegistry::isKeySet($modelName)) {
  92. $model =& ClassRegistry::getObject($modelName);
  93. }else {
  94. return;
  95. }
  96. $imgsize = $options['imgsize'];
  97. $rel = $options['rel'];
  98. $title = $options['title'];
  99. unset($options['imgsize']);
  100. unset($options['rel']);
  101. unset($options['title']);
  102. $basePath = $this->base.DS.'files'.DS.$model->actsAs['Upload']['saveDir'].DS;
  103. if(empty($options['value'])) {
  104. $value = $this->value($fieldName);
  105. }else {
  106. $value = $options['value'];
  107. }
  108. if(is_array($value)) {
  109. if(empty($value['session_key']) && empty($value['name'])) {
  110. $data = $model->findById($model->id);
  111. if(!empty($data[$model->alias][$field])) {
  112. $value = $data[$model->alias][$field];
  113. }else {
  114. $value = '';
  115. }
  116. }else {
  117. if(isset($value['session_key'])) {
  118. $tmp = true;
  119. $value = $value['session_key'];
  120. $basePath = $this->base.DS.'uploads'.DS.'tmp'.DS;
  121. }
  122. }
  123. }
  124. /* ファイルのパスを取得 */
  125. /* 画像の場合はサイズを指定する */
  126. if(isset($model->actsAs['Upload']['saveDir'])) {
  127. if($value && !is_array($value)) {
  128. $uploadSettings = $model->actsAs['Upload']['fields'][$field];
  129. if($uploadSettings['type']=='image') {
  130. $options = array('imgsize'=>$imgsize,'rel'=>$rel,'title'=>$title);
  131. if($tmp) {
  132. $options['tmp'] = true;
  133. }
  134. $fileLinkTag = $this->uploadImage($fieldName, $value, $options).'<br /><span class="file-name">'.$value.'</span>';
  135. }else {
  136. $filePath = $basePath.$value;
  137. $fileLinkTag = $this->Html->link('ダウンロード ≫',$filePath).'<br /><span class="file-name">'.$value.'</span>';
  138. }
  139. }else {
  140. $fileLinkTag = $value;
  141. }
  142. }else {
  143. return false;
  144. }
  145. return $fileLinkTag;
  146. }
  147. /**
  148. * アップロードした画像のタグをリンク付きで出力する
  149. * Uploadビヘイビアの設定による
  150. * 上から順に大きい画像を並べている事が前提で
  151. * 指定したサイズ内で最大の画像を出力
  152. * リンク先は存在する最大の画像へのリンクとなる
  153. *
  154. * @param string $fieldName
  155. * @param string $fileName
  156. * @param array $options
  157. * @return string
  158. */
  159. function uploadImage($fieldName, $fileName, $options = array()) {
  160. $_options = array('imgsize'=>'midium', 'escape'=>false, 'link'=>true, 'mobile'=>false);
  161. $options = Set::merge($_options,$options);
  162. $imgOptions = array();
  163. $linkOptions = array();
  164. $noimage = false;
  165. $link = true;
  166. $tmp = false;
  167. if(is_array($fileName)) {
  168. if(isset($fileName['session_key'])) {
  169. $fileName = $fileName['session_key'];
  170. $tmp = true;
  171. } else {
  172. return '';
  173. }
  174. }
  175. $imgsize = $options['imgsize'];
  176. if(isset($options['alt'])) {
  177. $imgOptions['alt'] = $options['alt'];
  178. unset($options['alt']);
  179. }
  180. if(isset($options['width'])) {
  181. $imgOptions['width'] = $options['width'];
  182. unset($options['width']);
  183. }
  184. if(isset($options['height'])) {
  185. $imgOptions['height'] = $options['height'];
  186. unset($options['height']);
  187. }
  188. unset($options['imgsize']);
  189. if(isset($options['noimage'])) {
  190. if(!$fileName) {
  191. $fileName = $options['noimage'];
  192. $noimage = true;
  193. }
  194. unset($options['noimage']);
  195. } else {
  196. if(!$fileName) {
  197. return '';
  198. }
  199. }
  200. if(isset($options['link'])) {
  201. $link = $options['link'];
  202. unset($options['link']);
  203. }
  204. if(isset($options['escape'])) {
  205. $linkOptions['escape'] = $options['escape'];
  206. unset($options['escape']);
  207. }
  208. if(isset($options['tmp'])) {
  209. $tmp = true;
  210. unset($options['tmp']);
  211. }
  212. $mobile = $options['mobile'];
  213. $_field = split('\.',$fieldName);
  214. $modelName = $_field[0];
  215. $field = $_field[1];
  216. if (ClassRegistry::isKeySet($modelName)) {
  217. $model =& ClassRegistry::getObject($modelName);
  218. }else {
  219. return;
  220. }
  221. $fileUrl = '/files/'.$model->actsAs['Upload']['saveDir'].'/';
  222. $filePath = WWW_ROOT.'files'.DS.$model->actsAs['Upload']['saveDir'].DS;
  223. $copySettings = $model->actsAs['Upload']['fields'][$field]['imagecopy'];
  224. if($tmp) {
  225. $link = false;
  226. $fileUrl = $this->base.'/uploads/tmp/';
  227. if($imgsize) {
  228. $fileUrl .= $imgsize.'/';
  229. }
  230. }
  231. if($noimage) {
  232. $mostSizeUrl = $fileName;
  233. } elseif($tmp) {
  234. $mostSizeUrl = $fileUrl.$fileName;
  235. } else {
  236. $check = false;
  237. $maxSizeExists = false;
  238. $mostSizeExists = false;
  239. foreach($copySettings as $key => $copySetting) {
  240. if($key == $imgsize) {
  241. $check = true;
  242. }
  243. if(isset($copySetting['mobile'])) {
  244. if($copySetting['mobile'] != $mobile) {
  245. continue;
  246. }
  247. }else{
  248. if($mobile != preg_match('/^mobile_/', $key)) {
  249. continue;
  250. }
  251. }
  252. $imgPrefix = '';
  253. $imgSuffix = '';
  254. if(isset($copySetting['suffix']))
  255. $imgSuffix = $copySetting['suffix'];
  256. if(isset($copySetting['prefix']))
  257. $imgPrefix = $copySetting['prefix'];
  258. $pathinfo = pathinfo($fileName);
  259. $ext = $pathinfo['extension'];
  260. $basename = basename($fileName,'.'.$ext);
  261. if(file_exists($filePath.$imgPrefix.$basename.$imgSuffix.'.'.$ext)) {
  262. if($check && !$mostSizeExists) {
  263. $mostSizeUrl = $fileUrl.$imgPrefix.$basename.$imgSuffix.'.'.$ext.'?'.rand();
  264. $mostSizeExists = true;
  265. } elseif(!$mostSizeExists && !$maxSizeExists) {
  266. $maxSizeUrl = $fileUrl.$imgPrefix.$basename.$imgSuffix.'.'.$ext.'?'.rand();
  267. $maxSizeExists = true;
  268. }
  269. }
  270. }
  271. if(!isset($mostSizeUrl)) {
  272. $mostSizeUrl = $fileUrl.$fileName.'?'.rand();
  273. }
  274. if(!isset($maxSizeUrl)) {
  275. $maxSizeUrl = $fileUrl.$fileName.'?'.rand();
  276. }
  277. }
  278. if($link && !$noimage) {
  279. return $this->Html->link($this->Html->image($mostSizeUrl,$imgOptions),$maxSizeUrl,am($options, $linkOptions));
  280. }else {
  281. return $this->Html->image($mostSizeUrl,am($options, $imgOptions));
  282. }
  283. }
  284. }
  285. ?>