New Community Forums are coming. Watch this space for news.
Subscribe: RSS
  • CMSでPC&携帯を同時に更新できるかという打診があったので、
    とりあえず、MODxでどこまでできるか、MobileConverterを試させていただきました。

    • 使うテンプレート毎にフォルダを分ける。
    • 1階層余分にダミーフォルダを間に入れる。(*1)
    • TinyMCE等リッチエディタの機能を制限する(もしくは使わない)。
    等の制限をすれば、けっこう使えそうです。
    (soushiさん、ありがとうございます)

    ただ、一点、携帯用の画像を生成する箇所で問題が残りました。
    というのは、ドキュメント作成時に、リソースブラウザで画像をアップロードしても、
    「OnFileManagerUpload」イベントが発行されず、携帯用の画像が生成されないのです。
    (ファイルマネージャを使うと生成されますが、ユーザには開放したくないので)

    そこで、リソースブラウザでも「OnFileManagerUpload」イベントを発行できないか、
    試行錯誤して(*2)、以下のように無理やりドキュメントパーサを組み込んで改造してみました。
    とりあえず、MobileConverterは動いたのですが、
    もっと良い(他のプラグインも動かせるような)方法は無いものでしょうか?
    どこかで副作用が出てこないか?ちょっと、ドキドキものです。(*3) undecided

    改造の対象は、この↓ファイルです。
    manager/media/browser/mcpuk/connectors/php/Commands/FileUpload.php
    ※以下、行番号はMODx0.9.6.1p2の変更前のソースを基準にしています。
    (読みにくいので、インデントは削っています)

    131行目~の「if (file_exists($this->real_cwd."/$filename.$ext")) {」に対応する
    elseブロックが終わった後の、180行目に以下を挿入。
    if (reset(explode(',', $disp)) != '202') {
    	$uploaded_path = preg_replace('|\\/$|', '', $this->real_cwd);
    	include_once("../../../../../includes/document.parser.class.inc.php");
    	global $modx;
    	$modx = new DocumentParser;
    	$modx->getSettings();
    	$modx->invokeEvent("OnFileManagerUpload",
    			array(
    				"filepath"	=> $uploaded_path,
    				"filename"	=> $uploaded_name
    			));
    }
    


    164行目~の「if (is_uploaded_file($_FILES[’NewFile’][’tmp_name’])) {」に対応する
    elseブロックが終わった後の、179行目に以下を挿入。
    $uploaded_name = "$filename.$ext";


    139行目~の「if (is_uploaded_file($_FILES[’NewFile’][’tmp_name’])) {」に対応する
    elseブロックが終わった後(「$taskDone=true;」の上)の、156行目に以下を挿入。
    $uploaded_name = "$filename($i).$ext";


    (*1)MobileConverterに、親ドキュメント指定(親ドキュメントはテンプレートが切り替わらない)パラメータがあると嬉しいなぁ… grin
    (*2)リソースマネージャでは、ディレクトリパスの最後に「/」が付いていて、最初、これに気づかずハマリました。 sad
    (*3)イベント発行の条件等は考慮していません。(というか、そういう条件ってあったっけ?)

    追記)
    (元のファイルの)126行目~180行目だった箇所は、改造後、以下のようになります。
    if ((($this->fckphp_config['DiskQuota']['Global']!=-1)||($typeconfig['DiskQuota']!=-1))&&$failSizeCheck) {
    	//Disk Quota over
    	$disp="202,'Over disk quota, ".$msg."'";
    } else {
    
    	if (file_exists($this->real_cwd."/$filename.$ext")) {
    		$taskDone=false;
    		
    		//File already exists, try renaming
    		//If there are more than 200 files with
    		//	the same name giveup
    		for ($i=1;(($i<200)&&($taskDone==false));$i++) {
    			if (!file_exists($this->real_cwd."/$filename($i).$ext")) {
    				if (is_uploaded_file($_FILES['NewFile']['tmp_name'])) {
    					if 
    					(move_uploaded_file($_FILES['NewFile']['tmp_name'],($this->real_cwd."/$filename($i).$ext"))) {
    						@chmod(($this->real_cwd."/$filename($i).$ext"),$this->fckphp_config['modx']['file_permissions']); //modified for MODx
    						$disp="201,'..$filename($i).$ext'";
    					} else {
    						$disp="202,'Failed to upload file, internal error.'";
    					}
    				} else {
    					if 
    					(rename($_FILES['NewFile']['tmp_name'],($this->real_cwd."/$filename($i).$ext"))) {
    						@chmod(($this->real_cwd."/$filename($i).$ext"),$this->fckphp_config['modx']['file_permissions']); //modified for MODx
    						$disp="201,'$filename($i).$ext'";
    					} else {
    						$disp="202,'Failed to upload file, internal error.'";
    					}
    				}
    				$uploaded_name = "$filename($i).$ext";
    				$taskDone=true;	
    			}
    		}
    		if ($taskDone==false) {
    			$disp="202,'Failed to upload file, internal error..'";
    		}
    	} else {
    		//Upload file
    		if (is_uploaded_file($_FILES['NewFile']['tmp_name'])) {
    			if (move_uploaded_file($_FILES['NewFile']['tmp_name'],($this->real_cwd."/$filename.$ext"))) {
    				@chmod(($this->real_cwd."/$filename.$ext"),$this->fckphp_config['modx']['file_permissions']); //modified for MODx
    				$disp="0";
    			} else {
    				$disp="202,'Failed to upload file, internal error...'";
    			}
    		} else {
    			if (rename($_FILES['NewFile']['tmp_name'],($this->real_cwd."/$filename.$ext"))) {
    				@chmod(($this->real_cwd."/$filename.$ext"),$this->fckphp_config['modx']['file_permissions']); //modified for MODx
    				$disp="0";
    			} else {
    				$disp="202,'Failed to upload file, internal error...'";
    			}
    		}
    		$uploaded_name = "$filename.$ext";
    	}
    	if (reset(explode(',', $disp)) != '202') {
    		$uploaded_path = preg_replace('|\\/$|', '', $this->real_cwd);
    		include_once("../../../../../includes/document.parser.class.inc.php");
    		global $modx;
    		$modx = new DocumentParser;
    		$modx->getSettings();
    		$modx->invokeEvent("OnFileManagerUpload",
    				array(
    					"filepath"	=> $uploaded_path,
    					"filename"	=> $uploaded_name
    				));
    	}
    }
    


    さらに追記)
    下記のコメントの通り、コードを修正しました。
    さらに2009-03-24追記)
    「global $modx;」が抜けていたので、修正しました。

    ソースを下記にアップしました。
    http://modxcms.com/forums/index.php/topic,34199.0.html
      ★日本公式フォーラム2009年9月1日本格始動!★
      http://modxcms-jp.com/bb/

      ▼ウェブ屋のCMS→modxヒキダス流(備忘録)
      http://d.hatena.ne.jp/hikidas_ikeda/
      ▼制作済みHTMLページをmodxで更新するデモ
      http://www.hikidas.com/hikidas/modx_document/modx_demo_osc2009kansai.php
    • ファイル名重複により、ファイル名が変更された場合の判定をミスっていました。
      if (! $disp) {

      の部分を、
      if (reset(explode(',', $disp)) != '202') {

      とすれば正しく動きます。
      (コードは修正しておきます。)
        ★日本公式フォーラム2009年9月1日本格始動!★
        http://modxcms-jp.com/bb/

        ▼ウェブ屋のCMS→modxヒキダス流(備忘録)
        http://d.hatena.ne.jp/hikidas_ikeda/
        ▼制作済みHTMLページをmodxで更新するデモ
        http://www.hikidas.com/hikidas/modx_document/modx_demo_osc2009kansai.php
      • kazuikeさん、色々とありがとうございます smiley

        リソースブラウザってイベントが発生しないんですね。
        多分、kazuikeさんの方法で大丈夫だと思います。
        document.parser.class.inc.phpが読み込まれていないので、ここで読み込んでnew DocumentParserするしかないですし。。。

        リソースブラウザ内でベントを発生させるという需要はありそうなので、もう少し練った後に本家に改善要望だしてもいいかもしれません。
        (別の投稿でもアップロードした日本語ファイル名が文字化けして困ってましたが、ここのイベントの設定次第でプラグイン対応で回避できるように…なったらいいなぁ grin)

        Quote from: kazuike at Dec 02, 2008, 09:36 AM

        (*1)MobileConverterに、親ドキュメント指定(親ドキュメントはテンプレートが切り替わらない)パラメータがあると嬉しいなぁ… grin

        と、いうわけでこちら対応してみました。
        この投稿に添付しているものが対応してみたMobileConverterです。
        フォーラムの添付ファイル保存領域の容量がフルみたいでアップロードできませんでした undecided
        暫定で以下のURLにアップしています(僕のサイトです grin)。

        http://ayd.jp/MobileConverter.zip

        プラグインの中身をこれにすり替えた後、「プラグイン設定」に以下の行を加えます。

        &exceptTarget=Except target document IDs;string;
        


        ここにテンプレートと画像の変換が必要ないドキュメントを「,」区切りで入力します。
        kazuikeさんの場合は親ドキュメントを変換の対象から除外したいとの事なので、ここに親ドキュメントのIDを書けばいいと思います。

        こちらで簡単に動作確認したので多分動くと思います :’(
        問題なければバージョンあげてリリースしますっ!
        • soushiさん
          早速のご対応、ありがとうございます。

          ただ、exceptTargetを指定すると、フォルダ内のドキュメントも、テンプレートが切り替わらなくなるようなんですが、
          なんか使い方間違っているのでしょうか? huh
            ★日本公式フォーラム2009年9月1日本格始動!★
            http://modxcms-jp.com/bb/

            ▼ウェブ屋のCMS→modxヒキダス流(備忘録)
            http://d.hatena.ne.jp/hikidas_ikeda/
            ▼制作済みHTMLページをmodxで更新するデモ
            http://www.hikidas.com/hikidas/modx_document/modx_demo_osc2009kansai.php
          • soushiさん
            遅くなってすみません。

            再度確認したところ、
            exceptTargetの指定で親ドキュメントのみ切り替わらないことが確認できました。
            お騒がせしました。申し訳ないです。 embarrassed


            先日の現象はなんだったんだろう??? huh
            子ドキュメントがPC用のテンプレートで表示されたと思ったんですが、
            何か別の障害でも起こっていたのかな?
              ★日本公式フォーラム2009年9月1日本格始動!★
              http://modxcms-jp.com/bb/

              ▼ウェブ屋のCMS→modxヒキダス流(備忘録)
              http://d.hatena.ne.jp/hikidas_ikeda/
              ▼制作済みHTMLページをmodxで更新するデモ
              http://www.hikidas.com/hikidas/modx_document/modx_demo_osc2009kansai.php
            • こちらこそ連絡遅くなりすいません、soushiです。

              無事に動いたのですが、了解しました~。
              とりあえずこれでバージョン上げて再リリースします smiley

              動かなかった原因はちょっと謎ですね。
              ブラウザのキャッシュだったのかなぁ。。。 huh
              • ソース中「global $modx;」が1行抜けていましたので、元の記事の該当箇所を修正しました。
                  ★日本公式フォーラム2009年9月1日本格始動!★
                  http://modxcms-jp.com/bb/

                  ▼ウェブ屋のCMS→modxヒキダス流(備忘録)
                  http://d.hatena.ne.jp/hikidas_ikeda/
                  ▼制作済みHTMLページをmodxで更新するデモ
                  http://www.hikidas.com/hikidas/modx_document/modx_demo_osc2009kansai.php