AngularJS + PHP 〜AngularJSの実装2〜

AngularJSで横スクロールメニューの実装ができましたので、今度はメニュー選択をしたら、それを画面に表示する実装を行います。

AngularJSの実装2

実現したい操作は下の通りです。

  1. 横スクロールメニューをクリックする
  2. 選択したメニューにひもづく記事一覧を取得
    3, 記事一覧の書く記事のタイトル部分をクリックすることで対象の記事を開く(window.open())

以上のような実装を行いたいと思います。

現状の問題1

横スクロールの定義がルートコントローラーにしてあるので、再度コントローラーを起動すると横スクロールメニューがクリア(初期化)されてしまう。。。

これに関しては、ルートコントローラーの呼び出しを行なっても、子供コントローラーを呼び出すように実装することで回避しました。

対象方法

横スクロールメニューをクリックすると「changeView()」を呼び出すように実装していますが、これを使用して$scopeの値を変更すると横スクロールメニューがクリアされてしまうので、直接子供の画面(<div ng-view></div>で表示する画面)のコントローラーを起動するように実装しました。
<実装>
イベント処理の通知、受信を行うように関連付けを行いました。処理を通知(親画面から子画面)

// pgbox.js: 画面上の処理(通知もと)
$scope.changeView = function (catId) {
   $scope.$broadcast('getCategoryPosts', catId);
};

からこ画面のコントローラー(siteMapCtrl.js)へイベントの通知を受け取る

/** サイトマップの表示部分コントローラー */
app.controller('siteMapCtrl',['$scope', 'SiteMapService', function($scope, SiteMapService){
    $scope.title = "Hello";
    const service = SiteMapService;
    $scope.$on('getCategoryPosts', function(event, catId, SiteMapService) {
        alert("testOn");
        service.getCategoryPosts(catId).then(function(response, status, headers, config){
          $scope.categories = response.data;
        }), function(data, status, headers, config) {
          alert(data);
        };
    });
}]);

