2012-07-13 136 views
4

我想知道是否有人可以指導我設置標記/通知系統的正確方向。我會說與標籤系統非常相似。如果有人知道任何教程或示例設置,那就太好了。如何設置標記系統

目的

基本上,該標誌是附加到數據項,包括客戶,性質,承包商,應用等與通知信息的關於該項目的一個重要部分的用戶的角色。這些標誌應該來自用戶可以添加或刪除的預定項目列表。

數據庫

我想用3臺設置去。

  • flags表:可用標誌列表,以及確定這些標誌適用於哪些(客戶,屬性等)的設置的列表。
  • 指示給定項目的鏈接表具有附加的給定標誌。
  • 適當的實體表

用戶界面

我想一些功能的是類似的堆棧溢出的,如添加和移除標籤。也許使用jQuery的標籤 - 它呢?主要是,我希望用戶能夠在選擇一個或多個標誌時從下拉列表和標誌圖標顯示中選擇標誌。將鼠標懸停在標誌上應顯示一個工具提示,其中列出了附加到該項目的標誌。不知道這個設置的一個標誌顯示是否適合查詢,而不是顯示多個標誌。 樣品視覺:http://i232.photobucket.com/albums/ee2/nismomatic97/flag.png

回答

6

您的主要問題是,您有任何數量的可能不同實體的標誌記錄,而不是一個單一的實體(如「客戶」)。

過去,我通過在每個表(「FlagID」)中提供一個在整個數據庫中唯一的Foreign Key字段來解決此問題。一個GUID是適合的。然後,您可以簡單地將適用於您的特定上下文的表JOIN添加到Flags表中的FlagID,並且您將只獲得適用於該特定實體的標誌。

例如,當您將Flags表中的FlagID設置爲您的Customers表中的FlagID時,您只會獲得與Customers相關的標誌。

請注意堆棧溢出沒有「多個實體」問題;所有標誌都被轉換爲帖子。

+0

用它來設計表格。 – sammich 2012-07-15 01:27:13

3

基本上,你需要一個帶有標誌和一張表的客戶/用戶表。 這些表應該是這樣的:

標誌表

  • 標誌的唯一ID(最簡單的方法是將「ID」字段設置爲AUTO_INCREMENT)。
  • 標誌名稱
  • 標誌說明
  • 更多的東西你想

用戶表

  • 存儲標誌(我建議存放國旗的序列化陣列)場
  • 您需要其他信息的其他數據

除了存儲序列化數組之外,還可以創建另一個表來存儲用戶的唯一ID和標識ID。每個標誌一行。但是,我認爲第一種方法更好,更高效。

選擇和顯示國旗:

  • 選擇包含標誌
  • 陣列解序列化,並使用JOIN選擇的名稱和標誌的描述的序列化的陣列的場。

例子

存儲標誌,以用戶的個人資料
讓我們假設你想存儲ID爲1,3,5和7的標誌:

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

如果您想編輯標誌,選擇字段,反序列化數組並使用Array functions進行編輯。

選擇和顯示:
所以,你有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' 

它將返回所有標誌及其名稱,描述和用戶的nam即

您所要做的就是現在顯示結果。


編輯1用戶界面
我不知道如果我明白你到底想要什麼,但如果你要允許每個用戶多個標誌,我建議你做一個checkbox每個國旗或select menu with multiple choices而不是下拉。我認爲下拉並不是一個好主意,因爲您只能選擇一個項目。

編輯2
可以使用jQuery Autocomplete這是非常相似的堆棧溢出的標籤,可能是最好的選擇。

另一個想法是,你實際上可以使用下拉菜單,仍然允許多個標誌。
這是事情:當用戶從下拉菜單中選擇一個標誌,通過AJAX在PHP數組中存儲標誌,並將數組存儲在$_SESSION中。

示例:通過AJAX向PHP文件發送請求,在PHP文件中讀取您的$_SESSION變量,其中應存儲標誌。如果它是空的(沒有標誌) - 添加1個數組。如果它不爲空,則讀取其值(整個數組),向數組中添加新標誌並將其返回到會話變量。

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文件中,檢查返回的結果。如果「確定」,則繼續,如果與「確定」不同,則顯示錯誤。
要防止多次選擇相同的標記,可以在用戶選擇jQuery時使用jQuery(請參閱this問題)從下拉菜單中將其刪除。在頁面上的其他位置,您可以顯示選定的標誌。

編輯3:
你也可以使用一個<select> with "multiple" attribute

+1

迄今爲止非常有幫助的答案。我現在正在努力讓桌子設計失敗!將更新結果然後將考慮用戶界面。 – sammich 2012-07-13 21:24:00

+0

@sammich我用UI建議更新了我的答案。 – 2012-07-13 22:30:35

+0

@ Nikola K.謝謝,看到你的編輯。是的,我同意這個問題與下拉。我擔心的是,如果最終出現一個給定實體的標誌很多,複選框或具有多個選項的菜單可能會使用戶界面變得混亂。仍在研究這一點。 – sammich 2012-07-15 01:26:30