■質問 アンケートシステムにて、次のデータモデル、画面遷移を実現したいと考えています。ここでデータを安全に取り扱うには、「レコード公開範囲」などを、どのように設定すれば良いでしょうか? 当方案も記載しましたが、「重複する項目を追加」したり、「adminがprojectを選択する度にDBを更新」したり、少し回りくどい気がしますし、当方の考え方が適切か不明です。 ■データモデル 「admin」*→1「group」1←*「project」1←*「user」 ※アンケート設定者を「admin」、回答者を「user」とします ※アンケート「project」ごとに、複数の回答者を登録します ※同じ「group」に属している「admin」は、同じ「project」を共同管理します ■画面遷移(admin) (a)adminログイン画面 ↓ (b)project一覧画面 (ここから選択する) ↓ (c)project詳細&user一覧画面 ↓ ↓ ↓ (d)project詳細編集画面 ↓ (e)user詳細編集画面 ■レコード公開範囲(当方案) DB「admin」に2項目追加します。 ・groupName テキスト(←所属するgroup名、固定値) ・projectId テキスト(←選択したprooject._id、都度変更) DB「project」に2項目追加します。 ・groupName テキスト(←所属するgroup名、固定値) ・projectId テキスト(←prooject._idをテキスト化した、固定値) projectの「レコード公開範囲」は、以下を設定します。 ・抽出方法「ログインフィルタ」「フィールド値関係抽出 (簡易) 」 ・「project->groupName 等しい admin->groupName」 userの「レコード公開範囲」は、以下を設定します。 ・抽出方法「ログインフィルタ」「フィールド値関係抽出 (簡易) 」 ・「user->projectId 等しい admin->projectId」 当方の質問の意図が伝われば幸いです。よろしくお願いします。
コメント
ご質問ありがとうございます。 当チーム側の認識は以下となります。 以下認識のもと、回答と設定方法をご提案させていただきます。 ※認識齟齬がございましたら、ご教示いただけますと幸いです。 【当チームの認識】 ①DB「project」について ・(b) project一覧画面にて、ログインしたアンケート設定者が管理しているアンケートを表示したい。 ・アンケート設定者はグループに所属しており、アンケートごとにグループで共同管理されている。 ②DB「user」について ・(c) project詳細&user一覧画面にて、表示されているアンケートへの回答者を表示したい。 【回答】 ①DB「project」のレコード公開範囲について お問い合わせ内容の公開範囲を設定いただければ、ログインしたアンケート設定者のグループに一致するアンケートのみ表示されるため実現可能です。 ②DB「user」のレコード公開範囲について お問い合わせ内容ですと、「(c) project詳細&user一覧画面」に遷移するたび、 adminフィールドを更新する処理が必要となり、実装としてはやや冗長かつ認識面でも分かりづらい可能性がございます。 そのため、以下の方法であればレコード値の動的変更処理をすることなく、安全かつシンプルに表示中のアンケート回答者を参照することが可能です。 1. DB「user」に「groupName」「projectID」フィールドを用意する 2. レコード公開範囲設定にて、抽出方法を「ログインフィルタ」「フィールド値関係抽出(簡易)」とし、 条件を「user->groupName 等しい admin->groupName」に設定する。 3. project詳細画面のパラメータからIDを取得し、ThymeleafでuserDBのprojectIDと一致するもののみ表示する。
パラメータの取得方法やthymeleaf記法については下記サポートサイトを参照ください ▼PHP > getParam($paramName) https://support.spiral-platform.com/function/function-site-manage/6898.html#getParamparamName ▼Thymeleaf記法 > th:if https://support.spiral-platform.com/function/function-site-manage/style/714.html#th_if ご確認をよろしくお願いいたします。
色々お察しいただき、明確な回答をいただき、ありがとうございます。 >【当チームの認識】 ご認識の通りです。 >【回答】 >① 「admin」*→1「group」1←*「project」、これらは、参照フィールドで関連付けられている想定でしたが、内容が重複する別フィールド「groupName」(テキスト)を作成する必要があると理解しました。 >② Thymeleafで「安全かつシンプル」に処理可能と認識しました。 また、レコード値を動的に変更することを厭わなければ、「レコード公開範囲」のみで実現することも可能と認識しました。 group内のuser数が過剰になる場合や、project単位でuserを一括更新/削除する場合など、追加条件に応じて検討したく思います。 曖昧であった理解がクリアになりました。ありがとうございました。
ご確認いただきましてありがとうございます。 >参照フィールドで関連付けられている想定でしたが、内容が重複する別フィールド「groupName」(テキスト)を作成する必要があると理解しました。 参照フィールドで admin と project のDBが関連付けられている場合、 レコード公開範囲の「参照先レコード値による抽出」にて抽出することが可能です。 しかし、参照フィールドには1つの値しか設定できないため、 今回のように「複数のアンケート設定者が1つのグループに所属し、グループ単位で複数アンケートを管理する」といった、多対多の関係では「参照先レコード値による抽出」を利用することはできません。 そのため、先にご案内した「groupName」を利用する方法をご検討ください。 >group内のuser数が過剰になる場合や、project単位でuserを一括更新/削除する場合など、追加条件に応じて検討したく思います。 前回の案内した、「回答者リストにおいてphp・thymeleafでレコード表示の出し分けを行う方法」について、補足がございます。 こちらの方法では、全件を取得したうえでThymeleaf にてページ上の表示・非表示を切り替える処理となっています。 そのため、レコードリストブロックの機能の「ページャ」「レコードカウント」については、非表示レコードも含めて動作してしまいます。 このため、「ページャ」「レコードカウント」は使用せず、リスト設定の「初期表示件数」の最大値(100件)以内に収まる場合に限り、 本方法のご利用をご検討いただけますようお願いいたします。
レコード件数が100件以上となる場合には、Project詳細画面に遷移するURLに検索用のパラメータをあらかじめ仕込む方法があります。 こちらも併せてご検討ください。 手順については、下記の通りになります。 ※1, 2 については前回ご案内した内容と同様です。 1.DB「user」に「groupName」「projectID」フィールドを用意する 2.レコード公開範囲設定にて、抽出方法を「ログインフィルタ」「フィールド値関係抽出(簡易)」とし、条件を「user->groupName 等しい admin->groupName」に設定する。 3.Project 一覧画面から詳細画面へ遷移する URL に検索用のパラメータを設定する。 ・書式例: rlb0aaaa_q_f0bb=${record['f0cc']} ・今回の場合: aaaa:userDBの「レコードリストブロックのID」 bb :userDBの「projectIDのID」 cc :projectDBの「projectIDのID」 上記の方法ではprojectDBの「projectIDのID」が「部分一致」で表示されます。そのため、projectID の値は一意として、ゼロ埋めによる固定長化していただくなどの方法で、意図しないレコードが表示されないよう対策をお願いいたします。 こちらの方法の詳細につきましては、下記ナレッジサイトに記載しておりますので、ご確認ください。 ▼レコード検索ブロックを使用したレコードリストブロック フィルタ設定方法 https://knowledge.spirers.jp/article/development/detail/9878 ご確認をよろしくお願いいたします。
▼ >多対多の関係では「参照先レコード値による抽出」を利用することはできません。 →現在の仕様、制限であると承知しました。 「user->project 等しい admin->project」のように「参照フィールド」は利用できないためと受け止めました。 ▼ >コードリストブロックの機能の「ページャ」「レコードカウント」 →影響、承知しました。 ▼ >Project詳細画面に遷移するURLに検索用のパラメータをあらかじめ仕込む方法があります。 →承知しました。 しかしこの場合、ブラウザ閲覧者がURLを書き換えることで、条件外のレコードを参照可能と理解しました。 ▼ やはり、最も安心できるのは、レコード公開範囲による制限、 「user->projectId 等しい admin->projectId」かもしれません。 ■追加質問■ 添付したPHPソースのように、projectを選択後の画面遷移先で、adminDB内のprojectidを更新しました。 その直後の画面では、画面下部の回答者一覧が、古いprojectidでselectされた一覧に見えます。 画面をリロードすると、新しいprojectidでselectされた一覧に変わりました。これでは操作性が不十分です。 projectを選択した直後の画面で、リロードなしに、新しいprojectidでselectした回答者一覧が表示されるには、 どのような改修が適切でしょうか?
■認証エリア「admin」、レコードアイテム「project詳細」+レコードリスト「回答者一覧」、PHPコード抜粋
$param = explode(".", $SPIRAL->getParam("record"));
$record_id = $param[1];
$aid=$SPIRAL->getAuthRecordByFieldId("_id");
$gname=$SPIRAL->getAuthRecordByFieldId("5");
$pid=$SPIRAL->getAuthRecordByFieldId("6");
$commonBase = CommonBase::getInstance();
$updateData=array("projectid"=>$record_id);
$result=$commonBase->apiCurlAction("PATCH", "/apps/". APP_ID. "/dbs/". DB_ID. "/records/".$aid, $updateData);
また、下記の方法にてパラメータが書き換えられた場合にページ非表示にする実装が可能になります。 1.Project一覧画面から詳細画面へ遷移するパラメータに、DB「project」のGroupNameのIDを設定します。 ・書式例:${record['f0aa']} ・今回の場合:aaに「GroupNameのID」を入力 2.(c)project詳細&user一覧画面にて、認証エリアにログインしているアンケート設定者のGroupNameの値を取得 ・getAuthRecordByFieldId関数にて、ログイン者の情報を取得することができます。 3.下記の条件のいずれかに当てはまる場合、ページを非表示にする。 ①パラメータで与えられた「レコード詳細ブロック表示用のprojectID」と「回答者検索用のprojectID」の値が一致しない場合 ②Project一覧画面から与えられた「GroupNameのパラメータ」と、「2」で取得したログイン中アンケート設定者の「GroupName」 が一致しない場合 詳細がナレッジサイトに記載されておりますので、ご確認をお願いします。 ▼レコード検索ブロックを使用したレコードリストブロック フィルタ設定方法>パラメータ改ざん時の対処方法 https://knowledge.spirers.jp/article/development/detail/9878#:~:text=%E3%82%92%E3%81%97%E3%81%BE%E3%81%99%E3%80%82-,%E3%83%91%E3%83%A9%E3%83%A1%E3%83%BC%E3%82%BF%E6%94%B9%E3%81%96%E3%82%93%E6%99%82%E3%81%AE%E5%AF%BE%E5%87%A6%E6%96%B9%E6%B3%95,-%E3%81%8A%E5%95%8F%E3%81%84%E5%90%88%E3%82%8F%E3%81%9B%E4%B8%80%E8%A6%A7
また、上記ナレッジサイトにて動作のデモが掲載されておりますので、併せてご確認ください。 ▼デモページ:レコード検索ブロックを使用したレコードリストブロック フィルタ設定方法 https://pb-sp2demo-application3.spiral-site.com/member/login >projectを選択した直後の画面で、リロードなしに、新しいprojectidでselectした回答者一覧が表示されるには、どのような改修が適切でしょうか? SPIRALでは「レコードリストで表示するレコードを取得」した後に PHP が実行されます。 そのため、今回のケースではDB「user」のレコード一覧を取得した後にDB「admin」のレコード更新が行われており、 更新前のprojectidで抽出された一覧が表示される状態となっております。 対応方法としましては、「(b) project 一覧画面」の後に一度空ページを経由し、そちらのページにてDB「admin」のレコードを更新していただきます。 その後、自動的に (c) project 詳細&user 一覧画面へ遷移させることで、DB「admin」の更新が完了してから DB「user」の一覧を取得する処理となるため、 更新後のprojectidで抽出されたレコード一覧が表示されるようになります。 なお、SPIRALではPHPのheaderメソッドが利用できない仕様となっております。 恐れ入りますがJavaScriptのwindow.location.hrefを用いて自動遷移をご実装いただけますようお願いいたします。 ご確認をよろしくお願いいたします。
ご回答ありがとうございます。おかげさまで問題解決しました。 >パラメータによる表示の絞り込み >パラメータ改ざん時の対処方法 後ほど精読して、是非理解したく思います。 >対応方法としましては、「(b) project 一覧画面」の後に一度空ページを経由し、 >そちらのページにてDB「admin」のレコードを更新していただきます。 そうします。今回は「(c) project 詳細&user 一覧画面」自身を、経由する空ページにしようと思います。 ■PHP $param = explode(".", $SPIRAL->getParam("record")); $record_id = $param[1]; $aid=$SPIRAL->getAuthRecordByFieldId("_id"); $pid=$SPIRAL->getAuthRecordByFieldId("6"); if($pid!=$record_id){ $commonBase = CommonBase::getInstance(); $updateData=array("projectid"=>$record_id); $result=$commonBase->apiCurlAction("PATCH", "/apps/". APP_ID. "/dbs/". DB_ID. "/records/".$aid, $updateData); $SPIRAL->setTHValue("status","pageRedirect"); $SPIRAL->setTHValue("redirectURL","#"); } ■head <th:block th:if="${cp.result.value['status']} == 'pageRedirect'"> <meta http-equiv="refresh" th:content="|0;URL=${cp.result.value['redirectURL']}|"> </th:block> ※「レコードリスト→リストパーツ→カラム詳細設定→リンク設定」についても、後日精読したく思います。
ベストアンサー
ナレッジ
向上チーム
ご質問ありがとうございます。 当チーム側の認識は以下となります。 以下認識のもと、回答と設定方法をご提案させていただきます。 ※認識齟齬がございましたら、ご教示いただけますと幸いです。 【当チームの認識】 ①DB「project」について ・(b) project一覧画面にて、ログインしたアンケート設定者が管理しているアンケートを表示したい。 ・アンケート設定者はグループに所属しており、アンケートごとにグループで共同管理されている。 ②DB「user」について ・(c) project詳細&user一覧画面にて、表示されているアンケートへの回答者を表示したい。 【回答】 ①DB「project」のレコード公開範囲について お問い合わせ内容の公開範囲を設定いただければ、ログインしたアンケート設定者のグループに一致するアンケートのみ表示されるため実現可能です。 ②DB「user」のレコード公開範囲について お問い合わせ内容ですと、「(c) project詳細&user一覧画面」に遷移するたび、 adminフィールドを更新する処理が必要となり、実装としてはやや冗長かつ認識面でも分かりづらい可能性がございます。 そのため、以下の方法であればレコード値の動的変更処理をすることなく、安全かつシンプルに表示中のアンケート回答者を参照することが可能です。 1. DB「user」に「groupName」「projectID」フィールドを用意する 2. レコード公開範囲設定にて、抽出方法を「ログインフィルタ」「フィールド値関係抽出(簡易)」とし、 条件を「user->groupName 等しい admin->groupName」に設定する。 3. project詳細画面のパラメータからIDを取得し、ThymeleafでuserDBのprojectIDと一致するもののみ表示する。
2025年9月2日(火)