MODX RevolutionのコンポーネントDropboxファイルソース

1つのプロジェクトを実装するには、何らかのクラウドストレージを使用する必要がありました。 一番下の行は、それぞれが特別なプログラムを使用する複数の分散した従業員がいて、その結果が個別のXMLファイルであるということです。 これらのファイルのデータは、ユーザーが利用可能な情報をダウンロードできるサイトでレポートを生成するために必要です。 問題は、従業員がローカルマシンで作業し、インターネットと対話しないことです(つまり、単一のサーバーなどを使用しません)。 そこで、Dropboxを使用することにしました。ファイルを同期するパパを各ユーザーに設定し、サイトの横でDropboxからすべてを取り出してレポートを生成します。 カットの下で、それが何をもたらしたのかを説明します。



一般的に、最初はすべてがはるかに簡単になると思っていました。かなり長い間、Dropboxとやり取りするMODXにファイルソースをインストールする既製のコンポーネントに出くわしました 、インストールすると、致命的なエラーがほんの少ししか表示されませんでした。 このコンポーネントは2012年に開発され、古いDropbox PHP SDKを使用していたか、何か汎用的なものでしたが、いずれにしてもまったく機能しませんでした。 最終的に、すべてを書き直す必要があることは明らかでした。 私はネットワーク上で特別な例を見つけませんでしたが、Dropboxはここここでかなり良いドキュメントに満足しています 。 その結果、パッケージ内のファイルソースオブジェクトをベースとして、最新バージョンのPHP SDK(現在は1.1.4)をアップロードし、サイト管理パネルからDropbox内のファイルを管理できる状態に追加しました。







これで、dropbox-2.0.0-betaパッケージの開発が完了しました。 しかし、ドロップボックスからこれらの変更を受け取る機会がまだないという考えは、休息を与えませんでした。 理解したように、最終的には何万ものドキュメントを処理する必要があり、毎回フォルダーを調べてサイト側のリビジョンを確認することはできません(ところで、一度にClientを使用するドロップボックス:getMetadataWithChildren($ path )は、2000個以下のレコードを返しますが、メソッドには25000個が指定されています)。 ドックを掘った後、 Client :: getDeltaメソッド($ cursor = null、$ pathPrefix = null)に行きました 。 既知のカーソルをそこに渡すと、開始時からの変更に関する情報を取得できるため、これがまさに必要です。 しかし、ここで少し迷惑です:最後のカーソルを取得する方法? 実際には、Dropboxアカウントが既に長い間存在している場合、多くの変更が履歴全体に蓄積され、カーソルを並べ替えるだけで、実際のアカウントに非常に長い間アクセスできます。 興味深いことに、API自体にこのためのメソッドがありますが、PHP SDKにはそのようなメソッドはありません。 さて、大丈夫、カーネルにメソッドがある場合、この情報を取得できるように 、クライアントクラスを長時間終了しないください。 これで、自分で開始点を修正し、ソートなしで変更を監視できます。 これらすべてを受け取ったとき、このデータをデータベースに保存し、特定のエンティティに特定のDropboxクライアントメソッドを転送すると便利であることが明らかになりました。 次に、何が起こったのかを使用する例をいくつか示します。



APIアプリケーションを登録します。



もちろん、何かを行う前に、Dropboxアプリケーションを登録する必要があります(もちろん、 Dropboxに登録する必要があります)。



詳細に
これを行うには、 www.dropbox.com / developers / appsのページに移動し 、[ アプリの作成 ]をクリックします (ちなみに、アプリケーションの名前はDropbox全体で一意である必要があります(パブリックアプリケーションを公開できるため、サイトのドメインまたは何かを指定する方が良いためmyAppなどの名前はビジーであり、Dropboxでは保存できません))。 作成されるアプリケーションのタイプは、2つのドロップインアプリDropbox APIアプリ です 。2つ目は作成します。





ここでは、すぐにステップ3を詳しく見ていきます。

アプリを独自のフォルダーに制限できますか?

「作成したファイルへのアクセスのみが必要」を選択すると、アプリケーションは独自のフォルダーを作成し、そこにアプリケーションがアクセスできるようになります。 このフォルダーには、アプリケーション/ [AppName]というフォルダーがあります。 つまり、アプリケーションフォルダーはすべてのアプリケーションのシステムフォルダーであり、アプリケーションごとに独自のフォルダーが作成されます。

