実現したい事
wordpressで作成したサイトに入力フォームを設定し、テキストと添付ファイルを確認画面を介してkintoneへ登録できるようにしたい。
入力フォームはwordpressの固定ページでショートコードを設定しfunnctions.phpへkintone登録の設定をを行っています。
設定ファイル
file-operator.php : 確認画面で添付ファイルを保存する設定php
file-upload.php : kintoneに登録する設定php
課題について
入力画面->完了画面 へ登録する場合はkintoneへのテキストおよび添付ファイルの登録が確認できましたが、
入力画面 → 確認画面 → 完了画面 を介して登録する場合にはkitnoneへ登録されずにエラーも発生しない状態です。
確認画面時にファイル名とFileKeyを仮保存したデータを完了画面へ送付する際にうまくいかないようなので、コードの記載に関して
アドバイスや改善点、参考サイトなどあればいただきたいです。
参考にしたサイト
・WordPressからkintoneへファイルをアップロードする #PHP - Qiita
・ファイル添付機能を、確認画面付きのフォームに実装する方法
functions.php
function templateFile() {
$html .= '<div class="content">';
$html .= '<form action="" method="post" enctype="multipart/form-data">';
$html .= '<input type="text" name="text_input">';
$html .= '<input type="file" name="up_file">';
$html .= '<input type="submit" id="upload" name="template_btn" value="ファイルアップロード">';
$html .= '</form>';
$html .= '</div>';
return $html;
}
add_shortcode('template', 'templateFile');
//確認画面
function confirmFile() {
require_once(dirname(__FILE__).'/template/file-operator.php');//添付ファイルの仮設定
$file_operator = FileOperator::get_instance();
$upload_file_names = $file_operator->upload_file();
$html .= '<div class="content">';
$html .= '<form action="" method="post" enctype="multipart/form-data">';
$html .= '以下で確認します、よろしいでしょうか?';
$html .= '<p>入力値'.$_POST["text_input"].'</p>';
$html .= '<p>入力値'.$upload_file_names['upload_file_name'].'</p>';
$html .= '<input type="hidden" name="text_input" value="'.$_POST["text_input"].'">';
$html .= '<input type="hidden" name ="up_file" value="'.$upload_file_names['upload_file_name'].'">';
$html .= '<input type="hidden" name ="tmp_file_name" value="'.$upload_file_names['tmp_file_name'].'">';
$html .= '<input type="submit" name="complete_btn" value="完了画面">';
$html .= '</form>';
$html .= '</div>';
return $html;
}
add_shortcode('confirm', 'confirmFile');
// 完了画面
function completeFile(){
//file Upload
require_once(dirname(__FILE__).'/kintone/file-upload.php');//kintoneの設定読み込み
$file_key = $_POST['tmp_file_name'];
$explode = explode(".", $file_key);
$upload_file_name = $explode[0];
if(isset($_FILES['up_file'])){
$files = $_FILES['up_file'];
$file_desc = $files; //$ _FILES配列を変換
$record_num = xxx; //レコード番号は決め打ち
file_upload($file_desc, $record_num,$upload_file_name); //関数にファイルとレコード番号,filekeyを渡します
}
$record_num = xxx; //レコード番号は決め打ち
$kintones = get_kintone_data($record_num);//kintoneのレコード取得
$html .= '<div class="content">';
for($i=0; $i<count($kintones['records']); $i++){
$drawing_attach = $kintones['records'][$i]['添付ファイル']['value'];
for($d=0; $d<count($drawing_attach); $d++){
$upload_file_name = $drawing_attach[$d]['name'];
$html .= '<p>'.$upload_file_name.'</p>';
}
}
$html .= '上記のファイル名で登録が完了しました。';
$html .= '</div>';
return $html;
}
add_shortcode('complete', 'completeFile');
file-operator.php
<?php
class FileOperator {
private static ?object $instance = null;
private string $tmp_dir = '';
private function __construct() {
//ファイルの一時格納を行うディレクトリを決定
$this->tmp_dir = __DIR__ . '/template';
$this->check_dir();
}
public function check_dir(): void {
//ファイルの一時格納を行うディレクトリの存在確認をし、無ければ作成
if (!is_dir($this->tmp_dir)) {
mkdir($this->tmp_dir, 0700);
file_put_contents("{$this->tmp_dir}/.htaccess", "deny from all");
}
}
public static function get_instance() {
if (self::$instance === null) {
self::$instance = new self;
}
return self::$instance;
}
public function upload_file(): array {
//index.phpから送られてきた添付ファイルの情報を取得
$file_info = $_FILES['up_file'];
//ファイルの拡張子を取得
preg_match("/\.[^.]+$/", $file_info['name'], $extension_match);
$extension = $extension_match[0];
//ファイルがサーバー内で予め決められた一時ディレクトリに正しくアップロードされているか確認
if (!is_uploaded_file($file_info['tmp_name'])) {
return false;
}
//一時ファイルの名称を作成
//同時にフォームが利用された場合に、ユーザーAの添付ファイルをユーザーBの添付ファイルが上書きしないよう、ユニークなファイル名を付ける
$now_time = str_replace('.', '', microtime(true));
$rand = mt_rand();
$file_name = $now_time . $rand . $extension;
//サーバー内で予め決められた一時ディレクトリから、このプログラムで利用する一時ディレクトリにファイルを移動
move_uploaded_file($file_info['tmp_name'], "{$this->tmp_dir}/{$file_name}");
//アップロードされたファイル名と、一時ディレクトリに保存したファイル名をreturn
return [
'upload_file_name' => $file_info['name'],
'tmp_file_name' => $file_name
];
}
public function get_file_path(string $tmp_file_name): string {
return "{$this->tmp_dir}/{$tmp_file_name}";
}
public function del_file(string $tmp_file_name): void {
unlink("{$this->tmp_dir}/{$tmp_file_name}");
}
public function garbage_collection(): void {
//ファイル作成からどれくらいの時間が経過したら削除するのか、秒単位で指定
$del_time_seconds = 10 * 60; //30分 * 60秒
//一時ディレクトリに残っているファイル一覧を取得
$tmp_files = glob("{$this->tmp_dir}/*");
foreach($tmp_files as $file_path) {
//ファイルを作成した時間
$file_create_time = filemtime($file_path);
//ファイルを作成してからの経過時間
$elapsed_time_since_create = time() - $file_create_time;
//ファイルを作成してからの経過時間が、予め決めておいた削除基準時間を超過していたら、削除
if($elapsed_time_since_create > $del_time_seconds) {
unlink($file_path);
}
}
}
}
kintone設定ファイルは返信に分割して記載します。