JQueryの.load()を使ってみて complete: にはまった、という話

Query ライブラリーの中に.load()というmethodがあり、これを使うと、WEBページの一部に他のページをはめ込む、ということが簡単にできる。 たとえばmain.html というページがあり、 そこに<div id=”sections”></div> というセクションをつくっておき、 この部分にcontent1.htmlというページを差し込むためには
$(‘#sections’).load(‘content1.html’);
というjavascript 一行で済む。

これを使えば、content2.html, content3.html などというページを用意しておいて、Javascriptを使ってインターアクティブに(ページを全部ロードしなおすのではなく)ページの一部だけを差し替えることができるようになるわけだ。

これって、巷にいうAjaxだが、jQuery のAjax サポートは ajaxSetup というobjectががあって、この中で、Ajax関係の諸パラメーターを前もって設定することが可能、 で、とりあえず
$.ajaxSetup({
beforeSend: function() {
$(‘#sections’).css(‘visibility’,’hidden’);
$(‘#aContainer’).css(‘background’, ‘url(images/ajax-loader.gif) no-repeat center’);
},
complete:
$(‘#aContainer’).css(‘background’,’none’);
}
});
とやって、 ページをロードしたときに、前のページの表示を消し、バックグランドにロード中お待ちくださいのイメージをはっておき、ロードし終わったときに、これを取り除く、という 動作を付け加えた。

ところが実際に動かしてみると、ロードが完了して新しいページが表示された後でもイメージが消えない。 ブラウザの開発ツールで見ると、スタイルシート上、バックグランドイメージがそのまま残っている。つまり、complete: の部分が動いていない。

これで2時間ほどハマったわけだが、 結論からかいてしまう。
実は.load()というコマンドにはコールバック機能があり、 これを使って、ロードされた画面の初期化を行うためのjavascriptを指定していた($(‘#sections’).load(‘content1.html’,’doSomething’)) のだが、これがcomplete: に指定された処理を無効化してしまうようである。 jQueryの.load と complete: の部分のマニュアルをじっくり読んでそういう結論に達した。

というわけで、Complete: event ではなく Success:event に動作をぶら下げて解決。.load()ではなく、.get()を使うとすっきりしそうだが、詳しく調べてないのでこれでよしとする。

jQuery.ajaxSetup({
beforeSend: function() {
$(‘#sections’).css(‘visibility’,’hidden’);
$(‘#aContainer’).css(‘background’, ‘url(images/ajax-loader.gif) no-repeat center’);
},
success:
$(‘#aContainer’).css(‘background’,’none’);
}
});

$ajax を使うと、もっときめ細かいAjax操作ができるそうだが、現状ではこれで十分。

一応動いている証拠は ここに
http://shogishack.net/modx/pages/assess-the-situation/exchanging-pieces/

ModX/WayFinderで作ったメニュのa href部分をjqueryで一括加工し、それぞれのアイテムをクリックすると、Jumpではなく、.loadが呼び出されるようになっている。

ModXと jQuery を使ったAjax, なかなか相性がよさそうである。

ModXのテンプレート変数(Template Variable, or TV)のすごさが判ってきた

 

とにかく実際に試してみる、とういのが物事なんでも大事なようで、オンラインのチュートリアルでわかったようなつもりになっていても、 実際に経験してみてその効果が実感できるということがよくわかったのが、このModXのTVの使い方

その1: 新しいページを作成してそこに表示するメニューをまったく別の親からはじめようと思ったのだが、メニュー部分はテンプレートに入っている。 テンプレートに新規のものを指定することももちろん出来るわけだが、今回はメニュー用Snippetのwayfinder のstartidの指定部分を`20`という固定から menurootというTVを作って`*menuroot`という変数指定とし、default値を20とすることで、従来のページには影響を与えず、新規のページについては何もしなければデフォルトのメニューを表示、メニューの表示を違う親から始めたければTVの値を指定できるようにして解決。

その2: その新しいページの固定幅を広くしたい必要が生じた。 CSSには .wrapper { width:750px; .. というクラスで指定してあるのだが、 新しく .wrapperWide{ width:1000x;   というクラスを指定し、 テンプレート上の

<div class=”wrapper”…  という部分を <div class=”wrapper[[*narrowOrWide]]….   として narrowOrWide というTVを追加する。   narrowOrWide のデフォルト値は空白なので、 従来のページはそのまま。 新しいページのnarrowOrWideのTV値を”Wide” とすることで解決。 

システムの仕組み上そうなるのが当たり前なのだが、 ページがうまく表示されたときには感動した。

Way of wayfinder

ModXのWayfinderはナビゲーションリストを作るときに、base_urlからの相対パスを出力する。 よってテンプレートに<base>tagで [[++site_url]]指定をしてやる必要がある、これを指定せずに階層の下がったページからナビゲーションしようとすると システムはカレントパスを相対パスの前に追加するからリンク先が存在しない事態になる。

Make sure you have the following in the the <head> section of your template:
Code:

<base href=”[(site_url)]” />
without the above code in the site template, the navigation menu  wayfinder will generate will not render correct path.   This is because Wayfinder generates the path from base url. If you left <base> tag out, the system will always start from current path.
Let me describe what had happened to me.
Target document tree looks like below;
one – two
  |_    three
  |__ four
  |__ five
The wayfinder sinppet generates a list with correct hrefs and  works fine in the page one.
When navigated to page two, then the links generated for other pages are incorrect.
if you are in second level, then the path will start as http://…/one.  the wayfinder adds /one/three.  Therefore the generated path is http://…../one/one/three,  rather than http://…./one/three  etc., (“one/ “is repeated twice)
Simply adding the <base href=”[[++site_url]]”> line at the <head> section of the template solve the issue.

趣味の将棋サイトをModxを使ってぼちぼち構築

現在 officelive で動いている我がサイトを別サイトに移し、PHPとMySQLベースで 再構築しようとしているわけだが

今回 ModX revolution をインストールしたがその際間違えてEvolutionを削除し、そのためホームページがまっしろになる。

 まあいいか。まだProductionにはほど遠かったし、これからはRevoの時代!!
 
インストールはしごく簡単でやんした。
MySQLに空のテーブルを用意し、サーバーのURLやログインパスワードなどを前もって用意しておくぐらいであとは setupをURLの最後に指定してブラウズするだけで楽勝の手合い。
Revolutionは使いやすそう。 今のところ、サーバー(Godaddyエコノミープラン)との相性も良い感じ。
バックエンドのインターフェースが”楽しそう”←アブナイ
 
 
それに今頃わかったが、 ZIPファイルをサーバーホストにuploadして ホスト側のファイルマネージャーを使って解凍することができるのだった。 今までデスクトップで解凍してアップロードしていたわけで、それに比べるとかなりの時間の節約になった。

modx を学習中 Site の 移動

modx で作ってみたテストサイトを ローカルサーバーからリモートサーバーに移動してみる。

インストラクションを見ると結構面倒くさいか?

Moving Site To Another Location

肝は.htaccess でベースURLをしっかり規定しておくこと。ルートから(本当のルートからはかなり下の階層で、それもmodxがしっかりdefaultのURLとして認識してくれるわけだけれど)Modxというフォルダーを作って、そこにダンプした場合は’/’の指定を’/modx’に変えてやる必要が。

http://myhomepage.org/modx

と打ち込みたくないので、ルートのindex.phpを

<?php
header( ‘Location: http://www.myhomepage.com/modx‘ ) ;
?>

としてフォワードするようにした。

CSS の指定パスが一瞬わからなくなったが、Resource に CSS として入れてやればよい、という記事を見つけ、早速実行。 これは便利。

[Tutorial] Use CSS as MODx document (now compatible with IE)

alias をたとえば、   style.css と設定してやると テンプレートからの参照が url=”style.css” となる。 簡単、快感! しかしながら、このページをpublish するのを忘れ、マネージャでログインしているときにはCSSが参照されるのにログアウトしてサイトにアクセスすると、CSS が反映されない、という不具合?で小一時間悩んだ。 ああもったいない。