カテゴリ: MODx
投稿者: terada
長ったらしい表題ですみません・・・。

つまりは、入力タイプをListBoxにして、オプション値を下記のように設定すると、
ID123のドキュメント以下のリソース一覧の中から1つのIDを設定できるようなテンプレート変数が作れますが、
これだと、未設定、つまり何も値が設定されていない状態で保存することができないので、
これを何とかしたいということです。

@SELECT `pagetitle` AS `name`,`id` FROM `[[+PREFIX]]site_content` WHERE `parent` = 123


答えは、オプション値に下記を設定します。

@EVAL return 'なし==0'.$modx->runSnippet('getResources',array('parents'=>'123','limit'=>'0','tpl'=>'@INLINE ||[[+pagetitle]]==[[+id]]'));


これで、先頭に「0」を値に持つ「なし」という項目が追加できましたので、規定値を「0」にするなどしておくと目的が達成できます。
@EVALを使うとPHPコードが実行できるので、いろいろ柔軟ですね。
カテゴリ: MODx
投稿者: terada
CORESERVERにmodxをインストールする手順をメモしておきます。

サーバープラン:CORE-MINI, CORE-A
MODX:revo ( 2.2.0-pl2-ja-p1 )

はじめに注意書きですが、6を行う前に、2,3の手順は済ませておかないと、PHPのセッションやユーザ権限の問題で、はじめからやり直しになります。他もどっちみちやっておかないとインストール画面が正常に表示されないので、はやる気持ちを我慢して全て済ましておきましょう。

1:modxのシステムファイルをサーバー上に展開
ssh username@hoge00.coreserver.jp
cd public_html
wget http://modx-revo-ja.googlecode.com/files/2.2.0-pl2-ja-p1.zip
unzip 2.2.0-pl2-ja-p1.zip
mv 2.2.0-pl2-ja-p1 modx
※ 3行目のところ、最新のmodxはこちらで確認しましょう。リストの中でインストールしたいパッケージをクリックすると個別のページにいくので、zipファイルのパスが分かります。

2:modx/core/cacheディレクトリの権限を757に設定。
3:public_htmlと同じ階層にtmpディレクトリを作成。権限を757に設定。
4:modx/setupに下記内容のphp.iniを作成
session.save_path = /virtual/username/tmp/

5:modxディレクトリにある「ht.access」に下記内容を加え、「.htaccess」にリネーム。
AddHandler application/x-httpd-phpcgi .php


6:modx/setup/ にアクセス。
7:インストーラーの手順に従ってインストール。

参考(というか手順についてはほぼそのまま使わせていただきました…):MODx RevolutionをXREA/CORESERVERにインストール
カテゴリ: MODx
投稿者: terada
modx revo用にGoogleMapsAPIを使って管理画面から簡単に緯度経度の入力ができるTVインプットを作ったので、公開します。

LatLngTV

地図上のマーカーをドラッグして任意の位置に移動すると、その場所の緯度経度がセットされます。GoogleMapsで使いやすいように、値は「緯度,軽度」のようにカンマ区切りの文字列でセットされます。また、住所やランドマーク名などを検索することができる検索機能もついています。

LatLngTV.zip[336clicks]

<インストール方法>
解凍後、以下の2つのファイルをそれぞれ指定のフォルダにアップロードするだけです。

latlng.php ↓

core/model/modx/processors/element/tv/renders/mgr/input/



latlng.tpl ↓

manager/templates/default/element/tv/renders/input/



管理画面のTVインプットのプルダウンメニューの中に「latlng」というのが追加されているはずなので選択してください。


そのうちにパッケージマネージャーからもインストールできるようにしようと思います。今、最初のデフォルトの位置がソースコードいじらないと変えられないので、管理画面からも設定できるようにしたいです。
カテゴリ: MODx
投稿者: mio
phxは、MODxのテンプレート変数などの値をとって、条件分岐をさせたり、表示非表示を切り替えができる機能です。


例えば、Contentのhtml内で使う場合は、以下のように使います。
[+phx:if=`[*templateVar*]`:is=`Red`:then=`#F00`:else=`#000`+]


