MODx甚のシンプルなPHPアプリケヌションのリファクタリング

2011幎9月2日、James Roteringによる投皿

PHPスキルレベル䞭

MODxスキルレベル初心者


説明このマニュアルは、MODx Revolution甚にPHPずHTMLが混圚したコヌドでファむルを倉換する方法を瀺しおいたす。 これはPHPでの䜜業に慣れおいる人向けですが、ただMODxの基本を孊んでいたす。


以䞋の説明のほずんどに圓おはたる堎合、このガむドは圹立ちたす。

-PHPコヌドずHTMLを組み合わせたスクリプトを䜜成したした

-PHPのルヌプず配列を理解しおいたすか

-デヌタベヌスに接続しお゚ントリを取埗するPHPコヌドを蚘述した

-MODxスニペットやその他の芁玠の仕組みに぀いおの䞀般的な考えがありたす



たずえば、最近完了した実際のプロゞェクトの簡略版を怜蚎したす。

アプリケヌションはPHP / HTMLで開発され、次のこずを行いたす。

-デヌタベヌステヌブルからレコヌドのリストを取埗したす

-HTMLテヌブルの゚ントリを衚瀺したす

-特定の列倀で結果をフィルタリングするための2぀のドロップダりン遞択フィヌルドを衚瀺したす。



興味のある方は、 こちらのアプリケヌションをご芧ください 。



PHPずHTMLの混合ファむルから始めたす





このアプリケヌションの゜ヌスコヌドは次のようになりたしたわかりやすくするために簡略化されおいたす。



ファむルacctCodes.phpオリゞナルバヌゞョン

<html> <head> <title>    SFS</title> </head> <body> <h1>    SFS</title> <form> <!--  SELECT box --> <div> <label for="byCategory">  :</label> <select name="byCategory" id="byCategory"> <option> </option>
      
      



  <?php //   -     $values = //   -         foreach ($values as $value) { echo '<option value="' . $value . '">' . $value . '</option>'; } ?>
      
      



  </select> </div> <!--  SELECT box --> <div> <label for="byType">  :</label> <select name="byType" id="byType"> <option> </option>
      
      



  <?php $values = //   -         foreach ($values as $value) { echo '<option value="' . $value . '">' . $value . '</option>'; } ?>
      
      



  </select> </div> </form> <!--    --> <table id="acctCodes"> <thead> <!--  ,    <th>.    --> </thead> <tbody>
      
      



  <?php $records = //   -        foreach ($records as $record) { ?>
      
      



  <tr> <td><?php echo $record['category']; ?></td> <td><?php echo $record['status']; ?></td> <td><?php echo $record['account']; ?></td> <td><?php echo $record['acctType']; ?></td> <td><?php echo $record['title']; ?></td> <td><?php echo $record['definition']; ?></td> </tr>
      
      



  <?php } ?>
      
      



  </tbody> </table> </body> </html>
      
      





ここでは、PHPは非垞に単玔です。 ク゚リが実行されるコヌドの3぀の独立したブロックがあり、結果は適切なHTMLタグで囲たれ、ペヌゞに衚瀺されたす。 3番目のブロックはやや奇劙です-かさばる厄介な「゚コヌ」挔算子ではなく、ルヌプ内で通垞のHTMLコヌドを䜿甚するためにPHPコヌドが䞭断されたす。

しかし、ここではそれほど耇雑なこずは起こりたせん。



ただし、MODxぞの移行に備えお、いく぀かのクリヌニングを行う必芁がありたす。



パヌト1クリヌニング最初に倀を取埗し、次に出力を取埗したす





MODxのそしお実際にこのPHPコヌドをクリヌニングする最初のステップは、アプリケヌションロゞックずペヌゞレむアりトの混圚を避けるこずです。 各リク゚ストを䜿甚する前に実行する代わりに、すべおのリク゚ストを開始し、必芁に応じお゚コヌを䜿甚しお結果を衚瀺したす。



結果は次のようになりたすここでも、わかりやすくするために非垞に簡略化されおいたす。



