ORMで新しい製品登録するECCUBE3今日もまたコーディング。Codingが大好きだから。RequirementsECCUBE3.0.16Symfony2.7.28PHP5.6.38PHPから商品登録PHPファイルから商品登録をさせるためにあれこれ調べる。persist()がわからなかったので、Symfony2のORMに関する記述を読む。Docs)persist()でいったんため込んで、flush()で実際データベースに書き込む(execute()に似ている)。ProductControllerの254行目付近からを参考に、データを準備する。クラスなどをうまく読み込んでくれないのは、namespaceか何かの問題かと思って調べたけれどわからない。ECCUBE3のWebAPIプラグインのソースがGitHubにあったし、参考になるかも...と見ていくと、オートロードの読み込みがあった。'/../vendor/autoload.php');なるほど。ところが動かしてみると、nullのメソッドを呼んでいる、と怒られた。$appが読み込まれていないことに気がついた。これってどこから来てるんだっけ...と出自をたどると、そもそもメソッドの仮引数で与えられている。...クラス化しないと無理ッ!クラス化なんとかプラグインに組み込んでクラス化してみた。DOCTRINEでは、とりあえずクラスをnewでインスタンス化して、データをsetterで突っ込んでいって、persist()してflush()すればデータベースに書き込まれる、らしいのだが、ECCUBE3では製品の絡みもあるし、なかなかそうはいかないもんだ。$app['eccube.repository.member']->find(2);データをサーバーから欲しい時はこのrepositoryが役に立つ。repositoryがServiceProviderに登録さえされていれば、$appから呼び出してfind()メソッドでオブジェクトを取得できる。セッターでデータをセットして、persist()して、最後にflush()。$app['orm.em']->persist($ProductClass);$app['orm.em']->persist($Product);$app['orm.em']->flush();これがなかなかうまくいかない。あれが足りない、これが足りないというエラーを一つずつ消していく。リポジトリ登録の方法が記述されているのを参考に、プラグインのServiceProviderで登録する。同様にCreatorをセットしておかないとSQLに書き込まれないので、セットしてやる。$app['eccube.repository.member']->find(2);$Product->setCreator($member);$ProductClass->setCreator($member);$ProductStock->setCreator($member);find(2)の2は管理者アカウントのID。Nullのnameが参照できない、とか。次の表示問題を解決しているうちにいつのまにか直った。開発者モードで作業していたのだが......。非公開フラグ15ある商品のうち12しか表示されていない。調べていくと、データベースのdtb_productのstatusが2になっているものだけ表示されていない。公開/非公開のフラグだった。DISPLAY_HIDEを設定しているのを見落としていた。$app['eccube.repository.master.disp']->find(\Eccube\Entity\Master\Disp::DISPLAY_HIDE);//公開・非公開のフラグ1に変更して無事公開。いいけど、「画像をアップロードして登録する」ところがまだなので、これは別記事で。persist/flushしてProductのidを確定。idがないとこの後のproductCategoryの登録ができない。エンジニア文章、写真、デザイン、コーディングまで一通りこなす自走式フルスタックブロガー。読者になる@mogami74をフォローはてなブログをはじめよう!mogami74さんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。