お問い合わせモジュールとして使う anchor.png

xCCK は項目を自由に追加できるため、お問い合わせモジュールに使えるのではないかと考える方もいらっしゃるかもしれません。
実際、お問い合わせモジュールとして利用可能なのですが、それにはプリロードを使ったやや高度なカスタマイズが必要となります。

Page Top

お問い合わせモジュールとして必要な機能 anchor.png

  • お問い合わせフォームで入力項目を自由に設定できる
  • モジュールにアクセスすると入力画面を表示する
  • 権限:ゲストによる投稿が可能
  • 権限:管理者はお問い合わせの内容を閲覧できるが、管理者以外は閲覧できない
  • お問い合わせ入力後、通知のメールを管理者に、受領のメールを送信者に送る
  • お問い合わせ入力後、トップページに遷移する
  • 複数のお問い合わせフォームを設定できる
Page Top

必要な機能の実現 anchor.png

Page Top

お問い合わせフォームで入力項目を自由に設定できる anchor.png

xCCK の標準機能として可能。

Page Top

モジュールにアクセスすると入力画面を表示する anchor.png

xCCK は、モジュールトップにアクセスすると一覧画面(action=PageList)に遷移する。入力画面に遷移するには、管理画面の xCCK の「一般設定」「モジュールトップのアクション名」で「Edit」を選ぶ。

Page Top

権限:ゲストによる投稿が可能 anchor.png

xCCK は単独で使う場合、ログインユーザでないと投稿できない。
ゲストでも投稿できるようにするには、lecat(コアのextras/extra_modules 内に同梱)などのカテゴリ管理モジュールを使う。
カテゴリ管理モジュールインストール後、管理画面の xCCK の「一般設定」「アクセス管理モジュール」でカテゴリモジュールを選ぶ。
カテゴリモジュールでカテゴリを作成し、ゲストに編集権限を与える。

Page Top

権限:管理者はお問い合わせの内容を閲覧できるが、管理者以外は閲覧できない anchor.png

投稿権限同様、カテゴリモジュールでゲストに閲覧権限を与えないよう設定する。

Page Top

お問い合わせ入力後、通知のメールを管理者に、受領のメールを送信者に送る anchor.png

この制御にはプリロードを使う。XCL2.2 では、XoopsSimpleObject でデータの追加(Add)、更新(Update)、削除(Delete)を行った後にデリゲートポイントが設定されているので、これを利用する。
後述のプリロードサンプルの Contact_Notification::sendNotification() を参照。

Page Top

お問い合わせ入力後、トップページに遷移する anchor.png

xCCK は入力後、詳細表示画面(action=PageView)に遷移するようになっている。権限管理上、これは都合が悪い(ほかのユーザの入力内容をゲストでも見れてしまう)。そのため、トップページに遷移させる。
xCCK は、フォーム入力後の遷移先をデリゲートで指定できるようになっている。そのため、プリロードファイルで遷移先を指定する。
以下の「プリロードサンプル」の Contact_Notification::forward() を参照。

Page Top

複数のお問い合わせフォームを設定できる anchor.png

xCCK は複製可能なので、フォームごとに複製して対応する。

Page Top

プリロードサンプル anchor.png

{XOOPS_MODULE_PATH}/xcck/preload/Notification.class.php

<?php
if (!defined('XOOPS_ROOT_PATH')) exit();
class Contact_Notification extends XCube_ActionFilter
{
  public function preBlockFilter()
  {
    //デリゲート登録
    $this->mRoot->mDelegateManager->add('Module.contact.Event.Add.page', array(&$this, 'sendNotification'));
    $this->mRoot->mDelegateManager->add('Module.contact.Event.GetForwardUri.Success', array(&$this, 'forward'));
  }

  public function sendNotification(&$obj)
  {
    //フォーム入力内容からメール本文を作成
    $contentObj = new Contact_PostContent($obj);
    $content = $contentObj->getContents();

    //メーラの取得
    $mailer =& getMailer();

    //送信内容の設定(管理者向け)
    $mailer->setSubejct($obj->getShow('title'));
    $mailer->setBody(Legacy_Utils::renderUri($obj->getDirname(), $obj->getDataname(),$obj->get('page_id'))."\n\n".$content);
    $mailer->appendTo($toMail,$toName);
    $mailer->send($this->_getSystemConfig('adminmail'));

    //送信内容の設定(問い合わせ者向け)
    $mailer->setSubect(_MD_CONTACT_NOTIF_SENDER_POSTFIX);
    $mailer->setBody(_MD_CONTACT_NOTIF_THANKS. "\n\n". $content);
    $mailer->appendTo($obj->get('email'),'');
    $mailer->send();
  }

  //問い合わせフォーム入力後の転送先指定 
  public function forward(&$obj)
  {
    XCube_Root::getSingleton()->mController->executeRedirect(XOOPS_URL.'/', 5, _MD_CONTACT_MESSAGE_RECEIVE_SUCCESSFULLY);
  }

  protected function _getSystemConfig($key, $mid=0)
  {
    $handler = xoops_gethandler('config');
    $cri = new CriteriaCompo();
    $cri->add(new Criteria('conf_modid', $mid));
    $cri->add(new Criteria('conf_name', $key));
    $configs = $handler->getConfigs($cri);
    if(count($configs)===1){
      $conf = array_shift($configs);
    }
    else{
      exit();	//invalid case
    }
    return $conf->getConfValueForOutput();
  }
}

//問い合わせフォーム入力内容からメール本文を組み立て 
class Contact_PostContent
{
  protected $_mData = null;

  public function __construct($obj)
  {
    $obj->loadDefinition();
    $this->_mData = $obj;
  }

  public function getContents()
  {
    $content = '';
    foreach($this->_mData->mDef as $def){
      if($def->get('field_type')==Xcck_FieldType::CHECKBOX){
        $pamphletArr = $this->_mData->showField($def->get('field_name'));
        $content .= $def->getShow('label') .' : '. implode(',',$pamphletArr['checked']). "\n\n";
      }
      else{
        $content .= $def->getShow('label') .' : '. $this->_mData->get($def->get('field_name'))."\n\n";
      }
    }
    return $content;
  }
}
?>

コードはおおむねそのまま使えるが、

  • _MD_CONTACT_NOTIF_SENDER_POSTFIX などの定数は、プリロードファイル内で適宜設定する。
  • お問い合わせ者のメールアドレスは、"email" というフィールドに入力されている前提

Front page   Freeze Diff Backup Copy Rename ReloadPrint View   New Page Page list Search Recent changes   Help   RSS of recent changes (RSS 1.0) RSS of recent changes (RSS 2.0) RSS of recent changes (RSS Atom) Powered by xpWiki
Counter: 4290, today: 2, yesterday: 3
Princeps date: 2012-03-27 (Tue) 19:23:32
Last-modified: 2012-05-12 (Sat) 20:32:37 (JST) (2600d) by admin