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

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

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

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 は記事が指定されたときのための変数
/**
 * 関数定義(コアから呼び出す)
 */
public function getPublicFunctions()
{
    // 標準関数以外で画面などから呼ばれる関数の定義
    $functions = array();
    $functions['get']  = ['index'];
    return $functions;
}
  • 標準関数は config\cc_role.php の CC_METHOD_AUTHORITY と CC_METHOD_REQUEST_METHOD で定義されています。
  • 標準関数にないものは、ここで定義することで、画面から呼ばれて実行可能になります。
/**
 *  権限定義
 */
public function declareRole()
{
    // 権限チェックテーブル
    $role_check_table = array();
    return $role_check_table;
}
  • 標準関数以外の関数を定義する場合は、ここで関数ごとの許可する権限を定義します。
  • このサンプルプラグインでは、標準関数以外はありませんが、指定する場合は以下のように指定します。
$role_check_table['remote'] = array('role_article');
/**
 * プラグインのバケツ取得関数
 */
private function getPluginBucket($bucket_id)
{
    // プラグインのメインデータを取得する。
    return Sample::firstOrNew(['bucket_id' => $bucket_id]);
}
  • プラグインのバケツ取得。自クラス内でのみ使用するため private 指定します。
/**
 * 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 にして、シングルトンにしているのは、処理速度を向上させるためです。
/**
 * データ初期表示関数
 * コアがページ表示の際に呼び出す関数
 *
 * @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 変数を画面に渡します。

/**
 * 記事編集画面
 *
 * @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件を取得して、編集画面に渡す。
  • 新規登録の場合は、記事は取得できずに空を渡す。
/**
 * 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 押下でのトラブルも防ぐ。

/**
 * 詳細表示
 *
 * @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,
    ]);
}
  • 指定された記事の表示処理
/**
 * 削除処理
 */
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]);
}
  • 指定された記事の削除処理
Clone this wiki locally