PHPである日のNASA画像を表示する

(1/1)
NASA(アメリカ航空宇宙局)は、さまざまな情報を API を通じてネット上に無償配信している。
そこで今回は、指定日の APOD(Astronomy Picture of the Day)画像および解説を取得し、画面に表示する PHPプログラムを作ってみることにする。NASA APIs の応答は英語であるため、翻訳APIを使って訳し、また、Twitter(現・X)や Bluesky に投稿できる機能を加えた。

サンプル・プログラムの実行例

PHPである日のNASA画像を表示する

目次

サンプル・プログラムのダウンロード

圧縮ファイルの内容
getNASAimage.phpサンプル・プログラム本体。
.pahooEnvクラウドサービスを利用するためのアカウント情報などを記入する .env ファイル。
使い方は「各種クラウド連携サービス(WebAPI)の登録方法」を参照。include_path が通ったディレクトリに配置すること。
pahooInputData.phpデータ入力に関わる関数群。
使い方は「数値入力とバリデーション」「文字入力とバリデーション」などを参照。include_path が通ったディレクトリに配置すること。
pahooCalendar.php暦・潮位計算クラス pahooCalendar。
暦・潮位計算クラスの使い方は「PHPで二十四節気・七十二候一覧を作成」「PHPで月齢を計算」「PHPで日出没・月出没・月齢・潮を計算」「PHPで潮位を計算する」などを参照。include_path が通ったディレクトリに配置すること。
pahooTwitterAPI.phpTwitter APIを利用するクラス pahooTwitterAPI。
使い方は「PHPでTwitterに投稿(ツイート)する」などを参照。include_path が通ったディレクトリに配置すること。
pahooBlueskyAPI.phpBluesky APIに関わるクラス pahooBlueskyAPI。
使い方は「PHPでPHPでBlueskyに投稿する」などを参照。include_path が通ったディレクトリに配置すること。
getNASAimage.php 更新履歴
バージョン 更新日 内容
1.0.0 2026/01/18 初版
pahooInputData.php 更新履歴
バージョン 更新日 内容
2.0.1 2025/08/11 getParam() bug-fix
2.0.0 2025/08/11 pahooLoadEnv() 追加
1.9.0 2025/07/26 getParam() 引数に$trim追加
1.8.1 2025/03/15 validRegexPattern() debug
1.8.0 2024/11/12 validRegexPattern() 追加
pahooCalendar.php 更新履歴
バージョン 更新日 内容
4.6.1 2025/11/23 next_fullmoon: bug-fix
4.6.0 2025/10/08 getMidAutumnMoon() 追加
4.5.1 2025/05/31 deg2ddmm(), deg2hhmm() 不具合修正
4.5.0 2024/03/17 ヒジュラ暦メソッドを追加
4.4.1 2024/03/17 getCabinetOfficeHolidayTable() -- bug-fix
pahooTwitterAPI.php 更新履歴
バージョン 更新日 内容
5.6.1 2025/11/30 PHP8.5対応:curl_closeを使わないようにした
5.6.0 2025/08/13 .pahooEnv導入
5.5.1 2024/11/23 __construct() -- PHP8.4における応急処置
5.5.0 2024/06/21 TwitterOAuth 7.0.0 対応
5.4.0 2024/05/18 twitter.com → x.com 変更対応
pahooBlueskyAPI.php 更新履歴
バージョン 更新日 内容
2.7.1 2025/11/22 PHP8.5対応:curl_close,imagedestroyを実行しないようにした
2.7.0 2025/08/17 reductImage,uploadBlob仕様変更←画像に余計な空白が入らないようにするため
2.6.0 2025/08/14 .pahooEnv 導入
2.5.1 2025/08/10 uploadBlob() -- bug-fix
2.5.0 2025/08/02 getOGPInformation() -- og:imageがないページに対応

プログラムの流れ

PHPである日のNASA画像を表示する

準備:PHP の https対応