「私のアプリは既にDropboxにあるファイルにアクセスする必要があります」を選択すると、アプリケーションはルートフォルダーにアクセスし、利用可能なファイルのリストは選択したファイルタイプのみに制限されます。 つまり、このアイテムを選択する 、新しいステップが表示されますアプリはどのタイプのファイルにアクセスする必要がありますか? ここで、「すべてのファイルタイプ」(つまり、すべてのファイル)または「特定のファイルタイプ」を選択して、使用可能なファイルタイプを指定できます。





[アプリの作成]をクリックすると、アプリケーションが作成され、アプリケーション設定ページが開きます。 その上で、特にAppキーApp secretを見つけますが、まだ必要ではないので、後で使用することを検討します。 それまでの間、 Accessトークンに関心があります 。 それを生成し、アクセスできない場所のどこかにコピーします。 二度と会えません 確かに、新しいトークンを生成できます。興味深いことに、以前のトークンも機能します。 3つのトークンを生成し、それらはすべて機能します。使用済みトークンのリストを表示したり、不要なトークンをキャンセルしたりすることはできません。アプリケーション全体を削除することしかできません。 カッツは少しありませんが、バグというよりは機能です。







ファイルソース設定



Dropboxパッケージをインストールすると、新しいタイプのファイルソースがシステムに表示されます-Dropbox。 このタイプのメディアリソースを作成します。



詳細に








ファイルソースを作成したら、それを編集用に開き、アクセストークンアプリケーションを指定します。





すべてが問題ない場合、ファイルソースを保存すると、ドロップボックスの内容が表示されます(上の最初の図を参照)。



Dropboxクライアント



パッケージの更新バージョンで最初にしたことは、別のメディアリソースメソッドでDropboxクライアントを取得できるようにすることでした。 たとえば、次のように取得できます。

$source_id = 27; // ID    $source = $modx->getObject('modMediaSource', $source_id); $client = $source->getClient();
      
      







これは、各メディアリソースがそのDropboxフォルダーで機能する一方で、必要なだけ多くのメディアリソースを持ち、設定に煩わされる可能性があるという点で便利です。



ディレクトリの内容に関する情報を取得する



 $source_id = 27; // ID    $source = $modx->getObject('modMediaSource', $source_id); $client = $source->getClient(); $result = $client->getMetadataWithChildren('/'); print_r($result);
      
      





結果
 Array ( [hash] => cfcf0b65c94cff03c32390b3c30a5812 [thumb_exists] => [bytes] => 0 [path] => / [is_dir] => 1 [icon] => folder [root] => dropbox [contents] => Array ( [0] => Array ( [rev] => 115ce031c0d71 [thumb_exists] => 1 [path] => /315a73ec24 - .jpg [is_dir] => [client_mtime] => Fri, 05 Dec 2014 23:12:30 +0000 [icon] => page_white_picture [bytes] => 258713 [modified] => Mon, 08 Dec 2014 02:45:31 +0000 [size] => 252.6 KB [root] => dropbox [mime_type] => image/jpeg [revision] => 71118 ) [1] => Array ( [rev] => 102d6031c0d71 [thumb_exists] => 1 [path] => /315a73ec24.jpg [is_dir] => [client_mtime] => Fri, 05 Dec 2014 23:12:30 +0000 [icon] => page_white_picture [bytes] => 258713 [modified] => Sat, 06 Dec 2014 21:21:20 +0000 [size] => 252.6 KB [root] => dropbox [mime_type] => image/jpeg [revision] => 66262 ) ) [size] => 0 bytes )
      
      







ファイルの内容を取得する



 $source_id = 27; // ID    $source = $modx->getObject('modMediaSource', $source_id); $content = $source->getContent('/315a73ec24.jpg');
      
      





またはそう
 $source_id = 27; // ID    $entry = $modx->newObject('DropboxEntry', array( "source_id" => $source_id, "path" => '/315a73ec24.jpg', )); $content = $entry->getContent(); //  $entry->get('content');
      
      





またはそう
 $source_id = 27; // ID    $source = $modx->getObject('modMediaSource', $source_id); $entry = $modx->newObject('DropboxEntry', array( "path" => '/315a73ec24.jpg', )); $entry->Source = $source; $content = $entry->getContent(); //  $entry->get('content');
      
      





