PageRenderTime 61ms CodeModel.GetById 30ms RepoModel.GetById 1ms app.codeStats 0ms

/baser/plugins/mail/controllers/mail_controller.php

https://github.com/hashing/basercms
PHP | 483 lines | 214 code | 67 blank | 202 comment | 35 complexity | 204e7ebe8ab5f5f29d6af378ebf56d42 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.plugins.mail.controller
  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. /**
  24. * お問い合わせメールフォーム用コントローラー
  25. *
  26. * @package baser.plugins.mail.controller
  27. */
  28. class MailController extends MailAppController {
  29. /**
  30. * クラス名
  31. *
  32. * @var string
  33. * @access public
  34. */
  35. var $name = 'Mail';
  36. /**
  37. * モデル
  38. *
  39. * @var array
  40. * @access public
  41. */
  42. var $uses = array('Mail.Message','Mail.MailContent','Mail.MailField','Mail.MailConfig');
  43. /**
  44. * ヘルパー
  45. *
  46. * @var array
  47. * @access public
  48. */
  49. var $helpers = array(
  50. BC_FREEZE_HELPER, 'Mail.Mailform', 'Javascript',
  51. BC_ARRAY_HELPER, BC_TIME_HELPER, 'Mail.Maildata', 'Mail.Mailfield', 'Mail.Mail'
  52. );
  53. /**
  54. * Array of components a controller will use
  55. *
  56. * @var array
  57. * @access public
  58. */
  59. // PHP4の場合、メールフォームの部品が別エレメントになった場合、利用するヘルパが別インスタンスとなってしまう様子。
  60. // そのためSecurityコンポーネントが利用できない
  61. // 同じエレメント内で全てのフォーム部品を完結できればよいがその場合デザインの自由度が失われてしまう。
  62. //var $components = array('Email','BcEmail','Security','BcCaptcha');
  63. var $components = array('Email','BcEmail','BcCaptcha');
  64. /**
  65. * CSS
  66. *
  67. * @var array
  68. * @access public
  69. */
  70. var $css = array('mail/form');
  71. /**
  72. * ページタイトル
  73. *
  74. * @var string
  75. * @access public
  76. */
  77. var $pageTitle = 'お問い合わせ';
  78. /**
  79. * サブメニューエレメント
  80. *
  81. * @var array
  82. * @access public
  83. */
  84. var $subMenuElements = array();
  85. /**
  86. * データベースデータ
  87. *
  88. * @var array
  89. * @access public
  90. */
  91. var $dbDatas = null;
  92. /**
  93. * ぱんくずナビ
  94. *
  95. * @var array
  96. * @access public
  97. */
  98. var $crumbs = array();
  99. /**
  100. * beforeFilter.
  101. *
  102. * @return void
  103. * @access public
  104. */
  105. function beforeFilter() {
  106. /* 認証設定 */
  107. $this->BcAuth->allow(
  108. 'index', 'mobile_index', 'smartphone_index',
  109. 'confirm', 'mobile_confirm', 'smartphone_confirm',
  110. 'submit', 'mobile_submit', 'smartphone_submit',
  111. 'captcha', 'smartphone_captcha'
  112. );
  113. parent::beforeFilter();
  114. // バリデーション自動生成用にメールフォームIDを設定
  115. if(!empty($this->contentId)) {
  116. $id = $this->contentId;
  117. }elseif(!empty($this->params['pass'][0]) && is_numeric($this->params['pass'][0])) {
  118. $id = $this->params['pass'][0];
  119. }else {
  120. $id = 1;
  121. }
  122. $this->dbDatas['mailContent'] = $this->MailContent->find(array("id"=>$id));
  123. $this->dbDatas['mailConfig'] = $this->MailConfig->find();
  124. $this->Message->mailFields = $this->dbDatas['mailFields'] = $this->MailField->find('all', array('conditions' => array("mail_content_id"=>$id), 'order' => 'MailField.sort'));
  125. // ページタイトルをセット
  126. $this->pageTitle = $this->dbDatas['mailContent']['MailContent']['title'];
  127. // レイアウトをセット
  128. $this->layout = $this->dbDatas['mailContent']['MailContent']['layout_template'];
  129. if(empty($this->contentId)) {
  130. $this->contentId = $this->params['pass'][0];
  131. }
  132. $this->subMenuElements = array('default');
  133. $this->Security->enabled = true;
  134. // PHP4でセキュリティコンポーネントがうまくいかなかったので利用停止
  135. // 詳細はコンポーネント設定のコメントを参照
  136. //$this->Security->requireAuth('submit');
  137. $this->Security->validatePost = false;
  138. // SSL設定
  139. if($this->dbDatas['mailContent']['MailContent']['ssl_on']) {
  140. $this->Security->blackHoleCallback = '_sslFail';
  141. $this->Security->requireSecure = am($this->Security->requireSecure, array('index', 'confirm', 'submit'));
  142. }
  143. // 複数のメールフォームに対応する為、プレフィックス付のCSVファイルに保存。
  144. // ※ nameフィールドの名称を[message]以外にする
  145. if($this->dbDatas['mailContent']['MailContent']['name'] != 'message') {
  146. $prefix = $this->dbDatas['mailContent']['MailContent']['name']."_";
  147. $this->Message = new Message(false,null,null,$prefix);
  148. $this->Message->mailFields = $this->dbDatas['mailFields'];
  149. }
  150. }
  151. /**
  152. * beforeRender
  153. *
  154. * @return void
  155. * @access public
  156. */
  157. function beforeRender() {
  158. parent::beforeRender();
  159. if($this->dbDatas['mailContent']['MailContent']['widget_area']){
  160. $this->set('widgetArea',$this->dbDatas['mailContent']['MailContent']['widget_area']);
  161. }
  162. }
  163. /**
  164. * [PUBIC] フォームを表示する
  165. *
  166. * @param mixed mail_content_id
  167. * @return void
  168. * @access public
  169. */
  170. function index($id = null) {
  171. if(!$this->dbDatas['mailContent']['MailContent']['status']) {
  172. $this->notFound();
  173. }
  174. // 初期値を取得
  175. if(!isset($this->data['Message'])) {
  176. $this->data = $this->Message->getDefaultValue();
  177. }else {
  178. $this->data['Message'] = $this->Message->sanitizeData($this->data['Message']);
  179. }
  180. $this->set('freezed',false);
  181. if($this->dbDatas['mailFields'])
  182. $this->set('mailFields',$this->dbDatas['mailFields']);
  183. $user = $this->BcAuth->user();
  184. if(!empty($user) && !Configure::read('BcRequest.agent')) {
  185. $this->set('editLink', array('admin' => true, 'prefix' => 'mail', 'controller' => 'mail_fields', 'action' => 'index', $this->dbDatas['mailContent']['MailContent']['id']));
  186. }
  187. $this->set('mailContent',$this->dbDatas['mailContent']);
  188. $this->render($this->dbDatas['mailContent']['MailContent']['form_template'].DS.'index');
  189. }
  190. /**
  191. * [MOBILE] フォームを表示する
  192. *
  193. * @param mixed mail_content_id
  194. * @return void
  195. * @access public
  196. */
  197. function mobile_index($id=null) {
  198. $this->setAction('index',$id);
  199. }
  200. /**
  201. * [SMARTPHONE] フォームを表示する
  202. *
  203. * @param mixed mail_content_id
  204. * @return void
  205. * @access public
  206. */
  207. function smartphone_index($id=null) {
  208. $this->setAction('index',$id);
  209. }
  210. /**
  211. * [PUBIC] データの確認画面を表示
  212. *
  213. * @param mixed mail_content_id
  214. * @return void
  215. * @access public
  216. */
  217. function confirm($id = null) {
  218. if(!$this->dbDatas['mailContent']['MailContent']['status']) {
  219. $this->notFound();
  220. }
  221. if(!$this->data) {
  222. $this->redirect(array('action' => 'index', $id));
  223. }else {
  224. // 入力データを整形し、モデルに引き渡す
  225. $this->data = $this->Message->create($this->Message->autoConvert($this->data));
  226. // 画像認証を行う
  227. if(Configure::read('BcRequest.agent') != 'mobile' && $this->dbDatas['mailContent']['MailContent']['auth_captcha']){
  228. $captchaResult = $this->BcCaptcha->check($this->data['Message']['auth_captcha']);
  229. if(!$captchaResult){
  230. $this->Message->invalidate('auth_captcha');
  231. } else {
  232. unset($this->data['Message']['auth_captcha']);
  233. }
  234. }
  235. // データの入力チェックを行う
  236. if($this->Message->validates()) {
  237. $this->set('freezed',true);
  238. }else {
  239. $this->set('freezed',false);
  240. $this->set('error',true);
  241. $this->Session->setFlash('【入力エラーです】<br />入力内容を確認して再度送信してください。');
  242. }
  243. $this->data['Message'] = $this->Message->sanitizeData($this->data['Message']);
  244. }
  245. if($this->dbDatas['mailFields'])
  246. $this->set('mailFields',$this->dbDatas['mailFields']);
  247. $this->set('mailContent',$this->dbDatas['mailContent']);
  248. $this->render($this->dbDatas['mailContent']['MailContent']['form_template'].DS.'confirm');
  249. }
  250. /**
  251. * [MOBILE] フォームを表示する
  252. *
  253. * @param mixed mail_content_id
  254. * @return void
  255. * @access public
  256. */
  257. function mobile_confirm($id=null) {
  258. $this->setAction('confirm',$id);
  259. }
  260. /**
  261. * [SMARTPHONE] フォームを表示する
  262. *
  263. * @param mixed mail_content_id
  264. * @return void
  265. * @access public
  266. */
  267. function smartphone_confirm($id=null) {
  268. $this->setAction('confirm',$id);
  269. }
  270. /**
  271. * [PUBIC] データ送信
  272. *
  273. * @param mixed mail_content_id
  274. * @return void
  275. * @access public
  276. */
  277. function submit($id = null) {
  278. if(!$this->dbDatas['mailContent']['MailContent']['status']) {
  279. $this->notFound();
  280. }
  281. if(!$this->data) {
  282. $this->redirect(array('action' => 'index', $id));
  283. }else {
  284. // 複数のメールフォームに対応する為、プレフィックス付のCSVファイルに保存。
  285. // ※ nameフィールドの名称を[message]以外にする
  286. if($this->dbDatas['mailContent']['MailContent']['name'] != 'message') {
  287. $prefix = $this->dbDatas['mailContent']['MailContent']['name']."_";
  288. }else {
  289. $prefix = "";
  290. }
  291. $this->Message->create($this->data);
  292. if($this->Message->save(null,false)) {
  293. // メール送信
  294. $this->_sendEmail();
  295. // ビューを一旦初期化しないと携帯の場合に送信完了ページが文字化けしてしまう
  296. ClassRegistry::removeObject('view');
  297. }else {
  298. $this->Session->setFlash('【送信エラーです】<br />送信中にエラーが発生しました。しばらくたってから再度送信お願いします。');
  299. $this->set('sendError',true);
  300. }
  301. }
  302. $this->set('mailContent',$this->dbDatas['mailContent']);
  303. $this->render($this->dbDatas['mailContent']['MailContent']['form_template'].DS.'submit');
  304. }
  305. /**
  306. * [MOBILE] 送信完了ページ
  307. *
  308. * @param mixed mail_content_id
  309. * @return void
  310. * @access public
  311. */
  312. function mobile_submit($id=null) {
  313. $this->setAction('submit',$id);
  314. }
  315. /**
  316. * [SMARTPHONE] 送信完了ページ
  317. *
  318. * @param mixed mail_content_id
  319. * @return void
  320. * @access public
  321. */
  322. function smartphone_submit($id=null) {
  323. $this->setAction('submit',$id);
  324. }
  325. /**
  326. * メール送信する
  327. *
  328. * @return void
  329. * @access protected
  330. */
  331. function _sendEmail() {
  332. $mailConfig = $this->dbDatas['mailConfig']['MailConfig'];
  333. $mailContent = $this->dbDatas['mailContent']['MailContent'];
  334. $userMail = '';
  335. // データを整形
  336. $data = $this->Message->restoreData($this->Message->convertToDb($this->data));
  337. $data['message'] = $data['Message'];
  338. $data['mailFields'] = $this->dbDatas['mailFields'];
  339. $data['mailContents'] = $this->dbDatas['mailContent']['MailContent'];
  340. $data['mailConfig'] = $this->dbDatas['mailConfig']['MailConfig'];
  341. $data['other']['date'] = date('Y/m/d H:i');
  342. $data = $this->Message->convertDatasToMail($data);
  343. // 管理者メールを取得
  344. if($mailContent['sender_1']) {
  345. $adminMail = $mailContent['sender_1'];
  346. }else {
  347. $adminMail = $this->siteConfigs['email'];
  348. }
  349. foreach($this->dbDatas['mailFields'] as $mailField) {
  350. $field = $mailField['MailField']['field_name'];
  351. if(!isset($data['Message'][$field])) {
  352. continue;
  353. }
  354. $value = $data['Message'][$field];
  355. // ユーザーメールを取得
  356. if($mailField['MailField']['type'] == 'email' && $value) {
  357. $userMail = $value;
  358. }
  359. // 件名にフィールドの値を埋め込む
  360. $mailContent['subject_user'] = str_replace('{$'.$field.'}', $value, $mailContent['subject_user']);
  361. $mailContent['subject_admin'] = str_replace('{$'.$field.'}', $value, $mailContent['subject_admin']);
  362. }
  363. // 前バージョンとの互換性の為 type が email じゃない場合にも取得できるようにしておく
  364. if(!$userMail) {
  365. if(!empty($data['Message']['email'])) {
  366. $userMail = $data['Message']['email'];
  367. }elseif(!empty($data['Message']['email_1'])) {
  368. $userMail = $data['Message']['email_1'];
  369. }
  370. }
  371. // ユーザーに送信
  372. if(!empty($userMail)) {
  373. $data['other']['mode'] = 'user';
  374. $options = array(
  375. 'fromName' => $mailContent['sender_name'],
  376. 'reply' => $adminMail,
  377. 'template' => $mailContent['mail_template'],
  378. 'from' => $adminMail
  379. );
  380. $this->sendMail($userMail, $mailContent['subject_user'], $data, $options);
  381. }
  382. // 管理者に送信
  383. if(!empty($adminMail)) {
  384. $data['other']['mode'] = 'admin';
  385. $options = array(
  386. 'fromName' => $mailContent['sender_name'],
  387. 'reply' => $userMail,
  388. 'from' => $adminMail,
  389. 'template' => $mailContent['mail_template'],
  390. 'bcc' => $mailContent['sender_2']
  391. );
  392. $this->sendMail($adminMail,$mailContent['subject_admin'], $data, $options);
  393. }
  394. }
  395. /**
  396. * 認証用のキャプチャ画像を表示する
  397. *
  398. * @return void
  399. * @access public
  400. */
  401. function captcha()
  402. {
  403. $this->BcCaptcha->render();
  404. }
  405. /**
  406. * [SMARTPHONE] 認証用のキャプチャ画像を表示する
  407. *
  408. * @return void
  409. * @access public
  410. */
  411. function smartphone_captcha()
  412. {
  413. $this->BcCaptcha->render();
  414. }
  415. }
  416. ?>