CREATE TABLE `mp_attribute_kind` ( `ID` int(11) NOT NULL AUTO_INCREMENT, `NAME` varchar(150) DEFAULT NULL, `DESCRIPTION` text, `IFACE_OUTLINE_NR` int(5) NOT NULL DEFAULT '0', PRIMARY KEY (`ID`), UNIQUE KEY `ID` (`ID`) ) ENGINE=MyISAM AUTO_INCREMENT=5 DEFAULT CHARSET=latin1; CREATE TABLE `mp_attributes` ( `ID` int(11) NOT NULL AUTO_INCREMENT, `ID_KLIENCI` int(11) DEFAULT '0', `ID_MP_ATTRIBUTE` int(11) DEFAULT '0', `CHECKSUM` char(2) DEFAULT NULL, PRIMARY KEY (`ID`), UNIQUE KEY `ID` (`ID`) ) ENGINE=MyISAM AUTO_INCREMENT=5210 DEFAULT CHARSET=latin1; CREATE TABLE `mp_attribute` ( `ID` int(11) NOT NULL AUTO_INCREMENT, `NAME` varchar(150) DEFAULT NULL, `DESCRIPTION` text, `ID_MP_ATTRIBUTE_KIND` int(11) DEFAULT '0', `FIELD_TYPE` varchar(20) NOT NULL DEFAULT 'checkbox', PRIMARY KEY (`ID`), UNIQUE KEY `ID` (`ID`) ) ENGINE=MyISAM AUTO_INCREMENT=32 DEFAULT CHARSET=latin1;
Za wykonywanie zapytań, pobieranie cech oraz ich wyświetlanie w formie drzewa odpowiada skrypt poniżej. (Pewne rzeczy musiałem usunąć bo post był za duży).
<? ?> <? echo "<?xml version="1.0" encoding="utf8"?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> "; @mysql_connect($_SESSION['server'],$_SESSION['user_db'],$_SESSION['haslo']); @mysql_select_db('oystercrm'); if ($_POST['action']='send') { if (isset($_POST['sub_cat'])) { for ($i=0; $i < count($_POST['sub_cat']); $i++) { $getin_checked=mysql_query('SELECT * FROM mp_attributes WHERE id_klienci='.$_SESSION['id'].' AND id_mp_attribute='.$_POST['sub_cat'][$i]); /*print $_POST['sub_cat'][$i];*/ /*echo !mysql_num_rows($getin_checked);*/ $checksum=mysql_num_rows($getin_checked); if ($checksum==0) { $m_date=date("Y-m-d"); mysql_query("update mp_modification set modify_data='".$m_date."' where id_klienci=".$_SESSION['id']."") or die ("zle"); mysql_query('INSERT INTO mp_attributes (id_klienci,id_mp_attribute) VALUES ('.$_SESSION['id'].','.$_POST['sub_cat'][$i].')'); } } } } echo "<head>"; ?> <script LANGUAGE="JavaScript"> <!-- var caution = false function setCookie(name, value, expires, path, domain, secure) { (...) } function item(parent, text, depth) { this.parent = parent this.text = text this.depth = depth } function makeArray(length) { this.length = length } <!-- funkcja zaznaczania wszystkikch pól typu checkbox w danej strukturze DOM o ile gałęzie są rozwiniete
//--> function setCheckboxes( container_id, state ) { var checkboxes = document.getElementById(container_id).getElementsByTagName('input'); for ( var i = 0; i < checkboxes.length; i++ ) { if ( checkboxes[i].type == 'checkbox' ) { checkboxes[i].checked = state; } } return true; } <? $show_items=mysql_query('select mp_attribute_kind.name, mp_attribute.name,mp_attribute.id from mp_attribu
tes, mp_attribute_kind, mp_attribute where mp_attributes.id_klienci='.$_SESSION['id'].' and mp_attribute.id=mp_attributes.id_mp_attribute and mp_attribute_kind.id = mp
_attribute.id_mp_attribute_kind'); if (!mysql_num_rows($show_items)==0) { ?> <!-- funkcja zaznaczania pól checkbox o values pobranych z tabeli SQL mp_attribute //--> function Check_Items(container_id) { var items = document.getElementById(container_id).getElementsByTagName('input'); for (var i=0; i < items.length; i++) { if ( <? @mysql_connect($_SESSION['server'],$_SESSION['user_db'],$_SESSION['haslo']); @mysql_select_db('mercator'); /*Pobieramy wartości dla danego ID */ $show_items=mysql_query('select mp_attribute_kind.name, mp_attribute.name,mp_attribute.id from mp_attribu
tes, mp_attribute_kind, mp_attribute where mp_attributes.id_klienci='.$_SESSION['id'].' and mp_attribute.id=mp_attributes.id_mp_attribute and mp_attribute_kind.id = mp
_attribute.id_mp_attribute_kind'); $counter_items=mysql_num_rows($show_items); $item_and_sig=0; while ($item=mysql_fetch_array($show_items)) { $selected_item=$item[2]; $item_and_sig++; if ($item_and_sig>0 && $item_and_sig<$counter_items) $sig_value="||"; else $sig_value=""; echo "items[i].value=='".$selected_item."' ".$sig_value." "; } echo ")"; echo "{r"; echo "items[i].checked = true;r"; echo "}r"; echo "else {items[i].checked = false;}r"; echo "}r"; echo "return true;r"; echo "}r"; } $all_categories=mysql_query('select count(id) from mp_attribute_kind'); $row=mysql_fetch_row($all_categories); $counter=$row[0]+1; $all_attributes=mysql_query('SELECT count(ID) FROM mp_attribute'); $attr=mysql_fetch_array($all_attributes); $Array_length=$attr[0]+$counter-1; echo "function makeDatabase() {r"; echo "outline = new makeArray(".$Array_length.")r"; for ($i=1; $i<$counter;$i++) { $all_categories_name=mysql_query('SELECT NAME,DESCRIPTION,IFACE_OUTLINE_NR FROM mp_attribute_kind WHERE ID='.$i); while ($row=mysql_fetch_row($all_categories_name)) { $all_attributes_for_category=mysql_query('SELECT ID,NAME,DESCRIPTION,FIELD_TYPE,ID FROM mp_attribute WHERE id_mp_attribute_kind='.$i); $counter_attrib=mysql_num_rows($all_attributes_for_category); echo "outline[".$row[2]."] = new item(true, '".$row[0]." ".$row[1]."', 0)r"; /*echo $row[0]; echo $row[1]; echo $row[2]; echo "<BR>";*/ for ($si=1; $si<$counter_attrib+1;$si++) { while ($cat=mysql_fetch_row($all_attributes_for_category)) { if ($i>1) $cat[0]=$cat[0]+$i-1; echo "outline[".$cat[0]."] = new item(false, '<input type=".$cat[3]." name=sub_cat[] value=".$cat[4]."> ".$cat[1]." ".$cat[2]."</input>', 1)r"; /*echo '<input type='.$cat[3].'>'; echo $cat[0]; echo $cat[1] ; echo $cat[2]; echo "<BR>";*/ } } } } ?> setStates() setImages() } function setStates() { var storedValue = getCookie("outline") if (!storedValue) { for (var i = 0; i < outline.length; ++i) { if (outline[i].depth == 0) outline[i].state = true else outline[i].state = false } } else { for (var i = 0; i < outline.length; ++i) { if (storedValue.charAt(i) == '1') outline[i].state = true else outline[i].state = false } } } function setImages() { for (var i = 0; i < outline.length; ++i) { if (outline[i].state) if (outline[i].parent) if (outline[i + 1].state) outline[i].pic = '<A HREF="java script:toggle(' + i + ')"><IMG SRC="minus.gif" BORDER=0></A><IMG SRC="folderek.gif" BORDER=0><B>' else outline[i].pic = '<A HREF="java script:toggle(' + i + ')"><IMG SRC="fil1.gif" BORDER=0></A><IMG SRC="folderek.gif" BORDER=0><B>' else outline[i].pic = '</B></B></B></B><IMG SRC="gowienko.bmp" BORDER=0>' } } function toggle(num) { for (var i = num + 1; i < outline.length && outline[i].depth >= outline[num].depth + 1; ++i) { if (outline[i].depth == outline[num].depth + 1) outline[i].state = !outline[i].state } setStorage() history.go(0) } function setStorage() { var text = "" for (var i = 0; i < outline.length; ++i) { text += (outline[i].state) ? "1" : "0" } setCookie("outline", text) } makeDatabase() // --> </SCRIPT> </head> <body> <script LANGUAGE="JavaScript"> <!-- document.write('<form name=form id=form action="<?php echo $_SERVER['PHP_SELF'] ?>" method=POST><PRE><font face=arial size=2>') document.write('<input type=hidden name=action value=send>') for (var i = 0; i < outline.length; ++i) { if (outline[i].state) { for (var j = 0; j < outline[i].depth * 5; ++j) { document.write(' ') } document.write(outline[i].pic, ' ', outline[i].text, '<BR>') } else { var previous = i for (var k = i + 1; k < outline.length && outline[k].depth >= outline[previous].depth; ++k) { ++i } } } document.write('</font></PRE><INPUT TYPE=SUBMIT></form>') // --> </SCRIPT> <script> setTimeout("java script:Check_Items('form', false);",10) </script> </body>
I nie mówię, wszystko byłoby ładnie, bo i pobiera i zapisuje do odpowiednich tabel relacyjnie, lecz przecież to chyba normalne, żeby mozna było również odznaczać już wcześniej zapisane cechy. No i tu pojawia się problem, gdyż ta cała nieszczęsna struktura tabel, jest może i fajna i elastyczna, ale jak teraz u licha stworzyć jakąś tablice z danymi zazanczonymi w interfejsie, porównać z zawartością w tabeli mp_attributes, oraz podjąć odpowiednią akcję, czyli zastosować INSERT tam gdzie pole w interfejsie jest zaznaczone a w tabeli puste (narazie jest tylko dostępna ta opcja!), no i DELETE tam gdzie chceckbox jest pusty a w tabeli jest jakaś wartość. Kiedy oba warunki są puste lub zaznaczone nie wyknuje żadnej operacji. ma ktoś może jakiś pomysł?