Skip to content
オープンソース・ワークショップ 永原 篤 edited this page Mar 11, 2022 · 18 revisions

SamplesPlugin.php(プラグイン・プログラム)

以下、部分ごとに解説します。

ファイル一覧

関数名 or 主な処理部分 説明
namespace & use 使用クラス定義部分
class クラス定義とインスタンス変数
getPublicFunctions 関数の実行許可設定

使用クラス定義部分

namespace App\PluginsOption\User\Samples;

use Illuminate\Support\Collection;
use Illuminate\Support\Facades\Validator;

use App\Models\Common\Buckets;
use App\Models\Common\Frame;
use App\ModelsOption\User\Samples\Sample;
use App\ModelsOption\User\Samples\SamplePost;

use App\PluginsOption\User\UserPluginOptionBase;
  • namespace はディレクトリと合わせて定義
  • Illuminate\Support\Collection アクションメソッドの戻り値に使用します。
  • Illuminate\Support\Facades\Validator 入力エラー定義に使用します。
  • App\Models\Common\Buckets 共通バケツ
  • App\Models\Common\Frame フレーム
  • App\ModelsOption\User\Samples\Sample サンプルプラグインのバケツ
  • App\ModelsOption\User\Samples\SamplePost サンプルプラグインの記事
  • App\PluginsOption\User\UserPluginOptionBase オプションプラグインを開発する場合の継承元

クラス定義とインスタンス変数

class SamplesPlugin extends UserPluginOptionBase
{
    /**
     * 変更時のPOSTデータ
     */
    public $post = null;
  • クラス定義と継承指定
  • $post は記事が指定されたときのための変数

関数の実行許可設定(getPublicFunctions)

/**
 * 関数定義(コアから呼び出す)
 */
public function getPublicFunctions()
{
    // 標準関数以外で画面などから呼ばれる関数の定義
    $functions = array();
    $functions['get']  = ['index'];
    return $functions;
}
  • 標準関数は config\cc_role.php の CC_METHOD_AUTHORITY と CC_METHOD_REQUEST_METHOD で定義されています。
  • 標準関数にないものは、ここで定義することで、画面から呼ばれて実行可能になります。

関数の許可権限設定(declareRole)

/**
 *  権限定義
 */
public function declareRole()
{
    // 権限チェックテーブル
    $role_check_table = array();
    return $role_check_table;
}
  • 標準関数以外の関数を定義する場合は、ここで関数ごとの許可する権限を定義します。
  • このサンプルプラグインでは、標準関数以外はありませんが、指定する場合は以下のように指定します。
$role_check_table['remote'] = array('role_article');

プラグインのバケツ取得関数(getPluginBucket)

/**
 * プラグインのバケツ取得関数
 */
private function getPluginBucket($bucket_id)
{
    // プラグインのメインデータを取得する。
    return Sample::firstOrNew(['bucket_id' => $bucket_id]);
}
  • プラグインのバケツ取得。自クラス内でのみ使用するため private 指定します。

記事取得関数(getPost)

/**
 * POST取得関数(コアから呼び出す)
 * コアがPOSTチェックの際に呼び出す関数
 */
public function getPost($id, $action = null)
{
    if (is_null($action)) {
        // プラグイン内からの呼び出しを想定。処理を通す。
    } elseif (in_array($action, ['index', 'save', 'delete'])) {
        // コアから呼び出し。posts.update|posts.deleteの権限チェックを指定したアクションは、処理を通す。
    } else {
        // それ以外のアクションは null で返す。
        return null;
    }

    // 一度読んでいれば、そのPOSTを再利用する。
    if (!empty($this->post)) {
        return $this->post;
    }

    // 指定された記事を取得
    $this->post = SamplePost::firstOrNew(['id' => $id]);

    return $this->post;
}
  • 記事データを取得する関数。コアからも呼ばれるために、public 指定します。
  • インスタンス変数 $this->post にして、シングルトンにしているのは、処理速度を向上させるためです。

初期表示関数(index)

/**
 * データ初期表示関数
 * コアがページ表示の際に呼び出す関数
 *
 * @method_title 記事編集
 * @method_desc 記事一覧を表示します。
 * @method_detail
 */
public function index($request, $page_id, $frame_id, $post_id = null)
{
    // バケツ未設定の場合はバケツ空テンプレートを呼び出す
    if (!isset($this->frame) || !$this->frame->bucket_id) {
        // バケツ空テンプレートを呼び出す。
        return $this->view('empty_bucket');
    }

    // バケツデータ取得
    $sample = $this->getPluginBucket($this->buckets->id);

    // 記事一覧
    $posts = SamplePost::where('sample_id', $sample->id)
        ->orderBy('id', 'desc')
        ->paginate(20, ["*"], "frame_{$frame_id}_page");

    // 表示テンプレートを呼び出す。
    return $this->view('index', [
        'sample' => $sample,
        'posts' => $posts,
    ]);
}
  • index 関数は、画面が開いた際にコアが最初に呼び出す関数です。
  • バケツの存在チェック、バケツデータ、記事一覧を取得して画面に渡します。
  • 記事一覧の取得は、新しいもの順、ページング処理のために20件ずつの指定をしています。
  • 画面テンプレートは $this->view 関数で呼び出します。(Laravel 標準は view 関数。ここでは、$this->view)
  • 画面テンプレート名は index、$sample と $posts 変数を画面に渡します。

記事編集画面(edit)

/**
 * 記事編集画面
 *
 * @method_title 記事編集
 * @method_desc 記事を編集します。
 * @method_detail 記事の削除もこの画面から行います。
 */
public function edit($request, $page_id, $frame_id, $post_id = null)
{
    // 記事取得
    $post = $this->getPost($post_id);

    // 編集画面を呼び出す。
    return $this->view('edit', [
        'post' => $post,
    ]);
}
  • 記事1件を取得して、編集画面に渡す。
  • 新規登録の場合は、記事は取得できずに空を渡す。

記事のバリデータ(getPostValidator)

/**
 * POST 登録/更新のバリデーターを取得する。
 *
 * @param \Illuminate\Http\Request $request リクエスト
 * @return \Illuminate\Contracts\Validation\Validator バリデーター
 */
private function getPostValidator($request)
{
    // 項目のエラーチェック
    $validator = Validator::make($request->all(), [
        'title' => [
            'required',
            'max:255'
        ],
    ]);
    $validator->setAttributeNames([
        'title' => 'タイトル',
    ]);
    return $validator;
}
}
  • 記事登録時のエラーチェックの定義

