MODX Revolutionのオンラインストアの準備完了

多くの場合、開発者が別のストアのエンジンを選択すると、通常、いくつかの基準に従ってこの質問を評価します。



カットの下で、これらの基準を考慮して開発されたオンラインストアの新しい既製のアセンブリについてお話します。洗練された開発者でさえ考えさせることができると思います。



記事の最後に、エンジンの概要と2つのインストール方法が記載されたビデオがあります



重要な!!! 私は言うのを忘れていました:誰がビデオを見るのが面倒ですが、アセンブリ、デフォルトでadmin / adminにログイン/パスワードをデプロイします:admin / admin。





デモサイト。



さらに読む前に、アセンブリのデモ版をクリックすることをお勧めします。



このアセンブリを展開すると、すぐにそのようなサイトが得られるとすぐに言わなければなりません。 つまり、カタログモデル、ソーシャルネットワークを介した登録/承認、キャッシュデスクを介した支払いなどがすぐにあります。 (もちろん、コピーでは、設定にロボカッサのデータを登録し、サイトをソーシャルネットワークにリンクする必要があります)。



エンジンの基礎(およびかなり大きな背景)



基礎は、MODX Revolutionフレームワークによって採用されました。 時間をかけてページを閉じてください。 これは、実際に発生したMODXではありません。 私は2009年の初めからMODXに取り組んできましたが、それを広く知っています。 そして、私は、多くの人と同じように、多くの短所(データベースのテンプレートやチャンク、ブレーキなど)に遭遇しました。 さらに、MODXを理解する前に、さまざまな自己記録や他のエンジンで多くの作業を行いました。MODXでは、その柔軟性のために正確に留まりました。 はい、私はそれについてすべてが好きではありませんが、コア自体に触れることなく、あなたはそれで多くを簡単に変えることができます。 その過程で、特定のMODX機能を補完または変更するいくつかのコンポーネントを入手しました。 最も重要なものをいくつか次に示します。

phpTemplates-通常のphpファイルのように静的なMODXテンプレートを呼び出すことができます。

modxSmarty -Smartyテンプレートエンジンを前面に接続し、MODX自体との密接な相互作用を提供するいくつかのグッズを追加します。

shopModx-オンラインストアの開発用モジュール。



その結果、MODXは本格的なテンプレートだけでなく、はるかに高いパフォーマンスを獲得します。 数万のドキュメントがあるサイトは、0.02〜0.6秒の応答で動作します。 さらに、MODX自体の構文をほぼ完全に忘れることができます。PHPでのプログラミング方法とSmartyを知っていれば、ここで開発に問題はありません。



しかし、MODXで最も重要なことの1つは、私を確実にチェーンに入れたままにすることです(パッケージシステム(MODXのモジュール))。 彼女は本当にクールです。 独自のパッケージリポジトリを作成できるモジュールを作成しました。 これは、さまざまなWebスタジオやアクティブな開発者にとって特に便利です。 同時に、最もおいしいのは、個々のモジュールだけでなく、一般的にサイト全体を、少なくとも全体として、少なくとも別々に、サイト全体でさえもパックできることです。 そのため、MODXサイトのスナップショットがありました。 当初、これはmodxcloud.com自体(MODX開発者からの公式ホスティング)にのみ実装されていましたが、ドキュメントやリリースなしで、 vaporスクリプトをアップロードしました。 modxcloud.comで 。 同時に、フィードバックは暗示されていませんでした(つまり、modxcloud.comから写真を撮影し、ホスティングに展開しています)。 詳細は説明しませんが、このベーパーを取り、修正し、別のスクリプトを追加しました(import.php)。 このスクリプトを使用して、サイトの写真を撮影し、それらをクリーンなサイトの上に展開することができます。 私の蒸気は公式リポジトリからダウンロードできます 。 そして、この蒸気で、私は個々のモジュールだけでなく、既成のサイトアセンブリについても講座を受講しました。



そのようなアセンブリの意味は何ですか?


ポイントは、プロジェクトがいくつかの別個のコンポーネントを一度に使用し、それらが一緒に何らかの期待される結果をもたらす場合、それらの存在だけでなく、最高の効果と最大限の柔軟性を確保するための微調整も重要であるということです。 そして、このためには、それらを非常によく知っているだけでなく、アプリケーションの経験、それをより良くする方法、落とし穴などを知る必要があることは明らかです。 しかし、すべてがすでにインストールおよび構成されている既製のサイトを開発者に提供すると、エントリーの上限と作業量が大幅に削減されます。

このアセンブリは、私のモジュールと標準モジュールに基づいた既製のオンラインストアであり、最高のパフォーマンス、柔軟性、管理性を提供します。