この機能は、チャンク内でも使うことができるようで、
チャンクないで使う場合は、+の部分を *にします。
もちろん、Dittoを使うときに指定するチャンク内でも使えるので便利。
[*phx:if=`[+existLink+]`:is=``:then=`[+pagetitle+]`:else=`[+pagetitle+]`*]


ただ、残念なことに、phxでは elseif といった文法はなく、 then... else... としかできないため、3択以上の選択肢を選ぶのは結構面倒だったりします。

詳しくはこちら。
(英語のwiki)

Topic: PHx logic problem: if X then X else if Y then Y else Z
残念ながら、「if X then X else if Y then Y else Z」はできなさげ、という話(英語)
カテゴリ: MODx
投稿者: terada
modx revoではDittoに代わってgetResourcesというスニペットが推奨されていたのですが、やはり使い慣れてる方がいいなと思ってパッケージマネージャーで検索してみるとDittoが見つかり、なんだあるじゃんと思ってインストール&使ってみました。単純な使い方なら大丈夫だろうと思って。

・・・が、しかしすぐにつまずきました。

なんと、Dittoのテンプレート内でテンプレート変数のプレースホルダーが機能していません!そんなばかなと思って検索してみると、周知の事実みたいでした。
これは、全然使いものにならない・・・。

というわけで、やはりrevoではgetResourcesを使うしかないようです。modxインストールしたら、すぐにパッケージマネージャーで検索して入れておきましょう。

ついでに、getResources 最初の一歩!

getResourcesはDittoの機能をほぼすべて持っていて、文法も似ていますが、テンプレート内でテンプレート変数のプレースホルダーを使う際に2点注意が必要です。

1)includeTVs=`1` を指定
テンプレート変数を使うかどうかの設定の初期値0になっているので、そのままでは使えません・・・。(これは、ソースいじって設定変えちゃってもいいかもな・・・)
[[!getResources? &parents=`[[*id]]` &includeTVs=`1` &tpl=`my-tmpl`]]



2)プレースホルダーのシンタックス
テンプレート内のプレースホルダーの書き方がちょっと違います。
例えば、上の例で指定している「my-tmpl」の中身、「tvname」という名前の変数を表示させたい時はこんな感じです。
[[+tv.tvname]]


あとは、ドキュメント読めばいいですね。すっきり乗り換えましょう!

それにしても、modx revoの公式ドキュメントがしょっちゅうダウンしているのが気になります。
カテゴリ: MODx
投稿者: mio
MODx2.0 では、フレンドリーURLのデフォルトの設定が「.html」が挿入される設定になっているのですが、
.htmlを取る方法が最初すぐに分からなかったのでメモしておきます。

設定方法は、簡単で、メニューから、
システム->コンテンツタイプ 
を選択し、HTMLのファイル拡張子の部分をダブルクリックして、拡張子を変更します。
URLに .html をつけたくない場合は、ここで、「.html」を取ればOKです。

Modx フレンドリーURL設定画面

2.0になってから、右クリックできる個所や、ダブルクリックできる場所が増え、
操作方法方が分かりにくくなったように思います。
結構、慣れが必要ですね。
最近はとりあえず、画面のいろんなところを右クリックしてます。(笑)
カテゴリ: MODx
投稿者: terada
modx 2.0 revoをいじくる毎日です。
色々新しくなって、戸惑うところも多く、まとめるべきことはたくさんあるのですが、今回はすごく簡単なチップスです。

管理画面内で文章整形や画像の挿入など便利な機能を提供してくれる「TinyMCE revo版」をインストールしてみました。このエディタはiframeを使っているので、エディタ内で実際のページに表示される際と同じCSSを適用できるはずです。evoのころからやりたいなーとは思っていたのですが、ようやくチャレンジしてみました。

TinyMCEのソースコードを「css」で検索すると直ぐに該当箇所がわかり、すごく簡単でした。core/components/tinymce/tinymce.class.phpで「content_css」という変数を設定しています。

