Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [Prototype] Wybór kategorii jak na allegro ;)
Forum PHP.pl > Inne > Oceny
phpion
Witam,
przyznam, że zabawa z Prototype mnie wciągnęła i chciałbym Wam pokazać moją inną pracę.

http://phpworkstation.com/prototype/kategorie.html

Jest to skrypt umożliwiający wybór kategorii w taki sposób w jaki wybiera się kategorie na allegro. Obsługuje nieograniczoną liczbę zagnieżdżeń. Docelowo tablica k ma być tworzona dynamicznie na podstawie bazy danych (Ajax niepotrzebnie spowolniłby skrypt).

Proszę o opinie nt. skrypciku oraz pomoc w pewnym problemie. Mam problem z usuwaniem zbędnych selectów przy cofnięciu się w drzewie kategorii. Sądziłem, że użycie remove() będzie ok ale nie bardzo chce to działać. Tymczasowo więc dałem hide(). Wizualnie wygląda tak jak chciałem jednak elementy nadal siedzą w kodzie, a nie powinny. Gdyby ktoś znał rozwiązanie proszę o info.

  1. var Category = Class.create();
  2. Category.prototype = {
  3. initialize: function(id, name) {
  4. this.id = id;
  5. this.name = name;
  6. },
  7.  
  8. getId: function() {
  9. return this.id;
  10. },
  11.  
  12. getName: function() {
  13. return this.name;
  14. }
  15. }
  16.  
  17. var CategoryList = Class.create();
  18. CategoryList.prototype = {
  19. initialize: function(id) {
  20. this.id = id;
  21. },
  22.  
  23. build: function() {
  24. var categoryId = this.id;
  25.  
  26. if (k[this.id]) {
  27. categoryId = "";
  28.  
  29. var select = document.createElement("select");
  30.  
  31. select.setAttribute("size", 10);
  32.  
  33. select.onchange = function() {
  34. var i = 0;
  35.  
  36. while (select.next(i)) {
  37. //select.next(i).remove(); //<- questionmark.gif
  38. select.next(i).hide();
  39. i++;
  40. }
  41.  
  42. var cl = new CategoryList(this.value);
  43. cl.build();
  44. }
  45.  
  46. var length = k[this.id].length;
  47.  
  48. for (var i=0; i<length; i++) {
  49. var option = document.createElement("option");
  50. option.text = k[this.id][i].getName();
  51. option.value = k[this.id][i].getId();
  52.  
  53. select.appendChild(option);
  54. }
  55.  
  56. $("container").appendChild(select);
  57. }
  58.  
  59. setCategoryId(categoryId);
  60. }
  61. }
  62.  
  63. var k = new Array();
  64.  
  65. k[0] = new Array();
  66. k[0][0] = new Category(1, "Kategoria 1");
  67. k[0][1] = new Category(2, "Kategoria 2");
  68. k[0][2] = new Category(3, "Kategoria 3");
  69.  
  70. k[1] = new Array();
  71. k[1][0] = new Category(4, "Kategoria 1 1");
  72. k[1][1] = new Category(5, "Kategoria 1 2");
  73. k[1][2] = new Category(6, "Kategoria 1 3");
  74.  
  75. k[2] = new Array();
  76. k[2][0] = new Category(7, "Kategoria 2 1");
  77.  
  78. k[5] = new Array();
  79. k[5][0] = new Category(8, "Kategoria 1 2 1");
  80. k[5][1] = new Category(9, "Kategoria 1 2 2");
  81.  
  82. function initCategoryList() {
  83. var categoryList = new CategoryList(0);
  84. categoryList.build();
  85. }
  86.  
  87. function setCategoryId(id) {
  88. $("categoryId").value = id;
  89. }
  90.  
  91. Event.observe(window, "load", initCategoryList, false);


Pozdrawiam: pion

