初心者MODX Revoノヌト



免責事項もちろん、この蚘事で玹介されおいる内容の倚くは、知識のある人にずっおはキャプテンのようです。 しかし、おそらく圌女は誰かを助けるでしょう...



はじめに



それで、MODXずは正確には䜕ですかちなみに、そのように曞かれおいたす-ハブの名前ずしおではなくMODX-MODx 公匏サむトを読むず-これはCMSです。 ただし、これは真実の䞀郚にすぎたせん。 実際、MODXはCMSずCMFのほが䞭間です。 ただし、MODXに興味がある人は他の蚘事からすぐにわかるので、この点に぀いおは詳しく説明したせん。



MODXはCMSずCMFの䞭間にあるため、WordpressやJoomlaなどの単玔なCMSほど簡単に孊ぶこずはできたせん。 おそらく、この蚘事は、䞀芋しお明らかではないように芋える埮劙な点のいく぀かを明らかにするために曞かれたのでしょう。







蚭眮



個人的に、nginxずPHP-FPMを装備したサヌバヌにMODX Revo 2.2.4をむンストヌルしたした。

MODXは䞀般にApache + PHP拡匵甚に蚭蚈されおいるため、nginxには远加の構成が必芁です。 私の構成は次のようになりたす。

nginx蚭定
server { listen 80; server_name example.com *.example.com; #   MODX        . index index.php index.html; root /srv/http/example.com/public; access_log /srv/http/example.com/logs/http_access.log main buffer=50k; error_log /srv/http/example.com/logs/http_error.log; #    robots.txt.      ? location = /robots.txt { access_log off; log_subrequest off; log_not_found off; } #    favicon.ico location = /favicon.ico { access_log off; log_subrequest off; log_not_found off; } #    sitemap.xml location = /sitemap.xml { access_log off; log_subrequest off; log_not_found off; } #    *.css  *.js  location ~* ^.+\.(css|js)$ { access_log off; log_subrequest off; log_not_found off; } #     ,  location ~* ^.+\.(bmp|gif|jpg|jpeg|ico|png|swf)$ { access_log off; log_subrequest off; log_not_found off; } #      ,   ,   .htaccess, .git, .svn  .. location ~ /\. { deny all; } #        MODX.        ( ),   (   ).    ,    MODX-? location / { try_files $uri $uri/ @rewrite; } #  .    - MODX     index.php?q= -       . location @rewrite { rewrite ^/(.*)$ /index.php?q=$1; } #   php-fpm location ~ \.php$ { # php-fpm.   . fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock; fastcgi_index index.php; fastcgi_param DOCUMENT_ROOT /srv/http/example.com/public; #   ,   root fastcgi_param SCRIPT_FILENAME /srv/http/example.com/public$fastcgi_script_name; #   ,   root + $fastcgi_script_name include fastcgi_params; fastcgi_param REMOTE_ADDR $remote_addr; # ,  IP   PHP   localhost-. } }
      
      





実際、この蚭定は䞍完党であるず確信しおいたすが、初期蚭定ではおそらく適切です。 ここで停止するこずが2぀ありたす。実際、MODXを接続したすCNCが正しく機胜するため。

  server_name example.com *.example.com; #   MODX        . #        MODX.        ( ),   (   ).    ,    MODX-? location / { try_files $uri $uri/ @rewrite; } #  .    - MODX     index.php?q= -       . location @rewrite { rewrite ^/(.*)$ /index.php?q=$1; }
      
      





実際、これはMODXず他のすべおPHPなしでnginx CSS、JS、画像、その他のものをロヌドするの䞡方を正しく動䜜させるのに十分なようです。

むンストヌル自䜓は非垞に簡単です。ファむルを目的のフォルダヌに解凍し、アドレスバヌexample.com/setup/に移動するだけで、その埌簡単なむンストヌラヌが読み蟌たれたす。



人に優しいURLCNC



デフォルトでは、CNCはMODXで無効になっおいたす。 それは非垞に簡単にオンになりたすシステム->システム蚭定->「friendly_urls」をフィルタヌに入れおEnterを抌したすもちろん、ハンドルを䜿甚しお怜玢できたすが、より高速です->倀を「はい」に切り替え、䞊郚の「保存」をクリックしたす。

䞀般的に、MODXでは、保存ボタンが右䞊隅にあるこずを忘れないでください。 MODXでは自動保存がトリガヌされる堎合ずそうでない堎合があるため、蚭定を忘れおしたうこずがありたす。

同様に、CNCの自動生成のための関数 "automatic_alias"に察しおも実行したす。

CNCを正垞にオンにしたので、リンクは次のように圢成されたす。

 example.com/resourcename.html
      
      





最埌に.htmlが挿入されおいるこずに泚意しおください 個々のリ゜ヌスのContent-Typeに䟝存したすリ゜ヌス自䜓のプロパティの倉曎。 コンテンツタむプ自䜓の蚭定は、システム->コンテンツタむプにありたす。

ただし、远加のGETパラメヌタヌはすべお同じたたであり、これは次のように機胜したす。

 example.com/news.html?date=05092012&nid=1
      
      





個人的に、私はそのようなシステムが奜きではなかったので、これらのパラメヌタヌをCNCの䞀郚にする方法を探し始めたした。 そしお芋぀けた

手始めに、MODXを拡匵できるさたざたな芁玠に぀いお少しお話しする䟡倀がありたす。 それらのいく぀かがありたす



この堎合、スニペットずプラグむンが必芁です。

それでは、独自のURL圢匏でMODXにどのように統合したすか 実際、それは非垞に簡単です-MODXに指定されたURLでペヌゞを芋぀けさせ、芋぀からない堎合は制埡しお解析し、その埌MODXをあるべき堎所に送りたす。 これを行うには、 OnPageNotFoundむベントのプラグむンを䜿甚したす。

高床なCNCのプラグむンコヌド
 <?php if($modx->request->getResourceMethod()!="alias") return; $uri = $modx->resourceIdentifier; $uriChunks = explode("/", $uri); $paramNum=0; $uriChunksCount = count($uriChunks); $paramDelimiter="-"; //DO NOT use "/"! Set the desired delimiter here. for($i=$uriChunksCount-1;$i>0;$i--) { $parameter=explode($paramDelimiter, $uriChunks[$i], 2); if(count($parameter)!=2) return; $modx->request->parameters['GET'][$parameter[0]]=$parameter[1]; if(empty($modx->request->parameters['POST'][$parameter[0]])) $modx->request->parameters['REQUEST'][$parameter[0]]=$parameter[1]; $paramNum++; unset($uriChunks[$i]); $uri = implode("/", $uriChunks); if (array_key_exists($uri, $modx->aliasMap)) { $modx->sendForward($modx->aliasMap[$uri]); } } if($paramNum==($uriChunksCount-1)) { $parameter=explode($paramDelimiter, $uriChunks[0], 2); if(count($parameter)!=2) return; $modx->request->parameters['GET'][$parameter[0]]=$parameter[1]; if(empty($modx->request->parameters['POST'][$parameter[0]])) $modx->request->parameters['REQUEST'][$parameter[0]]=$parameter[1]; $modx->sendForward($modx->getOption('site_start', null, 1)); }
      
      





実際、ここではおそらく次のこずをやめる䟡倀がありたす。

 $modx->request->getResourceMethod()
      
      





CNCがオンになっおいるかどうかを確認したす。

 $modx->resourceIdentifier
      
      





このそれほど明癜ではない倉数は、芁求されたURLを栌玍したす。

 $paramDelimiter="-";
      
      





この倉数は、GETパラメヌタヌの名前ずその倀の間の区切り蚘号を蚭定したす。 「/」以倖に倉曎できたす。

 $modx->request->parameters['GET'][$parameter[0]]=$parameter[1]; if(empty($modx->request->parameters['POST'][$parameter[0]])) $modx->request->parameters['REQUEST'][$parameter[0]]=$parameter[1];
      
      





実際には、MODXは各リク゚ストでGETおよびPOSTパラメヌタヌに関するすべおの情報を独自の配列に保存し、その埌、およそ次の方法で共通の配列を圢成したす。

 $modx->request->parameters['REQUEST'] = array_merge($modx->request->parameters['GET'], ($modx->request->parameters['POST']);
      
      





この構造を保存するために、POST配列のデヌタがREQUEST配列に保存されおいるかどうかを毎回確認し、存圚しない堎合にのみREQUEST配列のデヌタを眮き換えたす。

 if (array_key_exists($uri, $modx->aliasMap)) { $modx->sendForward($modx->aliasMap[$uri]); }
      
      





そしお、これは実際に目的のリ゜ヌスぞのリダむレクトです。 CNCテヌブル党䜓が$ modx-> aliasMapに保存されたす。これを䜿甚しお、目的のリ゜ヌスに移動する時間か、たたはアンダヌパヌスされたuriのコンテンツがただパラメヌタヌで構成されおいるかを確認したす。 $ modx-> sendForwardずこのリダむレクトを実行したす。



ただし、おそらく、このURL生成メカニズムを䜿甚しお、たずえば珟圚のペヌゞぞのリンクをすぐに提䟛したいず思うでしょう。 これを行うために、珟圚のペヌゞのURLを生成するだけの簡単なスニペットを䜜成したした。 もちろん、生成や他のリンクのために拡匵できたすが、これはすでにそれを必芁ずする人の個人的な宿題になりたす-それに぀いお耇雑なこずは䜕もありたせん:)

 <?php $currentURL=""; foreach($modx->request->getParameters() as $key => $value) { $currentURL.=$key."=".$value."&"; } $currentURL = $modx->makeUrl($modx->resource->get("id"), $modx->context->get("key"), $currentURL); return $currentURL;
      
      





実際、説明する特別なものはありたせん。 $ modx-> makeUrlはURLを圢成したす。 参考のために-それはコンテキストに関連しおそれを圢成したす-2番目のパラメヌタヌは単にコンテキストを蚭定したす。



MODXのマルチサむト



同じMODXで異なるコンテキストの耇数のドメむンを凊理する


実際、このトピックは、たずえばこのトピックやむンタヌネットですでに取り䞊げられおいたす 。 私の決断を提瀺したいず思いたす、それは私には非垞に簡単なようです。 しかし、最初に、この問題を解決する䞻な方法をリストしたす。

  1. index.phpの線集。 Index.phpは、起動時にロヌドされるコンテキストを明瀺的に瀺したす。 それを完党に修正し、状況をコンテキストの遞択に眮き換えるこずができたす。 私がこの方法を奜たない理由オリゞナルのmodxファむルの線集。 なぜこの事実が奜きではないのですか アップデヌトの難しさ。 私がmodxが奜きなのはそしおSMFフォヌラム゚ンゞンが奜きではないのず同じように 、元のMODXファむルを倉曎する必芁がないこずです。これにより、゚ンゞンをできるだけ簡単に曎新できたす。
  2. OnHandleRequestむベントのプラグむンを䜜成したす䞀般的な欠点もう少しリ゜ヌスが䜿甚されたす-Webコンテキストが垞に最初にロヌドされ、その埌に必芁なコンテキストがロヌドされたす

    1. index.phpの線集に䌌おいたすが、線集したせん。 すべおがほが同じです-厳密に定矩されたコンテキストのリストによっお凊理されるドメむンのリストはハヌドコヌディングされおいたす。 たたは、コンテキスト名にはドメむン名の䞀郚forum.example.comサブドメむンのフォヌラムコンテキストなどが含たれ、それに基づいお必芁なコンテキストの怜玢が実行されたす。単玔なサむトの堎合は適切ですが、十分な柔軟性はありたせん。
    2. コンテキスト蚭定をスキャンしお、適切な蚭定を芋぀けたす。 最倧限の柔軟性、コンテキストの自動䜜成、䜜成埌にプラグむンを線集する必芁はありたせん。






ここで最埌のオプションのみを説明したす。 私のプラグむンのテキスト思い出しお、 OnHandleRequestむベント

ゲヌトりェむプラグむン
 <?php if($modx->context->key!="mgr") { $object = $modx->getObject('modContextSetting', array('key' => 'multisite_http_host', 'value' => $modx->getOption('http_host'))); if($object) $modx->switchContext($object->get('context_key')); }
      
      





䜿甚するには、コンテキストプロパティの「multisite_http_host」パラメヌタに、凊理するドメむンの倀を蚭定する必芁がありたす。 適切なコンテキストが芋぀からない堎合、プラグむンはデフォルトでWebコンテキストを䜿甚したす。

ここでは、2぀のこずに焊点を圓おたいず思いたす。

たず、MODXを正垞に䜿甚するには、xPDOの原理を理解する必芁がありたす。 xPDOは、デヌタベヌスずPHPオブゞェクト間の通信のためのメカニズムです。 PHPでオブゞェクトを操䜜するず、デヌタベヌスにアクセスできたす。 MODXのほがすべおが、xPDOを䜿甚しおデヌタベヌスず通信したす。

 $object = $modx->getObject('modContextSetting', array('key' => 'multisite_http_host', 'value' => $modx->getOption('http_host')));
      
      





このコヌドは、特定の条件を含むコンテキスト蚭定オブゞェクト぀たり、httpホストの倀を持぀multisite_http_host構成キヌを怜玢するためにデヌタベヌスに移動したす。 その埌、受信したオブゞェクトからロヌドする必芁があるコンテキストキヌを取埗したす$ object-> get "context_key"。

第二に、haberuser XanderBassが正しい質問をしたした。ここで私はそれを耇補したいず思いたす。 では、なぜ「http_host」だけでなく「multisite_http_host」ずいうパラメヌタ名を䜿甚しおいるのでしょうか

すべおが非垞にシンプルで、システム蚭定、コンテキスト、ナヌザヌを組み合わせるメカニズムに基づいおいたす。 実際、システム蚭定はコンテキスト蚭定によっお䞊曞きされ、それらはナヌザヌ蚭定になりたす。

この堎合、http_hostはシステム蚭定です。 コンテキスト蚭定でmultisite_http_hostの代わりにhttp_hostを䜿甚するず、コンテキスト蚭定によっお消去されたす。 もちろん、この特定の䟋では、これはそれほど怖いものではありたせん。 ただし、このプラグむンを少し曞き換えお、特定のドメむンのすべおのサブドメむンを1぀のコンテキストで凊理したす。 たたは、いく぀かの異なるドメむンの1぀のコンテキストで凊理を実行したすたずえば、ほがこの圢匏のパラメヌタヌに駆動するsub1.example.com; sub2.example.com; sub3.example.com "など。この堎合、 http_hostでは、リク゚ストに䜿甚されたhttp_hostではなく、この蚭定になりたすが、あなたは決しお知らないでしょう、元のhttp_hostがどこか他に必芁になるかもしれたせん...



マルチコンテキスト認蚌


時には、耇数のコンテキストでナヌザヌを䞀床に認蚌したいこずがありたす。 デフォルトでは、システムにログむンするたずえば、ログむンmodを䜿甚しおナヌザヌは、1぀のコンテキストのみでシステムにログむンしたす。 次のプラグむンは、承認䞭にいく぀かのコンテキストに自動的にログむンしたす OnWebLoginおよびOnWebLogoutむベント 

マルチ認蚌
 <?php $currentSiteGroup = $modx->getOption("multisite_site_group"); if(empty($currentSiteGroup)) return; $currentContext = $modx->context->get("key"); $currentContextSettings = $modx->getCollection('modContextSetting', array('key' => "multisite_site_group", "value" => $currentSiteGroup)); foreach($currentContextSettings as $currentContextSetting) { $contextKey = $currentContextSetting->get('context_key'); if($contextKey!="mgr" && $contextKey!=$currentContext) { if($user) { if($modx->event->name=="OnWebLogout") { $modx->user->removeSessionContext($contextKey); } else if($modx->event->name=="OnWebLogin") { $modx->user->addSessionContext($contextKey); $_SESSION['modx.'.$contextKey.'.session.cookie.lifetime']=$attributes["lifetime"]; } } } }
      
      







䜿甚するには、パラメヌタ「multisite_site_group」を、ナヌザヌが同時にログむンするすべおのコンテキストのすべおの必芁なコンテキストに同じ倀を蚭定する必芁がありたす。

ほんの少しのコメント

ここで、必芁なコンテキストの怜玢は、以前のプラグむンで実装した方法ず非垞によく䌌おいたす。唯䞀の違いは、getObjectの代わりにgetCollectionを䜿甚するこずです。 そうするこずで、指定された条件に埓うオブゞェクトの配列を取埗したす。

 $modx->user->addSessionContext($contextKey);
      
      





そしお

 $modx->user->removeSessionContext($contextKey);
      
      





このコンテキストたたはそのコンテキストでナヌザヌの承認を実行するだけです。

 $_SESSION['modx.'.$contextKey.'.session.cookie.lifetime']=$attributes["lifetime"];
      
      





珟圚のコンテキストず同じように、他のすべおのコンテキストの承認の「存続期間」を付加したす。



珟時点では、私が䌝えたかったすべおのこずのように思えたす。 蚀語の切り替えを䌎う開発は、おそらく埌で倉曎したす。 ご枅聎ありがずうございたした



All Articles