Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php][mysql][javascript] Problem z jedną zakładką w moim CRM.
Forum PHP.pl > Forum > PHP
toolmaniak
Witam. Otóż właśnie byłem na ukończeniu swojego flagowego systemu CRM, ale odkryłem jeden mały denerwujący problem z zakładką cechy klientów. Otóż struktura tabel odpowiadających za cechy ma taką postać jak poniżej. Nie powiem, iż trochę zgapiłem od CRM Lefthand, tyle że ich baza stoi na firebird więc musiałem trochę strukturę przerobić i dostosować do swoich potrzeb oraz własnego interfejsu.

  1. CREATE TABLE `mp_attribute_kind` (
  2. `ID` int(11) NOT NULL AUTO_INCREMENT,
  3. `NAME` varchar(150) DEFAULT NULL,
  4. `DESCRIPTION` text,
  5. `IFACE_OUTLINE_NR` int(5) NOT NULL DEFAULT '0',
  6. PRIMARY KEY (`ID`),
  7. UNIQUE KEY `ID` (`ID`)
  8. ) ENGINE=MyISAM AUTO_INCREMENT=5 DEFAULT CHARSET=latin1;
  9.  
  10. CREATE TABLE `mp_attributes` (
  11. `ID` int(11) NOT NULL AUTO_INCREMENT,
  12. `ID_KLIENCI` int(11) DEFAULT '0',
  13. `ID_MP_ATTRIBUTE` int(11) DEFAULT '0',
  14. `CHECKSUM` char(2) DEFAULT NULL,
  15. PRIMARY KEY (`ID`),
  16. UNIQUE KEY `ID` (`ID`)
  17. ) ENGINE=MyISAM AUTO_INCREMENT=5210 DEFAULT CHARSET=latin1;
  18.  
  19. CREATE TABLE `mp_attribute` (
  20. `ID` int(11) NOT NULL AUTO_INCREMENT,
  21. `NAME` varchar(150) DEFAULT NULL,
  22. `DESCRIPTION` text,
  23. `ID_MP_ATTRIBUTE_KIND` int(11) DEFAULT '0',
  24. `FIELD_TYPE` varchar(20) NOT NULL DEFAULT 'checkbox',
  25. PRIMARY KEY (`ID`),
  26. UNIQUE KEY `ID` (`ID`)
  27. ) 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).

  1. <?
  2. session_name('PHPSESSIDCRM');
  3. ?>
  4.  <?
  5. echo "<?xml version="1.0" encoding="utf8"?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "DTD/xhtml1-transitional.dtd">
  6. <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
  7. ";
  8. @mysql_connect($_SESSION['server'],$_SESSION['user_db'],$_SESSION['haslo']);
  9.  
  10. @mysql_select_db('oystercrm');
  11. if ($_POST['action']='send') {
  12. if (isset($_POST['sub_cat']))
  13. {
  14. for ($i=0; $i < count($_POST['sub_cat']); $i++)
  15. {
  16. $getin_checked=mysql_query('SELECT * FROM mp_attributes WHERE id_klienci='.$_SESSION['id'].' AND id_mp_attribute='.$_POST['sub_cat'][$i]);
  17. /*print $_POST['sub_cat'][$i];*/
  18. /*echo !mysql_num_rows($getin_checked);*/
  19. $checksum=mysql_num_rows($getin_checked);
  20. if ($checksum==0)
  21. {
  22. $m_date=date("Y-m-d");
  23. mysql_query("update mp_modification set modify_data='".$m_date."' where id_klienci=".$_SESSION['id']."") or die ("zle");
  24. mysql_query('INSERT INTO mp_attributes (id_klienci,id_mp_attribute) VALUES ('.$_SESSION['id'].','.$_POST['sub_cat'][$i].')');
  25. }
  26. }
  27. }
  28. }
  29. echo "<head>";
  30. ?>
  31. <script LANGUAGE="JavaScript">
  32. <!--
  33.  
  34. var caution = false
  35. function setCookie(name, value, expires, path, domain, secure) {
  36.  
  37. (...)
  38.  
  39. }
  40. function item(parent, text, depth) {
  41. this.parent = parent 
  42. this.text = text 
  43. this.depth = depth 
  44. }
  45. function makeArray(length) {
  46. this.length = length 
  47. }
  48. <!-- funkcja zaznaczania wszystkikch pól typu checkbox w danej strukturze DOM o ile gałęzie są rozwiniete
     //-->
  49. function setCheckboxes( container_id, state ) 
  50. {
  51. var checkboxes = document.getElementById(container_id).getElementsByTagName('input');
  52. for ( var i = 0; i < checkboxes.length; i++ ) 
  53. {
  54. if ( checkboxes[i].type == 'checkbox' ) 
  55. {
  56. checkboxes[i].checked = state;  
  57. }
  58. }
  59. return true;
  60. <?
  61. $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');
  62. if (!mysql_num_rows($show_items)==0)
  63. {
  64. ?>
  65. <!-- funkcja zaznaczania pól checkbox o values pobranych z tabeli SQL mp_attribute //-->
  66. function Check_Items(container_id) 
  67. {
  68. var items = document.getElementById(container_id).getElementsByTagName('input');
  69. for (var i=0; i < items.length; i++)
  70. {
  71. if (
  72. <?
  73. @mysql_connect($_SESSION['server'],$_SESSION['user_db'],$_SESSION['haslo']);
  74.  
  75. @mysql_select_db('mercator');
  76.  
  77. /*Pobieramy wartości dla danego ID */
  78.  
  79. $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');
  80.  
  81. $counter_items=mysql_num_rows($show_items);
  82.  
  83. $item_and_sig=0;
  84.  
  85. while ($item=mysql_fetch_array($show_items)) {
  86.  
  87.  $selected_item=$item[2];
  88.  
  89.  $item_and_sig++;
  90.  
  91.  if ($item_and_sig>0 && $item_and_sig<$counter_items) 
  92.  $sig_value="||";
  93.  else 
  94.  $sig_value="";
  95.  
  96.  echo "items[i].value=='".$selected_item."' ".$sig_value." "; 
  97.  
  98. }
  99. echo ")";
  100. echo "{r";
  101. echo "items[i].checked = true;r";  
  102. echo "}r";
  103. echo "else {items[i].checked = false;}r";
  104. echo "}r"; 
  105. echo "return true;r";
  106. echo "}r";
  107. }
  108. $all_categories=mysql_query('select count(id) from mp_attribute_kind');
  109.  
  110. $row=mysql_fetch_row($all_categories);
  111.  
  112. $counter=$row[0]+1;
  113.  
  114. $all_attributes=mysql_query('SELECT count(ID) FROM mp_attribute');
  115.  
  116. $attr=mysql_fetch_array($all_attributes);
  117.  
  118.  $Array_length=$attr[0]+$counter-1;
  119.  
  120. echo "function makeDatabase() {r";
  121.  
  122. echo "outline = new makeArray(".$Array_length.")r";
  123.  
  124. for ($i=1; $i<$counter;$i++) {
  125.  
  126.  $all_categories_name=mysql_query('SELECT NAME,DESCRIPTION,IFACE_OUTLINE_NR FROM mp_attribute_kind WHERE ID='.$i);
  127.  
  128. while ($row=mysql_fetch_row($all_categories_name)) {
  129.  
  130. $all_attributes_for_category=mysql_query('SELECT ID,NAME,DESCRIPTION,FIELD_TYPE,ID FROM mp_attribute
  131.  
  132.  WHERE id_mp_attribute_kind='.$i);
  133.  
  134. $counter_attrib=mysql_num_rows($all_attributes_for_category);
  135.  
  136. echo "outline[".$row[2]."] = new item(true, '".$row[0]." ".$row[1]."', 0)r";
  137.  
  138. /*echo $row[0]; echo $row[1]; echo $row[2]; echo "<BR>";*/
  139. for ($si=1; $si<$counter_attrib+1;$si++) {
  140.  
  141. while ($cat=mysql_fetch_row($all_attributes_for_category)) {
  142.  
  143. if ($i>1) $cat[0]=$cat[0]+$i-1;
  144.  
  145. echo "outline[".$cat[0]."] = new item(false, '<input type=".$cat[3]." name=sub_cat[] value=".$cat[4].">&nbsp;".$cat[1]." ".$cat[2]."</input>', 1)r";
  146.  
  147. /*echo '<input type='.$cat[3].'>'; echo $cat[0]; echo $cat[1] ; echo $cat[2]; echo "<BR>";*/
  148. }
  149. }
  150. }
  151. }
  152. ?>
  153. setStates()
  154. setImages()
  155. }
  156.  
  157. function setStates() {
  158. var storedValue = getCookie("outline")
  159.  
  160. if (!storedValue) {
  161. for (var i = 0; i < outline.length; ++i) {
  162. if (outline[i].depth == 0)
  163. outline[i].state = true
  164. else
  165. outline[i].state = false
  166. }
  167. } else {
  168. for (var i = 0; i < outline.length; ++i) {
  169. if (storedValue.charAt(i) == '1')
  170. outline[i].state = true
  171. else
  172. outline[i].state = false
  173. }
  174. }
  175. }
  176. function setImages() {
  177. for (var i = 0; i < outline.length; ++i) {
  178. if (outline[i].state)
  179. if (outline[i].parent) 
  180. if (outline[i + 1].state) 
  181. outline[i].pic = '<A HREF="java script:toggle(' + i + ')"><IMG SRC="minus.gif" BORDER=0></A><IMG SRC="folderek.gif" BORDER=0><B>'
  182. else 
  183. outline[i].pic = '<A HREF="java script:toggle(' + i + ')"><IMG SRC="fil1.gif" BORDER=0></A><IMG SRC="folderek.gif" BORDER=0><B>'
  184. else 
  185. outline[i].pic = '</B></B></B></B><IMG SRC="gowienko.bmp" BORDER=0>'
  186. }
  187. }
  188. function toggle(num) {
  189. for (var i = num + 1; i < outline.length && outline[i].depth >= outline[num].depth + 1; ++i) {
  190. if (outline[i].depth == outline[num].depth + 1)
  191. outline[i].state = !outline[i].state 
  192. }
  193. setStorage()
  194. history.go(0)
  195. }
  196. function setStorage() {
  197. var text = ""
  198. for (var i = 0; i < outline.length; ++i) {
  199. text += (outline[i].state) ? "1" : "0"
  200. }
  201.  
  202. setCookie("outline", text)
  203. }
  204. makeDatabase()
  205. // -->
  206. </SCRIPT>
  207. </head>
  208. <body>
  209. <script LANGUAGE="JavaScript">
  210. <!--
  211. document.write('<form name=form id=form action="<?php echo $_SERVER['PHP_SELF'] ?>" method=POST><PRE><font face=arial size=2>')
  212. document.write('<input type=hidden name=action value=send>')
  213. for (var i = 0; i < outline.length; ++i) {
  214. if (outline[i].state) {
  215. for (var j = 0; j < outline[i].depth * 5; ++j) {
  216. document.write(' ')
  217. }
  218. document.write(outline[i].pic, ' ', outline[i].text, '<BR>')
  219. } else {
  220. var previous = i
  221. for (var k = i + 1; k < outline.length && outline[k].depth >= outline[previous].depth; ++k) {
  222. ++i
  223. }
  224. }
  225. }
  226. document.write('</font></PRE><INPUT TYPE=SUBMIT></form>')
  227. // -->
  228. </SCRIPT>
  229. <script>
  230. setTimeout("java script:Check_Items('form', false);",10)
  231. </script>
  232. </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ł?
sticker
po 1 nie wyjaśniłeś co jest w tabeli i twoj problem jakiej tabeli dotyczy ale tak na macajewa moze uda mi sie trafić w rozwiązanie twojego problemu:

otoż np.
-możesz to zrobić poprzez zrobienie flag mówiących o czy dany atrybut jest zaznaczony na 1 lub 0 ( i wtedy w razie potrzeby bawić się na przemiat insertem i updejtem)
- możesz też zastosować status bitowy tzn dany atrybut jest kodowany na odpowiednim bicie i poprzez odpowiedni updejt wiedzieć jakie atrybuty należą do danego klienta ( tu by trzeba jeszcze sobie jakiś słownik stworzyć coby sie samemu nie pogubić w statusach)

i tak na marginesie jak masz jakieś relacje to nie rób delete bo czasem przy jakimś błędzie ludzkim możesz stracić cenne dane smile.gif
toolmaniak
Kod
po 1 nie wyjaśniłeś co jest w tabeli i twoj problem jakiej tabeli dotyczy ale tak na macajewa moze uda mi sie trafić w rozwiązanie twojego problemu:


Tu są przykładowe dane z poszczególnych tabel które podałem. Poza tym jeśli chodzi o relacje nie mają one szczególnego zastosowania w działaniach użytkownika, który operuje w sumie tylko i wyłącznie na polach z mp_attributes. Gdyby było inaczej zmieniłbym silnik na InnoDB, wyłączył AUTOCOMMIT i odpalił transakcje.

Kod
>select * from mp_attribute_kind;
+----+------------------+-------------+------------------+
| ID | NAME             | DESCRIPTION | IFACE_OUTLINE_NR |
+----+------------------+-------------+------------------+
|  1 | Opiekunowie      | NULL        |                0 |
|  2 | Introligatorka   | NULL        |                7 |
|  3 | Klient - formaty | NULL        |               16 |
|  4 | Rodzaj           | NULL        |               21 |
+----+------------------+-------------+------------------+
4 rows in set (0.00 sec)

>select * from mp_attribute where ID_MP_ATTRIBUTE_KIND=3 ORDER BY ID;
+----+------+-------------+----------------------+------------+
| ID | NAME | DESCRIPTION | ID_MP_ATTRIBUTE_KIND | FIELD_TYPE |
+----+------+-------------+----------------------+------------+
| 15 | A2   | NULL        |                    3 | checkbox   |
| 16 | B1   | NULL        |                    3 | checkbox   |
| 17 | B2   | NULL        |                    3 | checkbox   |
| 18 | B3   | NULL        |                    3 | checkbox   |
+----+------+-------------+----------------------+------------+
4 rows in set (0.00 sec)

>select mp_attribute_kind.name, mp_attribute.name,mp_attribute.id from mp_attributes, mp_attribute_kind, mp_attribute where mp_attributes.id_klienci=2 and mp_attribute.id=mp_attributes.id_mp_attribute and mp_attribute_kind.id = mp_attribute.id_mp_attribute_kind;
+------------------+-----------------+----+
| name             | name            | id |
+------------------+-----------------+----+
| Opiekunowie      | Jan Kowalski    |  3 |
| Klient - formaty | B1              | 16 |
| Introligatorka   | Morgana         |  9 |
+------------------+-----------------+----+
3 rows in set (0.00 sec)

I teraz zgodnie ze skryptem z poprzedniego posta

  1. <?php
  2. if ($_POST['action']='send') {
  3. if (isset($_POST['sub_cat']))
  4. {
  5. for ($i=0; $i < count($_POST['sub_cat']); $i++)
  6. {
  7. $getin_checked=mysql_query('SELECT * FROM mp_attributes WHERE id_klienci='.$_SESSION['id'].' AND id_mp_attribute='.$_POST['sub_cat'][$i]);
  8. /*print $_POST['sub_cat'][$i];*/
  9. /*echo !mysql_num_rows($getin_checked);*/
  10. $checksum=mysql_num_rows($getin_checked);
  11. if ($checksum==0)
  12. {
  13. $m_date=date("Y-m-d");
  14. mysql_query("update mp_modification set modify_data='".$m_date."' where id_klienci=".$_SESSION['id']."") or die ("zle");
  15. mysql_query('INSERT INTO mp_attributes (id_klienci,id_mp_attribute) VALUES ('.$_SESSION['id'].','.$_POST['sub_cat'][$i].')');
  16. }
  17. }
  18. }
  19. }
  20. ?>


kiedy coś zaznaczymy w polu np. checkbox czy radio i wyślemy POST-em to odpali zapytanie: mysql_query('INSERT INTO mp_attributes (id_klienci,id_mp_attribute) VALUES ('.$_SESSION['id'].','.$_POST['sub_cat'][$i].')');

Ale jesli odznaczymy coś w interfejsie to nie wyśle oczywiście tego pola bo to normalne, niezaznaczone pole nie jest wysyłane, więc to co chcemy usunąć nie pojawi się w tablicy $_POST rzecz jasna. I teraz zastanawiam się po prostu nad tym jak poprawić interfejs aby rozróżniał odznaczenie pola i odpalał inną kwerendę SQL. Mam nadzieję że w miarę jasno to opisałem. worriedsmiley.gif
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.