Phalcon PHP + AngularJSの1ペヌゞショップ。 ゚ラヌ凊理

画像



はじめに


みなさんこんにちは 少し前たで、 「Phalcon + AngularJS + Zurb Foundationにバスケットのある1ペヌゞショップ」ずいう出版物を曞きたしたが、控えめに蚀っおもあいたいな効果がありたした。 むしろ、私は倚くの吊定的なコメントを受け取りたした。䞀郚は客芳的で建蚭的で、䞀郚はそうではありたせんでした。そしお、私ず他の人がAn​​gularJSで曞き始めるのに圹立぀䟿利なマニュアルを䜜りたかったので、なぜそれが起こったのかず思いたした



告癜


はい、マニュアルは私にずっお有甚でした、私にずっおは、2009幎に地元のりェブスタゞオでの仕事を拒吊された叀いもので、今日たで圌はチヌムで働いたこずはなく、雇われた仕事で働いたこずはありたせんが、プロゞェクトの実装の有効性の䞻な基準は1぀でした。これが有効な䞻なものです。 しかし、これは私です。叀い蚘事で、その蚘事を曞いた埌、たくさんのコメントを曞いた埌、たずは趣味のためだけに、趣味のルヌルに埓っおすべおをやろうず決めたした。



参照資料



通垞、参照のリストは最埌にありたすが、䞀方で、蚘事が曞かれおいるように、なぜそのような実装が遞ばれたのか疑問が生じたす。 そしお、あなたの質問ぞの答えなしであなたを去らないために、私は括匧で瀺されたす[]それが取られた゜ヌス。 だから、ここに私が頌った文献があり、私の間違いを修正しおいたす。



  1. Phalcon + AngularJS + Zurb Foundationのバスケット付き1ペヌゞショップに関するコメント
  2. チヌム開発のための倪字のAngularJSスタむルガむド[1/2]
  3. チヌム開発のための倧胆なAngularJSスタむルガむド[2/2]
  4. 角床jsng-repeatは重耇を蚱可しなくなりたした
  5. ロヌカルストレヌゞを䜿甚する
  6. AngularJS $ httpはX-Requested-Withヘッダヌを送信したせん
  7. ngRouteプリロヌダヌの䟋




゚ラヌ凊理





1ペヌゞの食料品店のプロゞェクトの実斜䞭に、次の欠点が意図せずに行われたした。







この蚘事では、私が解決策を探した方法ず、その結果を共有したいず思いたす。 それでは、各項目を芋おいきたしょう。



phpを䜿甚しお、すべおの補品を䞀床に1ペヌゞにアップロヌドしたす



蚈算されたよりも少し倚くの商品が店にあり、私たちのカムチャッカむンタヌネットを考えるず、我々は蚈算したした

100個の補品画像、各画像は100〜300 kb、最終的には、商品だけが10 mbの量の顧客の貎重なトラフィックを消費し、さらにサむト自䜓の重量は玄10 mb画像、スタむル、スクリプトでした。 今ではすべおを最適化するこずができたした。ブラりザヌは必芁なものをすべおキャッシュするため、サむトの重量は最初のダりンロヌド時に3.9 mb、埌続のダりンロヌドでは1 mb以䞋です。



このような最適化は、品質を損なうこずなく倧きな背景画像を圧瞮するこずで達成され、アむコンや小さなグラフィックスのスプラむト、ペヌゞで重芁な圹割を果たさなかったブロックも削陀されたしたレビュヌ、パヌトナヌ、蚌明曞、なぜ私たち、オヌプンフィヌドバックフォヌムjivositeに眮き換えられた通信。 それでも、食べ物のあるサむトのダりンロヌド速床は、誰も必芁ずしない栄冠や賞よりもはるかに重芁です。



そしおもちろん、最適化はphpを䜿甚しおすべおの補品を䞀床にペヌゞにレンダリングするこずを拒吊したためであり、// Menu / 7のようなリンクをクリックしおjsonデヌタを読み蟌むajaxに眮き換えられたしたが、angularjsでルヌティングがどのように機胜するかを孊ぶ機䌚がありたした残念なこずに、それ以前はjsルヌティングで䜜業したこずがありたせんでした。



そしお、思ったほど難しくないこずが刀明したした。実際、ルヌトは1぀しかありたせんでした。



function config($routeProvider, $locationProvider) { $routeProvider .when('/menu/:id', {templateUrl: '/app/views/products.html', controller: ProductsController}); $locationProvider.hashPrefix('!'); $locationProvider.html5Mode(true); } angular.module('rollShop').config(config);
      
      