このアセンブリには既に何がありますか?



  • 請求コンポーネントを追加しました。 注文、支払いなどに関連するすべてのものは、このモジュールに関連付けられています。
  • カートは個別に存在しなくなりました。 バスケットは注文ではありません。 現在、発注されていない注文もデータベースに保存されます。これにより、少なくとも誰が興味を持っているかを確認し、実際のコンバージョン率を決定し、起こりうるエラーを特定できます。
  • Basketコンポーネントは残りましたが、注文自体に関連するほとんどすべてがBillingに転送されました。 バスケットは別のモジュールのままであり、請求では必要最小限のロジックのみが存在します。 計算は、注文、支払いなどのメカニズムです。 請求と相互作用するサードパーティのモジュールに実装できます。
  • ブートストラップを使用した新しいデフォルトのテンプレートが追加され、ロールアップされました。 あらゆる種類のadjaxパンと本格的なJS-API。
  • テーブルドキュメントエディターが追加されました。
  • 注文管理を追加しました。
  • ユーザーアカウント、登録、パスワード変更、パスワード回復などを追加しました。
  • ログインによる登録、パスワードの変更/回復などが設定されます。
  • モジュールmodHybridAuth (ソーシャルネットワーク経由の承認)を追加しました。 これまでのところ、Twitter、Facebook、およびGoogleは明確にテストされていますが、他のものも動作するはずです。
  • 支払いサービスロボカッサが接続されています。
  • 設定されたセキュリティポリシー:

    • コンテンツマネージャー。
    • ストア管理者。
    • 店長;
    • 高度なストアマネージャー。






インストール後、このサイトで次に何をしますか?



テンプレートのコピーを作成し、その中の何かを変更します。 スマートなテンプレート、配列による入力データ、クラス上のすべてのプロセッサ。 つまり、コアに触れることなく、好きなようにサイトをやり直すことができます。



支払いシステムを追加する方法の例


ここでは、キャッシュデスクを介して支払いを行います。タスクは、他の支払い方法を固定することです。 これがどのように行われるかを見てみましょう。



