Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php/mysql] zarządzanie menu strony
Forum PHP.pl > Forum > PHP
jarmiar
Witam,

Aktualnie muszę wykonać zarządzanie menu strony.
Wszystko sprawnie mi idzie do momentu, w którym muszę zmieniać pozycję danego elementu.

Struktura mojej bazy danych jest następująca:

ID | tytul | adres | pozycja
(int) (text) (text) (text)


czy macie jakieś propozycje?

ja robię to pobierając aktualną pozycję danego elementu i odejmując od tego 1. oczywiście elementy wyświetlam z warunkiem ORDER BY ASC

ale niestety, kiedy dojdzie do zera już wtedy nie chce mi zmieniać pozycji.

proszę o jakieś porady jak to wykonać

pozdrawiam
legorek
Żeby przesunąć jakiś element w górę najlepiej zamienić go miejscem z elementem który jest wyżej (ma większą wagę). Czyli:
1) Pobierasz wagę elementu który przesuwasz.
  1. SELECT @waga_stary:=waga FROM elementy WHERE id=przesuwany_element

2) Potem pobierasz wagę i id elementu który zostanie zamieniony (przesunie się w dól)
  1. SELECT @waga_nowy:=waga, @nastepny:=id FROM elementy WHERE waga>@waga_stary ORDER BY waga ASC LIMIT 1

3) Potem zamieniasz elementy miejscami czyli:
  1. UPDATE elementy SET waga=@waga_nowy WHERE id=przesuwany_element

  1. UPDATE elementy SET waga=@waga_starty WHERE id=@nastepny


Dla przenoszenia w dół analogicznie, zmieniasz tylko warunki w drugim zapytaniu. Plusem tego rozwiązania jest to, że możesz przesuwać nie tylko sąsiadujące ze sobą elementy, ale każde dwa dowolne.
oscar17
Nie do końca rozumiem twój problem, ale jeśli dobrze myślę to chcesz aby konkretne elementy były według jakiejś przez ciebie wybranej kolejności.
To robisz kolumnę np. 'order' (lub też nie wiem czy do tego nie ma służyć twoja 'pozycja') typu int w której ustawiasz kolejność elementów - zakładasz sobie np, że im mniejsze tym wyżej i wstawiasz np. że element1 ma order=10 a element2 ma order=20 (warto dawać co 10, bo potem łatwo wrzucić coś pomiędzy nie, a nie musisz wszystkich zwiększać o jeden).
Następnie wyciągasz wszystko "SELECT * FROM tabela ORDER BY order" o wyrzucasz po kolei każdy element menu...

--edit--
Trochę się spóźniłem, ale na podstawie postu powyżej zrozumiałem chyba o co ci chodziło, więc napisałem trochę nie na temat.
Ale może to rozwiązanie też się do czegoś przyda ;-)
jarmiar
@legorek

Twoje rozwiązanie nie dokońca działa, gdyż elementy przesuwają mi się w sposób haotyczny.

tzn elementy sąsiednie nie zmieniają się miejscami przy przesuwaniu w gorę

element leżący raz na samym koncu zmienił się i był na samym pozcątku
legorek
Bo na początku musisz "ręcznie" przyporządkować każdemu elementowi unikalną wagę. Pamiętaj też warunkach przegowych (pierwszy i ostatni element)
webdice
Każdemu nowemu elementowi nadajesz pozycje o jeden większą (mowa oczywiście o dodawaniu). Podczas przenoszenia, sprawdzasz pozycje aktualnego oraz elementu powyższego lub poniższego (w zależności w którą stronę przesuwasz) i zamieniasz wartości obu rekordów.
jarmiar
Cytat(legorek @ 23.06.2008, 12:54:06 ) *
Bo na początku musisz "ręcznie" przyporządkować każdemu elementowi unikalną wagę. Pamiętaj też warunkach przegowych (pierwszy i ostatni element)




czyli co dokłądnie muszę zrobić?

