ページ: 1
いつもお世話になっています。
Nucleus Ver.3.51を使用していますが、バージョンの問題ではなさそうです。
XAMPP()を使用したローカル環境(PHP5)では、
テンプファイルで次のように設定すると
日付フォーマット:<span class="date">%Y年%m月%d日</span>
と設定したものが、 2011年01月%d日 と表示されます。
次のように'月'と'%'の間にスペースを入れると
日付フォーマット:<span class="date">%Y年%m月 %d日</span>
2011年01月 11日
のように正常に表示されます。
ロリポップサーバでは問題なく正常に動作します。
どちらもPHP5を使っています。
XAMPPローカル環境:
XAMPP Windows版 Version 1.7.1 !
Apache/2.2.11 (Win32)
MySQL : 5.0.51a
phpMyAdmin 3.1.3.1
PHP/5.2.9
を使用
XAMPPを使用したローカル環境では、NP_Carender で日にちを指定してジャンプさせるとエラーが発生します。
エラー表示は
「2011年01月method PARSER::getProperty() should not be called statically, assu'」
です。日付表示の部分にエラーが表示されます。
こちらもロリポップサーバでは問題なく正常に動作します。
php.ini httpd.conf MySQL など設定を見直したが問題ありません。
アドバイスいただけませんか。よろしくお願いいたします
オフライン
日付フォーマット:<span class="date">%Y年%m月%d日</span>
と設定したものが、 2011年01月%d日 と表示されます。次のように'月'と'%'の間にスペースを入れると
日付フォーマット:<span class="date">%Y年%m月 %d日</span>
2011年01月 11日
のように正常に表示されます。
根本的な解決方法ではないのですが、私は過去に以下の方法で対処してます。
<!-- l --><a class="postlink-local" href="http://japan.nucleuscms.org/bb/viewtopic.php?p=7267#7267">viewtopic.php?p=7267#7267</a><!-- l -->
藤咲
備忘録とかもろもろ
http://fjsk.tk/
オフライン
アイテムの本体に直接 <%date(%Y)%>年<%date(%m)%>月<%date(%d)%>日 というふうに記述してみるとどうでしょう?
オフライン
藤咲様 yama.kyms様 早速のご回答ありがとうございました。
藤咲様の 「日時: 2005.05.24 (火) 17:22 記事の件名: 思いつきました」のトピックで
<span class="date">%Y年%m月%d日</span>
と記述して正常に表示されました。
yama.kyms様のアイテムの本体に <%date(%Y)%>年<%date(%m)%>月<%date(%d)%>日 を記述して正常に表示されました。
しかし、
プラグインNP_Carenderのが画面上でマークされた日付を指定して、その日付の記事にリンクさせると
「2011年01月11日」と表示されるべきが、
「2011年01月method PARSER::getProperty() should not be called statically, assu'」
と日にちが表示される部分に「method PARSER::getProperty() should not be called statically, assu' 」
とエラーメッセージのようなメッセージが表示されます。
プラグインNP_Carender上の日にちから記事へリンクは出来るのですが、
「method PARSER::getProperty() should not be called statically, assu' 」
のこのメッセージが邪魔です。
プラグイン管理で
「カレンダーでリンクは使用しない(上記項目を上書きします):いいえ
でリンクしない設定にすると、なにもエラーメッセージは表示されません。
が、記事へのリンクも出来なくなります。
Andy様の 「日時: 2005.05.24 (火) 16:28 記事の件名: 」に掲載されている
NP_Carender.phpの内部で
function strftimeforIIS($format, $time='')
{
$sjis = mb_convert_encoding($format, 'utf-8', _CHARSET);
$result = ($time) ? strftime($format, $time) : strftime($format);
return mb_convert_encoding($result, _CHARSET, 'utf-8');
}
strftime()->strftimeforIIS()に全て変更して見ましたが結果は同じでした。
'utf-8'<-> 'sjis' 変更もして見ました。
Apacheのlocalhost下で動作のエラーです。ロリポプサーバでは、正常に動作しています。
オフライン
追伸です。
Apacheのlocalhost上で動作のエラーです。ロリポプサーバでは、正常に動作しています。
「method PARSER::getProperty() should not be called statically, assu' 」
のこのエラー表示の getProperty() は
javascriptのAPI関数ですね。
私のPCでのlocalhost環境下では、PARSER::getProperty() このAPIがうまく動作してないのでは?
1.フォーラムを検索して見ましたが、類例は見つからない。
2.レンタルサーバーでは正常に動作してる。
3.バージョンの異なる複数のNP_carenderでも同じ現象が発生する。
の3点から、 パソコンのシステムに問題がありそうです。
レンタルサーバーでは、正常に動作するし、羽詰った問題ではないので、独自に PARSER::getProperty()の関数を使った javascript プログラムを作成しパソコン上で走らせじっくり調査して見ようと思います。
他に、良い解決策がございましたらご指導お願いします。
オフライン
「method PARSER::getProperty() should not be called statically, assu' 」
のこのエラー表示の getProperty() はjavascriptのAPI関数ですね。
この判断は間違いです。PHPの文法上のエラーです。
/nucleus/libs/PARER.phpで提供されているPARSERクラスのメソッド「getProperty」はstatic宣言されていないのにも関わらず、Nucleus CMSのコアライブラリあるいはNP_Carenderプラグイン内で、PARSER::getPropertyを使っているということだと思います。
PHP5の文法上、スコープ定義演算子「::」を使ってクラスのプロパティあるいはメンバーにアクセスする場合、対象がstaticで宣言されている必要があり、そうでない場合は警告(Warning)が出るはずです。
詳細はPHPのマニュアルでオブジェクト指向プログラミングがどのように実装されているのか勉強して下さい。2週間もあれば、PHPのクラス設計やオブジェクトの扱いを理解することができるでしょう。
オフライン
Mocchi様、藤咲様、yama.kyms様 大変お忙しいところ、ご指導頂き恐縮しています。
1.2011年01月%d日 と表示される件:
テンプファイルの日付フォーマット:
<span class="date">%Y年%m月%d日</span>
を
<span class="date">% Y & # 24180 ;% m & # 26376 ; % d & # 26085 ;</span> *1
と
記述して正常に表示されました。
2.カレンダーからの日付リンクエラー表示の件:
スキンの編集 '***': 月別アーカイブページ 内の記述で
<%archivedate(ja-JP,%Y年%m月)%>
を
<%archivedate(ja-JP,">% Y & # 24180 ;% m & # 26376 %>
と
変更しましたら、カレンダーからのリンクエラー表示
「method PARSER::getProperty() should not be called statically, assu' 」
のエラーメッセージは出なくなりました。
*1 コードを表示させる方法が分かりませんので、半角スペースを空け書き込んでいます。
使用されるときは、スペースを詰めて使用してください。
詳しくは、次は藤咲様からの引用URLです。
根本的な解決方法ではないのですが、私は過去に以下の方法で対処してます。
<!-- l --><a class="postlink-local" href="http://japan.nucleuscms.org/bb/viewtopic.php?p=7267#7267">viewtopic.php?p=7267#7267</a><!-- l -->
Mocchi様 コマンド<%archivedate(ja-JP,%Y年%m月)%>の中身を調べて見たいが、Mocchi様 おっしゃる通りNucleusをはじめPHPをもっと勉強しなければなりません。
私のパソコンでエラーが出ているので、Nucleusを知る良いチャンスになるので解決したいですが、相当時間がかかると思います。
Mocchi様、藤咲様、yama.kyms様ご指導ありがとうございました。
オフライン
自己レスです。
カレンダーの日付をクリックして、
<h3><%archivedate(ja-JP,%Y年%m月)%></h3>
のコマンドにリンクしたとき
「2011年01月method PARSER::getProperty() should not be called statically, assu'」
の表示エラーの改善提案。
\lib\フォルダー内の <ACTIONS.php>ファイルのおおよそ 491行目から
/**
* %archivedate(locale,date format)%
*/
function parse_archivedate($locale = '-def-') {
global $archive;
if ($locale == '-def-')
setlocale(LC_TIME,$template['LOCALE']);
else
setlocale(LC_TIME,$locale);
// get archive date
sscanf($archive,'%d-%d-%d',$y,$m,$d);
// get format
$args = func_get_args();
// format can be spread over multiple parameters
if (sizeof($args) > 1) {
// take away locale
array_shift($args); //KisokaranoPHP p229
// implode
$format=implode(',',$args );
} elseif ($d == 0 && $m !=0) {
$format = '%B %Y';
} elseif ($m == 0) {
$format = '%Y';
} else {
$format = '%d %B %Y';
}
$format .=' '; // <--を付け加えました XXXXXXXXXXX
echo strftime($format,mktime(0,0,0,$m?$m:1,$d?$d:1,$y));
}
$format .=' '; // <--を付け加えましたらエラー表示は出なくなりました。
去年PHPを本で学んだだけで、プログラムを作成した経験がありませんでしたが、やればできるもんですね。
PHPマニュアル役に立ちました。
Mocchi様 お忙しいところ、アドバイスありがとうございました。
オフライン
浅学でよく知らないのですが、何故フォーマット末尾に空白スペースを入れると直るんでしょう?
詳しく教えてくださいませんか?
オフライン
コマンド入力で
<%archivedate(ja-JP,%Y年%m月)%> -> <%archivedate(ja-JP,'%Y年%m月')%>
と変更するとエラー表示葉出ません。
<%archivedate(ja-JP,%Y年%m月)%> -> <%archivedate(ja-JP,%Y年%m月 )%>
と変更してもエラー表示葉出ません。
以上のことから判断して、文字コードの変換かPHP関数の漢字の読み込みに問題があると判断しました。
エラー表示本は
echo strftime($format,mktime(0,0,0,$m?$m:1,$d?$d:1,$y));
の関数の$formatに日本語文字が入ると、環境によってエラー表示が出るようです。
strftime();k関数はオープンソースではないので直せません。
よって、$formatの文字列を変更するしか手立てはありませんでした。
strftime();を
http://www.php.net/manual/ja/language.oop5.php
で調べると、もともと不安定要素を含んでいるようです。
の部分を
関数内部で
$format .=' '; // <--を付け加えました XXXXXXXXXXX
と付け加えました。
別な方法として:
藤咲様のご指導のヒントから
$formatmomo文字列内部の漢字(月と日)を漢字コードに変換してから、
strftime();の関数のargumentとして渡すことが、ベターな方法かとおもいます。
実験して報告したいと思います。
Mocchi様、藤咲様、yama.kymsは、雲の上のはるか遠い存在です。
ごれからも、ご指導よろしくお願いいたします。
オフライン
http://modxcms.com/forums/index.php/top ... #msg340786
たまたま他のCMSで対応が必要な件があったので、自分は上記のようにしてみました。
「%Y年%m月」だったら
echo strftime('%Y', $timestamp);
echo '年';
echo strftime('%m', $timestamp);
echo '月';
というふうに分解して出力します。曜日もロケール設定に関係なく意図どおりに出力できます
オフライン
自己レスです。
ファイル<ACTIONS.php>の内部の
function parse_archivedate($locale = '-def-') {
........
}
関数で
echo strftime($format,mktime(0,0,0,$m?$m:1,$d?$d:1,$y));
を
$format .=' ' ;
echo strftime($format,mktime(0,0,0,$m?$m:1,$d?$d:1,$y));
あるいは
$format2 = ' ' . $format . ' ' ;
echo strftime($format2,mktime(0,0,0,$m?$m:1,$d?$d:1,$y));
と
変更して見ました。
正常に日付が表示されました。
簡単なので、これで行こうかと思いますが、いかがでしょう?
コアーファイル<ACTIONS.php>
を変更して、配布しては、いかがでしょうか。
アドバイス戴けないでしょうか?
よろしくお願いいたします。
オフライン
今回問題となっていることで私が理解している事をご説明させていただくと
1. NP_Calenderをインストールした場合、このプラグインが原因でスクリプトのどこかでPARSER::getPropertyが実行される。PARSER::getPropertyはstatic宣言されてないため、警告が出る環境がある
2. PHPにビルトインされているstrftime関数の第1引数にマルチバイト文字を含むフォーマット文字列を指定すると、意図通りに指定されない場合がある
1. に関しては、NP_Calendarがどのように処理をしているのかをソースを見ながら判断していく必要があります。私のところでNucleus CMSのコアライブラリに全文検索をかけてみたところ、PARSER::getPropertyはACTIONS.phpとBaseActions.phpとglobalfunctions.phpとSKIN.phpにおいて、IncludeModeとIncludeIncludePrefixの定義を参照するのに使われていました。
http://japan.nucleuscms.org/documentati ... properties
NP_Calendarのソースは見たことがないのでなんとも言えませんが、どこかで直接的にか間接的に、PARSERクラスを呼び出しているのでしょう。
http://japan.nucleuscms.org/wiki/plugins:calendar
2.に関して調べてみました。strftimeはlibcというサーバにインストールされている処理系を利用するようです。この処理系に対して、処理系にとって期待通りではない文字符号化方式(いわゆる「エンコード」)によって符号化された文字列を渡すことで処理系の混乱を引き起こし、結果、意図通りではない文字列が返されるということらしいです。
http://www.php.net/manual/ja/function.strftime.php
そもそも、PHPのビルトイン関数であるstrftimeは日本語のようなマルチバイト文字を正しく処理する事を期待されている関数ではないです。これは、PHPがもともとシングルバイト文字(ASCIIプラスアルファと考えて下さい)を使う文化圏で開発されたものであるという背景があります(Nucleus CMSも同様で、それをリリースチームが、ある意味「無理やり」マルチバイト対応させていました)。
そのため、strftimeに日本語文字列を含むフォーマットを指定することは、「無謀なこと」となりそうです。
keiosysさんのご提案の採用も私の方で検討しましたが、システム全体からすると対処療法的な対応となりますので、長期的に見た場合、あまり望ましくないかなと判断しました。ある種の「ハック」ですので、未来の開発者が見た場合に混乱してしまうコードとなりそうというのもあります。
以上のような事情により、今後は「<%date(%Y)%>年<%date(%m)%>月<%date(%d)%>日」のように日本語を含まないような文字列をフォーマットに指定する事を推奨したいと思います。
最後に、私はただ「sourceforgeのSVNシステムへのコードコミットに慣れているだけ」の一般ユーザです。いわゆる「中の人」をやってるつもりはありません。目的としては、Nucleus CMSプロジェクトがある程度遅滞なく続いて、(何年後になるかわからないけど)遠い未来に、ユーザにあたたかく見守られながら、その役割を終えることが出来るように関わっていけたらいいかな、といったところです。
の、割に「Site Admin」なんて仰々しい冠がついてますが、これはリリースプロジェクトと並行してこのフォーラムのメンテナンスに関しても動いているからです。いろいろ調べ物をするのに、Site Adminの権限があると便利でしたので。メンテナンスが終了したら普通のユーザに戻りたいな、と。
オフライン
日本語Windows決め打ちならこんな感じでいけそう。
if (setlocale(LC_CTYPE, 0) == 'Japanese_Japan.932'){
echo iconv('CP932', _CHARSET, strftime(iconv(_CHARSET, 'CP932', $format),mktime(0,0,0,$m?$m:1,$d?$d:1,$y)));
} else {
echo strftime($format,mktime(0,0,0,$m?$m:1,$d?$d:1,$y));
}
ネタ元
もしコアに入れるなら、関数にして3項演算でreturnがすっきりするかな。
コアに入れるかはビミョーですけど。
オフライン
Mocchi様へ
大変お忙しいところ、いつもご丁寧な、ご指導ありがとうございます。
どのように時間管理をされていらっしゃるか、不思議です。
開発ご担当の皆様、本業をこなしながらのNucleus開発、どんなに大変かと思います。
「keiosysさんのご提案の採用も私の方で検討しましたが、システム全体からすると対処療法的な対応となりますので、長期的に見た場合、あまり望ましくないかなと判断しました。」
当然です。今回デバッグをとおして見て、Mocchi様のおっしゃることは良くわかりました。
きゃしゃ様のご提示されました2例とも動作しましたが、日本語文字コードの種類が沢山あるので、どんな環境のパソコンでも動作させる為のコアー修正は、難しいことが解りました。
WEBの勉強を始めて10ヶ月ぐらいの67歳です。
WEB作成がこんなに大変とは、まったく思いませんでした。
今より、20歳若ければと思うこともしばしばです。
若いときの徹夜で、午前3~5時ぐらいの仕事の効率が、現在の昼間の状態と言ったところでしょうか。
きゃしゃ様へ
月別アーカイブページで次のコマンド
<%archivedate(ja-JP, %Y年%m月)%>
を実行時エラー表示は
<AKSTINS.php>ファイルの内部関数
function parse_archivedate($locale = '-def-') {...}
の中に使われている関数は
echo strftime($format,mktime(0,0,0,$m?$m:1,$d?$d:1,$y));
の関数の代わりに きゃしゃ様紹介の
if(setlocale(LC_CTYPE,0) == 'Japanese_Japan.932'){
echo iconv('CP932',_CHARSET,strftime(iconv(_CHARSET,'CP932',$format),mktime(0,0,0,$m?$m:1,$d?$d:1,$y) ));
} else {
echo strftime($format,mktime(0,0,0,$m?$m:1,$d?$d:1,$y));
を使ってみましたところ、正常表示されました。
さらに、ネタ元より引用させて頂いた
echo iconv('CP932', 'UTF-8', strftime(iconv('UTF-8', 'CP932', $format)));
を記入してもエラー表示は出なくなり、正常表示しました。
今回の件で、大変勉強になりました。 ますますNUcleusCMSが好きになりました。
大変お忙しいところなのに、丁寧なご回答頂き、ありがとうございました。
もう一点ですが、
テンプファイルの
日付フォーマット設定で
%Y年%m月%d日
とセットしたら
2011年01月%d日
の表示が出ます。
このコマンドのソースが見つかりません。
コアーファイルを調べたいのですが、どのファイルのどの関数を調べればよいか、教えていただけないでしょうか。
今回の件で、もっとコアーを調べたくなってしまいました。
甘えて、申し訳ないです。
オフライン
BLOG.php中でstrftimeの処理ありますね。
他に、media.php、ADMIN.php、COMMENTACTIONS.php、globalfunctions.php、ITEMACTIONS.php
/*
いえ、むしろ、67歳で、歴10ヶ月で、その貪欲さ、その吸収力、脱帽です。
徹夜の深々夜は神が舞い降りることもありますし。
*/
オフライン
きゃしゃ様
ありがとうございました。
日付フォーマット設定で
%Y年%m月%d日 とセットしたら 2011年01月%d日
と表示される問題は、
<ITEMFUNCTIONS.php>の中の384行目の
function parse_date($format = '') {
.......
formatDate()関数の本体に問題がありそうです。
......
}
<globalfunctions.php>の1711行に formatDate()関数があります。
その関数の中に 次の記述があります。
default :
return strftime($format ? $format : $defaultFormat, $timestamp);
ここが、問題のようです。
この件は、PHPをもっと学習してから、調べ直したいと思います。
Mocchi様
1. NP_Calenderをインストールした場合、このプラグインが原因でスクリプトのどこかでPARSER::getPropertyが実行される。PARSER::getPropertyはstatic宣言されてないため、警告が出る環境がある
2. PHPにビルトインされているstrftime関数の第1引数にマルチバイト文字を含むフォーマット文字列を指定すると、意図通りに指定されない場合がある
ソースの手直しで、現在は表示されていませんが、PHPをもっと学習してから、調べ直したいと思います。
皆様方に、大変お世話になりました。
オフライン
きゃしゃ様
<%archivedate(ja-JP,%Y年%m月)%><
のエラーが発生するタイミングと
<%archivedate(ja-JP,%Y年%m月)%>と 日付フォーマット設定の%Y年%m月%d日 とは同じタイミングで発生していることに気づきました。
つまり、
<%archivedate(ja-JP,%Y年%m月" ")%> と 日付フォーマット設定の%Y年%m月 %d日 のどちらも月の後に" "とスペースを入れることでエラー表示は出なくなることです。
'月'の後に' 'を入れないとstrftime()の内部で文字化けを起していると思えます。
<globalfunctions.php>の1711行に formatDate()関数があります。
その関数の中に 次の記述があります。
default :
return strftime($format ? $format : $defaultFormat, $timestamp);
このstrftime()関すも同じ現象でエラーを出していることになります。
その部分を
return strftime($format ? $format : $defaultFormat, $timestamp);
と変更しましたら正常に表示されるようになりました。
ほっとしました。
オフライン
前回の記事に誤記入がございましたので、訂正してお詫びいたします。
default :
return strftime($format ? $format : $defaultFormat, $timestamp); // <- 誤記入
このstrftime()関すも同じ現象でエラーを出していることになります。
その部分を
return iconv('CP932', _CHARSET, strftime(iconv(_CHARSET, 'CP932', $format ? $format : $defaultFormat))); // <-- このように 訂正させていただきます。
と変更しましたら正常に表示されるようになりました。
きゃしゃ様からご紹介されましたネタ元を参考に作成しました。
とうとう 一反木綿 のような記事になってしまい申し訳ございませんでした。
オフライン
問題解決となられたトピックに横から失礼します。
現在、こちらからダウンロードできるNucleus Ver.3.71を使ってサイト構築しています。
テンプレートで日付のフォーマットを「%Y年%m月%d」としている場合に、表示されるページを見ると、たまに「2017年02朁Ed日」と文字化けすることに気づきました。
「たまに」としたのは発生する時もあれば、発生しない時もあるからです。
発生した場合は、リロードすると正しい日付で表示されます。
これはどうも"/nucleus/libs/globalfunctions.php"ファイル内の2435行目が原因のようです。
if(setlocale(LC_CTYPE, 0) == 'Japanese_Japan.932')
この行を以下のようにすると文字化けしなくなるのではないかと思います。
if(setlocale(LC_CTYPE, '') == 'Japanese_Japan.932')
編集者 nshown (2017-11-25 18:47:33)
オフライン
ページ: 1