記事の登録・更新(save)

/**
 * POST コンテンツを登録する。
 *
 * @param \Illuminate\Http\Request $request リクエスト
 * @param int $frame_id フレームID
 * @param int $bucket_id バケツID
 * @return int バケツID
 */
public function save($request, $page_id, $frame_id, $post_id = null)
{
    // 入力エラーがあった場合は入力画面に戻る。
    $validator = $this->getPostValidator($request);
    if ($validator->fails()) {
        return back()->withErrors($validator)->withInput();
    }

    // 記事の保存
    $sample = $this->getPluginBucket($this->buckets->id);
    $post = SamplePost::updateOrCreate(
        ['id' => $post_id],
        [
            'sample_id' => $sample->id,
            'title' => $request->title,
            'content' => $request->content,
        ],
    );
    // 登録後はリダイレクトして編集ページを開く。
    return new Collection(['redirect_path' => url('/') . "/plugin/samples/index/" . $page_id . "/" . $frame_id . "/" . $post->id . "#frame-" . $frame_id]);
}
  • 記事の登録処理
  • getPostValidator 関数でエラーチェックの定義を取得。エラーチェックを実行し、エラーがあれば入力画面に戻る。
  • 記事を保存する。記事は、プラグインのバケツに紐づける。
  • 登録後は、記事一覧画面をリダイレクトで表示する。これにより、登録後のF5 押下でのトラブルも防ぐ。

記事の詳細表示(show)

/**
 * 詳細表示
 *
 * @method_title 記事表示
 * @method_desc 記事を1件、表示します。
 * @method_detail 記事のURLを特定したい場合にはこの画面のURLを使用します。
 */
public function show($request, $page_id, $frame_id, $post_id)
{
    // 記事取得
    $post = $this->getPost($post_id);

    // 編集画面を呼び出す。
    return $this->view('show', [
        'post' => $post,
    ]);
}
  • 指定された記事の表示処理

記事の削除(delete)

/**
 * 削除処理
 */
public function delete($request, $page_id, $frame_id, $post_id)
{
    // データを削除
    SamplePost::where('id', $post_id)->delete();

    // 削除後はリダイレクトして一覧ページを開く。
    return new Collection(['redirect_path' => url('/') . "/plugin/samples/index/" . $page_id . "/" . $frame_id . "#frame-" . $frame_id]);
}
  • 指定された記事の削除処理

プラグインのバケツ選択表示関数(listBuckets)

/**
 * プラグインのバケツ選択表示関数
 *
 * @method_title 選択
 * @method_desc このフレームに表示する掲示板を選択します。
 * @method_detail
 */
public function listBuckets($request, $page_id, $frame_id, $id = null)
{
    // 表示テンプレートを呼び出す。
    return $this->view('list_buckets', [
        'plugin_buckets' => Sample::orderBy('created_at', 'desc')->paginate(10, ["*"], "frame_{$frame_id}_page"),
    ]);
}

データ紐づけ変更関数(changeBuckets)

/**
 * データ紐づけ変更関数
 *
 * @param \Illuminate\Http\Request $request リクエスト
 * @param int $page_id ページID
 * @param int $frame_id フレームID
 */
public function changeBuckets($request, $page_id, $frame_id)
{
    // FrameのバケツIDの更新
    Frame::where('id', $frame_id)->update(['bucket_id' => $request->select_bucket]);
}
  • バケツの選択表示画面と、フレームとバケツの紐づけの更新処理