↓40行目
 $this->modx->getOption('editor_css_path')


つまり、modxの設定を読み込んでいるだけなので、modxの「システム>システム設定」を呼び出して「editor_css_path」で絞り込み検索します。

キャプチャ画像

これの値で読込先CSSが指定できます。この場合はassetsフォルダにtinymceというフォルダを作って、そこにcustom.cssを置いています。ここに実際のサイトで使うCSSを指定してあげれば、実際の見た目が再現できるはずです。


WP版で同内容を解説をされているこのサイトYUI Libraryreset.cssをこんな感じで読み込んでますが、これ1行書くだけなので簡単でいいですね。

@import url('http://yui.yahooapis.com/2.7.0/build/reset/reset-min.css');


同じライブラリでフォントをIE用に%で書く場合にpxに換算できるのもあって、以前重宝しました。こういうのは、どんどん使っていきたいですね。
カテゴリ: MODx
投稿者: terada
かなり需要の少ない情報かもしれませんが、自分の備忘録として、
UTF-8のCSVファイルをエクセルで作成してmodxのCsv2Docで読み込むまでの手順メモです。


はまりポイント
? エクセルが直接utf-8形式で保存できない。
? Csv2DocでUTF-8のファイルを読み込ませると最初の列が「フィールド名(○○)は未定義です。」といわれてしまう。



?対策で、予め先頭の列はダミーの変数名を入れて、空欄にしておく。

手順
・先頭に列を追加
・その列の最初の行のセルには「dummy」と記入
・それ以降の行は空欄のまま



エクセルから直接CSVを書き出すとUTF-8にできない(?)ので、一旦Unicodeテキスト(.txt)の形式で保存し、
あとでエディタを使って手動でCSVの形式に変換します。

手順
・各列の右側に新しい列を追加して追加したすべてのセルに「コンマ」等あとで置換しやすい文字列を記入
・Uinicodeテキスト(.txt)で保存



手動でCSVに変換して保存

手順
Xin等のエディタで、文字コードをUnicodeに指定してさきほどのファイルを開く
・「コンマ」を「,」に全置換
・その他、特に1行目の空白などを削除
・文字コードを指定して保存でCSVファイル(.csv)として保存



modxのCsv2Docで読込
ここまで準備をしていれば、Csv2Docの「CSVファイルエンコーディング」を「UTF-8」にしてやればOKのはずです。
1で作った列は赤文字で「フィールド名(dummy)は未定義です。」とエラーが出ると思いますが、無視して「登録」。


とてもスマートとはいえない対応策ですが、以上のやり方で一応登録までこぎつけました・・・。

参考:Excelで作成した中国語データベースをutf-8コードに変換する方法
カテゴリ: MODx
投稿者: terada
modx管理画面上でスニペットなどを編集する際に、デフォルトだとインデントつけられなかったり不便なので、エディタソフトにコピペして編集していました。ちょっとした修正など多いと、この手間が非常に厄介だったのですが、素晴らしいプラグインを見つけました。

EditArea

複数行選択してのインデント上げ下げができるだけでも、ありがたいのにシンタックスカラーまで付いてるなんて!
思わず紹介したくなりました。
カテゴリ: MODx
投稿者: terada
modxのスニペットDittoで、出力をフィルタリングしたい時に一番簡単なのはfilterで出力対象以外をフィルタリングで予め排除する方法があります。ただし、この方法では対象となる変数によってうまくいかないことがあります。

例えば、テンプレート変数「tv_name」の値が「hoge」のものだけ出力したいとします。
下のようにfilterを使って記述した場合、tv_nameの値が「hoge_fuge」や「fuge_hoge」など、「hoge」の付くものは全て出力されてしまいます。つまり、filterを使う限り完全一致ができないということです。

[[Ditto? &filter=`tv_name,hoge,7`]]

出力を完全一致でフィルタリングさせたいときは、下記のようにtaggingを使うとうまくいきます。

[[Ditto? &extenders=`tagging` &tagData=`tv_name` &tagDelimiter=`,` &tagMode=`onlyTags` &tags=`hoge`]]