dodać zapytanie za pomocą phpmyadmina?
legorek
Powiedzmy że masz teraz jakąś tabele z elementami które chcesz poustawiać. Stwórz pole waga (int). Teraz musisz tymczasowo każdemu z elementów przyporządkować jakąś pozycję (wartość pola waga), najlepiej kolejne liczby (uwaga: pozycje nie mogą się powtarzać). Czy zrobisz to w phpMyAdminie czy za pomocą pętli w PHP to już Twoja sprawa. Jak już to zrobisz będziesz mógł sobie dowolnie przestawiać elementy za pomocą zapytań które Ci podałem. I nie mów że nie działa, czy coś w tym stylu. Jeśli nie działa to znaczy że na 90% ty robisz coś źle. Pozostałe 10% to jakaś moja literówka, bo pisałem to z palca. Naprawdę wystarczy tylko trochę pomyśleć, przecież to są podstawy programowania. Może w ogóle napisać za ciebie ten kod, piwko podać z lodówki?
jarmiar
Wiem, ze są to podstawy programowania. I dokłądnie przed tem tak robiłem jak mi napisałeś
Tylko zamiast pola "waga" mam pole "pozycja" i dokładnie tak samo przypisałem te dane.

Jak odpalam mój skrypt, to po kliknięciu na przycisk "Przenieś w górę" aktualna pozycja nie zamienia się miejscem z sąsiadującym elementem, lecz haotycznie się porusza.

Proszę wyjaśnij mi jeszcze jak to zrobić, aby na dół shocdziło bo odwróciłem warunek w w/w przykładzie zapytania i niestety po kliknięciu w przycisk "Przenieś w dół" nic się nie dzieje, a co więcej po kliknięciu w przycisk "Przenieś do góry" też nic się nie dzieje

Dołączam mój listing
  1. <?
  2. if($akcja == 'przenies')
  3. {
  4.  
  5.  //przesuwanie elementów z menu
  6.  
  7.  $pozycja = $_GET['pozycja'];
  8.  $id = $_GET['id'];
  9.  
  10. if($pozycja == '0')
  11.  {
  12.  $pozycja = '1';
  13.  }
  14.  
  15.  $gdzie = $_GET['gdzie'];
  16.  
  17.  
  18.  if(empty($id) || empty($gdzie))
  19.  {
  20.  
  21.  echo '<div class="informacja">Błędne parametry wejściowe</div>';
  22.  
  23.  }
  24.  else
  25.  {
  26.  
  27.  //wykonanie oiperacji przenoszenia
  28.  
  29.  
  30.  
  31.  if($gdzie == 'gora')
  32.  {
  33.  
  34.  $zapytanie = "SELECT @waga_stary:=`pozycja` FROM `nawigacja` WHERE `id`='".$id."'";
  35.  
  36.  polacz();
  37.  
  38.  mysql_query($zapytanie);
  39.  
  40.  $zapytanie = "SELECT @waga_nowy:=`pozycja`, @nastepny:=`id` FROM `nawigacja` WHERE `pozyc
    ja`>@waga_stary ORDER BY `pozycja` ASC LIMIT 1"
    ;
  41.  
  42.  mysql_query($zapytanie);
  43.  
  44.  $zapytanie = "UPDATE `nawigacja` SET `pozycja`=@waga_nowy WHERE `id`='".$id."'";
  45.  
  46.  mysql_query($zapytanie);
  47.  
  48.  $zapytanie = "UPDATE `nawigacja` SET `pozycja`=@waga_starty WHERE `id`=@nastepny ";
  49.  
  50.  $zapytanie = mysql_query($zapytanie);
  51.  
  52.  ?>
legorek
Napisałem ci, że moglem zrobić literówkę: @waga_starty zamień na @waga_stary. W każdym razie powinieneś sam to wyłapać.
jarmiar
no faktycznie smile.gif nie zauważyłem teraz działa

ale jak chcę przenieść na dół to nie działa

zapytanie warunkowe przy przenoszeniu na dół

  1. <?php
  2. $zapytanie = "SELECT @waga_nowy:=`pozycja`, @nastepny:=`id` FROM `nawigacja` WHERE `pozyc
    ja`<@waga_stary ORDER BY `pozycja` ASC LIMIT 1"
    ;
  3. ?>
legorek
Zamień ASC na DESC.
jarmiar
dzięki działa. choć nie do końca tak jakbym chciał. ale może tak zostać.
plusik dla Ciebie

pzdr
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.