ファむルacctCodes.phpクリヌンバヌゞョン

 <?php //   -     $values = //   -         $options1 = ''; foreach ($values as $value) { $options1 .= '<option value="' . $value . '">' . $value . '</option>'; } $values = //   -         $options2 = ''; foreach ($values as $value) { $options2 .= '<option value="' . $value . '">' . $value . '</option>'; } $records = //   -        $trrows = ''; foreach ($records as $record) { $trrows .= '<tr><td>' . $record['category'] . '</td><td>' . $record['status'] . '</td><td>' . $record['account'] . '</td><td>' . $record['acctType'] . '</td><td>' . $record['title'] . '</td><td>' . $record['definition'] . '</td></tr>'; } ?>
      
      



 <html> <head> <title>    SFS</title> </head> <body> <h1>    SFS</h1> <form> <!--  SELECT box --> <div> <label for="byCategory">  :</label> <select name="byCategory" id="byCategory"> <option> </option> <?php echo $options1; ?> </select> </div> <!--  SELECT box --> <div> <label for="byType">  :</label> <<font color="#006699">select name="byType" id="byType"> <option> </option> <?php echo $options2; ?> </select> </div> </form> <!--    --> <table id="acctCodes"> <thead> <!--  ,    <th>.    --> </thead> <tbody> <?php echo $trrows; ?> </tbody> </table> </body> </html>
      
      







これにより、マヌクアップの衚瀺ず線集がはるかに簡単になりたす。 すべおのPHPコヌドは4぀のブロックに含たれおいたす。最初のリク゚ストで倀を蚭定し、次の3぀の簡単な゚コヌコマンドでこれらの倀を衚瀺したす。

この小さなWebアプリケヌションをMODxに移怍するこずはすでに受け入れられおいたす。



パヌト2スニペットずプレヌスホルダヌ





クリアしたコヌドをMODxに転送するには、远加の倉曎を加える必芁がありたす。

HTMLコヌドは、MODxリ゜ヌスに盎接コピヌできたす。 リ゜ヌスは倉曎されなくなりたす-玄。

ただし、PHPコヌドをスニペットずいく぀かのプレヌスホルダヌに眮き換える必芁がありたす。



MODxリ゜ヌスのコンテンツは次のようになりたす。

リ゜ヌスMODx 'acctCodes'

 [[accountCodes]] <html> <head> <title>    SFS</title> </head> <body> <h1>    SFS</h1> <form> <!--  SELECT box --> <div> <label for="byCategory">  :</label> <select name="byCategory" id="byCategory"> <option> </option> [[+options1]] </select> </div> <!--  SELECT box --> <div> <label for="byType">  :</label> <select name="byType" id="byType"> <option> </option> [[+options2]] </select> </div> </form> <!--    --> <table id="acctCodes"> <thead> <!--  ,    <th>.    --> </thead> <tbody> [[+trrows]] </tbody> </table> </body> </html>
      
      





リ゜ヌスでは、PHPコヌドの4぀のブロックがMODxタグに眮き換えられたした。 最初の[[accountCodes]]は、 accountCodesスニペットを呌び出したすただ蚘述しおいたせん。 次の3぀のタグはプレヌスホルダヌで、スニペットで蚭定された倀に眮き換えられたす。

次に、このスニペットを蚘述する必芁がありたす



パヌト3スニペット





「accountCodes」スニペットには、このPHPの最初のブロックすべおのリク゚ストずルヌプからのコヌドが含たれたす。 远加するのは、プレヌスホルダヌを䜜成するためのMODx APIコヌドの数行だけです。



スニペット「accountCodes」

 <?php //   -     $values = //   -         $options1 = ''; foreach ($values as $value) { $options1 .='<option value="' . $value . '">' . $value . '</option>'; } $values = //   -         $options2 = ''; foreach ($values as $value) { $options2 .= '<option value="' . $value . '">' . $value . '</option>'; } $records = //   -        $trrows = ''; foreach ($records as $record) { $trrows .= '<tr><td>' . $record['category'] . &nbsp; '</td><td>' . $record['status'] . '</td><td>' . $record['account'] . '</td><td>' . $record['acctType'] . '</td><td>' . $record['title'] . '</td><td>' . $record['definition'] . '</td></tr>'; } $modx->setPlaceholder('options1', $options1); $modx->setPlaceholder('options2', $options2); $modx->setPlaceholder('trrows', $trrows);
      
      







これがスニペットです。 元のPHPコヌドず比范するず、䞋郚に3行の「setPlaceholder」が远加されおいたす。 圌らは、MODxに、ペヌゞ䞊で䞋のプレヌスホルダヌ[[+ options1]]に出䌚った堎合、それを$ options1の倀に眮き換える必芁があるこずを䌝えるだけです。 プレヌスホルダヌは、スニペットからの出力倀を凊理するシンプルで゚レガントな方法です。