バケツ新規作成画面(createBuckets)

/**
 * バケツ新規作成画面
 *
 * @method_title 作成
 * @method_desc 掲示板を新しく作成します。
 * @method_detail 掲示板名やいいねボタンの表示を入力して掲示板を作成できます。
 */
public function createBuckets($request, $page_id, $frame_id)
{
    // 処理的には編集画面を呼ぶ
    return $this->editBuckets($request, $page_id, $frame_id);
}

バケツ設定変更画面の表示(editBuckets)

/**
 * バケツ設定変更画面の表示
 */
public function editBuckets($request, $page_id, $frame_id)
{
    // コアがbucket_id なしで呼び出してくるため、bucket_id は frame_id から探す。
    if ($this->action == 'createBuckets') {
        $bucket_id = null;
    } else {
        $bucket_id = $this->getBucketId();
    }

    // 表示テンプレートを呼び出す。
    return $this->view('bucket', [
        // 表示中のバケツデータ
        'sample' => $this->getPluginBucket($bucket_id),
    ]);
}
  • プラグインのバケツ関係の新規作成画面、設定変更画面
  • 処理は基本的に共通のため、プラグイン名などの変更で動きます。

バケツ登録処理(saveBuckets)

/**
 *  バケツ登録処理
 */
public function saveBuckets($request, $page_id, $frame_id, $bucket_id = null)
{
    // 入力エラーがあった場合は入力画面に戻る。
    $validator = $this->getBucketValidator($request);
    if ($validator->fails()) {
        return back()->withErrors($validator)->withInput();
    }

    $bucket_id = $this->saveSample($request, $frame_id, $bucket_id);

    // 登録後はリダイレクトして編集ページを開く。
    return new Collection(['redirect_path' => url('/') . "/plugin/samples/editBuckets/" . $page_id . "/" . $frame_id . "/" . $bucket_id . "#frame-" . $frame_id]);
}
  • プラグイン・バケツの登録時エラー定義

バケツを登録する。(saveSample)

/**
 * バケツを登録する。
 *
 * @param \Illuminate\Http\Request $request リクエスト
 * @param int $frame_id フレームID
 * @param int $bucket_id バケツID
 * @return int バケツID
 */
private function saveSample($request, $frame_id, $bucket_id)
{
    // バケツの取得。なければ登録。
    $bucket = Buckets::updateOrCreate(
        ['id' => $bucket_id],
        ['bucket_name' => $request->bucket_name, 'plugin_name' => 'samples'],
    );

    // フレームにバケツの紐づけ
    $frame = Frame::find($frame_id)->update(['bucket_id' => $bucket->id]);

    // プラグインバケツを取得(なければ新規オブジェクト)
    // プラグインバケツにデータを設定して保存
    $sample = $this->getPluginBucket($bucket->id);
    $sample->bucket_name = $request->bucket_name;
    $sample->save();

    return $bucket->id;
}
  • プラグイン・バケツの登録。
  • フレームとバケツの紐づけや画面で入力された項目をバケツに設定します。

バケツ削除処理(destroyBuckets)

/**
 *  バケツ削除処理
 *
 * @param \Illuminate\Http\Request $request リクエスト
 * @param int $page_id ページID
 * @param int $frame_id フレームID
 */
public function destroyBuckets($request, $page_id, $frame_id, $sample_id)
{
    // プラグインバケツの取得
    $sample = Sample::find($sample_id);
    if (empty($sample)) {
        return;
    }

    // FrameのバケツIDのクリア
    Frame::where('id', $frame_id)->update(['bucket_id' => null]);

    // バケツ削除
    Buckets::find($sample->bucket_id)->delete();

    // コンテンツ削除
    SamplePost::where('sample_id', $sample->id)->delete();

    // プラグイン・バケツ削除
    $sample->delete();

    return;
}
  • フレームに設定されているバケツのクリア
  • 共通のバケツ、記事(コンテンツ)、プラグイン・バケツを削除

権限設定 変更画面を表示する(editBucketsRoles)

/**
 * 権限設定 変更画面を表示する
 *
 * @see UserPluginBase::editBucketsRoles()
 */
public function editBucketsRoles($request, $page_id, $frame_id, $id = null, $use_approval = false)
{
    // 承認機能は使わない
    return parent::editBucketsRoles($request, $page_id, $frame_id, $id, $use_approval);
}

権限設定を保存する(権限設定 変更画面を表示する)

/**
 * 権限設定を保存する
 *
 * @see UserPluginBase::権限設定 変更画面を表示する()
 */
public function saveBucketsRoles($request, $page_id, $frame_id, $id = null, $use_approval = false)
{
    // 承認機能は使わない
    return parent::saveBucketsRoles($request, $page_id, $frame_id, $id, $use_approval);
}
  • 権限設定を実装する場合は、上記の関数を使用する。(このサンプルでは、権限設定は行っていません)
  • 権限設定を実装する場合は、記事テーブルにも、公開フラグなどが必要です。
Clone this wiki locally