または(レコードが既にデータベースにある場合)
 $entry = $modx->getObject('DropboxEntry', array( "path" => '/315a73ec24.jpg', )); $content = $entry->getContent(); //  $entry->get('content');
      
      







セクションの変更を追跡する



ここでは2つの手順が必要です。



1.セクションの現在のカーソルを取得し、データベースに保存します
一般に、保存する必要はありませんが、非常に便利なため、どこにも行けません。

 $source_id = 27; // ID    $cursor = $modx->newObject('DropboxCursor', array( "source_id" => $source_id, "path" => '/', )); if($result = $cursor->getLast()){ $cursor->fromArray($result); $cursor->save(); }
      
      





2.変更をリクエストします。
 $cursor= $modx->getObject('DropboxCursor', array( "path" => '/', )); $result = $entry->getDelta(); print_r($result);
      
      





答え
 Array ( [has_more] => [cursor] => AAE3sefSDffe3SiOcfkaMd7vyzjQvjxngkI1gkJGLvBQplsNUhF9tx5Okb7epnGufIziuDWjyG16sWaxjRcnt-XjT-jBD_8fDW89enF7OO3AHBjsZz9vHTBJenmeCdLUgO0f-EqRJYigzELD0rzD3hFNn-YGfDQaxUOs0bHd2F5qND3J6HX-HwOqOLWQfcbuMZMNHN1_UGN2VODIbaPzBbML0rap_B6ibV03JQxtiGHZtxwjP-mSw8drigK3yJtvqyR3XdzHP5uVsyrD8gkyGk1J9dOTLdzFRA-woImCg1Iwc9XA7l1XsZGCRvDYpXjg [entries] => Array ( ) [reset] => )
      
      



-jBD_8fDW89enF7OO3AHBjsZz9vHTBJenmeCdLUgO0f-EqRJYigzELD0rzD3hFNn-YGfDQaxUOs0bHd2F5qND3J6HX-HwOqOLWQfcbuMZMNHN1_UGN2VODIbaPzBbML0rap_B6ibV03JQxtiGHZtxwjP-mSw8drigK3yJtvqyR3XdzHP5uVsyrD8gkyGk1J9dOTLdzFRA-woImCg1Iwc9XA7l1XsZGCRvDYpXjg Array ( [has_more] => [cursor] => AAE3sefSDffe3SiOcfkaMd7vyzjQvjxngkI1gkJGLvBQplsNUhF9tx5Okb7epnGufIziuDWjyG16sWaxjRcnt-XjT-jBD_8fDW89enF7OO3AHBjsZz9vHTBJenmeCdLUgO0f-EqRJYigzELD0rzD3hFNn-YGfDQaxUOs0bHd2F5qND3J6HX-HwOqOLWQfcbuMZMNHN1_UGN2VODIbaPzBbML0rap_B6ibV03JQxtiGHZtxwjP-mSw8drigK3yJtvqyR3XdzHP5uVsyrD8gkyGk1J9dOTLdzFRA-woImCg1Iwc9XA7l1XsZGCRvDYpXjg [entries] => Array ( ) [reset] => )



変更がある場合は、 エントリの配列にそれらが表示されます







ファイルの改訂



 $entry = $modx->getObject('DropboxEntry', array( "path" => '/315a73ec24.jpg', )); $result = $entry->getRevisions();
      
      





また、目的のバージョンのファイルを復元できます。
 $entry = $modx->getObject('DropboxEntry', array( "path" => '/315a73ec24.jpg', )); $result = $entry->restoreFile('102d6031c0d71');
      
      







一般に、公式ドキュメントを掘り下げると、これに基づいて多くのことができます。 一般に、異なる種類のメディアリソース間でファイルを交換できるMODXのファイルマネージャコンポーネントを開発することが望まれていますが、これまでのところ時間/リソースはありません。



パッケージは、オフサイトmodx.comからダウンロードできます。

Githubプロジェクト: github.com/Fi1osof/modx-Dropbox



そして最後に、コンポーネントの開発中に私が遭遇したある潜んでいる問題についての小さなメモ



UPD:その過程で、いくつかのポイントが見つかりました。

1. Dropbox PHP SDKにはPHP最低5.3が必要です

2.彼は64ビット軸を必要とするようです。 議論はこちらです。



All Articles