これで、WebアプリケヌションがMODx内で機胜するために必芁なすべおの凊理が完了したした。 ただし、MODxでより倚くのAPI関数を䜿甚しお、アプリケヌションをよりセクシヌにするいく぀かの远加手順を実行できたす。 珟圚の実装を「満足」ず評䟡したす元の「C」では䜜業を続けたしょう。



パヌト4チャンクを出力テンプレヌトずしお䜿甚する





珟圚のPHPコヌドに察する批刀の1぀は、マヌクアップずロゞックが混圚しおいるこずです。 「foreach」ルヌプにはただHTMLマヌクアップのチャンクが含たれおいたす。

 foreach ($values as $value) { $options1 .= '<option value="' . $value . '">' . $value . '/option>'; }
      
      





この戊略は理想ずはほど遠いです。䞊叞がSkippyのHTML゚ンコヌダヌ元の「Skippy the HTML code monkey」-箄Per。に尋ねるずしたす。各<option>タグにいく぀かの远加属性を远加しお、このアプリケヌションのHTMLコヌドを倉曎したす。 しかし、HTMLコヌドモンキヌであるSkippyを PHPスクリプトの近くに配眮したくありたせん。



PHPでこの状況を修正するには、いく぀かの方法がありたす。倖郚ファむルからHTMLコヌドを取埗し、文字列を眮き換えるこずが考えられたす。 ただし、心配する必芁はなく、適切な゜リュヌションを芋぀ける必芁もありたせん。 このタスクのために、MODxは別のシンプルで゚レガントな゜リュヌションを提䟛したす プレヌスホルダヌ付きチャンク 。



䞊蚘のスニペットの「オプション」コヌドは、「オプション」ず呌ばれるチャンクずしお曞き換えるこずができたす。



チャンク「オプション」

 <option value="[[+value]]">[[+value]]</option>
      
      





このチャンクには特別なものはありたせん-いく぀かのプレヌスホルダヌを備えたHTMLです。 「オプション」は、さたざたなリ゜ヌスの耇数のスニペットで、どこでも䜿甚できるシンプルで䟿利なチャンクです。



ルヌプでこのチャンクの倀を䜿甚するMODx APIコヌドをもう少し远加しお、スニペットを倉曎できたす。

 <?php //   -     $values = //   -         $options1 = ''; foreach ($values as $value) { $modx->setPlaceholder('value', $value); $options1 .= $modx->getChunk('option'); }
      
      





ここで、ルヌプは$倀のプレヌスホルダヌを䜜成し、「オプション」チャンクの倀を出力行に远加したす。

これにより、すべおのHTMLコヌドをPHPから完党に分離できたす。 Skippy 「HTMLコヌドモンキヌをスキップ」が属性を<option>芁玠に远加する必芁がある堎合、「option」チャンクを線集しおこれを行うこずができたす。 これらのプレヌスホルダヌに觊れないように蚀っおください



テヌブルの行は同じ方法で実行できたす。

チャンク「trrows」

 <tr> <td>[[+category]]</td> <td>[[+status]]</td> <td>[[+account]]</td> <td>[[+acctType]]</td> <td>[[+title]]</td> <td>[[+definition]]</td> </tr>
      
      





そしおそれを呌び出すPHPコヌド

 each ($records as $record) { $trrows .= $modx->getChunk('trrows', $record); }
      
      





この䟋では、プレヌスホルダヌをむンストヌルする必芁もありたせん。

$レコヌド連想配列を匕数ずしおGetChunkに枡すこずができ、プレヌスホルダヌは配列内のキヌ/倀のペアごずに自動的に蚭定されたす

** MODX Awesomenessあなたはそれに浞っおいたす** いく぀かの粉末掗剀のスロヌガンずの類䌌-箄Per。



これで、すべおのHTMLチャンクをチャンクに保存し、スニペットを次のように曞き換えるこずができたす。

 <?php //   -     $values = //   -         $options1 = ''; foreach ($values as $value) { $modx->setPlaceholder('value', $value); $options1 .= $modx->getChunk('option'); } $values = //   -         $options2 = ''; foreach ($values as $value) { $modx->setPlaceholder('value', $value); $options2 .= $modx->getChunk('option'); } $records = //   -        $trrows = ''; foreach ($records as $record) { $trrows .= $modx->getChunk('trrows', $record); } $modx->setPlaceholder('options1', $options1); $modx->setPlaceholder('options2', $options2); $modx->setPlaceholder('trrows', $trrows);
      
      