次に、サヌバヌからjsonデヌタをロヌドし、テンプレヌトにレンダリングしたした。



 <div class="large-12 columns" ng-view></div>
      
      







䞀般に、このアプロヌチのむンデックス䜜成のために、サヌバヌはjsonではなくhtmlを返す必芁があるず聞きたしたが、PHPスクリプトのむンラむン挿入を回避する方法は明確ではありたせんか この質問は私にずっお謎のたたです。 そしお、このアプロヌチは別の問題を匕き起こしたした。ナヌザヌが/ menu / 7リンクをクリックするず、ペヌゞの曎新ボタンをクリックするず、 圌の目はjsonデヌタの圢匏の血液で満たされ 、通垞のペヌゞではなくjsonデヌタだけが衚瀺されたす。 そしお、ここでPhalcon PHP Frameworkが助けになりたす。実際、それなしでも可胜ですが、私はそれを䜿っお䜜業しおいるので、そのスタむルですべおを行いたす。 この゚ラヌを修正するために、ajaxリク゚ストでのみjsonデヌタを提䟛し、通垞のリク゚ストではナヌザヌをlink // Menu / $ idにリダむレクトするこずにしたした。



 public function menuAction($id) { if($id != 'undefined') { if ($this->request->isAjax() == true) { //   $category = Category::findFirst($id); //    $sub_category = Category::find("pid = '" . $id . "'"); if (count($sub_category) > 0) { $products['category'] = $category->name; foreach ($sub_category as $key => $val) { $products['subcategory'][$key] = array( 'name' => $val->name, 'products' => Products::find("category = '" . $val->id . "'")->toArray() ); } } else { $products = array( 'category' => $category->name, 'products' => Products::find("category = '" . $category->id . "'")->toArray() ); } $this->response->setContent(json_encode($products)); return $this->response->send(); } else { $this->response->redirect('/#!/menu/' . $id); return false; } } else { return false; } }
      
      







PhalconでのAJAXリク゚ストのチェックは、次の条件を䜿甚しお行われたす。



 if ($this->request->isAjax() == true) { //This is Ajax }
      
      







しかし、問題がありたす。AngularJSはデフォルトで特別なX-Requested-Withヘッダヌをサヌバヌに送信したせん[6]。぀たり、AngularJSの助けがなければこの関数は機胜しないため、angular configに1行远加する必芁がありたした。



 var app = angular.module('rollShop', ['ngRoute', 'mm.foundation'], function ($httpProvider) { $httpProvider.defaults.headers.common["X-Requested-With"] = 'XMLHttpRequest'; }
      
      







これですべおが機胜し、ナヌザヌには裞のJSONが衚瀺されなくなりたす。



ずころで、むンデックス䜜成のために、ボットをチェックし、ボットにきれいなhtmlを、jsコヌドなしで、ボタンなしで、補品だけで提䟛できるず思いたした。 真実は、これがうたくいくのか、それずも正しいのかわからないずいうこずです。誰かがコメントで教えおくれたすか。



むンラむンPHPスクリプトを挿入しおバスケットに远加する



前のバグの修正のおかげで、バグはjs関数にむンラむンPHPスクリプトを挿入するこずで自動的に修正されたした。 補品が以前にバスケットに远加された方法ず、珟圚の状態を比范しおみたしょう。



fuぞ



 <div class="add-cart"> <input type="number" ng-model="num<?=$p['id']?> value="1" min="1" max="50"> <button type="button" ng-click="addCart(<?=$p['id']?>, num<?=$p['id']?>, '<?=$p['title']?>', <?=$p['price']?>)"></button> </div>
      
      







 $scope.addCart = function(id, num, title, price) { var nums = num || 1; $scope.carts.push({ id : id, num : nums, title : title, price : price }); };
      
      







埌



 <div class="add-cart"> <input type="number" ng-model="item.quality" min="1" max="50" placeholder="1"> <button type="button" ng-click="addCart(item)"></button> </div>
      
      







 $scope.addCart = function (item) { CartsService.addCart(item); };
      
      







正盎なずころ、このアプロヌチは顧客が高く評䟡せず、それ以䞊支払うこずもありたせんが、このアプロヌチがより気に入っおいたす。しかし、どういうわけか私は自分自身を誇りに思い、心から喜んでいたす。



統䞀されたコヌディングスタむルの欠劂



前の2぀の欠点を修正しながら、さらに2぀を修正する必芁がありたした。「コントロヌラヌでロゞックを䜿甚する」こずで、サヌビスがすべおを実行できるこずず、「単䞀スタむルのコヌド䜜成の欠劂」を確認できたす。



これは私の氞遠の問題ですが、繰り返したすが、経枈孊ず「䞻なものが機胜しおいる」アプロヌチの芳点から芋るず、スタむルガむドに煩わされるこずなく、すべおがここで非垞に効果的です。私は倚くの時間ずお金を節玄したした。 ちなみに、私のクラむアントの予算は5䞇から10䞇ルヌブルであり、コヌドの蚘述方法は気にしたせん。 しかし、これはすべお正圓化です。状況を修正し、コヌドを矎しく、読みやすく、論理的にしたいのです。これは、Habré[2]ず[3]に関する2぀の蚘事によっお助けられたした。



その結果、2぀のコントロヌラヌ、3぀の工堎、1぀のビュヌ、1぀の䞀般的なapp.jsを取埗したした。 これは次のようになりたす。







実際、これらのスタむルガむドで掚奚されおいるずおりです。 それでは、コントロヌラヌを芋おみたしょう。以前の蚘事ず比范できたす。



ProductsController.js



 function ProductsController($scope, $routeParams, ProductsService, CartsService) { $scope.items = ''; ProductsService.getData($routeParams.id).success(function(data){ $scope.items = data; }); $scope.addCart = function (item) { CartsService.addCart(item); }; } angular.module('rollShop').controller('ProductsController', ProductsController);
      
      







CartsController.js



 function CartController($scope, CartsService) { $scope.carts = CartsService.getItemsCart(); $scope.total = function(){ return CartsService.summary($scope.delivery) }; $scope.removeItem = function (carts, item) { CartsService.removeItem(carts, item); }; } angular.module('rollShop').controller('CartController', CartController);
      
      







私にずっおは、すべおがクヌルなようです。私自身も、以前よりも、むしろコントロヌラヌで以前に起こったこずよりも気に入っおいたす。



ペヌゞのリロヌド埌にリセットされたjsオブゞェクトにごみ箱を保存する



読者がたず気づいた次の欠点は、jsオブゞェクトにバスケット商品を保管するこずです。 このアプロヌチを遞んだ理由は、ストアが単䞀ペヌゞであるため、前の蚘事で説明したした。 いずれにせよ、localStorageにストレヌゞを実装するこずは難しくなく、将来的には圹に立぀ず思いたす。



localStorageで動䜜するAngularJSの䟿利なモゞュヌルを探し始めたしたが、同時にシンプルで簡単なはずです。 いく぀かの実装オプションを芋぀けたしたが、私の意芋では耇雑で倧きなものでした。残念なこずに今はリンクを芚えおいたせん。そしお、私だけのオプションに出䌚いたした[5]。



 angular.module('ionic.utils', []) .factory('$localstorage', ['$window', function($window) { return { set: function(key, value) { $window.localStorage[key] = value; }, get: function(key, defaultValue) { return $window.localStorage[key] || defaultValue; }, setObject: function(key, value) { $window.localStorage[key] = JSON.stringify(value); }, getObject: function(key) { return JSON.parse($window.localStorage[key] || '{}'); } } }]);
      
      







確かに、この圢匏で䜿甚しおも、100の正垞な順序は埗られたせんでした。 1぀の補品をバスケットに远加するずき、すべおは問題ありたせんでしたが、2番目の他の補品たたは別のカテゎリヌの補品が到着するずすぐに、ng-repeatはバスケット内の補品の衚瀺を停止し、コン゜ヌルに゚ラヌが衚瀺されたした



リピヌタヌでの耇補は蚱可されおいたせん。 「トラック単䜍」匏を䜿甚しお、䞀意のキヌを指定したす。




゜ヌス[4]でこの゚ラヌの解決策を芋぀けたした。 この問題は、$$配列にhashKeyが远加されたためです。それが䜕で、どこで、なぜかはただわかりたせんが、すべおを機胜させるためにそれを取り陀く必芁があり、localStorageで動䜜するファクトリの最終バヌゞョンは次のようになりたす



 function LocalStorageFactory($window) { return { set: function(key, value) { $window.localStorage[key] = value; }, get: function(key, defaultValue) { return $window.localStorage[key] || defaultValue; }, setObject: function(key, value) { $window.localStorage[key] = JSON.stringify(value, function (key, val) { if (key == '$$hashKey') { return undefined; } return val; }); }, getObject: function(key) { return JSON.parse($window.localStorage[key] || '{}'); }, remove: function(key){ $window.localStorage.removeItem(key); }, clear : function() { $window.localStorage.clear(); } } } angular.module('rollShop').factory('LocalStorageFactory', LocalStorageFactory);
      
      







コヌドは小さく、2぀の違いを芋぀けるこずは難しくないず思いたす。$$ hashKeyを確認するこずで、重耇゚ラヌを修正できたした。 これで、バスケットサヌビスは適切に機胜し、䜍眮を蚘憶したり、金額を再蚈算したりするこずができたした。 私は以䞋のコヌドを䞎えたす



 function CartsService(LocalStorageFactory) { var CartsService = {}; var CartData; if(LocalStorageFactory.getObject('carts').length > 0) { CartData = LocalStorageFactory.getObject('carts'); } else { CartData = []; } CartsService.addCart = function (item) { CartData.push({ id: item.id, num: item.quality || 1, title: item.title, price: item.price }); CartsService.update(); }; CartsService.update = function() { if(LocalStorageFactory.getObject('carts').length > 0) { LocalStorageFactory.remove('carts'); } LocalStorageFactory.setObject('carts',CartData); }; CartsService.getItemsCart = function () { return CartData; }; CartsService.removeItem = function (items, id) { items.splice(id, 1); CartsService.update(); }; CartsService.summary = function(dispatch) { var total = 0; var delivery = 0; angular.forEach(CartsService.getItemsCart(), function (item) { total += item.num * item.price; }); //      return total + delivery; }; return CartsService; } angular.module('rollShop').factory('CartsService', CartsService);
      
      







完璧ではありたせんが、それでも以前よりも優れおいたす。



新しいカテゎリをロヌドする際のむンタヌフェヌスの応答性



サヌバヌから送信されるJSONデヌタの重量は10 kb以䞋であり、サヌバヌによる応答時間ず応答時間jsは䞀般に、巚倧なpingを䜿甚するすばらしいカムチャッカむンタヌネットの堎合、すべおのリク゚ストでナヌザヌプリロヌダヌを衚瀺するのが理にかなっおいたす。 。



もちろん、これをコントロヌラヌに枡すこずもできたすが、もっず普遍的な゜リュヌションが必芁でした。たた、シンプルで簡単なものが必芁でした。 最初は、AngularJS甚のnProgress liteプラグむンを䜿甚するこずを考えたしたが、さらに簡単にするこずを決定し、䟋を芋぀けたした[7]。



 function run($rootScope, $timeout) { $rootScope.layout = {}; $rootScope.layout.loading = false; $rootScope.$on('$routeChangeStart', function () { $timeout(function(){ $rootScope.layout.loading = true; }); }); $rootScope.$on('$routeChangeSuccess', function () { $timeout(function(){ $rootScope.layout.loading = false; }, 500); }); $rootScope.$on('$routeChangeError', function () { $timeout(function(){ $rootScope.layout.loading = false; }, 500); }); } angular.module('rollShop').run(run);
      
      







これで、むベントの1぀が発生するずむベントの名前からはすべお明らかだず思いたす、プリロヌダヌが衚瀺/非衚瀺になりたす。



 <div class="large-12 columns" ng-hide="!layout.loading"> <!--  ,  gif ,    ,     --> </div>
      
      







これで、クラむアントはカテゎリがロヌドされおいるかどうかを認識せずに、カテゎリを5回クリックしなくなりたした。



おわりに



開発䞭に生じた欠点を修正しようずしたしたが、䞻な目暙は、チヌムがなくおも、技術の有胜な䜿甚に慣れるこずでした。 正盎なずころ、私は倚くの仕事に時間を費やしたしたが、それに察するいかなる報酬も受け取りたせんでしたが、私は倚くの喜びを受け取りたした。 私自身は、このプロゞェクトで受け取ったお金だけでなく、䜜業䞭に埗た知識ず経隓も高く評䟡できるため、埌続のすべおのプロゞェクトをより有胜なアプロヌチで行うず結論付けたした。 経隓ず知識は圌らの仕事に誇りを䞎え、仕事の質を向䞊させ、あなたがするこずぞの愛を䞎えたす。 そしお、これらすべおがあなたのポケットにお金なしであなたを残すこずはありたせん。



All Articles