今回はDoctrineのEntityに関するちょっと難しい話題です。
choiceタイプやentityタイプのフォームでデータベースの内容を表示しようとした時(主にセレクトボックスやチェックボックス)
Entities passed to the choice field must be managed. Maybe persist them in the entity manager?
というエラーが発生することがあります。
エラー内容的には「フォームでエンティティを表示するにはentity managerで管理されている必要があるよ。persistしてみたら?」というようなイメージです。
通常entityタイプのフォームを使用するとデータはEntity Managerによって取得されますのでこういったことは起こりません。
経験則では、もしこのエラーが発生した場合はセッションからエンティティを取り出していないかを確認すると良いです。
例えば商品マスタや受注マスタの上部検索エリアは検索した項目を一時的にセッションに保存する仕様となっていますよね。
商品マスタのコントローラー(Eccube\Controller\Admin\ProductController)の中を良く見ると次のようなコードが存在します。
$searchData = $session->get('eccube.admin.product.search');//セッションから検索条件を取り出している (中略) if (empty($status)) { if (isset($searchData['status']) && count($searchData['status']) > 0) { $status_ids = array(); foreach ($searchData['status'] as $Status) { $status_ids[] = $Status->getId(); } $searchData['status'] = $app['eccube.repository.master.disp']->findBy(array('id' => $status_ids)); } }
この部分ではセッションから取り出した商品の公開・非公開というステータスのエンティティ(Disp)を一度データベースから読み込み直しています。
これはセッションから取り出したエンティティがEntity Managerによって管理されていないために必要となる対応です。
自分で商品マスター等に検索項目を付け足した場合もそれがエンティティであれば復元作業が必要です。
if (!empty($searchData['SomeEntity'])) { $searchData['SomeEntity'] = $app['orm.em']->getRepository('Eccube\Entity\Master\SomeEntity')->find($searchData['SomeEntity']->getId()); }
EC-CUBEに関するお問い合わせ
[重要]現在公式にセキュリティサポートが切れていないPHPは8.1以上、MySQLは8.0以上で、対応しているEC-CUBEバージョンは4.2以上です。古いEC-CUBEを使っている方は適切なタイミングでバージョンアップをご検討ください。