Concrete5でパッケージからDashBoard項目を追加する(singlepage)

Concrete5タイトル

Concrete5で、パッケージとともに設定画面を追加したい時があります。(ブロックの共通データ画面など)

情報が非常に少ないうえに、そのものズバリが見つけられませんでした。とりあえず成功したのでまとめてみます。

前提

まずは使用するさまざまな名称を再確認をします。(ちなみに自分の中でつけた名称ですので、Concrete5の標準的な名称がありましたらTwitterとかで教えて下さい。)

  • シングルページ:機能の操作ページ(php)
  • パッケージディレクトリ:パッケージのルートディレクトリ
  • ダッシュボード名:ダッシュボードに表示される大枠の名称(コンポーザーやワークフローなど)
  • 機能名:ダッシュボードの細かな機能(フルサイトマップ、ファイルマネージャなど)

今回は

  • パッケージ名 = test_pkg
  • ダッシュボード名 = test
  • 機能名 = setting
  • 機能表示名=テスト

として話を進めます。

ディレクトリ構成

次にディレクトリ構成です。
図で示すと以下の様な構成が基本となります。

Concrete5 シングルページの構成 (1)

Concrete5のメインディレクトリにシングルページを追加する構成と、全く同じ構成をパッケージ内に作ります。

インストール方法

パッケージインストール時にシングルページをインストールするコードです。
これはパッケージのcontroller.phpに記入します。

public function install() {
      $pkg = parent::install();

      // install single page
      Loader::model('single_page');
      $single_page = SinglePage::add('/dashboard/test/setting', $pkg);
      $single_page->update(array('cName' => 'テスト'));

SinglePage::addのパスには パッケージ名、controllers や single_pages は含めません。/dashboard/ダッシュボード名/機能名 となります。

引数のcNameは機能の表示名です。ここでは日本語をベタ打ちしていますが、なるべく t() などを使用してマルチ言語に対応するとよいでしょう。

またコードを単純化するためにエラー処理はしていません。運用時は、$single_pageが生成できなかった場合などのエラー処理は必要です。

エラー処理の一例:

if ( is_object($single_page) && $single_page->isError() !== false ){
  ・・・
}

機能のcontroller.php

機能のコントローラを書きます。書き方は concrete5で管理画面に独自ページ(シングルページ)を追加する | notnil creation weblog のページを参考に(というか丸写し)しています。(詳しい解説は上記ページヘ! <  説明も丸投げという・・・)

コントローラの名前は Dashboard[ダッシュボード名][機能名]Controller となります。必ずディレクトリ名と合わせ、キャメルケースで書きます。

<?php

  defined('C5_EXECUTE') or die("Access Denied.");

  class DashboardTestSettingController extends DashboardBaseController {

    public function view() {
      $my_setting = Config::get('my_setting');
      $this->set('my_setting', $my_setting);
    }

    public function settings_saved() {
      $this->set('message', t("Your settings saved successfully."));
      $this->view();
    }

    public function save_settings() {
      if ( $this->token->validate("save_settings") ) {
        if ( $this->isPost() ) {
          Config::save('my_setting', $this->post('my_setting'));
          $this->redirect('/dashboard/test/setting', 'settings_saved');
        }
      } else {
        $this->set('error', array($this->token->getErrorMessage()));
      }
    }

  }

機能のview.php

続いて設定画面のview.phpです。これもまた上記ページから引用させていただきます。

<?php defined('C5_EXECUTE') or die("Access Denied."); ?>
<?php
  echo Loader::helper('concrete/dashboard')->getDashboardPaneHeaderWrapper(t('Single Page Name'),
    false, false, false)
?>

<form method="post" class="form-horizontal" action="<?php echo $this->action('save_settings') ?>">

  <?php
// print access token
    echo $this->controller->token->output('save_settings')
  ?>

  <div class="ccm-pane-body">
    <fieldset>
      <legend><?php echo t('My Settings'); ?></legend>
      <div class="control-group">
        <?php echo $form->label('my_setting', t('My Setting Label'))
        ?>
        <div class="controls">
          <?php echo $form->text('my_setting', $my_setting) ?>
        </div>
      </div>
    </fieldset>
  </div>
  <div class="ccm-pane-footer">
    <?php echo $interface->submit(t('Save'), 'site-form', 'right',
        'primary')
    ?>
  </div>

</form>

<?php echo Loader::helper('concrete/dashboard')->getDashboardPaneFooterWrapper(false) ?>

インストールとテスト

ではパッケージをインストールしてみましょう。

  1. パッケージディレクトリを Concrete5 > packages に入れます。
  2. [インストール]から作ったパッケージをインストール。

管理画面に戻ると右下に追加されています!

image

機能を使う

「テスト」を開いてみましょう。

image

 

設定画面が表示されました!これで共通データの設定などが行えます。

「あああ」と打って保存してみます。

screenshot_0119

 

保存されました!

 

上記のコードではDBのconfigテーブルに保存されます。

image

WTS的まとめ

まとめれば非常にカンタンに使える機能ですが、いかんせん情報が少ないですね。(-_-;
ここまでたどり着くのに2日ぐらいかかりました。

Concrete5のユーザー層が拡大するように、これからも機能のまとめを作っていきたいと思います。

参考ページ

concrete5で管理画面に独自ページ(シングルページ)を追加する | notnil creation weblog

concrete5 :: Working with Dashboard Single Pages