Re:

感銘高き名言は「1%のひらめきがなければ99%の努力は無駄である」(トーマス・エジソン)

タグ:MODx

NewsManagerスニペットでページ分割を行うと、一ページ表示件数未満の記事件数だとSQLエラーが起こります。

原因は、for文にて(&nrpostsで指定した)表示件数必ずループ処理をするので、空データでアップデートが行われSQLエラーが発生するためです。

データが空であればfor文を抜ける処理を加える対策で解決することにします。

というか、全件取得してるようなので…offset、limitで取得するように根本修正したいところです。



NewsManager.txtの320行目辺り

修正前:
// For all articles
for ($x = $start; $x < $stop; $x++, $rownum++) {
  if ($resource[$x]['createdby'] < 0) {


修正後:
// For all articles
for ($x = $start; $x < $stop; $x++, $rownum++) {
  if(empty($resource[$x]['id'])) { break; } // この処理を追加
  if ($resource[$x]['createdby'] < 0) {


これで、1ページ10件とかにしててまだ10件に満たない場合でも、NewsManagerスニペットのpaginateが正しく動作するよーになりますデス!

かなり初歩的なエラーなのに、いまだに直されてないってゆーのはNewsManager自体があまり使われてないってことなのかな?


今日はあとウェブユーザの場合のTinyMCE画像アップのプラグイン作成(大した物じゃない)、リンクのLink Listカスタマイズとかしてました。

特に、ウェブユーザでリンクをしようとすると「一覧から選ぶ」というtreeが無くて不便だし(リンクをコピペしなきゃなのは、分かってる人間ほど不便過ぎるし、分からない人にはお手上げだ)、表示しただけでは[~123~]となってポストした後のリンクが正しくないので、ウェブユーザの場合はリソースID(/123など)または優先してエイリアス(/aboutなど)で入るようになりましたとさ。


とにかく、エンドユーザにより易しい管理ページ提供をできるよーに奮闘中!

※当初、無意識にプラグインと書いていましたが、正しくはスニペットです

人気はあるものの、日本語ドキュメントは意外に乏しいのでちょっとでも情報になればと思い、時々書くよーにします。

特に、具体例があるのが一番良いですね。

画像とか添えられたら尚良しなんですがー、結構不精なのでたぶんテキストでメモっとく程度です。


とりあえず、NewsManagerのページナビゲーションの方法。

NewsManagerはここからダウンロード。

※リンク先は、本家>extras>News>NewsManager

解凍すると"NewsManager.txt"と"NewsEditor.txt"があるので、MODx管理画面からスニペット作成、それぞれ中身をコピペして保存で準備OK。

[!NewsManager? &folder=`2` &makefolder=`1` &postid=`3` &rowtpl=`nm.row_template` &clearcache=`1` &nrposts=`5` &paginate=`1` &prv=`nm.prv` &nxt=`nm.nxt` &alwaysshow=`1`!]

とりあえずこんな感じでパラメータを指定してスニペットを呼び出すようにします。

Documentation.html、NewsManager.txtのヘッダコメントに書かれてる通りの、それぞれのパラメータ内容なんですけど、その理解、実装までが意外と長かったりするんですよね…。

なので、以下こんな意味合いとか使い方になります。


&folderは、親(コンテナ)としてのリソースを指定します。で、コンテナとして保存してあるリソースなら良いんですが、そうじゃない場合にこれを親として子リソースをポストしてしまうと不整合?(見えなくなるなど)が起こるので(管理画面で直してやればそれは解消できる)、&makefolder=`1`(この1はTRUEの意味)として、子リソースをポスト時に&folderで指定したリソースをコンテナにする、ってことになります。

&postidは、子リソースを作成した後などどこを表示するのか、その指定です。指定がなければ、そのポストした子リソースが表示されます。

&rowtplは、NewsManagerで表示する一覧(リソース一つのタイトルやshowボタン、editボタンなどの)部分テンプレートをチャンク名で指定します(テンプレだがチャンクっていう語意の紛らわしさに慣れない…)。なお、NewsManager.txtの中に元となるテンプレが書かれているので、それを参考に作れば簡単。ここでは nm.row_template という名前で作成例。

&clearcacheは、そのまま。キャッシュをクリアします。作成や編集してるのにキャッシュされてると挙動が変になるので、まぁ必須で`1`(これもTRUEの意味)です。

&nrpostsは、(一ページに)何件表示するか、その件数です。

&paginateは、上記&nrpostsでの指定件数を超えた場合のページナビゲーションの有効(同様に`1`でTRUE)です。このパラメータを指定することにより、プレースホルダーでページリストを表示できるようになります。

[+pages+]とページリストのプレースホルダーを書くことで、"123"のようなリンクが表示されます(ここでは単に数字列に見えますが、以下の記述を参考)。&paginate=`1`を指定すればページリストも表示されるように思われがちなので、プレースホルダーを記述する点がポイントです。


ちなみに、このナビゲーションだと"123 Next >"のように数字間が無いので、パイプで区切るような修正例(NewsManager.txtの287行目辺りから)。

修正前:
for ($x = 0; $x < $totalpages; $x++) {
  $inc = $x * $nrposts;
  $display = $x + 1;
  if($inc != $start) {
    $pages .= "<a class=\"nl_page\" href='[~$currentpageid~]".$char."start=$inc'>$display</a>";
  } else {
    $pages .= "<span id=\"nl_currentpage\">$display</span>";
  }
}

修正後:
$pagesArr = array();
for ($x = 0; $x < $totalpages; $x++) {
  $inc = $x * $nrposts;
  $display = $x + 1;
  if($inc != $start) {
    $pagesArr[] = "<a class=\"nl_page\" href='[~$currentpageid~]".$char."start=$inc'>$display</a>";
  } else {
    $pagesArr[] = "<span id=\"nl_currentpage\">$display</span>";
  }
}
if(empty($pagesArr)){
  $pages = '';
} else {
  $pages = implode('|',$pagesArr);
}
unset($pagesArr);

デフォルトだとただ繋げるだけなので、配列に入れて|で分割した文字列とすることで"1|2|3 Next >"のようになります。

ま、修正前の方でもリンクの後に|だけだと、"1|2|3| Next >"となってイマイチですが、$pages .= "|"; と始めに入れておくことで"|1|2|3| Next >"となって、これはこれでアリかもしれません。

配列処理するのはクドイかもですが、おこのみで。

※上の表示例は、プレースホルダーを [+pages+] [+next+] と書いた時


&prv&nxtは、"Next >"のデフォルト表示を"次へ≫"など独自のものへ置換したい時にチャンクで指定します。例では`nm.prv`としてチャンクを作成し指定しています。

&alwaysshowは、それらprevious、nextを常に表示する指定です。例えば、まだ&nrpostsで指定した件数より少なく次のページがない場合でも"Next >"は非リンクのまま表示されます。



MODxのデモでもそのうちアップできたら良いッス。

MODxのバージョンを1.0.1Jにしようと作業したところ、MySQLが4.0.25なんてバージョンのサーバだったのでエラーが起こった。

ちなみに、バージョンアップの方法は

/assets
/install
/manager

を丸々上書きアップして、/installにアクセスしてインストールすればよい。


で問題は、アップグレードインストールでチャンク、モジュール、プラグイン、スニペットいずれかにチェックが入っているとSQLのSyntaxエラーっす。

解消方法は

/install/instprocessor.php

このソースで

SELECT (CASE COUNT(*) WHEN 0 THEN 0 ELSE `id` END) `id` FROM $dbase.`" . $table_prefix . "categories` WHERE `category` = '$category'

ってサブクエリ箇所をエスケープしてやれば正常に処理されるよーになる。

'mysql_real_escape_string(上のクエリ)'


ところで、ウェブユーザでサイトからtinyMCEで画像を挿入できないんだよなぁ。ファイルブラウザは立ち上がるんだが、画像をクリックしてもフォームに適用されない(何も起こらない)。

それに、リンクでアンカーも空。

ローカルでのアップグレードテストは問題ないし、サーバのPHPバージョンとか関係してる?でも、JavaScriptだよね、これ。

/managerのインターフェース設定でデザイン変更効かないし、やっぱり何かがおかしいんだろーな・・・。


課題山積み。


そんなんで、できれば concrete5 をプッシュしていきたい。

こっちの方がよさげジャン?

↑このページのトップヘ