【EC-CUBE 4】オリジナルテーブルに新規データ(レコード)を追加する方法

オリジナルテーブルにレコードを新規追加する方法

データベースに作成したオリジナルテーブルに新しいデータ(レコード)を追加するには?

この記事では、データベースに新規作成したテーブルに、Web上から新しくデータ(レコード)を追加する方法を解説しています。
こちらの記事 の続き(『dtb_Maker』テーブルを新規作成した状態)からの手順となります。)

レコードの更新 / 削除についてはこちら

なお、デバッグモードを設定しておくと、エラーが起きたときに詳細情報が表示されるようになります。
エラー箇所を探しやすくなるので、開発前に設定しておくのをオススメします。
デバッグモードの設定方法については こちらの記事 で解説しています。

【動作環境】
EC CUBEのバージョン:4.1.2
サーバー:Xserver

目次

実装後の状態

メーカー名とメーカーコードを入力し、新規保存できるフォームを埋め込んだページを作成します。

レコード登録前の画面
『ドメイン/maker_register』というメーカー情報登録ページを新規作成

『Register』ボタンをクリックすると、入力した内容でデータが新規に登録されます。

例として、

  • メーカー名:New Company
  • メーカーコード:NC

を入力して登録してみます。

レコード登録後の画面
登録後は「完了しました!」というメッセージを表示

Webページから新規登録後にデータベースを確認すると、新しいメーカー情報が追加されています。

新規レコード登録後のテーブル
『dtb_Maker』テーブルに新規レコードが追加されています。

実装までの手順

『dtb_Maker』テーブルを新規作成した後より、新規データ(レコード)の登録ページの作成から登録するまでの流れを解説します。

新規データ(レコード)を登録するためのページを作成する

まずは新規登録するためのページを作成します。

新規ページはEC-CUBE管理画面から簡単に作成できますが、あとでControllerを修正する必要があり、Controllerも合わせて用意しなければなりません。

具体的には以下記事で解説していますので、本記事では省きます。

作成したページのControllerを修正する

新しくページを用意できたら、「app/Customize/Controller」に保存してあるControllerを以下の通り修正します。

<?php

namespace Customize\Controller;

use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Routing\Annotation\Route;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
use Eccube\Controller\AbstractController;
use Customize\Entity\Maker;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\Extension\Core\Type\SubmitType;

class MakerRegisterController extends AbstractController
{
  /**
   * @Route("/maker_register", name="maker_register")
   * @Template("maker_register.twig")
   */
  public function create(Request $request)
  {
    $maker = new Maker();
    $form = $this->createFormBuilder($maker)
      ->add('name', TextType::class, array('label' => 'メーカー名'))
      ->add('code', TextType::class, array('label' => 'メーカーコード'))
      ->add('save', SubmitType::class, array('label' => 'Register'))
      ->getForm();

    if ($request->getMethod() == 'POST') {
      $form->handleRequest($request);
      $maker = $form->getData();
      $manager = $this->getDoctrine()->getManager();
      $manager->persist($maker);
      $manager->flush();
      return [
        'message' => '登録完了しました!',
        'form' => $form->createView(),
      ];
    } else {
      return [
        'message' => 'メーカー情報を新規登録します。',
        'form' => $form->createView(),
      ];
    }

  }
}
フォームの作成
use Customize\Entity\Maker;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\Extension\Core\Type\SubmitType;

まず、新規データを追加したいEntityを宣言します。
今回は、こちらの記事で用意した「Maker.php」を使用します。

また、使いたいフォームのタイプもここで宣言します。
今回用意したTextTypeとSubmitTypeの他、EmailTypeやIntegerTypeなど多数用意されているので、フォームの種類に応じて追加・修正してください。


$maker = new Maker();
$form = $this->createFormBuilder($maker)
  ->add('name', TextType::class, array('label' => 'メーカー名'))
  ->add('code', TextType::class, array('label' => 'メーカーコード'))
  ->add('save', SubmitType::class, array('label' => 'Register'))
  ->getForm();

こちらの記述でフォームを作成します。
addメソッドの第一引数はテーブルの項目と一致するようにし、第二引数にフォームタイプを、第三引数にラベル名を配列で指定します。登録したい項目の数だけ「->」でaddメソッドを繋ぎます。


なお、フォーム生成箇所はFormTypeと呼ばれる別ファイルに切り分けることもできます。EC-CUBEではContactTypeやOrderTypeなどがデフォルトで多数実装されています。詳しくは こちらの記事 をご覧ください。

またテキストだけでなく、ドロップダウンリスト(プルダウン)や日付などの入力フォームも実装できます。詳しくは以下記事をご覧ください。

データ(レコード)の追加
if ($request->getMethod() == 'POST')

POST送信時(フォーム送信時)、データ(レコード)を追加する処理をこちらに記載します。


$form->handleRequest($request);
$maker = $form->getData();

フォームから受け取ったデータを取り扱うときの決まり文句。
まずhandleRequest($request)で、送信されたフォーム情報を取り扱えるようにします。続いて、getData()で送信されたフォームの値が$makerに格納されます。


$manager = $this->getDoctrine()->getManager();
$manager->persist($maker);
$manager->flush();

「マネージャ」というクラスを使うことで、データ(レコード)の追加や更新、削除ができます。
まずgetDoctrine()->getManager()でマネージャを取得し、persist()メソッドで引数に指定したエンティティを保存します。最後にflush()メソッドで、persistしたエンティティをデータベースに反映させます。

作成したページのTwigを修正する

Controllerから渡された「message」と「form」を表示するだけのシンプルなテンプレートを作成します。
Controllerから渡された情報をTwigで表示する方法については こちらの記事 にて。

{% extends 'default_frame.twig' %}

{% block main %}

<h1>{{ message }}</h1>
{{ form_start(form) }}
{{ form_widget(form) }}
{{ form_end(form) }}

{% endblock %}
フォームの表示
{{ form_start(form) }}

<form>タグ生成に相当するもので、最初に記述します。


{{ form_widget(form) }}

引数のformに組み込まれている、<input>タグ関係がすべて書き出されます。


{{ form_end(form) }}

</form>タグ生成に相当するもので、最後に記述します。

キャッシュの削除

ここまでで準備完了です。
管理画面からキャッシュを削除して、ページにアクセスしてみましょう。

キャッシュ管理からキャッシュを削除できます。

冒頭でお見せしたような登録ページが表示され、ボタンクリックでデータが保存されればOKです!

レコード登録前の画面
メーカー情報の登録画面

【おまけ】管理ユーザーのみアクセスできるようする

本記事で作成したページは、URLさえ知っていれば誰でもアクセス可能で、追加も自由にできてしまいます。

以下記事で、管理画面にログインした場合のみアクセスできるよう制限をかける方法を紹介しています。本記事と合わせての実装がお薦めです。

まとめ

以上、Webページからデータベースに新規データ(レコード)を追加する方法を紹介しました。

様々なクラスやメソッドが出てきて混乱しそうですが、形が決まっている部分も多く、レコードの更新や削除にも応用できます。ぜひ使いこなしてみてください!

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次