4

誰かがフラグ/通知システムを設定する際に正しい方向に私を向けることができるかどうか疑問に思っていました. タグ付けシステムに非常に似ていると思います。誰かがチュートリアルやセットアップの例を知っていれば、それは素晴らしいことです.

目的

基本的に、フラグは、顧客、プロパティ、請負業者、アプリケーションなどのデータ項目に付けられ、その項目に関する重要な情報をユーザーに通知する役割を果たします。フラグは、ユーザーが追加または削除できるアイテムの事前定義されたリストから取得する必要があります。

データベース

テーブル3台で行こうかと考えていました。

  • フラグ テーブル: 使用可能なフラグのリストと、それらのフラグが適用される対象 (顧客、プロパティなど) を決定する設定。
  • 特定のアイテムに特定のフラグが付いていることを示すリンク テーブル。
  • 適切なエンティティ テーブル

ユーザーインターフェース

タグの追加や削除など、いくつかの機能をスタック オーバーフローの機能と同様にしたいと考えています。多分これにjquery tag-itを使用しますか?主に、ユーザーがドロップダウン リストからフラグを選択できるようにして、1 つ以上のフラグが選択されているときにフラグ アイコンを表示できるようにしたいと考えています。旗の上にマウスを置くと、そのアイテムに付けられた旗をリストするツールチップが表示されます。複数のフラグを表示するのではなく、この 1 つのフラグの設定がクエリ目的に適しているかどうかはわかりません。サンプルビジュアル: http://i232.photobucket.com/albums/ee2/nismomatic97/flag.png

4

2 に答える 2

6

あなたの主な問題は、単一のエンティティ (「顧客」など) ではなく、考えられるさまざまなエンティティのフラグ レコードがあることです。

過去に、Foreign Keyデータベース全体で一意のフィールド (「FlagID」) を各テーブルに追加することで、この問題を解決しました。GUID が適しています。次にJOIN、特定のコンテキストに適用されるテーブルを Flags テーブルの FlagID に単純化すると、その特定のエンティティに適用されるフラグのみが取得されます。

たとえばJOIN、Flags テーブルの FlagID を Customers テーブルの FlagID に関連付けると、Customers に関連するフラグのみが取得されます。

スタック オーバーフローには「複数のエンティティ」の問題がないことに注意してください。すべてのフラグは投稿にキャストされます。

于 2012-07-13T20:16:45.273 に答える
3

基本的に、フラグを含むテーブルと顧客/ユーザーを含むテーブルが必要です。これらのテーブルは次のようになります。

フラグ テーブル:

  • フラグの一意の ID (最も簡単な方法は、「ID」フィールドを に設定することAUTO_INCREMENTです)。
  • フラグ名
  • フラグの説明
  • もっと欲しいもの

ユーザー テーブル:

  • フラグを格納するフィールド (シリアル化されたフラグの配列を格納することをお勧めします)
  • 他の目的のために必要なその他のデータ

シリアル化された配列を格納する以外に、ユーザーの一意の ID とフラグ ID を格納する別のテーブルを作成できます。フラグごとに 1 行。ただし、最初の方法の方が効率的で優れていると思います。

フラグの選択と表示:

  • シリアル化されたフラグの配列を含むフィールドを選択します
  • 配列のシリアル化を解除し、JOINフラグの名前と説明を選択するために使用します。

ユーザーのプロファイルにフラグを保存する:
ID 1、3、5、および 7 のフラグを保存するとします。

$flags = serialize(array(1, 3, 5, 7));
mysql_query("UPDATE `users` SET `flags` = '$flags'") or die(mysql_error());

フラグを編集する場合は、フィールドを選択し、配列のシリアル化を解除して、配列関数を使用して編集します。

選択と表示:
1、3、5、および 7 の値を持つ配列があります。クエリ
を作成する例を次に示します。SELECT

$flags = array(1, 3, 5, 7); // selected from 'users' table and unserialized
$query = "SELECT u.name, f.name, f.description FROM users u INNER JOIN flags f ON ";
$conditions = null;
for($i = 0; $i < count($flags); $i++)
{
    $conditions .= "f.id = $flags[$i] OR ";
}
$conditions = substr($conditions , 0, -4); // removing the last " OR "

$query = $query . $conditions . " WHERE u.name = 'Nikola'";

これは、コードから取得したクエリです。

SELECT u.name, f.name, f.description 
    FROM users u 
    INNER JOIN flags f 
    ON f.id = 1 OR f.id = 3 OR f.id = 5 OR f.id = 7 
    WHERE u.name = 'Nikola'

名前、説明、ユーザー名とともにすべてのフラグを返します。

あとは、結果を表示するだけです。


編集 1 :ユーザー インターフェース
あなたが何を望んでいるのか正確に理解できたかどうかはわかりませんが、ユーザーごとに複数のフラグを許可する場合は、すべてのフラグにチェックボックスを作成するか、ドロップではなく複数の選択肢がある選択メニューを作成することをお勧めします。下。項目を 1 つしか選択できないので、ドロップダウンはお勧めできません。

EDIT 2 : jQuery Autocomplete
を 使用できます。これは Stack Overflow のタグ付けと非常によく似ており、おそらく最良の選択です。もう 1 つのアイデアは、ドロップダウン メニュー を実際に使用して、複数のフラグを許可することです。ユーザーがドロップダウンからフラグを選択すると、AJAX を介して PHP 配列にフラグが格納され、その配列が に格納されます。例: AJAX 経由で PHP ファイルにリクエストを送信します。PHP ファイルで、フラグを格納する変数を読み取ります。空の場合 (フラグはまだありません) - 1 つのキーの配列を追加します。空でない場合は、その値 (配列全体) を読み取り、配列に新しいフラグを追加して、それをセッション変数に返します。


$_SESSION

$_SESSION

session_start();

if(isset($_POST['id'])) $flagid = $_POST['id']; // previously sent request via AJAX that contains this ID.
if(empty($_SESSION['flags'])) $_SESSION['flags'] = array($flagid); // this is the first selected flag
else 
{ 
    // other tags was selected earlier
    $flags = $_SESSION['flags'];
    $flags[] = $flagid;
    $_SESSION['flags'] = $flags;
}
die("ok");

ここで、JS ファイルに戻り、返された結果を確認します。「OK」の場合は次に進み、「OK」以外の場合はエラーを表示します。
同じタグを複数回選択しないようにするには、ユーザーが選択したときに jQuery (この質問を参照) を使用してドロップダウンから削除できます。ページの別の場所に、選択したフラグを表示できます。

編集 3: 「複数」属性を
使用することもできます。<select>

于 2012-07-13T21:07:11.080 に答える