上のコントローラー内で、$scope.$on('getCategoryPosts', function(event, catId) {のように"getCategoryPosts"イベントの通知を受け取ったときに処理が動くように定義しておきます。
こうすると、$bloadcastで通知されたイベントを受け取れます。
ちなみに、逆方向の処理を行うときは"emit()"を使用するようです。実装する機会があったら記載しますが、この実装はあまり多用しない方が良いように思います。
なぜかというと「どこからどこへ・・・」というのがソース上でしかわからないからです。あまり複雑になるようであれば、何かしらのマッピングを行わないと「意味わからねぇ!」となります。(その人にしかわからないコードは危険です。)

とりあえずは、ここまで実装しました。
現状のソースはGithubにアップロード(差分表示)してあります。

でわでわ。。。



AngularJS + PHP 〜AngularJSの実装〜

前回はWordPressとAngularJSを連携してサイトマップの作成をする計画(設計プラン)を作りましたので、今回はクライアント部分、AngularJSでの実装及び、サーバーサイドへのアクセス方法に関して記載したいと思います。

AngularJSの実装

実装したい要件は以下の通りです。

  1. 初期表示時に、サイトマップの画面を表示する(他の画面も表示できるように作成)
  2. ヘッダー部分に横スクロールメニュー(サイトマップ用)を表示する(WordPress連携部分)
  3. カテゴリ選択した時に対象カテゴリの記事一覧(タイトルと説明(できれば)と画面表示するURL)を表示する

上のような要件を満たすように実装したいと思います。

大まかなフレームワーク

「フレームワーク」と言ってもAngularJSなどのようなフレームワークではなく、「処理の概要」という意味での処理フローです。
具体的には。。。

初期表示

土台にするHTMLファイルにAngularJSの機能を埋め込みます。(土台にするHTMLはBootStrapのテーマです。)

ファイル構成はGithubにアップしてあるのでそちらを参照ください。
まずは「index.html」です。
このHTMLファイルを下のように(一部)編集してやります。

<body ng-app= "pgBoxAG" class="bg-light"  ng-controller="pgboxCtrl">

こうすることでAngularJSの下のコード部分が、モジュールとして機能するようにバインド(関連付け)されます。

/project/config.js

let app = angular.module('pgBoxAG', ['ngRoute']);

このコードは「pgBoxAG」トイウモジュールを作成します。という意味です。index.htmlには下のように、自作するJSファイルの中では下の順番で読まれるように実装しています。

    <!-- PGボックス(上から順に読み込む) -->
    <script src="./project/dataConst.js"></script>
    <script src="./project/config.js"></script>
    <script src="./project/services/service-config.js"></script>
    <script src="./project/pgbox.js"></script>
    <script src="./project/siteMapCtrl.js"></script>
< JSファイルの概要>

A.dataConst.jsには定数などの定義がしてあります。
B.config.jsには各モジュール(コントローラーとファクトリ)
C.pgbox.jsにはルートコントローラー
D.siteMapCtrl.jsにはサイトマップ用の各処理(サイトマップコントローラー)を実装しています。

WordPress連携

今夏のWordPress連携部分はヘッダー部分の横スクロールメニューの項目表示です。
大まかな処理としては下のように実装しています。

  1. pgbox.jsにあるコントローラーでSiteMapService(/project/service/(/project/service/serviceーconfig.js)を呼び出し、WordPressにある、カテゴリ一覧を取得する
  2. SitemapServiceからPHPファイルへリクエストを飛ばし返却値'(JSON)を取得して値を返却する
  3. PHPファイル(getCategories.php)でWordPressの部品を使用するための「おまじない」を使用してWordPressテンプレート(関数)を使用できるようにする。→require_once( $_SERVER['DOCUMENT_ROOT'] . '/wp/wp-load.php' );
  4. カテゴリ一覧を取得、JSONに変換してクライアント側に値を返却

というような処理を実装しました。

現段階(2020-01-05)では、横スクロールメニューからのカテゴリ毎の記事一覧が表示できない状態です(BootStrapテーマファイルがそのまま残っています。)

とりあえずは、こんな状態です。まだまだ実装は続きます。

でわでわ。。。



AngularJS + PHP 〜WordPressと連携する〜

自分のブログ用サイトマップ(記事一覧)を作成しようと思いました。

WordPress連携

AngularJSとWordPress(WP)を連携する方法としてJSONでのデータ通信を使用します。世間ではRESTFullなんて言葉を使うようですが、ちょっと調べてみるとJSONでデータ通信を行うという解釈がされていることが多いようで。。。
まぁ言葉の意味は動的なことが多いので(特にIT業界)細かいところは気にしません。
ちなみにちゃんとした意味はウィキペディアを見た方が良いと思います。早い話が、1つのアーキテクチャスタイルなんですね(笑)。つまり「通信方法」のことではないということです。

何をやるのか?

WordPress(ブログシステム(CMS))に登録されている記事(POST)を一覧する機能をAngularJSで実装します。
通常はWordPressのAPI(WordPressテンプレート)を使用してXXX.phpで作成するのがスタンダードなやり方です。
理由は、WordPressがPHPで作成されているのでPHPで一覧ページを作成した方がテクノロジー的なギャップがないためです。

AngularJSを使う

このフレームワークを使用するのはWordPressだけでなく他のテクノロジーも使用したいためです。
具体的にはGoogleMapsAPI(JavascriptAPI)があります。今後Javaサーバーなどと通信したいときにもシンプルなHTMLファイルで実装しておけば改修は難しくありません。→HTML(+JS)とJavaはセットで使用することが多いです。
余談ですが、JSFというフレームワークがあり、これはJavaでJSを生成してくれるものです。つまりはJSで実装していた部分をJavaで実装ができるものです(JS自体も使用可能です)。

AngularJSの良いところ

HTML+JSでクライアントサイドを1つのアプリケーションとして作成できるところが良いところです。
具体的にサーバー側との通信部分をAjax通信(非同期通信)で行うための部品があるので簡単に実装できます(自分でXMLHttpの実装を行わなくて良い)。
つまるところは、サーバーとの通信時はリクエスト送信とレスポンスの受信方法を統一(JSONを使用する)してやればPHPだろうが、Javaだろうが関係ないということです。

設計を行う

具体的にAngularJSでの画面実装とサーバー(WordPress)とのやりとりを実現するのにどのようにやるか?この部分を考えます。

現状としては、画面のデザイン部分に関してはテンプレートを使用するつもりです。というか下のようなイメージです。

このテンプレートを自分の表示したいようにカスタムして実装を行います。とりあえずは下のような感じでいじりました(カスタムしました)。

ポイントとしては以下の機能が欲しかったので余計な部分を削除して、必要な部分を追加しました。

  1. 横スクロール型のメニューバー
  2. 選択したメニューによりそれに対応する表示を行うView(画面)

もともとテンプレートにあった、サイドバーなどは削除しました。

AngularJSの処理

現段階での実装(プロトタイプ実装)では下のような構成で処理を行っています。コードはGithubにあります。

  1. index.htmlで以下の順序でJSを読み込む
    ⑴.「./project/dataConst.js」
    ⑵.「./project/config.js」
    ⑶.「./project/pgbox.js」
  2. 「navigator.language」でアクセスした人のロケールを取得(現状はjaで固定)
  3. angularJSモジュール「pgBoxAG」をルーティグモジュール付きで作成する。
  4. navController(空実装)を作成する
  5. PageDataFactory(共通で使用するデータを保持する)を作成する
  6. ルーティングモジュールの設定(URLと表示HTMLのバインド)
  7. サンプルで作成したParisとLondonのコントローラー作成
  8. 初期表示処理として、「$scope.pageTitle」に"Site Map"を設定
  9. #!/pgboxにリダイレクト、pgboxCtrlを起動する

という形で実装しています。

問題

  1. 現状では、画面のヘッダーメニュー部分(横スクロール型のメニュー)にアクセスすることができない(Controllerが別になっているので。。。)
  2. カテゴリの一覧を表示したいが、表示する見た目が決まっていない

大雑把にこんな問題があります。そそくさと解決できそうなのは「ヘッダーメニュー部分にアクセスできない」の部分です。
これはpageTitleが"Site Map"の時には。。。という条件を入れてやれば初期表示時以外でも「pgboxCtrl」を起動できるので、このコントローラーをハンドラーにしようかと考えております。

でわでわ。。。



WordPress テスト実装 〜heade-test.phpを表示〜

ヘッダー部分のphpをテストします。前提としては以下のようなところです。

  1. header.phpをコピーしてheader-test.phpを作成済み
  2. index.phpを以下のように修正
    get_header();get_header('test');

そしてheader-test.phpの一番下の部分を下のように修正
<div id="content" class="site-content">テストのように修正しました。
なので表示したヘッダー部分に「テスト」という文字が表示されるはずです。

なんとか表示されました。確認のためにget_headerの部分も元に戻しget_header()表示して見ます。

確認よし!

横スクロールメニュー実装


上のようなメニューを作成したいと思っています。
ここに、カテゴリのリストを表示するのが今回の目標です。

早速、BootStrapを使用するのでそれをstyle.cssにインポートします。

/*--- Add 2019-12-30 --*/
@charset 'utf-8';
@import url('https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js');
@import url('https://maxcdn.bootstrapcdn.com/bootstrap/3.4.0/js/bootstrap.min.js');

これをstyle.cssのはじめの部分(48行目)に追加しました。

フォントが少し小さくなりましたが、そんな影響しないであろうと思いそのままにしています。

さらに、横スクロールを追加して見たものの。。。
PC版での表示はよし!

スマホ版での表示はアウトー!

CSSを細々といじるのはよろしくないので、というか嫌いなので他の方法を考えます。

でわでわ。。。



MAMP WordPress 〜インポート時のエラー対処〜

WordPressを起動したら、現在実行しているWordPress(レンタルサーバー上)の状態と同じような状態にします。(記事や設定など)

MAMPのインストールとWordPressのインストールと起動確認を行ったので、PHP開発の準備を進めていこうと思います。
WordPress自体は起動できたので、

インポートの実行

記事などのインポートを行おうと思います。単純にWordPressのダッシュボードから「ツール→エクスポート」を選択して「pg.WordPress.2019-12-30.xml」というファイルをダウンロードしました。

そして、ローカル(自分のPC)で実行しているWordPressへとインポートを行おうとしたときにエラーが出ました。

エラーの文言は以下のようなものでした。

ファイルが空のようです。中身のあるファイルをアップロードしてください。このエラーは php.ini ファイルでアップロードができない設定になっているか、post_max_size が upload_max_filesize よりも小さく設定されているために発生している可能性もあります。

早い話が、「php.iniの設定が不適切です」ということなので、以下のようなところを確認します。

  1. MAMPの「Open Web Start Page」の部分をクリックします。
  2. PHPの情報を見ます。
  3. 下のような画面があるので「post_max_size 」「upload_max_filesize 」の文言で検索して値を確認します。そして、「post_max_size 」 < 「upload_max_filesize 」の状態なのでエラーが出る

早い話が、post_max_sizeのサイズがアップロードしたファイルよりも大きければ問題なし!ということです。

php.iniを編集

上のphpInfoのページを「Loaded Configuration File」で検索します。

そして、記載には「/Applications/MAMP/bin/php/php7.3.8/conf/php.ini」とあるので、編集したいファイルはここにあるということです。

そして、一度サーバーを停止して編集します。
自分はテキストエディタとしてATOMを使用しているので下のような画面になります。

間違って「108M」に編集しました。本当は「10M」に編集する必要があります。
今回は自分がダウンロードしたファイルが9M(メガ)なので上の値にしました。

サーバーを再起動

上の手順を踏んだ後に修正したものを確認します。
phpInfoを見ます、上に表示する手順を記載しています。

そして、再度インポートを行います。

今回はエラーなく行ったようです。

下のように設定してインポートしました。

エラーが出ました、これは画像ファイルのインポートに失敗ということです。
まぁ、イメージはよしとします。記事の一覧は表示できたので。。。

テスト開発の開始

これは次回やります。。。

でわでわ。。。