PS: zastanawiałem się czy nie dać tego do "Gotowe rozwiązania" gdyż jest to dość często poszukiwany skrypt, jednak na razie chciałbym poznać opinie na jego temat.
PS2: teraz zauważyłem, że pod IE skrypt nie działa :/ Opera i FireFox śmigają.
in5ane
Testowałem na FF i muszę przyznać cud malina biggrin.gif
ayeo
Good idea, dude!
AxZx
to dopisz do tego jak powinna wygladac struktura tabel w bazie oraz kod php do wygenerowania tablicy w JS.
wtedy bedzie calkiem uzyteczne gotowe rozwiazanie:)

ps. w alledrogo tez tak jest to zrobione? tzn tez od razu wszystkie tablice sa w JS wpisywane? jak bedzie tego 100 tys kategorii to nie bedzie za duzo? przeciez user zazwyczaj wybiera tylko jedna kategorie wiec 90% innych bedzie niepotrzebnie zaladowane, moze zrobisz w AJAX jezeli jest duzo kategorii?smile.gif
lectric
Czy stworze kategorie o poziomie zagnieżdżenia powiedzmy 10 i zacznę wybierać kategorię w Twoim prototype dochodząc do ostatniego poziomu (10), zdecyduje się wybrać inną podkategorię w poziomie 2 to czy wybór wpłynie na wszystkie podkategorie w głąb czy tylko na następną głębiej. ?
phpion
Cytat(AxZx @ 23.11.2007, 12:18:45 ) *
to dopisz do tego jak powinna wygladac struktura tabel w bazie oraz kod php do wygenerowania tablicy w JS.

Tabela może mieć różną strukturę ale powinna zawierać polę id, parent_id, name. Tyle jest potrzebne do działania tego skryptu. Kod PHP chyba nie jest trudny do napisania więc jeśli ktoś będzie zainteresowany to sam sobie napisze.

Cytat(AxZx @ 23.11.2007, 12:18:45 ) *
ps. w alledrogo tez tak jest to zrobione? tzn tez od razu wszystkie tablice sa w JS wpisywane? jak bedzie tego 100 tys kategorii to nie bedzie za duzo? przeciez user zazwyczaj wybiera tylko jedna kategorie wiec 90% innych bedzie niepotrzebnie zaladowane, moze zrobisz w AJAX jezeli jest duzo kategorii?smile.gif

Nie wiem czy jest tam użyty Ajax czy nie. Na moje potrzeby odwołania ajaxowe byłyby zbędne, lategorie w spokoju można trzymać w tablicy.

Cytat(lectric @ 23.11.2007, 13:07:20 ) *
Czy stworze kategorie o poziomie zagnieżdżenia powiedzmy 10 i zacznę wybierać kategorię w Twoim prototype dochodząc do ostatniego poziomu (10), zdecyduje się wybrać inną podkategorię w poziomie 2 to czy wybór wpłynie na wszystkie podkategorie w głąb czy tylko na następną głębiej. ?

Tak, wpłynie na wszystkie następne. Zobacz na przykładzie w podanym przeze mnie linku. Wybierasz kolejno:
- Kategoria 1
- Kategoria 1 2
- Kategoria 1 2 1
po czym chcesz zmienić Kategorię 1 na Kategorię 2. Następuje usunięcie (a konkretnie ukrycie :/) selectów powyżej danego poziomu zagnieżdżenia i pojawiaja się select dla Kategorii 2 (zawierający 1 pozycję Kategoria 2 1).
lectric
Cytat(phpion.com @ 23.11.2007, 11:30:05 ) *
Tak, wpłynie na wszystkie następne. Zobacz na przykładzie w podanym przeze mnie linku. Wybierasz kolejno:
- Kategoria 1
- Kategoria 1 2
- Kategoria 1 2 1
po czym chcesz zmienić Kategorię 1 na Kategorię 2. Następuje usunięcie (a konkretnie ukrycie :/) selectów powyżej danego poziomu zagnieżdżenia i pojawiaja się select dla Kategorii 2 (zawierający 1 pozycję Kategoria 2 1).


Tak ale jesli bedzie wiecej w głąb kategorii ?
phpion
Również nie będzie problemu.
taoo
nie wiem czy to tymczasowe czy jak, ale u mnie na IE7 nie działa
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.