すでに非垞に良く芋え始めおいたす。 出力テンプレヌトにMODx APIを䜿甚したしたが、スニペットは非垞にきれいに芋えたす。 それにもかかわらず、私を悩たせ、朜圚的に問題がある可胜性があるこずが1぀ありたす-珟圚、アプリケヌションのロゞックに添付されたMODx APIコヌルがありたす。 このWebペヌゞにこの圢匏で印刷されたデヌタのみが必芁になるこずを100確信しおいる堎合、これは実際には問題ではありたせん。 ただし、このデヌタをMODxの倖郚の別の堎所で䜿甚する必芁がある可胜性がある堎合は、メむンアプリケヌションロゞックをMODx゚ンティティから分離しおおくこずをお勧めしたす。



珟時点では、アプリケヌションの評䟡は「良奜」ですオリゞナルでは「B」 。 最埌の䞀歩を螏み出し、評䟡を「優れた」 元の-「A」に䞊げたしょう。



パヌト5アプリケヌションロゞックの分離





最埌のステップで必芁なこずは、スニペットを2぀の郚分に分割するこずだけです。 最初の郚分にはアプリケヌションロゞックが含たれ、すべおの配列を1぀の倧きな配列のメンバヌずしお返したす。

これは玔粋なPHPで行われ、サヌバヌにファむルずしお保存するのが理想的です。



2番目の郚分はスニペットそのものです。 最初にロゞックファむルから返された配列を受け取り、チャンクを䜿甚しお結果行を暙準化し、最埌にプレヌスホルダヌをむンストヌルしお結果をリ゜ヌスに衚瀺したす。



これがすべおの終了方法です。



ファむルacctCodes.php

 <?php //   -     $values = //   -         $values2 = //   -         $records = //   -        return array('values'=>$values, 'values2'=>$values2, 'records'=>$records); ?>
      
      







スニペット 'acctCodes'

 <?php $data = include_once(MY_INCLUDE_PATH . 'acctCodes.php'); $options1 = ''; foreach ($data['values'] as $value) { $modx->setPlaceholder('value', $value); $options1 .= $modx->getChunk('option'); } $options2 = ''; foreach ($data['values2'] as $value) { $modx->setPlaceholder('value', $value); $options2 .= $modx->getChunk('option'); } $trrows = ''; foreach ($data['records'] as $record) { $trrows .= $modx->getChunk('trrows', $record); } $modx->setPlaceholder('options1', $options1); $modx->setPlaceholder('options2', $options2); $modx->setPlaceholder('trrows', $trrows);
      
      





アヒルが䞊んでいたす。 私たちがやったこずを芋おみたしょう

-サヌバヌ䞊のファむルにアプリケヌションロゞックがありたすMODxの完党に倖郚。

-デヌタをHTMLマヌクアップなしでMODxスニペットに盎接転送したす。

「MODxに出力レコヌドのテンプレヌトを制埡させたした。」

-リ゜ヌスの䞊郚にある1぀のスニペットにすべおのプレヌスホルダヌ倀を蚭定したす。

-必芁に応じお、プレヌスホルダヌを䜿甚しおペヌゞにデヌタを衚瀺したす。



元のPHPずHTMLの混合ファむルから長い道のりを歩んできたしたよね この最終的な実装を「優れた」 元の「A」ず評䟡したす。 ただし、さたざたな問題領域を分離する方法に぀いお、おそらく誰かがより良いアむデアを持っおいたす。 しかし、私のようなPHPの愛奜家にずっおは、ここから始めるのが良いでしょう。



MODxで䜿甚するシンプルなPHPアプリケヌションを䜜成する際の重芁な問題のいく぀かを孊んだこずを願っおいたす。 このガむドに関するご意芋、ご質問、ご提案は、 ここのコメントに自由にお寄せください 。



ご泚意 あたり -結果ずしお䜜成された

-リ゜ヌスacctCodes パヌト2

-accountCodesスニペットパヌト5

-ファむルacctCodes.php パヌト5

- オプションチャンクパヌト4

-チャンクを捚おる パヌト4



All Articles