SlideShare a Scribd company logo
Drupal 8
DBに保存して読み込む
2019年7月5日
ホス
目次
1. カスタムモジュールの基礎を作る
→ Hello World
2. フォーム画面を作る
→ DBへ保存する機能を作る
3. 表の表示画面を作る
→ DBから読み込む機能を作る
1.カスタムモジュール
の基礎を作る
カスタムモジュールの基礎を作る
〜このようなものを作ります
〜
カスタムモジュールの基礎を作る
〜ディレクトリの作成〜
• モジュール用のディレクトリを作る
• ソース保存用のディレクトリを作る
mkdir /path/to/drupal/modules/animalbook
cd /path/to/drupal/modules/animalbook
mkdir src
mkdir src/Controller
mkdir src/Form
カスタムモジュールの基礎を作る
〜メタ情報ファイルの作成〜
vim animalbook.info.yml
name: The Animalbook module
type: module
description: 'Animalbook module'
core: 8.x
カスタムモジュールの基礎を作る
~コントローラファイル作成~
vim src/Controller/AnimalbookController.php
<?php
namespace DrupalanimalbookController;
use DrupalCoreControllerControllerBase;
class AnimalbookController extends ControllerBase {
public function content() {
return array(
'#markup' => '' . t('Hello!') . '',
);
}
}
HTMLで Hello! を出力する
class名は
ファイル名と同じ
Drupal8のControllerBaseを継
承
class名は
ファイル名と同じ
カスタムモジュールの基礎を作る
~ルーティングファイル作成~
vim animalbook.routing.yml
animalbook:
path: '/animalbook'
defaults:
_title: 'Animalbook Page'
_controller: 'DrupalanimalbookControllerAnimalbookController::content'
requirements:
_permission: 'access content'
このpathにアクセスしたとき
このcontrollerを呼び出す
「access content」という
デフォルトのロール
カスタムモジュールの基礎を作る
~モジュールインストール~
管理画面
→ 拡張機能
→ インストール
カスタムモジュールの基礎を作る
~Hello World!完成~
AnimalbookController.phpで
書いたとおり
Hello!が表示されている
2.フォーム画面を作る
フォーム画面を作る
〜このようなものを作ります
〜
フォーム画面を作る
〜vim src/Form/InputForm.php〜
• 完成図
vim src/Form/InputForm.php
<?php
namespace DrupalanimalbookForm;
use DrupalCoreFormFormBase;
use DrupalCoreFormFormStateInterface;
use DrupalCoreDatabaseDatabase;
class InputForm extends FormBase {
public function getFormId() {
return 'default_form';
}
public function buildForm(array $form,
FormStateInterface $form_state) {
$typelist = array(
$typelist = array(
'MAMMALS' => t('哺乳類'),
'BIRDS' => t('鳥類'),
'REPTILES' => t('爬虫類'),
'AMPHIBIANS' => t('両生類'),
'FISH' => t('魚類'),
);
public function validateForm(array &$form,
FormStateInterface $form_state) {
parent::validateForm($form, $form_state);
}
public function submitForm(array &$form,
FormStateInterface $form_state) {
// Display result.
foreach ($form_state->getValues() as $key => $value) {
drupal_set_message($key . ': ' . $value);
}
// Save to Database.
$conn = Database::getConnection();
$conn->insert('module_animalbook_data')->fields(
array(
'name' => $form_state->getValue('name'),
'type' => $form_state->getValue('type'),
)
)->execute();
}
}
$form['name'] = array(
'#type' => 'textfield',
'#title' => $this->t('Name'),
'#required' => TRUE,
);
$form['type1'] = array(
'#type' => 'select',
'#title' => 'タイプ',
'#options' => $typelist,
'#required' => TRUE,
);
$form['submit'] = [
'#type' => 'submit',
'#value' => $this->t('Save'),
];
return $form;
}
フォーム画面を作る
〜vim src/Form/InputForm.php〜
• 完成図
vim src/Form/InputForm.php
<?php
namespace DrupalanimalbookForm;
use DrupalCoreFormFormBase;
use DrupalCoreFormFormStateInterface;
use DrupalCoreDatabaseDatabase;
class InputForm extends FormBase {
public function getFormId() {
return 'default_form';
}
public function buildForm(array $form,
FormStateInterface $form_state) {
$typelist = array(
$typelist = array(
'MAMMALS' => t('哺乳類'),
'BIRDS' => t('鳥類'),
'REPTILES' => t('爬虫類'),
'AMPHIBIANS' => t('両生類'),
'FISH' => t('魚類'),
);
public function validateForm(array &$form,
FormStateInterface $form_state) {
parent::validateForm($form, $form_state);
}
public function submitForm(array &$form,
FormStateInterface $form_state) {
// Display result.
foreach ($form_state->getValues() as $key => $value) {
drupal_set_message($key . ': ' . $value);
}
// Save to Database.
$conn = Database::getConnection();
$conn->insert('module_animalbook_data')->fields(
array(
'name' => $form_state->getValue('name'),
'type' => $form_state->getValue('type'),
)
)->execute();
}
}
$form['name'] = array(
'#type' => 'textfield',
'#title' => $this->t('Name'),
'#required' => TRUE,
);
$form['type1'] = array(
'#type' => 'select',
'#title' => 'タイプ',
'#options' => $typelist,
'#required' => TRUE,
);
$form['submit'] = [
'#type' => 'submit',
'#value' => $this->t('Save'),
];
return $form;
}
// Save to Database.
$conn = Database::getConnection();
$conn->insert('module_animalbook_data')->fields(
array(
'name' => $form_state->getValue('name'),
'type' => $form_state->getValue('type'),
)
)->execute();
フォーム画面を作る
〜vim src/Form/InputForm.php〜
• 完成図
vim src/Form/InputForm.php
<?php
namespace DrupalanimalbookForm;
use DrupalCoreFormFormBase;
use DrupalCoreFormFormStateInterface;
use DrupalCoreDatabaseDatabase;
class InputForm extends FormBase {
public function getFormId() {
return 'default_form';
}
public function buildForm(array $form,
FormStateInterface $form_state) {
$typelist = array(
$typelist = array(
'MAMMALS' => t('哺乳類'),
'BIRDS' => t('鳥類'),
'REPTILES' => t('爬虫類'),
'AMPHIBIANS' => t('両生類'),
'FISH' => t('魚類'),
);
public function validateForm(array &$form,
FormStateInterface $form_state) {
parent::validateForm($form, $form_state);
}
public function submitForm(array &$form,
FormStateInterface $form_state) {
// Display result.
foreach ($form_state->getValues() as $key => $value) {
drupal_set_message($key . ': ' . $value);
}
// Save to Database.
$conn = Database::getConnection();
$conn->insert('module_animalbook_data')->fields(
array(
'name' => $form_state->getValue('name'),
'type' => $form_state->getValue('type'),
)
)->execute();
}
}
$form['name'] = array(
'#type' => 'textfield',
'#title' => $this->t('Name'),
'#required' => TRUE,
);
$form['type1'] = array(
'#type' => 'select',
'#title' => 'タイプ',
'#options' => $typelist,
'#required' => TRUE,
);
$form['submit'] = [
'#type' => 'submit',
'#value' => $this->t('Save'),
];
return $form;
}
// Save to Database.
$conn = Database::getConnection();
$conn->insert('module_animalbook_data')->fields(
array(
'name' => $form_state->getValue('name'),
'type' => $form_state->getValue('type'),
)
)->execute();
DBに接続
フォーム画面を作る
〜vim src/Form/InputForm.php〜
• 完成図
vim src/Form/InputForm.php
<?php
namespace DrupalanimalbookForm;
use DrupalCoreFormFormBase;
use DrupalCoreFormFormStateInterface;
use DrupalCoreDatabaseDatabase;
class InputForm extends FormBase {
public function getFormId() {
return 'default_form';
}
public function buildForm(array $form,
FormStateInterface $form_state) {
$typelist = array(
$typelist = array(
'MAMMALS' => t('哺乳類'),
'BIRDS' => t('鳥類'),
'REPTILES' => t('爬虫類'),
'AMPHIBIANS' => t('両生類'),
'FISH' => t('魚類'),
);
public function validateForm(array &$form,
FormStateInterface $form_state) {
parent::validateForm($form, $form_state);
}
public function submitForm(array &$form,
FormStateInterface $form_state) {
// Display result.
foreach ($form_state->getValues() as $key => $value) {
drupal_set_message($key . ': ' . $value);
}
// Save to Database.
$conn = Database::getConnection();
$conn->insert('module_animalbook_data')->fields(
array(
'name' => $form_state->getValue('name'),
'type' => $form_state->getValue('type'),
)
)->execute();
}
}
$form['name'] = array(
'#type' => 'textfield',
'#title' => $this->t('Name'),
'#required' => TRUE,
);
$form['type1'] = array(
'#type' => 'select',
'#title' => 'タイプ',
'#options' => $typelist,
'#required' => TRUE,
);
$form['submit'] = [
'#type' => 'submit',
'#value' => $this->t('Save'),
];
return $form;
}
// Save to Database.
$conn = Database::getConnection();
$conn->insert('module_animalbook_data')->fields(
array(
'name' => $form_state->getValue('name'),
'type' => $form_state->getValue('type'),
)
)->execute();
nameとtypeのフィールドの値を
insert:挿入
フォーム画面を作る
〜vim src/Form/InputForm.php〜
• 完成図
vim src/Form/InputForm.php
<?php
namespace DrupalanimalbookForm;
use DrupalCoreFormFormBase;
use DrupalCoreFormFormStateInterface;
use DrupalCoreDatabaseDatabase;
class InputForm extends FormBase {
public function getFormId() {
return 'default_form';
}
public function buildForm(array $form,
FormStateInterface $form_state) {
$typelist = array(
$typelist = array(
'MAMMALS' => t('哺乳類'),
'BIRDS' => t('鳥類'),
'REPTILES' => t('爬虫類'),
'AMPHIBIANS' => t('両生類'),
'FISH' => t('魚類'),
);
public function validateForm(array &$form,
FormStateInterface $form_state) {
parent::validateForm($form, $form_state);
}
public function submitForm(array &$form,
FormStateInterface $form_state) {
// Display result.
foreach ($form_state->getValues() as $key => $value) {
drupal_set_message($key . ': ' . $value);
}
// Save to Database.
$conn = Database::getConnection();
$conn->insert('module_animalbook_data')->fields(
array(
'name' => $form_state->getValue('name'),
'type' => $form_state->getValue('type'),
)
)->execute();
}
}
$form['name'] = array(
'#type' => 'textfield',
'#title' => $this->t('Name'),
'#required' => TRUE,
);
$form['type1'] = array(
'#type' => 'select',
'#title' => 'タイプ',
'#options' => $typelist,
'#required' => TRUE,
);
$form['submit'] = [
'#type' => 'submit',
'#value' => $this->t('Save'),
];
return $form;
}
// Save to Database.
$conn = Database::getConnection();
$conn->insert('module_animalbook_data')->fields(
array(
'name' => $form_state->getValue('name'),
'type' => $form_state->getValue('type'),
)
)->execute();
実行
フォーム画面を作る
~ルーティングファイル編集~
• 追記する
vim animalbook.routing.yml
animalbook.default_form:
path: '/animalbook/form/input'
defaults:
_form: 'DrupalanimalbookFormInputForm'
_title: 'InputForm'
requirements:
_access: 'TRUE'
このpathにアクセスしたとき
このFormを呼び出す
誰でもアクセス可、ログイン不要
フォーム画面を作る
~DBのテーブル定義作成~
vim animalbook.install
<?php
function animalbook_schema() {
$schema['module_animalbook_data'] = [
'description' => 'Module Animalbook data.',
'fields' => array(
'id' => array(
'description' => 'id',
'type' => 'serial',
'not null' => TRUE,
),
'name' => array(
'description' => 'Character Name',
'type' => 'varchar',
'length' => 256,
'not null' => TRUE,
),
'type' => array(
'description' => 'Type',
'type' => 'varchar',
'length' => 256,
'not null' => TRUE,
),
),
'primary key' => array('id'),
];
return $schema;
}
DBのテーブル名
フォーム画面を作る
~モジュール再インストール~
管理画面
→ 拡張機能
→ アンインストール
フォーム画面を作る
~モジュール再インストール~
管理画面
→ 拡張機能
→ インストール
フォーム画面を作る
~フォームが表示された~
フォーム画面を作る
~フォームが表示された~
フォーム画面を作る
~入力して保存してみる~
•
フォームに入力した内容が
表示されている
フォーム画面を作る
~DBに保存されている~
SQL文
このテーブルのすべてのデータを取得する
id、name、typeが保存されている
mySQLコマンド
3.表の表示画面を作る
フォーム画面を作る
〜このようなものを作ります
〜
• 完成図
表の表示画面を作る
~表を表示するForm作成~
vim src/Form/ListForm.php
<?php
namespace DrupalanimalbookForm;
use DrupalCoreFormFormBase;
use DrupalCoreFormFormStateInterface;
use DrupalCoreDatabaseDatabase;
class ListForm extends FormBase {
function __construct() {
}
public function getFormId() {
return 'default_form';
}
// Initialize an empty array
$output = array();
// Next, loop through the $results array
foreach ($results as $result) {
$output[$result->id] = [
'id' => $result->id,
'name' => $result->name,
'type' => $result->type,
];
}
$form['table'] = [
'#type' => 'tableselect',
'#header' => $header,
'#options' => $output,
'#empty' => t('No users found'),
];
return $form;
}
public function buildForm(array $form,
FormStateInterface $form_state) {
//データベースからデータを取得する
$conn = Database::getConnection();
$query = $conn
->select('module_animalbook_data', 'x')
->fields('x', array('id', 'name', 'type'));
$data = $query->execute();
//条件に合致するものを配列にして返す
#$result = $data->fetchCol();
$results = $data->fetchAll();
//var_dump($results);
//ヘッダー作成
$header = [
'id' => t('ID'),
'name' => t('Name'),
'type' => t('Type'),
];
• 完成図
<?php
namespace DrupalanimalbookForm;
use DrupalCoreFormFormBase;
use DrupalCoreFormFormStateInterface;
use DrupalCoreDatabaseDatabase;
class ListForm extends FormBase {
function __construct() {
}
public function getFormId() {
return 'default_form';
}
// Initialize an empty array
$output = array();
// Next, loop through the $results array
foreach ($results as $result) {
$output[$result->id] = [
'id' => $result->id,
'name' => $result->name,
'type' => $result->type,
];
}
$form['table'] = [
'#type' => 'tableselect',
'#header' => $header,
'#options' => $output,
'#empty' => t('No users found'),
];
return $form;
}
public function buildForm(array $form,
FormStateInterface $form_state) {
//データベースからデータを取得する
$conn = Database::getConnection();
$query = $conn
->select('module_animalbook_data', 'x')
->fields('x', array('id', 'name', 'type'));
$data = $query->execute();
//条件に合致するものを配列にして返す
#$result = $data->fetchCol();
$results = $data->fetchAll();
//var_dump($results);
//ヘッダー作成
$header = [
'id' => t('ID'),
'name' => t('Name'),
'type' => t('Type'),
];
表の表示画面を作る
~表を表示するForm作成~
vim src/Form/ListForm.php
//データベースからデータを取得する
$conn = Database::getConnection();
$query = $conn
->select('module_animalbook_data', 'x')
->fields('x', array('id', 'name', 'type'));
$data = $query->execute();
• 完成図
<?php
namespace DrupalanimalbookForm;
use DrupalCoreFormFormBase;
use DrupalCoreFormFormStateInterface;
use DrupalCoreDatabaseDatabase;
class ListForm extends FormBase {
function __construct() {
}
public function getFormId() {
return 'default_form';
}
// Initialize an empty array
$output = array();
// Next, loop through the $results array
foreach ($results as $result) {
$output[$result->id] = [
'id' => $result->id,
'name' => $result->name,
'type' => $result->type,
];
}
$form['table'] = [
'#type' => 'tableselect',
'#header' => $header,
'#options' => $output,
'#empty' => t('No users found'),
];
return $form;
}
public function buildForm(array $form,
FormStateInterface $form_state) {
//データベースからデータを取得する
$conn = Database::getConnection();
$query = $conn
->select('module_animalbook_data', 'x')
->fields('x', array('id', 'name', 'type'));
$data = $query->execute();
//条件に合致するものを配列にして返す
#$result = $data->fetchCol();
$results = $data->fetchAll();
//var_dump($results);
//ヘッダー作成
$header = [
'id' => t('ID'),
'name' => t('Name'),
'type' => t('Type'),
];
表の表示画面を作る
~表を表示するForm作成~
vim src/Form/ListForm.php
//データベースからデータを取得する
$conn = Database::getConnection();
$query = $conn
->select('module_animalbook_data', 'x')
->fields('x', array('id', 'name', 'type'));
$data = $query->execute();
DBに接続
• 完成図
<?php
namespace DrupalanimalbookForm;
use DrupalCoreFormFormBase;
use DrupalCoreFormFormStateInterface;
use DrupalCoreDatabaseDatabase;
class ListForm extends FormBase {
function __construct() {
}
public function getFormId() {
return 'default_form';
}
// Initialize an empty array
$output = array();
// Next, loop through the $results array
foreach ($results as $result) {
$output[$result->id] = [
'id' => $result->id,
'name' => $result->name,
'type' => $result->type,
];
}
$form['table'] = [
'#type' => 'tableselect',
'#header' => $header,
'#options' => $output,
'#empty' => t('No users found'),
];
return $form;
}
public function buildForm(array $form,
FormStateInterface $form_state) {
//データベースからデータを取得する
$conn = Database::getConnection();
$query = $conn
->select('module_animalbook_data', 'x')
->fields('x', array('id', 'name', 'type'));
$data = $query->execute();
//条件に合致するものを配列にして返す
#$result = $data->fetchCol();
$results = $data->fetchAll();
//var_dump($results);
//ヘッダー作成
$header = [
'id' => t('ID'),
'name' => t('Name'),
'type' => t('Type'),
];
表の表示画面を作る
~表を表示するForm作成~
vim src/Form/ListForm.php
//データベースからデータを取得する
$conn = Database::getConnection();
$query = $conn
->select('module_animalbook_data', 'x')
->fields('x', array('id', 'name', 'type'));
$data = $query->execute();
SQLのクエリを作成
select:検索
• 完成図
<?php
namespace DrupalanimalbookForm;
use DrupalCoreFormFormBase;
use DrupalCoreFormFormStateInterface;
use DrupalCoreDatabaseDatabase;
class ListForm extends FormBase {
function __construct() {
}
public function getFormId() {
return 'default_form';
}
// Initialize an empty array
$output = array();
// Next, loop through the $results array
foreach ($results as $result) {
$output[$result->id] = [
'id' => $result->id,
'name' => $result->name,
'type' => $result->type,
];
}
$form['table'] = [
'#type' => 'tableselect',
'#header' => $header,
'#options' => $output,
'#empty' => t('No users found'),
];
return $form;
}
public function buildForm(array $form,
FormStateInterface $form_state) {
//データベースからデータを取得する
$conn = Database::getConnection();
$query = $conn
->select('module_animalbook_data', 'x')
->fields('x', array('id', 'name', 'type'));
$data = $query->execute();
//条件に合致するものを配列にして返す
#$result = $data->fetchCol();
$results = $data->fetchAll();
//var_dump($results);
//ヘッダー作成
$header = [
'id' => t('ID'),
'name' => t('Name'),
'type' => t('Type'),
];
表の表示画面を作る
~表を表示するForm作成~
vim src/Form/ListForm.php
//データベースからデータを取得する
$conn = Database::getConnection();
$query = $conn
->select('module_animalbook_data', 'x')
->fields('x', array('id', 'name', 'type'));
$data = $query->execute();
DBへの問い合わせを実行
表の表示画面を作る
~ルーティングファイル編集~
• 追記する
vim animalbook.routing.yml
animalbook.list_form:
path: '/animalbook/form/list'
defaults:
_form: 'DrupalanimalbookFormListForm'
_title: 'ListForm'
requirements:
_access: 'TRUE'
このpathにアクセスしたとき
このFormを呼び出す
誰でもアクセス可、ログイン不要
フォーム画面を作る
~ページが表示されない?~
• ページが
見つからない!
• URLは
合ってるのに!
フォーム画面を作る
~キャッシュクリアが必要~
• ルーティングファイル
を変更したらクリア
• 管理画面
→ 環境設定
→ パフォーマンス
キャッシュクリアを実行
表の表示画面を作る
~フォームが表示された~
表の表示画面を作る
~フォームが表示された~
疑問・課題
• ルーティングファイルの「_access」で指定する
「access contents」と「TRUE」はどう違う?
• ViewのPHPソースには無駄がありそう
ソースをもっと理解して、リファクタリング
ご清聴
ありがとうございました

More Related Content

What's hot

Yahoo!ボックスAPI Hackday資料
Yahoo!ボックスAPI Hackday資料Yahoo!ボックスAPI Hackday資料
Yahoo!ボックスAPI Hackday資料
Yahoo!デベロッパーネットワーク
 
プロになるためのJavaScript入門読書会 レジュメ
プロになるためのJavaScript入門読書会 レジュメプロになるためのJavaScript入門読書会 レジュメ
プロになるためのJavaScript入門読書会 レジュメNorito Agetsuma
 
iOSハンズオントレーニング データの永続化編(SQLite3, NSUserDefaults)
iOSハンズオントレーニング データの永続化編(SQLite3, NSUserDefaults)iOSハンズオントレーニング データの永続化編(SQLite3, NSUserDefaults)
iOSハンズオントレーニング データの永続化編(SQLite3, NSUserDefaults)
聡 大久保
 
2012 keynote-2
2012 keynote-22012 keynote-2
2012 keynote-2
kmiyako
 
「スピード」と「品質」を実現するPHP開発チームの取り組み~AngularJS+FuelPHP+AspectMock~
「スピード」と「品質」を実現するPHP開発チームの取り組み~AngularJS+FuelPHP+AspectMock~「スピード」と「品質」を実現するPHP開発チームの取り組み~AngularJS+FuelPHP+AspectMock~
「スピード」と「品質」を実現するPHP開発チームの取り組み~AngularJS+FuelPHP+AspectMock~
leverages_event
 
俺のフックがこんなに簡単なわけがない。
俺のフックがこんなに簡単なわけがない。俺のフックがこんなに簡単なわけがない。
俺のフックがこんなに簡単なわけがない。Hishikawa Takuro
 
Django boodoo
Django boodooDjango boodoo
Django boodoo
泰 増田
 
第一回Miim勉強会
第一回Miim勉強会第一回Miim勉強会
第一回Miim勉強会
Yuri Kawamoto
 
大ざっぱにオブジェクト指向
大ざっぱにオブジェクト指向大ざっぱにオブジェクト指向
大ざっぱにオブジェクト指向
azuma satoshi
 
CakePHP でお小遣い帳をつくってみよう
CakePHP でお小遣い帳をつくってみようCakePHP でお小遣い帳をつくってみよう
CakePHP でお小遣い帳をつくってみよう
Tomo Mizoe
 
PHP classの教室
PHP classの教室PHP classの教室
PHP classの教室
Yusuke Ando
 
CakePHP+Smartyハイブリッドによるラクラク開発
CakePHP+Smartyハイブリッドによるラクラク開発CakePHP+Smartyハイブリッドによるラクラク開発
CakePHP+Smartyハイブリッドによるラクラク開発
Shinzo SAITO
 
swooleを試してみた
swooleを試してみたswooleを試してみた
swooleを試してみた
Yukihiro Katsumi
 
【アシアル塾】PHPオブジェクト指向再入門・第一回クラスとオブジェクト
【アシアル塾】PHPオブジェクト指向再入門・第一回クラスとオブジェクト【アシアル塾】PHPオブジェクト指向再入門・第一回クラスとオブジェクト
【アシアル塾】PHPオブジェクト指向再入門・第一回クラスとオブジェクト
Yuki Okamoto
 

What's hot (16)

Yahoo!ボックスAPI Hackathon向け資料
Yahoo!ボックスAPI Hackathon向け資料Yahoo!ボックスAPI Hackathon向け資料
Yahoo!ボックスAPI Hackathon向け資料
 
Yahoo!ボックスAPI Hackday資料
Yahoo!ボックスAPI Hackday資料Yahoo!ボックスAPI Hackday資料
Yahoo!ボックスAPI Hackday資料
 
プロになるためのJavaScript入門読書会 レジュメ
プロになるためのJavaScript入門読書会 レジュメプロになるためのJavaScript入門読書会 レジュメ
プロになるためのJavaScript入門読書会 レジュメ
 
iOSハンズオントレーニング データの永続化編(SQLite3, NSUserDefaults)
iOSハンズオントレーニング データの永続化編(SQLite3, NSUserDefaults)iOSハンズオントレーニング データの永続化編(SQLite3, NSUserDefaults)
iOSハンズオントレーニング データの永続化編(SQLite3, NSUserDefaults)
 
2012 keynote-2
2012 keynote-22012 keynote-2
2012 keynote-2
 
OSC京都2011
OSC京都2011OSC京都2011
OSC京都2011
 
「スピード」と「品質」を実現するPHP開発チームの取り組み~AngularJS+FuelPHP+AspectMock~
「スピード」と「品質」を実現するPHP開発チームの取り組み~AngularJS+FuelPHP+AspectMock~「スピード」と「品質」を実現するPHP開発チームの取り組み~AngularJS+FuelPHP+AspectMock~
「スピード」と「品質」を実現するPHP開発チームの取り組み~AngularJS+FuelPHP+AspectMock~
 
俺のフックがこんなに簡単なわけがない。
俺のフックがこんなに簡単なわけがない。俺のフックがこんなに簡単なわけがない。
俺のフックがこんなに簡単なわけがない。
 
Django boodoo
Django boodooDjango boodoo
Django boodoo
 
第一回Miim勉強会
第一回Miim勉強会第一回Miim勉強会
第一回Miim勉強会
 
大ざっぱにオブジェクト指向
大ざっぱにオブジェクト指向大ざっぱにオブジェクト指向
大ざっぱにオブジェクト指向
 
CakePHP でお小遣い帳をつくってみよう
CakePHP でお小遣い帳をつくってみようCakePHP でお小遣い帳をつくってみよう
CakePHP でお小遣い帳をつくってみよう
 
PHP classの教室
PHP classの教室PHP classの教室
PHP classの教室
 
CakePHP+Smartyハイブリッドによるラクラク開発
CakePHP+Smartyハイブリッドによるラクラク開発CakePHP+Smartyハイブリッドによるラクラク開発
CakePHP+Smartyハイブリッドによるラクラク開発
 
swooleを試してみた
swooleを試してみたswooleを試してみた
swooleを試してみた
 
【アシアル塾】PHPオブジェクト指向再入門・第一回クラスとオブジェクト
【アシアル塾】PHPオブジェクト指向再入門・第一回クラスとオブジェクト【アシアル塾】PHPオブジェクト指向再入門・第一回クラスとオブジェクト
【アシアル塾】PHPオブジェクト指向再入門・第一回クラスとオブジェクト
 

Similar to Drupal8 DBに保存して読み込む

WordPress のキャッシュ機構
WordPress のキャッシュ機構WordPress のキャッシュ機構
WordPress のキャッシュ機構
katanyan
 
WordPressで提供するWeb API
WordPressで提供するWeb APIWordPressで提供するWeb API
WordPressで提供するWeb APIYuko Toriyama
 
PHP Object Injection入門
PHP Object Injection入門PHP Object Injection入門
PHP Object Injection入門
Yu Iwama
 
ISUCONで学ぶ Webアプリケーションのパフォーマンス向上のコツ 実践編 完全版
ISUCONで学ぶ Webアプリケーションのパフォーマンス向上のコツ 実践編 完全版ISUCONで学ぶ Webアプリケーションのパフォーマンス向上のコツ 実践編 完全版
ISUCONで学ぶ Webアプリケーションのパフォーマンス向上のコツ 実践編 完全版Masahiro Nagano
 
Teclab3
Teclab3Teclab3
BACKBONE.JSでMVC始めませんか?
BACKBONE.JSでMVC始めませんか?BACKBONE.JSでMVC始めませんか?
BACKBONE.JSでMVC始めませんか?
Toshio Ehara
 
20170923 excelユーザーのためのr入門
20170923 excelユーザーのためのr入門20170923 excelユーザーのためのr入門
20170923 excelユーザーのためのr入門
Takashi Kitano
 
Mojoliciousをウェブ制作現場で使ってみてる
Mojoliciousをウェブ制作現場で使ってみてるMojoliciousをウェブ制作現場で使ってみてる
Mojoliciousをウェブ制作現場で使ってみてるjamadam
 

Similar to Drupal8 DBに保存して読み込む (8)

WordPress のキャッシュ機構
WordPress のキャッシュ機構WordPress のキャッシュ機構
WordPress のキャッシュ機構
 
WordPressで提供するWeb API
WordPressで提供するWeb APIWordPressで提供するWeb API
WordPressで提供するWeb API
 
PHP Object Injection入門
PHP Object Injection入門PHP Object Injection入門
PHP Object Injection入門
 
ISUCONで学ぶ Webアプリケーションのパフォーマンス向上のコツ 実践編 完全版
ISUCONで学ぶ Webアプリケーションのパフォーマンス向上のコツ 実践編 完全版ISUCONで学ぶ Webアプリケーションのパフォーマンス向上のコツ 実践編 完全版
ISUCONで学ぶ Webアプリケーションのパフォーマンス向上のコツ 実践編 完全版
 
Teclab3
Teclab3Teclab3
Teclab3
 
BACKBONE.JSでMVC始めませんか?
BACKBONE.JSでMVC始めませんか?BACKBONE.JSでMVC始めませんか?
BACKBONE.JSでMVC始めませんか?
 
20170923 excelユーザーのためのr入門
20170923 excelユーザーのためのr入門20170923 excelユーザーのためのr入門
20170923 excelユーザーのためのr入門
 
Mojoliciousをウェブ制作現場で使ってみてる
Mojoliciousをウェブ制作現場で使ってみてるMojoliciousをウェブ制作現場で使ってみてる
Mojoliciousをウェブ制作現場で使ってみてる
 

More from iPride Co., Ltd.

MPAなWebフレームワーク、Astroの紹介 (その2) 2024/05/24の勉強会で発表されたものです。
MPAなWebフレームワーク、Astroの紹介 (その2) 2024/05/24の勉強会で発表されたものです。MPAなWebフレームワーク、Astroの紹介 (その2) 2024/05/24の勉強会で発表されたものです。
MPAなWebフレームワーク、Astroの紹介 (その2) 2024/05/24の勉強会で発表されたものです。
iPride Co., Ltd.
 
MPAなWebフレームワーク、Astroの紹介 (その1) 2024/05/17の勉強会で発表されたものです。
MPAなWebフレームワーク、Astroの紹介 (その1) 2024/05/17の勉強会で発表されたものです。MPAなWebフレームワーク、Astroの紹介 (その1) 2024/05/17の勉強会で発表されたものです。
MPAなWebフレームワーク、Astroの紹介 (その1) 2024/05/17の勉強会で発表されたものです。
iPride Co., Ltd.
 
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
iPride Co., Ltd.
 
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
iPride Co., Ltd.
 
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半        2024/04/26の勉強会で発表されたものです。新人研修 後半        2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。
iPride Co., Ltd.
 
SOPを理解する 2024/04/19 の勉強会で発表されたものです
SOPを理解する       2024/04/19 の勉強会で発表されたものですSOPを理解する       2024/04/19 の勉強会で発表されたものです
SOPを理解する 2024/04/19 の勉強会で発表されたものです
iPride Co., Ltd.
 
新人研修のまとめ 2024/04/12の勉強会で発表されたものです。
新人研修のまとめ       2024/04/12の勉強会で発表されたものです。新人研修のまとめ       2024/04/12の勉強会で発表されたものです。
新人研修のまとめ 2024/04/12の勉強会で発表されたものです。
iPride Co., Ltd.
 
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
iPride Co., Ltd.
 
AWS_Bedrock入門 このスライドは2024/03/08の勉強会で発表されたものです。
AWS_Bedrock入門 このスライドは2024/03/08の勉強会で発表されたものです。AWS_Bedrock入門 このスライドは2024/03/08の勉強会で発表されたものです。
AWS_Bedrock入門 このスライドは2024/03/08の勉強会で発表されたものです。
iPride Co., Ltd.
 
AWS Lambdaと AWS API Gatewayを使ったREST API作り
AWS Lambdaと AWS API Gatewayを使ったREST API作りAWS Lambdaと AWS API Gatewayを使ったREST API作り
AWS Lambdaと AWS API Gatewayを使ったREST API作り
iPride Co., Ltd.
 
AWS (Amazon Web Services) を勉強してみる その3 2024/03/01の勉強会で発表されたものです。
AWS (Amazon Web Services) を勉強してみる その3 2024/03/01の勉強会で発表されたものです。AWS (Amazon Web Services) を勉強してみる その3 2024/03/01の勉強会で発表されたものです。
AWS (Amazon Web Services) を勉強してみる その3 2024/03/01の勉強会で発表されたものです。
iPride Co., Ltd.
 
AWS (Amazon Web Services) を勉強してみる おさらい 2024/02/16の勉強会で発表されたものです。
AWS (Amazon Web Services) を勉強してみる おさらい 2024/02/16の勉強会で発表されたものです。AWS (Amazon Web Services) を勉強してみる おさらい 2024/02/16の勉強会で発表されたものです。
AWS (Amazon Web Services) を勉強してみる おさらい 2024/02/16の勉強会で発表されたものです。
iPride Co., Ltd.
 
可用性・セキュリティを考慮して AWSでDrupalを構築する 2024/02/09の勉強会で発表されたものです。
可用性・セキュリティを考慮して AWSでDrupalを構築する 2024/02/09の勉強会で発表されたものです。可用性・セキュリティを考慮して AWSでDrupalを構築する 2024/02/09の勉強会で発表されたものです。
可用性・セキュリティを考慮して AWSでDrupalを構築する 2024/02/09の勉強会で発表されたものです。
iPride Co., Ltd.
 
AWSで全てのパブリックIPv4アドレスが有料になった件について 2024/02/09の勉強会で発表されたものです。
AWSで全てのパブリックIPv4アドレスが有料になった件について 2024/02/09の勉強会で発表されたものです。AWSで全てのパブリックIPv4アドレスが有料になった件について 2024/02/09の勉強会で発表されたものです。
AWSで全てのパブリックIPv4アドレスが有料になった件について 2024/02/09の勉強会で発表されたものです。
iPride Co., Ltd.
 
AWS CDKを使おうとしたら普通に悪戦苦闘した話 2024/02/02の勉強会で発表されたものです。
AWS CDKを使おうとしたら普通に悪戦苦闘した話 2024/02/02の勉強会で発表されたものです。AWS CDKを使おうとしたら普通に悪戦苦闘した話 2024/02/02の勉強会で発表されたものです。
AWS CDKを使おうとしたら普通に悪戦苦闘した話 2024/02/02の勉強会で発表されたものです。
iPride Co., Ltd.
 
AWS (Amazon Web Services) を勉強してみる 2024/01/26の勉強会で発表されたものです
AWS (Amazon Web Services) を勉強してみる 2024/01/26の勉強会で発表されたものですAWS (Amazon Web Services) を勉強してみる 2024/01/26の勉強会で発表されたものです
AWS (Amazon Web Services) を勉強してみる 2024/01/26の勉強会で発表されたものです
iPride Co., Ltd.
 
AWS SAM入門 2024/01/26の勉強会で発表されたものです【アイ・プライド】
AWS SAM入門  2024/01/26の勉強会で発表されたものです【アイ・プライド】AWS SAM入門  2024/01/26の勉強会で発表されたものです【アイ・プライド】
AWS SAM入門 2024/01/26の勉強会で発表されたものです【アイ・プライド】
iPride Co., Ltd.
 
Drupalでフォームの代わりにSPA (React) を表示させる話 2023/12/15の勉強会で発表されたものです。
Drupalでフォームの代わりにSPA (React) を表示させる話 2023/12/15の勉強会で発表されたものです。Drupalでフォームの代わりにSPA (React) を表示させる話 2023/12/15の勉強会で発表されたものです。
Drupalでフォームの代わりにSPA (React) を表示させる話 2023/12/15の勉強会で発表されたものです。
iPride Co., Ltd.
 
ChatGPTを用いてCDKを勉強
ChatGPTを用いてCDKを勉強ChatGPTを用いてCDKを勉強
ChatGPTを用いてCDKを勉強
iPride Co., Ltd.
 
OpenID Connectについて
OpenID ConnectについてOpenID Connectについて
OpenID Connectについて
iPride Co., Ltd.
 

More from iPride Co., Ltd. (20)

MPAなWebフレームワーク、Astroの紹介 (その2) 2024/05/24の勉強会で発表されたものです。
MPAなWebフレームワーク、Astroの紹介 (その2) 2024/05/24の勉強会で発表されたものです。MPAなWebフレームワーク、Astroの紹介 (その2) 2024/05/24の勉強会で発表されたものです。
MPAなWebフレームワーク、Astroの紹介 (その2) 2024/05/24の勉強会で発表されたものです。
 
MPAなWebフレームワーク、Astroの紹介 (その1) 2024/05/17の勉強会で発表されたものです。
MPAなWebフレームワーク、Astroの紹介 (その1) 2024/05/17の勉強会で発表されたものです。MPAなWebフレームワーク、Astroの紹介 (その1) 2024/05/17の勉強会で発表されたものです。
MPAなWebフレームワーク、Astroの紹介 (その1) 2024/05/17の勉強会で発表されたものです。
 
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
 
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
 
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半        2024/04/26の勉強会で発表されたものです。新人研修 後半        2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。
 
SOPを理解する 2024/04/19 の勉強会で発表されたものです
SOPを理解する       2024/04/19 の勉強会で発表されたものですSOPを理解する       2024/04/19 の勉強会で発表されたものです
SOPを理解する 2024/04/19 の勉強会で発表されたものです
 
新人研修のまとめ 2024/04/12の勉強会で発表されたものです。
新人研修のまとめ       2024/04/12の勉強会で発表されたものです。新人研修のまとめ       2024/04/12の勉強会で発表されたものです。
新人研修のまとめ 2024/04/12の勉強会で発表されたものです。
 
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
 
AWS_Bedrock入門 このスライドは2024/03/08の勉強会で発表されたものです。
AWS_Bedrock入門 このスライドは2024/03/08の勉強会で発表されたものです。AWS_Bedrock入門 このスライドは2024/03/08の勉強会で発表されたものです。
AWS_Bedrock入門 このスライドは2024/03/08の勉強会で発表されたものです。
 
AWS Lambdaと AWS API Gatewayを使ったREST API作り
AWS Lambdaと AWS API Gatewayを使ったREST API作りAWS Lambdaと AWS API Gatewayを使ったREST API作り
AWS Lambdaと AWS API Gatewayを使ったREST API作り
 
AWS (Amazon Web Services) を勉強してみる その3 2024/03/01の勉強会で発表されたものです。
AWS (Amazon Web Services) を勉強してみる その3 2024/03/01の勉強会で発表されたものです。AWS (Amazon Web Services) を勉強してみる その3 2024/03/01の勉強会で発表されたものです。
AWS (Amazon Web Services) を勉強してみる その3 2024/03/01の勉強会で発表されたものです。
 
AWS (Amazon Web Services) を勉強してみる おさらい 2024/02/16の勉強会で発表されたものです。
AWS (Amazon Web Services) を勉強してみる おさらい 2024/02/16の勉強会で発表されたものです。AWS (Amazon Web Services) を勉強してみる おさらい 2024/02/16の勉強会で発表されたものです。
AWS (Amazon Web Services) を勉強してみる おさらい 2024/02/16の勉強会で発表されたものです。
 
可用性・セキュリティを考慮して AWSでDrupalを構築する 2024/02/09の勉強会で発表されたものです。
可用性・セキュリティを考慮して AWSでDrupalを構築する 2024/02/09の勉強会で発表されたものです。可用性・セキュリティを考慮して AWSでDrupalを構築する 2024/02/09の勉強会で発表されたものです。
可用性・セキュリティを考慮して AWSでDrupalを構築する 2024/02/09の勉強会で発表されたものです。
 
AWSで全てのパブリックIPv4アドレスが有料になった件について 2024/02/09の勉強会で発表されたものです。
AWSで全てのパブリックIPv4アドレスが有料になった件について 2024/02/09の勉強会で発表されたものです。AWSで全てのパブリックIPv4アドレスが有料になった件について 2024/02/09の勉強会で発表されたものです。
AWSで全てのパブリックIPv4アドレスが有料になった件について 2024/02/09の勉強会で発表されたものです。
 
AWS CDKを使おうとしたら普通に悪戦苦闘した話 2024/02/02の勉強会で発表されたものです。
AWS CDKを使おうとしたら普通に悪戦苦闘した話 2024/02/02の勉強会で発表されたものです。AWS CDKを使おうとしたら普通に悪戦苦闘した話 2024/02/02の勉強会で発表されたものです。
AWS CDKを使おうとしたら普通に悪戦苦闘した話 2024/02/02の勉強会で発表されたものです。
 
AWS (Amazon Web Services) を勉強してみる 2024/01/26の勉強会で発表されたものです
AWS (Amazon Web Services) を勉強してみる 2024/01/26の勉強会で発表されたものですAWS (Amazon Web Services) を勉強してみる 2024/01/26の勉強会で発表されたものです
AWS (Amazon Web Services) を勉強してみる 2024/01/26の勉強会で発表されたものです
 
AWS SAM入門 2024/01/26の勉強会で発表されたものです【アイ・プライド】
AWS SAM入門  2024/01/26の勉強会で発表されたものです【アイ・プライド】AWS SAM入門  2024/01/26の勉強会で発表されたものです【アイ・プライド】
AWS SAM入門 2024/01/26の勉強会で発表されたものです【アイ・プライド】
 
Drupalでフォームの代わりにSPA (React) を表示させる話 2023/12/15の勉強会で発表されたものです。
Drupalでフォームの代わりにSPA (React) を表示させる話 2023/12/15の勉強会で発表されたものです。Drupalでフォームの代わりにSPA (React) を表示させる話 2023/12/15の勉強会で発表されたものです。
Drupalでフォームの代わりにSPA (React) を表示させる話 2023/12/15の勉強会で発表されたものです。
 
ChatGPTを用いてCDKを勉強
ChatGPTを用いてCDKを勉強ChatGPTを用いてCDKを勉強
ChatGPTを用いてCDKを勉強
 
OpenID Connectについて
OpenID ConnectについてOpenID Connectについて
OpenID Connectについて
 

Recently uploaded

YugabyteDB適用に向けた取り組みと隠れた魅力 (DSS Asia 2024 発表資料)
YugabyteDB適用に向けた取り組みと隠れた魅力 (DSS Asia 2024 発表資料)YugabyteDB適用に向けた取り組みと隠れた魅力 (DSS Asia 2024 発表資料)
YugabyteDB適用に向けた取り組みと隠れた魅力 (DSS Asia 2024 発表資料)
NTT DATA Technology & Innovation
 
FIDO Alliance Osaka Seminar: NEC & Yubico Panel.pdf
FIDO Alliance Osaka Seminar: NEC & Yubico Panel.pdfFIDO Alliance Osaka Seminar: NEC & Yubico Panel.pdf
FIDO Alliance Osaka Seminar: NEC & Yubico Panel.pdf
FIDO Alliance
 
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアルLoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
CRI Japan, Inc.
 
FIDO Alliance Osaka Seminar: CloudGate.pdf
FIDO Alliance Osaka Seminar: CloudGate.pdfFIDO Alliance Osaka Seminar: CloudGate.pdf
FIDO Alliance Osaka Seminar: CloudGate.pdf
FIDO Alliance
 
TaketoFujikawa_物語のコンセプトに基づく情報アクセス手法の基礎検討_JSAI2024
TaketoFujikawa_物語のコンセプトに基づく情報アクセス手法の基礎検討_JSAI2024TaketoFujikawa_物語のコンセプトに基づく情報アクセス手法の基礎検討_JSAI2024
TaketoFujikawa_物語のコンセプトに基づく情報アクセス手法の基礎検討_JSAI2024
Matsushita Laboratory
 
単腕マニピュレータによる 複数物体の同時組み立ての 基礎的考察 / Basic Approach to Robotic Assembly of Multi...
単腕マニピュレータによる 複数物体の同時組み立ての 基礎的考察 / Basic Approach to Robotic Assembly of Multi...単腕マニピュレータによる 複数物体の同時組み立ての 基礎的考察 / Basic Approach to Robotic Assembly of Multi...
単腕マニピュレータによる 複数物体の同時組み立ての 基礎的考察 / Basic Approach to Robotic Assembly of Multi...
Fukuoka Institute of Technology
 
【AI論文解説】Consistency ModelとRectified Flow
【AI論文解説】Consistency ModelとRectified Flow【AI論文解説】Consistency ModelとRectified Flow
【AI論文解説】Consistency ModelとRectified Flow
Sony - Neural Network Libraries
 
【DLゼミ】XFeat: Accelerated Features for Lightweight Image Matching
【DLゼミ】XFeat: Accelerated Features for Lightweight Image Matching【DLゼミ】XFeat: Accelerated Features for Lightweight Image Matching
【DLゼミ】XFeat: Accelerated Features for Lightweight Image Matching
harmonylab
 
FIDO Alliance Osaka Seminar: PlayStation Passkey Deployment Case Study.pdf
FIDO Alliance Osaka Seminar: PlayStation Passkey Deployment Case Study.pdfFIDO Alliance Osaka Seminar: PlayStation Passkey Deployment Case Study.pdf
FIDO Alliance Osaka Seminar: PlayStation Passkey Deployment Case Study.pdf
FIDO Alliance
 
FIDO Alliance Osaka Seminar: Welcome Slides.pdf
FIDO Alliance Osaka Seminar: Welcome Slides.pdfFIDO Alliance Osaka Seminar: Welcome Slides.pdf
FIDO Alliance Osaka Seminar: Welcome Slides.pdf
FIDO Alliance
 
論文紹介: Exploiting semantic segmentation to boost reinforcement learning in vid...
論文紹介: Exploiting semantic segmentation to boost reinforcement learning in vid...論文紹介: Exploiting semantic segmentation to boost reinforcement learning in vid...
論文紹介: Exploiting semantic segmentation to boost reinforcement learning in vid...
atsushi061452
 
2024年度_サイバーエージェント_新卒研修「データベースの歴史」.pptx
2024年度_サイバーエージェント_新卒研修「データベースの歴史」.pptx2024年度_サイバーエージェント_新卒研修「データベースの歴史」.pptx
2024年度_サイバーエージェント_新卒研修「データベースの歴史」.pptx
yassun7010
 
FIDO Alliance Osaka Seminar: LY-DOCOMO-KDDI-Mercari Panel.pdf
FIDO Alliance Osaka Seminar: LY-DOCOMO-KDDI-Mercari Panel.pdfFIDO Alliance Osaka Seminar: LY-DOCOMO-KDDI-Mercari Panel.pdf
FIDO Alliance Osaka Seminar: LY-DOCOMO-KDDI-Mercari Panel.pdf
FIDO Alliance
 
論文紹介: Offline Q-Learning on diverse Multi-Task data both scales and generalizes
論文紹介: Offline Q-Learning on diverse Multi-Task data both scales and generalizes論文紹介: Offline Q-Learning on diverse Multi-Task data both scales and generalizes
論文紹介: Offline Q-Learning on diverse Multi-Task data both scales and generalizes
atsushi061452
 

Recently uploaded (14)

YugabyteDB適用に向けた取り組みと隠れた魅力 (DSS Asia 2024 発表資料)
YugabyteDB適用に向けた取り組みと隠れた魅力 (DSS Asia 2024 発表資料)YugabyteDB適用に向けた取り組みと隠れた魅力 (DSS Asia 2024 発表資料)
YugabyteDB適用に向けた取り組みと隠れた魅力 (DSS Asia 2024 発表資料)
 
FIDO Alliance Osaka Seminar: NEC & Yubico Panel.pdf
FIDO Alliance Osaka Seminar: NEC & Yubico Panel.pdfFIDO Alliance Osaka Seminar: NEC & Yubico Panel.pdf
FIDO Alliance Osaka Seminar: NEC & Yubico Panel.pdf
 
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアルLoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
 
FIDO Alliance Osaka Seminar: CloudGate.pdf
FIDO Alliance Osaka Seminar: CloudGate.pdfFIDO Alliance Osaka Seminar: CloudGate.pdf
FIDO Alliance Osaka Seminar: CloudGate.pdf
 
TaketoFujikawa_物語のコンセプトに基づく情報アクセス手法の基礎検討_JSAI2024
TaketoFujikawa_物語のコンセプトに基づく情報アクセス手法の基礎検討_JSAI2024TaketoFujikawa_物語のコンセプトに基づく情報アクセス手法の基礎検討_JSAI2024
TaketoFujikawa_物語のコンセプトに基づく情報アクセス手法の基礎検討_JSAI2024
 
単腕マニピュレータによる 複数物体の同時組み立ての 基礎的考察 / Basic Approach to Robotic Assembly of Multi...
単腕マニピュレータによる 複数物体の同時組み立ての 基礎的考察 / Basic Approach to Robotic Assembly of Multi...単腕マニピュレータによる 複数物体の同時組み立ての 基礎的考察 / Basic Approach to Robotic Assembly of Multi...
単腕マニピュレータによる 複数物体の同時組み立ての 基礎的考察 / Basic Approach to Robotic Assembly of Multi...
 
【AI論文解説】Consistency ModelとRectified Flow
【AI論文解説】Consistency ModelとRectified Flow【AI論文解説】Consistency ModelとRectified Flow
【AI論文解説】Consistency ModelとRectified Flow
 
【DLゼミ】XFeat: Accelerated Features for Lightweight Image Matching
【DLゼミ】XFeat: Accelerated Features for Lightweight Image Matching【DLゼミ】XFeat: Accelerated Features for Lightweight Image Matching
【DLゼミ】XFeat: Accelerated Features for Lightweight Image Matching
 
FIDO Alliance Osaka Seminar: PlayStation Passkey Deployment Case Study.pdf
FIDO Alliance Osaka Seminar: PlayStation Passkey Deployment Case Study.pdfFIDO Alliance Osaka Seminar: PlayStation Passkey Deployment Case Study.pdf
FIDO Alliance Osaka Seminar: PlayStation Passkey Deployment Case Study.pdf
 
FIDO Alliance Osaka Seminar: Welcome Slides.pdf
FIDO Alliance Osaka Seminar: Welcome Slides.pdfFIDO Alliance Osaka Seminar: Welcome Slides.pdf
FIDO Alliance Osaka Seminar: Welcome Slides.pdf
 
論文紹介: Exploiting semantic segmentation to boost reinforcement learning in vid...
論文紹介: Exploiting semantic segmentation to boost reinforcement learning in vid...論文紹介: Exploiting semantic segmentation to boost reinforcement learning in vid...
論文紹介: Exploiting semantic segmentation to boost reinforcement learning in vid...
 
2024年度_サイバーエージェント_新卒研修「データベースの歴史」.pptx
2024年度_サイバーエージェント_新卒研修「データベースの歴史」.pptx2024年度_サイバーエージェント_新卒研修「データベースの歴史」.pptx
2024年度_サイバーエージェント_新卒研修「データベースの歴史」.pptx
 
FIDO Alliance Osaka Seminar: LY-DOCOMO-KDDI-Mercari Panel.pdf
FIDO Alliance Osaka Seminar: LY-DOCOMO-KDDI-Mercari Panel.pdfFIDO Alliance Osaka Seminar: LY-DOCOMO-KDDI-Mercari Panel.pdf
FIDO Alliance Osaka Seminar: LY-DOCOMO-KDDI-Mercari Panel.pdf
 
論文紹介: Offline Q-Learning on diverse Multi-Task data both scales and generalizes
論文紹介: Offline Q-Learning on diverse Multi-Task data both scales and generalizes論文紹介: Offline Q-Learning on diverse Multi-Task data both scales and generalizes
論文紹介: Offline Q-Learning on diverse Multi-Task data both scales and generalizes
 

Drupal8 DBに保存して読み込む

  • 2. 目次 1. カスタムモジュールの基礎を作る → Hello World 2. フォーム画面を作る → DBへ保存する機能を作る 3. 表の表示画面を作る → DBから読み込む機能を作る
  • 7. カスタムモジュールの基礎を作る ~コントローラファイル作成~ vim src/Controller/AnimalbookController.php <?php namespace DrupalanimalbookController; use DrupalCoreControllerControllerBase; class AnimalbookController extends ControllerBase { public function content() { return array( '#markup' => '' . t('Hello!') . '', ); } } HTMLで Hello! を出力する class名は ファイル名と同じ Drupal8のControllerBaseを継 承 class名は ファイル名と同じ
  • 8. カスタムモジュールの基礎を作る ~ルーティングファイル作成~ vim animalbook.routing.yml animalbook: path: '/animalbook' defaults: _title: 'Animalbook Page' _controller: 'DrupalanimalbookControllerAnimalbookController::content' requirements: _permission: 'access content' このpathにアクセスしたとき このcontrollerを呼び出す 「access content」という デフォルトのロール
  • 13. フォーム画面を作る 〜vim src/Form/InputForm.php〜 • 完成図 vim src/Form/InputForm.php <?php namespace DrupalanimalbookForm; use DrupalCoreFormFormBase; use DrupalCoreFormFormStateInterface; use DrupalCoreDatabaseDatabase; class InputForm extends FormBase { public function getFormId() { return 'default_form'; } public function buildForm(array $form, FormStateInterface $form_state) { $typelist = array( $typelist = array( 'MAMMALS' => t('哺乳類'), 'BIRDS' => t('鳥類'), 'REPTILES' => t('爬虫類'), 'AMPHIBIANS' => t('両生類'), 'FISH' => t('魚類'), ); public function validateForm(array &$form, FormStateInterface $form_state) { parent::validateForm($form, $form_state); } public function submitForm(array &$form, FormStateInterface $form_state) { // Display result. foreach ($form_state->getValues() as $key => $value) { drupal_set_message($key . ': ' . $value); } // Save to Database. $conn = Database::getConnection(); $conn->insert('module_animalbook_data')->fields( array( 'name' => $form_state->getValue('name'), 'type' => $form_state->getValue('type'), ) )->execute(); } } $form['name'] = array( '#type' => 'textfield', '#title' => $this->t('Name'), '#required' => TRUE, ); $form['type1'] = array( '#type' => 'select', '#title' => 'タイプ', '#options' => $typelist, '#required' => TRUE, ); $form['submit'] = [ '#type' => 'submit', '#value' => $this->t('Save'), ]; return $form; }
  • 14. フォーム画面を作る 〜vim src/Form/InputForm.php〜 • 完成図 vim src/Form/InputForm.php <?php namespace DrupalanimalbookForm; use DrupalCoreFormFormBase; use DrupalCoreFormFormStateInterface; use DrupalCoreDatabaseDatabase; class InputForm extends FormBase { public function getFormId() { return 'default_form'; } public function buildForm(array $form, FormStateInterface $form_state) { $typelist = array( $typelist = array( 'MAMMALS' => t('哺乳類'), 'BIRDS' => t('鳥類'), 'REPTILES' => t('爬虫類'), 'AMPHIBIANS' => t('両生類'), 'FISH' => t('魚類'), ); public function validateForm(array &$form, FormStateInterface $form_state) { parent::validateForm($form, $form_state); } public function submitForm(array &$form, FormStateInterface $form_state) { // Display result. foreach ($form_state->getValues() as $key => $value) { drupal_set_message($key . ': ' . $value); } // Save to Database. $conn = Database::getConnection(); $conn->insert('module_animalbook_data')->fields( array( 'name' => $form_state->getValue('name'), 'type' => $form_state->getValue('type'), ) )->execute(); } } $form['name'] = array( '#type' => 'textfield', '#title' => $this->t('Name'), '#required' => TRUE, ); $form['type1'] = array( '#type' => 'select', '#title' => 'タイプ', '#options' => $typelist, '#required' => TRUE, ); $form['submit'] = [ '#type' => 'submit', '#value' => $this->t('Save'), ]; return $form; } // Save to Database. $conn = Database::getConnection(); $conn->insert('module_animalbook_data')->fields( array( 'name' => $form_state->getValue('name'), 'type' => $form_state->getValue('type'), ) )->execute();
  • 15. フォーム画面を作る 〜vim src/Form/InputForm.php〜 • 完成図 vim src/Form/InputForm.php <?php namespace DrupalanimalbookForm; use DrupalCoreFormFormBase; use DrupalCoreFormFormStateInterface; use DrupalCoreDatabaseDatabase; class InputForm extends FormBase { public function getFormId() { return 'default_form'; } public function buildForm(array $form, FormStateInterface $form_state) { $typelist = array( $typelist = array( 'MAMMALS' => t('哺乳類'), 'BIRDS' => t('鳥類'), 'REPTILES' => t('爬虫類'), 'AMPHIBIANS' => t('両生類'), 'FISH' => t('魚類'), ); public function validateForm(array &$form, FormStateInterface $form_state) { parent::validateForm($form, $form_state); } public function submitForm(array &$form, FormStateInterface $form_state) { // Display result. foreach ($form_state->getValues() as $key => $value) { drupal_set_message($key . ': ' . $value); } // Save to Database. $conn = Database::getConnection(); $conn->insert('module_animalbook_data')->fields( array( 'name' => $form_state->getValue('name'), 'type' => $form_state->getValue('type'), ) )->execute(); } } $form['name'] = array( '#type' => 'textfield', '#title' => $this->t('Name'), '#required' => TRUE, ); $form['type1'] = array( '#type' => 'select', '#title' => 'タイプ', '#options' => $typelist, '#required' => TRUE, ); $form['submit'] = [ '#type' => 'submit', '#value' => $this->t('Save'), ]; return $form; } // Save to Database. $conn = Database::getConnection(); $conn->insert('module_animalbook_data')->fields( array( 'name' => $form_state->getValue('name'), 'type' => $form_state->getValue('type'), ) )->execute(); DBに接続
  • 16. フォーム画面を作る 〜vim src/Form/InputForm.php〜 • 完成図 vim src/Form/InputForm.php <?php namespace DrupalanimalbookForm; use DrupalCoreFormFormBase; use DrupalCoreFormFormStateInterface; use DrupalCoreDatabaseDatabase; class InputForm extends FormBase { public function getFormId() { return 'default_form'; } public function buildForm(array $form, FormStateInterface $form_state) { $typelist = array( $typelist = array( 'MAMMALS' => t('哺乳類'), 'BIRDS' => t('鳥類'), 'REPTILES' => t('爬虫類'), 'AMPHIBIANS' => t('両生類'), 'FISH' => t('魚類'), ); public function validateForm(array &$form, FormStateInterface $form_state) { parent::validateForm($form, $form_state); } public function submitForm(array &$form, FormStateInterface $form_state) { // Display result. foreach ($form_state->getValues() as $key => $value) { drupal_set_message($key . ': ' . $value); } // Save to Database. $conn = Database::getConnection(); $conn->insert('module_animalbook_data')->fields( array( 'name' => $form_state->getValue('name'), 'type' => $form_state->getValue('type'), ) )->execute(); } } $form['name'] = array( '#type' => 'textfield', '#title' => $this->t('Name'), '#required' => TRUE, ); $form['type1'] = array( '#type' => 'select', '#title' => 'タイプ', '#options' => $typelist, '#required' => TRUE, ); $form['submit'] = [ '#type' => 'submit', '#value' => $this->t('Save'), ]; return $form; } // Save to Database. $conn = Database::getConnection(); $conn->insert('module_animalbook_data')->fields( array( 'name' => $form_state->getValue('name'), 'type' => $form_state->getValue('type'), ) )->execute(); nameとtypeのフィールドの値を insert:挿入
  • 17. フォーム画面を作る 〜vim src/Form/InputForm.php〜 • 完成図 vim src/Form/InputForm.php <?php namespace DrupalanimalbookForm; use DrupalCoreFormFormBase; use DrupalCoreFormFormStateInterface; use DrupalCoreDatabaseDatabase; class InputForm extends FormBase { public function getFormId() { return 'default_form'; } public function buildForm(array $form, FormStateInterface $form_state) { $typelist = array( $typelist = array( 'MAMMALS' => t('哺乳類'), 'BIRDS' => t('鳥類'), 'REPTILES' => t('爬虫類'), 'AMPHIBIANS' => t('両生類'), 'FISH' => t('魚類'), ); public function validateForm(array &$form, FormStateInterface $form_state) { parent::validateForm($form, $form_state); } public function submitForm(array &$form, FormStateInterface $form_state) { // Display result. foreach ($form_state->getValues() as $key => $value) { drupal_set_message($key . ': ' . $value); } // Save to Database. $conn = Database::getConnection(); $conn->insert('module_animalbook_data')->fields( array( 'name' => $form_state->getValue('name'), 'type' => $form_state->getValue('type'), ) )->execute(); } } $form['name'] = array( '#type' => 'textfield', '#title' => $this->t('Name'), '#required' => TRUE, ); $form['type1'] = array( '#type' => 'select', '#title' => 'タイプ', '#options' => $typelist, '#required' => TRUE, ); $form['submit'] = [ '#type' => 'submit', '#value' => $this->t('Save'), ]; return $form; } // Save to Database. $conn = Database::getConnection(); $conn->insert('module_animalbook_data')->fields( array( 'name' => $form_state->getValue('name'), 'type' => $form_state->getValue('type'), ) )->execute(); 実行
  • 18. フォーム画面を作る ~ルーティングファイル編集~ • 追記する vim animalbook.routing.yml animalbook.default_form: path: '/animalbook/form/input' defaults: _form: 'DrupalanimalbookFormInputForm' _title: 'InputForm' requirements: _access: 'TRUE' このpathにアクセスしたとき このFormを呼び出す 誰でもアクセス可、ログイン不要
  • 19. フォーム画面を作る ~DBのテーブル定義作成~ vim animalbook.install <?php function animalbook_schema() { $schema['module_animalbook_data'] = [ 'description' => 'Module Animalbook data.', 'fields' => array( 'id' => array( 'description' => 'id', 'type' => 'serial', 'not null' => TRUE, ), 'name' => array( 'description' => 'Character Name', 'type' => 'varchar', 'length' => 256, 'not null' => TRUE, ), 'type' => array( 'description' => 'Type', 'type' => 'varchar', 'length' => 256, 'not null' => TRUE, ), ), 'primary key' => array('id'), ]; return $schema; } DBのテーブル名
  • 28. • 完成図 表の表示画面を作る ~表を表示するForm作成~ vim src/Form/ListForm.php <?php namespace DrupalanimalbookForm; use DrupalCoreFormFormBase; use DrupalCoreFormFormStateInterface; use DrupalCoreDatabaseDatabase; class ListForm extends FormBase { function __construct() { } public function getFormId() { return 'default_form'; } // Initialize an empty array $output = array(); // Next, loop through the $results array foreach ($results as $result) { $output[$result->id] = [ 'id' => $result->id, 'name' => $result->name, 'type' => $result->type, ]; } $form['table'] = [ '#type' => 'tableselect', '#header' => $header, '#options' => $output, '#empty' => t('No users found'), ]; return $form; } public function buildForm(array $form, FormStateInterface $form_state) { //データベースからデータを取得する $conn = Database::getConnection(); $query = $conn ->select('module_animalbook_data', 'x') ->fields('x', array('id', 'name', 'type')); $data = $query->execute(); //条件に合致するものを配列にして返す #$result = $data->fetchCol(); $results = $data->fetchAll(); //var_dump($results); //ヘッダー作成 $header = [ 'id' => t('ID'), 'name' => t('Name'), 'type' => t('Type'), ];
  • 29. • 完成図 <?php namespace DrupalanimalbookForm; use DrupalCoreFormFormBase; use DrupalCoreFormFormStateInterface; use DrupalCoreDatabaseDatabase; class ListForm extends FormBase { function __construct() { } public function getFormId() { return 'default_form'; } // Initialize an empty array $output = array(); // Next, loop through the $results array foreach ($results as $result) { $output[$result->id] = [ 'id' => $result->id, 'name' => $result->name, 'type' => $result->type, ]; } $form['table'] = [ '#type' => 'tableselect', '#header' => $header, '#options' => $output, '#empty' => t('No users found'), ]; return $form; } public function buildForm(array $form, FormStateInterface $form_state) { //データベースからデータを取得する $conn = Database::getConnection(); $query = $conn ->select('module_animalbook_data', 'x') ->fields('x', array('id', 'name', 'type')); $data = $query->execute(); //条件に合致するものを配列にして返す #$result = $data->fetchCol(); $results = $data->fetchAll(); //var_dump($results); //ヘッダー作成 $header = [ 'id' => t('ID'), 'name' => t('Name'), 'type' => t('Type'), ]; 表の表示画面を作る ~表を表示するForm作成~ vim src/Form/ListForm.php //データベースからデータを取得する $conn = Database::getConnection(); $query = $conn ->select('module_animalbook_data', 'x') ->fields('x', array('id', 'name', 'type')); $data = $query->execute();
  • 30. • 完成図 <?php namespace DrupalanimalbookForm; use DrupalCoreFormFormBase; use DrupalCoreFormFormStateInterface; use DrupalCoreDatabaseDatabase; class ListForm extends FormBase { function __construct() { } public function getFormId() { return 'default_form'; } // Initialize an empty array $output = array(); // Next, loop through the $results array foreach ($results as $result) { $output[$result->id] = [ 'id' => $result->id, 'name' => $result->name, 'type' => $result->type, ]; } $form['table'] = [ '#type' => 'tableselect', '#header' => $header, '#options' => $output, '#empty' => t('No users found'), ]; return $form; } public function buildForm(array $form, FormStateInterface $form_state) { //データベースからデータを取得する $conn = Database::getConnection(); $query = $conn ->select('module_animalbook_data', 'x') ->fields('x', array('id', 'name', 'type')); $data = $query->execute(); //条件に合致するものを配列にして返す #$result = $data->fetchCol(); $results = $data->fetchAll(); //var_dump($results); //ヘッダー作成 $header = [ 'id' => t('ID'), 'name' => t('Name'), 'type' => t('Type'), ]; 表の表示画面を作る ~表を表示するForm作成~ vim src/Form/ListForm.php //データベースからデータを取得する $conn = Database::getConnection(); $query = $conn ->select('module_animalbook_data', 'x') ->fields('x', array('id', 'name', 'type')); $data = $query->execute(); DBに接続
  • 31. • 完成図 <?php namespace DrupalanimalbookForm; use DrupalCoreFormFormBase; use DrupalCoreFormFormStateInterface; use DrupalCoreDatabaseDatabase; class ListForm extends FormBase { function __construct() { } public function getFormId() { return 'default_form'; } // Initialize an empty array $output = array(); // Next, loop through the $results array foreach ($results as $result) { $output[$result->id] = [ 'id' => $result->id, 'name' => $result->name, 'type' => $result->type, ]; } $form['table'] = [ '#type' => 'tableselect', '#header' => $header, '#options' => $output, '#empty' => t('No users found'), ]; return $form; } public function buildForm(array $form, FormStateInterface $form_state) { //データベースからデータを取得する $conn = Database::getConnection(); $query = $conn ->select('module_animalbook_data', 'x') ->fields('x', array('id', 'name', 'type')); $data = $query->execute(); //条件に合致するものを配列にして返す #$result = $data->fetchCol(); $results = $data->fetchAll(); //var_dump($results); //ヘッダー作成 $header = [ 'id' => t('ID'), 'name' => t('Name'), 'type' => t('Type'), ]; 表の表示画面を作る ~表を表示するForm作成~ vim src/Form/ListForm.php //データベースからデータを取得する $conn = Database::getConnection(); $query = $conn ->select('module_animalbook_data', 'x') ->fields('x', array('id', 'name', 'type')); $data = $query->execute(); SQLのクエリを作成 select:検索
  • 32. • 完成図 <?php namespace DrupalanimalbookForm; use DrupalCoreFormFormBase; use DrupalCoreFormFormStateInterface; use DrupalCoreDatabaseDatabase; class ListForm extends FormBase { function __construct() { } public function getFormId() { return 'default_form'; } // Initialize an empty array $output = array(); // Next, loop through the $results array foreach ($results as $result) { $output[$result->id] = [ 'id' => $result->id, 'name' => $result->name, 'type' => $result->type, ]; } $form['table'] = [ '#type' => 'tableselect', '#header' => $header, '#options' => $output, '#empty' => t('No users found'), ]; return $form; } public function buildForm(array $form, FormStateInterface $form_state) { //データベースからデータを取得する $conn = Database::getConnection(); $query = $conn ->select('module_animalbook_data', 'x') ->fields('x', array('id', 'name', 'type')); $data = $query->execute(); //条件に合致するものを配列にして返す #$result = $data->fetchCol(); $results = $data->fetchAll(); //var_dump($results); //ヘッダー作成 $header = [ 'id' => t('ID'), 'name' => t('Name'), 'type' => t('Type'), ]; 表の表示画面を作る ~表を表示するForm作成~ vim src/Form/ListForm.php //データベースからデータを取得する $conn = Database::getConnection(); $query = $conn ->select('module_animalbook_data', 'x') ->fields('x', array('id', 'name', 'type')); $data = $query->execute(); DBへの問い合わせを実行
  • 33. 表の表示画面を作る ~ルーティングファイル編集~ • 追記する vim animalbook.routing.yml animalbook.list_form: path: '/animalbook/form/list' defaults: _form: 'DrupalanimalbookFormListForm' _title: 'ListForm' requirements: _access: 'TRUE' このpathにアクセスしたとき このFormを呼び出す 誰でもアクセス可、ログイン不要
  • 38. 疑問・課題 • ルーティングファイルの「_access」で指定する 「access contents」と「TRUE」はどう違う? • ViewのPHPソースには無駄がありそう ソースをもっと理解して、リファクタリング