質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

91.34%

  • PHP

    15175questions

    PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

  • CakePHP

    1940questions

    CakePHPは、PHPで書かれたWebアプリケーション開発用のフレームワークです。 Ruby on Railsの考え方を多く取り入れており、Railsの高速性とPHPの機動性を兼ね備えています。 MVCやORMなどを「規約優先の考え方」で利用するため、コードを書く手間を省くことができます。 外部のライブラリに依存しないので、単体での利用が可能です。

Cakephp3で共通のコードをコンポーネント化?まとめたいです。

解決済

回答 1

投稿 2017/11/28 11:09 ・編集 2017/11/28 11:10

  • 評価
  • クリップ 0
  • VIEW 46

lovelydai

score 16

こんにちは、学年度によってデータを表示するページを作っています。
セレクトボックスに年度を表示し、それを選択してボタンを押すとセッションに年度価を書き込んで、その値に基づいてデータを表示するという形です。
現在は実装でき、問題なく動いてはいます。

やりたいのは、複数のページに全く同じコードが入っているので、それを何とかの形でまとめたいと思います。共通の部分が複数のコントローラーとビューにあるので修正も大変ですし、無駄という気がします。
ビューは、/template/Element/OOO.ctpという風に作り、<?= $this->element('OOO'); ?>でビューに表示させればいい、ということは分かりました。
しかし、コントローラー内の共通コードはどうすればいいしょうか?あと、共通化したコントローラー(?)とビューはどんな感じで繋げばいいですか?年度更新ボタンを押すとコントローラー名とアクション名を書かないといけませんが、よく分かりません。

方法がありましたら教えてください。
宜しくお願い致します。

以下は現在のコード一部です。

//class ArticlesController extends AppController 
//このソースコードが約15ページに重複されていますので、1つにしたいです。

public function index()
    {
        // 学年度を表示するための年度調整, ここから共通化したいです。
        $startDay = '04-01';
        $todayDate = new DateTime();
        $theDate = new DateTime($todayDate->format('Y-m-d'));
        $diff = (new DateTime($theDate->format('Y') . '-' . $startDay))->diff($theDate);
        if ( $diff->invert ) 
        {
            $curYear = intval($theDate->format('Y')) - 1;
        }
        else
        {
            $curYear = intval($theDate->format('Y'));
        }
        // 次年度を表示するための値
        $nexYear = $curYear + 1;

        // セッションに値がなかったら今年を入れる
        if($this->Session->check('Year.year'))
        {
          $year = $this->Session->read('Year.year');
        }
        else
        {
          $this->Session->write('Year.year',$curYear);
          $year = $this->Session->read('Year.year');
        }

        if($this->request->is('post'))
        {
          //  POSTで投げられた学年度をセッションに入れることで学年度更新を行う。
          $year = $this->request->data['year'];
          $this->Session->write('Year.year',$year);
          $this->Flash->success(__('学年度が変更されました。'));
        }

        $this->set('curYear', $curYear);
        $this->set('nexYear', $nexYear);  //ここまで共通化できますかね?

        //  ビューに表示するためのデータセット生成
        $subject = $this->Subject->find();

        $subject = $this->paginate($subject);

        $this->set(compact('subject'));
        $this->set('_serialize', ['subject']);
    }
    <!--他のコードは省略-->
    <!--年度選択リストの表示-->
    <div class="row">
      <div class="col-md-6" align="left">
        <?= $this->Form->create() ?>
        <?php
          $setYear = $this->request->session()->read('Year.year');
          echo $this->Form->select('year',
          [
            $curYear => $curYear,
            $nexYear => $nexYear
          ],['default' => ($setYear==$curYear)?$curYear:$nexYear, 'class'=>'form-group', 'data-width'=>'150px']);
        ?>
      </div>
      <div class="col-md-6" align="left">
        <?= $this->Form->button('学年度更新', ['type'=>'submit','controller' => '', 'action' => 'index', 'class' => 'btn btn-primary btn-sm']); ?>
      </div>
      <?= $this->Form->end() ?>
    </div>
    <!--他のコードは省略-->
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+1

CakePHP のバージョンが書かれてないのですが、3.x 系でとりあえず回答しておきます。

クックブックにあるように、
コントローラー内のコードの共通化には、Contorollers\Component\ の下にコンポーネントを作り、
使いたいコントローラーの initialize の中でloadComponentしてやればよいです。

Controllers\Component\CommonComponent.php

namespace App\Controller\Component;
use Cake\Controller\Component;

class CommonComponent extends Component {
  public function getCurYearData() {
    // ここに共通化したコードを書く
  }
}


Controllers\SampleController.php

class SampleController extends AppController {
  public function initialize() {
    parent::initialize();
    $this->loadComponent('Common');
  }

  public function index() {
    $curData = $this->Common->getCurYearData();
    ...
}

すべてのコントローラーで共通で読み込んでよいなら、AppController の initialize で読み込ませてもよいです。

投稿 2017/11/28 11:45

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/11/28 12:37

    ありがとうございました!役に立ちました。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

ただいまの回答率

91.34%

関連した質問

  • 解決済

    縦型のカレンダーを出力したい PHP

    最終的には画像のように送信ボタンを押したら、選択年月が曜日と合わせて テーブルで出力されるカレンダーを作りたいのですが、 月初の曜日を月末まで連続して出力する処理の書き方がわか

  • 解決済

    テキストファイルからデータを読み込んで表示

    ご無沙汰しております。 テキストファイルにお客様の声をまとめてそれらを配列に格納して、一行ずつ呼び出して表示したいのですが、なかなかうまくいきません。 今回使用するj

  • 解決済

    MySQLとPHPでブログのようなシステムを作っています。(WordPressを使わない)

    記事のテーブルにある番号でアカウント情報を読み込ませたい <?php function head($a){ $pdo = new PDO("mysql:dbname=dat

  • 解決済

    [PHP]POSTに失敗してしまいます

    PHP勉強中の者です。現在自動販売機作成ツールの管理画面を作成しているのですが、POSTの処理につまずいてしまっています。 ご教授頂ければ幸いです。 現在作成しているコードは以下の

  • 解決済

    クイズのプログラム作成に苦戦しています。

    PHPで回答した答えを表示するプログラムを作成しています。 望みとしてはshow_form部分で文字列を送信してnameを受けとると再度show_formを表示し GETに送信

  • 受付中

    セッションへ保存するための処理について

    [数量入力ページ]にて商品の数量を入力し、[結果ページ]へ遷移後、数量追加ボタンにて[数量入力ページ]へ戻り、 再度、数量追加を行える仕様にしたいと考えております。 また、数量

  • 解決済

    htmlのテーブルを横に並べたい

    前提・実現したいこと テーブルを横に並べたいのですが上手くいきません。 具体的にはこのような形にしたいです。 今はこんな感じです。 最初は番号と所属を同じテーブルで

  • 解決済

    1つのボタンでStartとStopの動作をさせたい

    こんにちは。 ある測定プログラムを作っておりまして HTMLのスタートボタンを押すと処理が始まり、PHPにデータを渡し 空ファイルを作成するようにして Stopボタンを押すと処理が

同じタグがついた質問を見る

  • PHP

    15175questions

    PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

  • CakePHP

    1940questions

    CakePHPは、PHPで書かれたWebアプリケーション開発用のフレームワークです。 Ruby on Railsの考え方を多く取り入れており、Railsの高速性とPHPの機動性を兼ね備えています。 MVCやORMなどを「規約優先の考え方」で利用するため、コードを書く手間を省くことができます。 外部のライブラリに依存しないので、単体での利用が可能です。