日付表示時の書式について

2015年9月8日 at 13:44

ページの公開日を表示するだけのブロックを作成したのですが、
getCollectionDatePublic()で指定した書式と異なる書式でページに表示されており、困っております。
書式の指定方法として誤りがあるか、他の指定方法があれば、教えて頂けないでしょうか?

view.phpは以下の通りです。(C5_EXECUTE等は割愛いたしました)


<?php $c = Page::getCurrentPage(); ?>
<p class="text-right">
<?php echo $c->getCollectionDatePublic('Y/m/d'); ?>
</p>


実際に表示される表示は添付のように"Y-m-d H:i:s"として表示されております。

添付: publicdate.png
タグ: getCollectionDatePublic

Re: 日付表示時の書式について

2015年9月8日 at 13:57
追伸です。

フォーラムへの書き込み後、本サイトに5.7用に日付書式設定用の説明ページがありました。
http://concrete5-japan.org/help/5-7/recipes/get-collection-public-date-with-custom-format/

上記にあった、「format」を使用したのですが、
<?php echo $c->getCollectionDatePublic()->format('Y/m/d'); ?>


この場合は、
Call to a member function format() on string
という例外が発生してしまうようです。

ブロックで使用する場合は使い方が違いますでしょうか?
 

Re: 日付表示時の書式について

2015年9月8日 at 14:07
連投で失礼します。
concrete5のコーディングスタイルと外れるような気がしますが、
一旦、以下の通り、PHPのdate関数で書式を指定して対処する事にしました。
が、concrete5のメソッドで綺麗にするなら、こう書いた方が綺麗という作法がございますでしょうか?

<?php
$c = Page::getCurrentPage();
$pdate = strtotime($c->getCollectionDatePublic());
?>
<p class="text-right">
<?php echo date('Y/m/d', $pdate) ?>
</p>
 

Re: 日付表示時の書式について

2015年9月8日 at 14:51
こちらで動作確認をしていませんが、
取り急ぎ。

echo $c->getCollectionDatePublic()->format('Y/m/d');


ですが、

$page->getCollectionDatePublicObject()->format('M j, Y');


と、getCollectionDatePublicObject() でないといけないところが、getCollectionDatePublic() となっているので、これが原因ではないでしょうか。

試していただけますか?
 

Re: Re: 日付表示時の書式について

2015年9月8日 at 16:57
有難うございます。

$c->getCollectionDatePublicObject()->format('Y/m/d');


で、期待通り動作いたしました!!

API仕様は
http://concrete5.org/api/source-class-Concrete.Core.Page.Page.html#1452-1455

かと思うのですが、formatメソッド見つからず・・・
引き続き、勉強させて頂きます!
 

Re: 日付表示時の書式について

2015年9月8日 at 17:09
こちらです
http://php.net/manual/ja/datetime.format.php
 

Re: 日付表示時の書式について

2015年9月8日 at 17:42
なるほど・・・

public function getCollectionDatePublic()
{
return $this->vObj->cvDatePublic;
}

public function getCollectionDatePublicObject()
{
return Core::make('date')->toDateTime($this->getCollectionDatePublic());
}


(concrete5にformatメソッドが在る訳ではなく)
getCollectionDatePublicObject()は、DateTime型のオブジェクトを戻り値とするので、
PHPののformatメソッドがそのまま使えているという事ですね。

一方で、getCollectionDatePublic()の返却値を(PHPの)date関数でフォーマットするのも、
結果が一緒という事ですね。

concrete5の汎用的なパッケージにしない限り、上記はどちらも一緒で、
パッケージにするなら、書式を指定するなら、getCollectionDatePublicObject()->format()
の方がよりベターな感じと考えればよろしいでしょうか?

実は、この辺の感覚もまだ相当不足していて、多言語(多文化?)を考慮した設計になっているconcrete5の場合、プログラム内にコーディングするべきではなく、Dateヘルパーを使った方が良いのですよね?

どういった時にconcrete5のヘルパーを使うのか
が判断できるように成りたいですね・・・
 

Re: 日付表示時の書式について

2015年9月8日 at 17:55
多言語対応で日付フォーマットを任意に設定したいのであれば、concrete5 のコアコミッターでもあるmlocatiが作っているPunicでいろいろ対応可能です(concrete5に同梱されています)
http://punic.github.io/#Calendar-class

多言語サイトでなければ、DateTimeオブジェクトで十分かと思いますし、formatメソッドに渡すフォーマット書式に t() 関数を通せば言語ごとに変更も可能ですし、まあその辺りは自由にやればいいと思います
 

Re: Re: 日付表示時の書式について

2015年9月8日 at 18:22
有難うございます。

自分の場合、(残念ながら)多言語サイトへの対応は無いですね・・・

と、いう事で、自由にやってみます!

ただ、将来、Marketplaceに出すとかしたくなった時に、変な癖がついているのも嫌なので、
色々、感性を磨かせて頂きます!