クラウド連携や相手先サイトのデータを読み込むのに https通信を使うため、PHPに OpenSSLモジュールが組み込まれている必要がある。関数  phpinfo  を使って、下図のように表示されればOKだ。
OpenSSL - PHP
そうでない場合は、次の手順に従ってOpenSSLを有効化し、PHPを再起動させる必要がある。

Windowsでは、"php.ini" の下記の行を有効化する。
extension=php_openssl.dll
Linuxでは --with-openssl=/usr オプションを付けて再ビルドする。→OpenSSLインストール手順

これで準備は完了だ。

準備:pahooInputData 関数群

PHPのバージョンや入力データのバリデーションなど、汎用的に使う関数群を収めたファイル "pahooInputData.php" が同梱されているが、include_path が通ったディレクトリに配置してほしい。他のプログラムでも "pahooInputData.php" を利用するが、常に最新のファイルを1つ配置すればよい。

また、各種クラウドサービスに登録したときに取得するアカウント情報、アプリケーションパスワードなどを登録した .pahooEnv ファイルから読み込む関数 pahooLoadEnv を備えている。こちらについては、「各種クラウド連携サービス(WebAPI)の登録方法」をご覧いただきたい。

準備:pahooCalendar クラス

pahooCalendar.php

  11: class pahooCalendar {
  12:     var $CONVERGE = 0.00005;            // 逐次近似計算収束判定値
  13:     var $ASTRO_REFRACT = 0.585556;      // 大気差
  14:     var $TDIFF = +9.0;          // 世界時との時差
  15:     var $error, $errmsg;        // エラーフラグ,エラーメッセージ
  16:     var $year, $month, $day;    // 西暦年月日
  17:     var $tblmoon;               // グレゴリオ暦=旧暦テーブル
  18:     var $language;              // 表示言語(jp:日本語, en:英語, en3:英語略記)
  19:     var $resolve2033;           // 旧暦2033年問題解決案 0:解決しない,1:案1,2:案2,3:対応案3  https://www.pahoo.org/e-soul/webtech/php02/php02-45-01.shtm#php_resolveLunarCalendar2033
  20:     var $pcc;                   // pahooCacheインスタンス
  21:     var $CabinetOfficeHolidayTables;    // 内閣府が公開している祝日表
  22:     const CABINETOFFICE_HOLIDAY_FILE = 'https://www8.cao.go.jp/chosei/shukujitsu/syukujitsu.csv';   // 内閣府が公開している祝日表URL
  23: 
  24: /**
  25:  * コンストラクタ
  26:  * @param   string $language 表示言語;省略時 jp
  27:  * @param   float  $tdiff    世界時との時差(省略時 +9.0;日本標準時)
  28:  * @param   object $pcc      pahooCacheインスタンス;省略時 NULL
  29:  *              インターネット経由で内閣府の国民の祝日を参照するときに指定
  30:  * @return  bool オブジェクト/FALSE:$tdiffが不正
  31: */
  32: function __construct($language='jp', $tdiff=+9.0, $pcc=NULL) {
  33:     $this->error  = FALSE;
  34:     $this->errmsg = '';
  35:     $this->year  = date('Y');
  36:     $this->month = date('n');
  37:     $this->day   = date('j');
  38:     $this->resolve2033 = 0;
  39:     $this->pcc = $pcc;
  40:     $this->CabinetOfficeHolidayTables = array();
  41: 
  42:     $this->setLanguage($language);
  43:     if ($this->setTimeDifference($tdiff) == FALSE) {
  44:         $this->error = TRUE;
  45:         $this->errmsg = 'illegal tdiff';
  46:     }
  47: }

西暦(グレゴリオ暦)計算やヒジュラ暦(イスラム暦)への変換、祝祭日、六曜、二十四節気の算出などの暦関係の計算、太陽や月の位置計算、潮位などを求めるクラス・ファイル "pahooCalendar.php" が同梱されているが、include_path が通ったディレクトリに配置してほしい。他のプログラムでも "pahooCalendar.php" を利用するが、常に最新のクラス・ファイルを1つ配置すればよい。

準備:pahooTwitterAPI クラス

pahooTwitterAPI.php

  11: // TwitterOAuth クラスをロードする.
  12: $version = explode('.', phpversion());
  13: if ($version[0>8) {
  14:     require __DIR__ . '/vendor/autoload.php';
  15: }
  16: use Abraham\TwitterOAuth\TwitterOAuth;
  17: 

Twitter API」を利用するためのクラスファイルが "pahooTwitterAPI.php" である。同梱のクラス・ファイル "pahooTwitterAPI.php" は include_path が通ったディレクトリに配置してほしい。他のプログラムでも pahooTitterAPIクラス を利用するが、常に最新のクラス・ファイルを1つ配置すればよい。

Twitter API」を利用するために、API keyAPI key secretAccess TokenAccess Token secret が必要で、入手方法は「Twitter API - WebAPIの登録方法」を参照されたい。

PHPのクラスについては「PHPでクラスを使ってテキストの読みやすさを調べる」を参照されたい。

OAuth認証 および Twitter API へのアクセスには、TwitterOAuth を利用する。導入方法は公式サイトにあるように composer を使うことを推奨している。
TwitterOAuth 8.1.0 は、2025年(令和7年)11月20日にリリースされた PHP 8.5 に対応している。

TwitterOAuth クラスをロードする。composer でインストールされたフォルダ "\vendor" を "pahooTwitterAPI.php" と同じフォルダへコピーすること。

pahooTwitterAPI.php

  37: /**
  38:  * コンストラクタ
  39:  * @param   なし
  40:  * @return  なし
  41: */
  42: function __construct() {
  43:     if (isset($_ENV['PAHOO_TWTR_CONSUMER_KEY'])) {
  44:         $this->TWTR_CONSUMER_KEY = $_ENV['PAHOO_TWTR_CONSUMER_KEY'];
  45:     }
  46:     if (isset($_ENV['PAHOO_TWTR_CONSUMER_SECRET'])) {
  47:         $this->TWTR_CONSUMER_SECRET = $_ENV['PAHOO_TWTR_CONSUMER_SECRET'];
  48:     }
  49:     if (isset($_ENV['PAHOO_TWTR_ACCESS_KEY'])) {
  50:         $this->TWTR_ACCESS_KEY = $_ENV['PAHOO_TWTR_ACCESS_KEY'];
  51:     }
  52:     if (isset($_ENV['PAHOO_TWTR_ACCESS_SECRET'])) {
  53:         $this->TWTR_ACCESS_SECRET = $_ENV['PAHOO_TWTR_ACCESS_SECRET'];
  54:     }
  55: 
  56:     // プロパティを初期化する.
  57:     $this->responses = array();
  58:     $this->webapi    = '';
  59:     $this->error     = FALSE;
  60:     $this->errmsg    = '';
  61:     $this->errcode   = 0;
  62: 
  63:     $this->connection = new TwitterOAuth($this->TWTR_CONSUMER_KEY, $this->TWTR_CONSUMER_SECRET, $this->TWTR_ACCESS_KEY, $this->TWTR_ACCESS_SECRET);
  64:     // v2使用を宣言
  65:     $this->connection->setApiVersion('2');
  66: 
  67:     // PHP8.4で暗黙的にnullableを指定することが非推奨になったため
  68:     // TwitterOAuthが対応するまでの応急処置
  69:     error_reporting(E_ALL & ~E_DEPRECATED & ~E_USER_DEPRECATED);
  70: }

TwitterOAuth クラスは pahooTwitterAPI のコンストラクタでインスタンス化しておく。

pahooTwitterAPI.php

  30:     // OAuth用パラメータ
  31:     // https://apps.twitter.com/
  32:     public $TWTR_CONSUMER_KEY    = '';      // Cunsumer key
  33:     public $TWTR_CONSUMER_SECRET = '';      // Consumer secret
  34:     public $TWTR_ACCESS_KEY      = '';      // Access Token (oauth_token)
  35:     public $TWTR_ACCESS_SECRET   = '';      // Access Token Secret (oauth_token_secret)
  36: 

TwitterAPI を利用するために、クラスファイル "pahooTwitterAPI.php" を使用する。組み込み関数  require_once  を使って読めるディレクトリに配置する。ディレクトリは、設定ファイル php.ini に記述されているオプション設定 include_path に設定しておく。

事前にプログラムを登録しておく必要があり、その方法は「Twitter API - WebAPIの登録方法」を参照されたい。入手したパラメータを、上述の変数に代入しておくこと。

準備:pahooBlueskyAPI クラス

pahooBlueskyAPI.php

  19: class pahooBlueskyAPI {
  20:     public $pds;            // PDSドメイン
  21:     public $webapi  ;       // 直前に呼び出したWebAPI URL
  22:     public $errmsg;         // エラーメッセージ
  23:     public $accessJwt;      // accessJwt
  24:     public $refreshJwt;     // refreshJwt
  25: 
  26:     const INTERNAL_ENCODING = 'UTF-8';  // 内部エンコーディング
  27:     const MAX_MESSAGE_LEN = 300;        // 投稿可能なメッセージ文字数
  28:     const URL_LEN = 23;                 // メッセージ中のURL文字数(相当)
  29:     const MAX_IMAGE_WIDTH  = 1200;      // 投稿可能な最大画像幅(ピクセル)
  30:     const MAX_IMAGE_HEIGHT = 675;       // 投稿可能な最大画像高さ(ピクセル)
  31:                                         // これより大きいときは自動縮小する
  32:     // トークンを保存するファイル名
  33:     // 秘匿性を保つことができ、かつ、PHPプログラムから読み書き可能であること
  34:     const FILENAME_TOKEN = './.token';
  35: 
  36:     // -- 以下のデータは .env ファイルに記述可能
  37:     // Bluesky API アプリパスワード
  38:     // https://bsky.app/
  39:     public $BLUESKY_HANDLE   = '';      // ハンドル名
  40:     public $BLUESKY_PASSWORD = '';      // アプリケーション・パスワード

Bluesky API」を利用するためのクラスファイルが "pahooBlueskyAPI.php" である。同梱のクラス・ファイル "pahooBlueskyAPI.php" は include_path が通ったディレクトリに配置してほしい。他のプログラムでも pahooBlueskyAPIクラス を利用するが、常に最新のクラス・ファイルを1つ配置すればよい。

Bluesky API」を利用するために、ハンドル名アプリケーション・パスワード が必要で、入手方法は「Bluesky API - WebAPIの登録方法」を参照されたい。

PHPのクラスについては「PHPでクラスを使ってテキストの読みやすさを調べる」を参照されたい。

準備:各種定数など

getNASAimage.php

  52: // 各種定数(START) ===========================================================
  53: 
  54: // 表示幅(ピクセル)
  55: define('WIDTH', 600);
  56: 
  57: // Twitter(現・X)投稿ボタン  TRUE:有効,FALSE:無効
  58: define('TWITTER', TRUE);
  59: 
  60: // Bluesky投稿ボタン  TRUE:有効,FALSE:無効
  61: define('BLUESKY', TRUE);
  62: 
  63: // 各種定数(END) =============================================================

各種定数などの内容は、プログラムのコメントに記載した通りである。「変更不可」以外の定数は自由に変更できる。

 
出力結果を Twitter(現・X) に投稿することができる。投稿機能を有効化するときは、定数 TWITTER を TRUE にする。
出力結果を Bluesky に投稿することができる。投稿機能を有効化するときは、定数 BLUESKY を TRUE にする。

Twitter(現・X) や Bluesky のボタン・アイコンについては、「HTMLとCSSでさまざまなアイコンを表示する」を参照して欲しい。

NASA APIs:APOD

NASA APIs:APOD」は、GETでパラメータを渡し、応答を JSON形式で受け取る REST API である。今回使う入力パラメータと応答結果のデータ構造を以下に示す。日付は米国東部標準時間で行うことに注意されたい。
NASA APIs:APOD
リクエストURL
https://api.nasa.gov/planetary/apod

入力パラメータ
フィールド名 要否 内  容
api_key 必須 APIキー。Generate API Key から無償入手できる。APODでは "DEMO_KEY" を指定してもよい。
date 必須 取得年月日:yyyy-mm-dd形式。米東部標準時間で本日以降の年月日は指定できない。
応答データ構造(成功時)(json) title タイトル url 画像URL date 年月日(米東部標準時間) explanation 解説 hdurl 高精細画像URL media_type コンテンツの種類 service_version バージョン
応答データ構造(失敗時)(json) code httpステータスカード msg エラー・メッセージ service_version バージョン

解説:NASA API クラス

getNASAimage.php

  80: class pahooNasaAPI {
  81:     public $webapi;         // 直前に呼び出したWebAPI URL
  82:     public $errmsg;         // エラーメッセージ
  83:     public $NASA_API_KEY;   // NASA API key
  84: 

NASA APIs へのアクセスは、ユーザー定義クラス pahooNasaAPI に分離した。
$NASA_API_KEY には、APIキーを代入するのだが、事前に Generate API Key から氏名、メールアドレスを入力することで無償で取得できる。得られたAPIキーは、環境ファイル .pahooEnv に代入してほしい。なお、今回利用する APOD については、APIキーを "DEMO_KEY" としても動作する。

解説:指定日のNASA画像を取得する

getNASAimage.php

 149: /**
 150:  * 指定日のNASA画像を取得する
 151:  * @param   string $date 取得したい年月日(yyyy-mm-dd)省略時は本日(日本時間)
 152:  * @return  array 画像データ/FALSE:クラウド連携に失敗
 153: */
 154: function APOD($date='') {
 155:     // 現在の年月日(米東部標準時)
 156:     if ($date === '') {
 157:         $dt = new DateTime('now', new DateTimeZone('America/New_York'));
 158:         $date = $dt->format('Y-m-d');
 159:     // 引数を米東部標準時に返還
 160:     } else {
 161:         $nowJST = new DateTime('now', new DateTimeZone('Asia/Tokyo'));
 162:         $date = $date . ' ' . $nowJST->format('H:i:s');
 163:         $dt = new DateTime($date, new DateTimeZone('Asia/Tokyo'));
 164:         $dt->setTimezone(new DateTimeZone('America/New_York'));
 165:         $date = $dt->format('Y-m-d');
 166:     }
 167: 
 168:     // リクエストURL
 169:     $this->webapi = "https://api.nasa.gov/planetary/apod?api_key={$this->NASA_API_KEY}&date={$date}";
 170: 
 171:     $ch = curl_init($this->webapi);
 172:     // cURLを使ったリクエスト
 173:     curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10);
 174:     curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
 175:     curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
 176:     curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); // サーバ証明書検証をスキップ
 177:     curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE); //  〃
 178: 
 179:     // レスポンス処理
 180:     $response = curl_exec($ch);
 181:     if (PHP_VERSION_ID < 80500) {
 182:         curl_close($ch);
 183:     }
 184:     $items = json_decode($response, TRUE);
 185: 
 186:     if ($response === FALSE) {
 187:         $this->seterror($this->webapi . ' にアクセスできません');
 188:         return FALSE;
 189:     } else if (isset($items['code']) && ($items['code'>300)) {
 190:         $this->seterror($items['msg']);
 191:         return FALSE;
 192:     }
 193: 
 194:     return $items;
 195: }

指定日のNASA画像を取得するユーザーメソッドが APOD である。上述の API仕様の通りに実装した。

引数は日本標準時だが、これを NASA APIs に渡す前に DateTimeZone クラスを使って米東部標準時に変換している。

翻訳処理

NASA APIs の応答は英文であるため、これを日本語に翻訳するのに、「PHPでクラウド翻訳サービスを利用する」で作ったユーザー定義クラス pahooTranslate を利用する。今回は DeepL 翻訳しか使わないので、不要なメソッドは削った。

getNASAimage.php

 201: class pahooTranslate {
 202:     public $webapi = '';    // 直前に呼び出したWebAPI URL
 203:     public $errmsg = '';    // エラーメッセージ
 204: 
 205:     // DeepL APIキー
 206:     // https://www.deepl.com/ja/docs-api から無料申込み.
 207:     // 利用しないのなら未定義のままでよい.
 208:     public $PAHOO_DEEPL_API_KEY = '';
 209: 
 210: /**
 211:  * コンストラクタ
 212:  * @param   なし
 213:  * @return  なし
 214: */
 215: function __construct() {
 216:     $this->webapi = '';
 217:     $this->errmsg = '';
 218: 
 219:     if (isset($_ENV['PAHOO_DEEPL_API_KEY'])) {
 220:         $this->PAHOO_DEEPL_API_KEY = $_ENV['PAHOO_DEEPL_API_KEY'];
 221:     }
 222: }

解説:Twitter(現・X)にポストする

getNASAimage.php

 508: /**
 509:  * Twitter(現・X)にポストする
 510:  * @param   string $imageTitle 画像タイトル
 511:  * @param   string $explanatio 解説
 512:  * @param   string $imageUrl   画像URL
 513:  * @param   string $date       日付
 514:  * @param   string $errmsg     エラーメッセージ格納用
 515:  * @return  string 応答メッセージ
 516: */
 517: function postTwitter($imageTitle, $explanation, $imageUrl, $date, &$errmsg) {
 518:     $errmsg = '';
 519:     $str = mb_substr($explanation, 0, 80. '...';
 520:     $message =<<< EOT
 521: {$imageTitle} - {$date}(EST)
 522: 
 523: {$str}
 524: 
 525: (ご参考)PHPで今日のNASA画像を求める https://www.pahoo.org/e-soul/webtech/php06/php06-59-01.shtm
 526: 
 527: EOT;
 528:     $ptw = new pahooTwitterAPI();
 529:     $res = $ptw->tweet_media($message, array($imageUrl));
 530:     if ($res === FALSE) {
 531:         $errmsg = $ptw->geterror();
 532:     } else {
 533:         $res =<<< EOT
 534: <p style="color:blue;">ツイートしました.</p>
 535: 
 536: EOT;
 537:     }
 538:     $ptw = NULL;
 539: 
 540:     return $res;
 541: }

取得したタイトル、解説を日本語に翻訳し、日付、画像とともに Twitter(現・X)にポストするユーザー関数が postTwitter である。クラス pahooTwitterAPI のメソッド tweet_media を呼び出す。

解説:Blueskyへ投稿する

getNASAimage.php

 543: /**
 544:  * Blueskyへ投稿する
 545:  * @param   string $imageTitle 画像タイトル
 546:  * @param   string $explanatio 解説
 547:  * @param   string $imageUrl   画像URL
 548:  * @param   string $date       日付
 549:  * @param   string $errmsg     エラーメッセージ格納用
 550:  * @return  string 応答メッセージ
 551: */
 552: function postBluesky($imageTitle, $explanation, $imageUrl, $date, &$errmsg) {
 553:     $errmsg = '';
 554:     $str = mb_substr($explanation, 0, 150. '...';
 555:     $message =<<< EOT
 556: {$imageTitle} - {$date}(EST)
 557: 
 558: {$str}
 559: 
 560: (ご参考)PHPで今日のNASA画像を求める https://www.pahoo.org/e-soul/webtech/php06/php06-59-01.shtm
 561: 
 562: EOT;
 563:     $rawImage = @file_get_contents($imageUrl);
 564:     $pbs = new pahooBlueskyAPI(BLUESKY_DOMAIN);
 565:     $res = $pbs->createSession();
 566:     $res = $pbs->post($message, FALSE, NULL, NULL, array($rawImage));
 567:     if ($res === FALSE) {
 568:         $errmsg = $pbs->geterror();
 569:     } else {
 570:         $res =<<< EOT
 571: <a href="{$res}">{$res}</a> に投稿しました.
 572: 
 573: EOT;
 574:     }
 575:     $pbs->deleteSession();
 576:     $pbs = NULL;
 577: 
 578:     return $res;
 579: }

取得したタイトル、解説を日本語に翻訳し、日付、画像とともに Bluesky にポストするユーザー関数が postBluesky である。クラス pahooBlueskyAPI のメソッド post を呼び出す。

解説:Twitter(現・X)にポストする

getNASAimage.php

 433: /**
 434:  * jQuery:Datepicker 用の祝日スクリプトを作成する
 435:  * @param   pahooCalendar $pc  暦計算クラス
 436:  * @param   array $startDate   開始年月日
 437:  * @param   array $finishDate  終了年月日
 438:  * @param   string $ymd  初期値;省略可能
 439:  * @return  string スクリプト
 440: */
 441: function makeJSDatepicker($pc, $startDate, $finishDate, $ymd='') {
 442:     $js =<<< EOT
 443: $(function() {
 444:   //カレンダーの範囲
 445:   const minD = new Date({$startDate[0]}, {$startDate[1]} - 1, {$startDate[2]});
 446:   const maxD = new Date({$finishDate[0]}, {$finishDate[1]} - 1, {$finishDate[2]});
 447: 
 448: var holidays = {
 449: 
 450: EOT;
 451:     $cnt = 0;
 452:     for ($year = $startDate[0]; $year <$finishDate[0]; $year++) {
 453:         for ($month = 1$month <12$month++) {
 454:             $day_of_month = $pc->getDaysInMonth($year, $month);
 455:             for ($day = 1$day <$day_of_month$day++) {
 456:                 $name = $pc->getHoliday($year, $month, $day);
 457:                 if ($name !FALSE) {
 458:                     $yyyymmdd = sprintf('%04d%02d%02d', $year, $month, $day);
 459:                     if ($cnt > 0)   $js .",\n";
 460:                     $js .<<< EOT
 461: "{$yyyymmdd}":{type:0, title:"{$name}"}
 462: EOT;
 463:                 $cnt++;
 464:                 }
 465:             }
 466:         }
 467:     }
 468: 
 469:     $js .=<<< EOT
 470: 
 471: };
 472: 
 473:     //Datepickerの設定
 474:     $(".datepicker").datepicker({
 475:         dateFormat: "yy-mm-dd",
 476:         minDate: minD,
 477:         maxDate: maxD,
 478:         beforeShowDay: function(day) {
 479:             var result;
 480:             var holiday = holidays[$.datepicker.formatDate('yymmdd', day)]
 481:             // 祝日・非営業日定義に存在するか?
 482:             if (holiday) {
 483:                 result =  [true, "date-holiday" + holiday.type, holiday.title];
 484:             } else {
 485:                 switch (day.getDay()) {
 486:                     case 0: // 日曜日か?
 487:                         result = [true, "date-sunday"];
 488:                         break;
 489:                     case 6: // 土曜日か?
 490:                         result = [true, "date-saturday"];
 491:                         break;
 492:                     default:
 493:                         result = [true, ""];
 494:                         break;
 495:                 }
 496:             }
 497:             return result;
 498:         }
 499:     });
 500:     $(".datepicker").datepicker("setDate", "{$ymd}");
 501: });
 502: 
 503: EOT;
 504: 
 505:     return $js;
 506: }

年月日入力については、「PHPで日付入力:カレンダーから選択」で紹介した jQuery UI:Datepicker を用いている。祝祭日の表示には、ユーザー定義クラス pahooCalendar を利用する。
なお。本日日付以降は入力できないようグレーアウトする。

参考サイト

(この項おわり)
header