これは、あらゆるタイプの支払いのコアプロセッサです。
<?php /*     .    ,     .         ,         */ abstract class modWebPaymentsCreateProcessor extends modObjectCreateProcessor{ public $classKey = 'Payment'; protected $BillingProcessorsPath; public function checkPermissions() { //     $ok = $this->checkSignature(); if($ok !== true){ $this->error($ok); return false; } return parent::checkPermissions(); } public function initialize(){ $this->BillingProcessorsPath = MODX_CORE_PATH . 'components/billing/processors/'; $this->setDefaultProperties(array( 'currency_id' => $this->modx->getOption('shopmodx.default_currency'), )); if(!$this->getProperty('paysystem_id')){ return $this->error("   ID  "); } return parent::initialize(); } public function beforeSet(){ $this->setProperties(array( "createdby" => $this->modx->user->id ? $this->modx->user->id : null, "date" => time(), )); return parent::beforeSet(); } public function beforeSave(){ if( !$currency_id = (int)$this->getProperty('currency_id') OR !$currency = $this->modx->getObject('modResource', $currency_id) OR ! $currency instanceof ShopmodxResourceCurrency ){ return $this->error("    "); } if( !$paysystem_id = (int)$this->getProperty('paysystem_id') OR !$paysystem = $this->modx->getObject('Paysystem', $paysystem_id) OR ! $paysystem instanceof Paysystem ){ return $this->error("     "); } // ,     ,   ,  //       if($paysys_invoice_id = $this->object->get('paysys_invoice_id')){ if($this->modx->getCount($this->classKey, array( 'paysys_invoice_id' => $paysys_invoice_id, 'paysystem_id' => $paysystem_id, ))){ return $this->error("     ."); } } $this->object->addOne($currency); $this->object->addOne($paysystem); return parent::beforeSave(); } /*    ,           */ abstract protected function checkSignature(); protected function log($msg, $level = null){ if($level === null){ $level = xPDO::LOG_LEVEL_INFO; } $this->modx->log($level, "[Basket - ".__CLASS__."] {$msg}"); $this->modx->log($level, print_r($this->getProperties(), true)); return $msg; } protected function error($msg){ return $this->log($msg, xPDO::LOG_LEVEL_ERROR); } /*    ,    */ public function failure($msg = '',$object = null) { $this->error($msg); if(!empty($this->object) && is_object($this->object)){ $this->error(print_r($this->object->toArray(), true)); } return parent::failure($msg,$object); } public function cleanup() { /* //    ,     */ if($order_id = $this->object->get('order_id')){ $this->modx->runProcessor('mgr/orders/status/pay', array( 'order_id' => $order_id, ), array( 'processors_path' => $this->BillingProcessorsPath, )); //      ,     //    $this->modx->error->reset(); } return $this->success($this->getSuccessMessage(), $this->object); } protected function getSuccessMessage(){ return ''; } } return 'modWebPaymentsCreateProcessor';
      
      







これは抽象的であり、特定の支払いシステムごとに独自の支払い検証メカニズムがあるため、直接呼び出すことはできません。 ただし、このクラスはすでに必要なすべてのロジックを提供しており、拡張するプロセッサに必要なものは1つだけです。支払いの正確性を確認し、金額やその他の支払いデータを設定します。



また、robocash専用の拡張プロセッサは次のとおりです。
 <?php /*     */ require_once dirname(dirname(__FILE__)). '/create.class.php'; class modWebPaymentsRobokassaCreateProcessor extends modWebPaymentsCreateProcessor{ public function initialize(){ $this->setProperties(array( "paysystem_id" => $this->modx->getOption('robokassa.bill_serv_id'), )); return parent::initialize(); } /*     */ protected function checkSignature(){ $mrh_pass2 = $this->modx->getOption('robokassa.mrh_pass2'); // ,      $crc = mb_strtoupper($this->getProperty('SignatureValue')); $out_sum = $this->getProperty('OutSum'); $inv_id = $this->getProperty('InvId'); $shp_aid = $this->getProperty('shp_aid'); $shp_order = $this->getProperty('shp_order', null); $shp_trff = $this->getProperty('shp_trff'); $shp_uid = $this->getProperty('shp_uid'); $my_crc = mb_strtoupper(md5("{$out_sum}:{$inv_id}:{$mrh_pass2}:shp_aid={$shp_aid}:shp_order={$shp_order}:shp_trff={$shp_trff}:shp_uid={$shp_uid}")); $this->modx->log(xPDO::LOG_LEVEL_INFO, "[Robokassa - robokassa.payResult]", print_r($_REQUEST, true)); //    if ($my_crc !=$crc){ $error = "[Robokassa - robokassa.payResult] -  . : '{$crc}'.  : '{$my_crc}'"; $this->modx->log(xPDO::LOG_LEVEL_ERROR, $error); return "bad sign"; } // else $this->setProperties(array( "sum" => $out_sum, "order_id" => $shp_order, "owner" => $shp_uid, "paysys_invoice_id" => $inv_id, )); return true; } protected function getSuccessMessage(){ return 'OK'.$this->getProperty('InvId'); } }
      
      







ご覧のとおり、これはわずか60行のコードです。 ただし、その結果、支払人、支払額、金額などを考慮して支払が行われるだけでなく、注文のステータスが支払済に自動的に変更されます。 そして別の支払い方法を台無しにします-それはほんの数十行です。



まとめ



結果として、結果は実際には非常に悪いエンジンではありません。 柔軟性に加えて、そのパフォーマンスもそれほど悪くないことをすぐに言わなければなりません。 つい最近、40,000個もの商品がすでに店を悩ませていると人々が主張するトピックに出会いました。 私はshopModxで何万もの製品を使って特別なトリックをすることなくお店を作りましたが、すべてうまくいきます。 そして、数十万の商品があったとしても(すでに150,000の商品用に商品を作った)、わずかな変更を加えるだけで、その店は同じくらい引きます。



そして最も重要なこと:このアセンブリは完全に無料です! もちろん、感謝している開発者からの寄付をいつでも受け付けていますが、事実上のエンジンは完全に無料です。



そして最後に、エンジンの簡単な概要と2つのインストール方法を含むビデオ。









UPD:

新しいビルドの利点の1つは、バスケットをデータベースに保存することです。 より正確には、バスケットは、それ自体、独立したエンティティではなくなりましたが、新しい注文の表示に変わりました。 同時に、新しい注文はまだ実行された注文ではありません。



クリック可能





注文のステータスについてもう少し説明します。



新しいもの。 ユーザーが製品をバスケットに追加しようとすると、注文がまだ作成されていない場合、新しい注文が作成され、すぐにこの注文に製品が追加されます。 つまり、ユーザーが認証されておらず、それ以上何もしていなくても、すべての注文がすぐに表示されます。

これにより、マーケティング部門は、店舗の寿命をより明確に確認し、コンバージョンを計算し、ユーザーの行動の考えられる原因を評価できます。



飾られた。 ユーザーがリクエストを作成した場合(つまり、注文を出して住所やその他のデータを示した場合)、注文のステータスは[チェックアウト済み]に変わります。 この瞬間から、マネージャーは自分で注文を取ることができます。 (はい、マルチユーザーの作業がすぐに提供され、さまざまなシナリオが可能になりました。現在、ロジックはマネージャーが新しい注文と注文のみを見るようになっています。 、その後、彼は注文の連絡先の詳細も表示しません)。







有料。 ユーザーがサイトで注文に対して独自に支払いを行うと、注文ステータスは自動的に支払い済みに変わります。



次に、支払済みなど、いくつかの典型的なステータス。





新しい注文の通知はメールで届きます。 (特にユーザーのグループがあり、それぞれが通知を受け取ります)。



UPD2:

これがloadimpact.comテストです。

このテストは無料であり、どこにダウンロードするかはわかりません(ダウンロードが数秒で表示されます)が、誰でもサイトをクリックして、5秒から遠く離れていることを確認できます。 ただし、スケジュールは50クライアントで1つで安定しています。 また、50台のクライアントでさえ、プロセッサは全負荷からはほど遠い状態であり、ほとんどの場合10〜25%、場合によっては50〜70%しか出ません。 (10ドルでdigitalocean.comをホスト)。







UPD3:このコメントの写真。



















UPD4:昨日、ShopModxBoxでウェビナーを開催しました。録音品質はあまり良くありませんでしたが、私もそれを投稿しました(一般的な参考のため)。




All Articles