Avatar billede ewax Nybegynder
26. august 2008 - 13:21 Der er 20 kommentarer og
2 løsninger

Menuplacering i CMS

Hey alle sammen, har ledt efter noget hjælp til dette længe! Og fik at vide der skulle være nogle rigtig kloge hoveder herinde som kunne hjælpe.

Jeg har lavet et større cms system, og her vil jeg gerne ha en lille nødvendig feature på som gør det ekstra sprødt.
Nemlig at kunne rykke mine sider op og ned i menuplaceringen.

Skal lige siges jeg har gennemsøgt forumet så godt jeg kunne, men har kun fundet asp løsninger :)


Jeg vil ikke bare lave det så den ligger en til eller fra, eller noget i den stil, da dette blir usikkert hvis man sletter en side.

Jeg skal bruge noget der kan finde id på den udskrevne række før, og efter.

Jeg har fundet rækken før, da jeg gemmer en der hedder $lastid til sidst i min while løkke.

Men den er lidt tricky med at finde den næste! og det er her jeg sidder fast


Min tabel hedder for eksempel

ID    Titel    Place

1      Side1    1
3      Side2    2
4      Side3    4
7      Side4    7


Håber nogen kan hjælpe
Avatar billede jakobdo Ekspert
26. august 2008 - 13:43 #1
Avatar billede ewax Nybegynder
26. august 2008 - 13:47 #2
Uha.. det ser jo godt ud.. :) det vil jeg lige prøve at kigge på
Avatar billede ewax Nybegynder
26. august 2008 - 14:31 #3
Nu syns jeg at jeg har gået den igennem flere gange, og syns jeg har sat den rigtigt op.. den gør bare ikke noget når jeg prøver. og den kommer ikke med nogen fejl? det kunne selvfølgelig være querystrings id og sort der var noget i vejen med. men det burde der ikke være?

kan man smide hele koden ind her ? :) er ny herinde
Avatar billede jakobdo Ekspert
26. august 2008 - 14:33 #4
Ja, det kan du godt.
Men prøv evt. at begræns koden, så du kun smider det kode det rent faktisk omhandler. :o)

Nogle gange smider folk 10000 sider kode ind og spørger hvorfor den udskriver noget i linje 12.
Avatar billede ewax Nybegynder
26. august 2008 - 14:59 #5
Her kommer koden fra dit eksempel:


if(is_numeric($id) && !empty($_GET['sort']))
{
  $currentSort = 0;
  $currentID = mysql_real_escape_string($id);
   
  $moveSort = 0;
  $moveID = 0;
   
  $query = mysql_query("SELECT place FROM cases WHERE id = " . $currentID . " LIMIT 1") or die(mysql_error());
  if(mysql_num_rows($query)>0)
  {
    $currentSort = mysql_result($query,0);
  }
   
  switch($_GET['sort'])
  {
    case "op":
      $query = mysql_query("SELECT id, place FROM cases WHERE place < ".$currentSort." ORDER BY place DESC LIMIT 1");
      break;
    case "ned":
      $query = mysql_query("SELECT id, place FROM cases WHERE place > ".$currentSort." ORDER BY place ASC LIMIT 1");
      break;
    default:
      $moveSort = 0;
      $moveID = 0;
  }
   
  if(mysql_num_rows($query)>0)
  {
    $row      = mysql_fetch_assoc($query);
    $moveID  = $row['id'];
    $moveSort = $row['place'];
  }
   
  if($moveSort > 0)
  {
    $query = mysql_query("UPDATE cases SET place = ".$moveSort." WHERE id = ".$currentID." LIMIT 1");
    $query = mysql_query("UPDATE cases SET place = ".$currentSort." WHERE id = ".$moveID." LIMIT 1");
  }
}


har lavet det lidt om så at den passer til mine databasenavne etc.


og her er så mine små pile der skulle kunne flytte op og ned på rækkerne


echo "  <td width='16'><a href='?id=" . $r1['id'] . "&sort=op'><img src='icons/up.png' title='Ryk op'></a></td>";
  echo "  <td width='16'><a href='?id=" . $r1['id'] . "&sort=ned'><img src='icons/down.png' title='Ryk ned'></a></td>";


problemet er at der ikke rigtigt sker noget, og kan ikke se hvor fejlen skulle være.. :/
Avatar billede ewax Nybegynder
26. august 2008 - 14:59 #6
skal vist lige siges at jeg i min setup.php har $id som blir hentet fra $_GET['id']
Avatar billede jakobdo Ekspert
26. august 2008 - 15:16 #7
Hvor kommer $r1 fra ?
Skal det ikke være: $row ?
Avatar billede ewax Nybegynder
26. august 2008 - 15:19 #8
Det er fra min mysql query, jeg kalder dem altid

$sql1 = mysql_query();
$r1 = mysql_fetch_array();

etc.

grundet jeg tit bruger flere kald i samme while
Avatar billede jakobdo Ekspert
26. august 2008 - 15:22 #9
Prøv at vis din fulde kode ?
Avatar billede ewax Nybegynder
26. august 2008 - 15:55 #10
Allright, here it comes :)


<?php
include("../includes/setup.php");
include("includes/classes.php");

if(!$_SESSION['login']=="ok")
{
  header("location: login.php");
}

if(is_numeric($id) && !empty($_GET['sort']))
{
  $currentSort = 0;
  $currentID = mysql_real_escape_string($id);
   
  $moveSort = 0;
  $moveID = 0;
   
  $query = mysql_query("SELECT place FROM cases WHERE id = " . $currentID . " LIMIT 1") or die(mysql_error());
  if(mysql_num_rows($query)>0)
  {
    $currentSort = mysql_result($query,0);
  }
   
  switch($_GET['sort'])
  {
    case "op":
      $query = mysql_query("SELECT id, place FROM cases WHERE place < ".$currentSort." ORDER BY place DESC LIMIT 1");
      break;
    case "ned":
      $query = mysql_query("SELECT id, place FROM cases WHERE place > ".$currentSort." ORDER BY place ASC LIMIT 1");
      break;
    default:
      $moveSort = 0;
      $moveID = 0;
  }
   
  if(mysql_num_rows($query)>0)
  {
    $row      = mysql_fetch_assoc($query);
    $moveID  = $row['id'];
    $moveSort = $row['place'];
  }
   
  if($moveSort > 0)
  {
    $query = mysql_query("UPDATE cases SET place = ".$moveSort." WHERE id = ".$currentID." LIMIT 1");
    $query = mysql_query("UPDATE cases SET place = ".$currentSort." WHERE id = ".$moveID." LIMIT 1");
  }
}

include("includes/header.php");

$obj = new BoxTop("Caseoversigt");

echo "<table cellpadding='5' cellspacing='0' width='100%'>";
echo " <tr style='background-color:#e5e5e5;'>";
echo "  <td></td>";
echo "  <td><b>Titel</b></td>";
echo "  <td align='center'><b>Kunden</b></td>";
echo "  <td align='center'><b>Opgaven</b></td>";
echo "  <td align='center'><b>Logo</b></td>";
echo "  <td align='center'><b>Top</b></td>";
echo "  <td align='center'><b>Website</b></td>";
echo "  <td></td>";
echo "  <td></td>";
echo "  <td></td>";
echo "  <td></td>";
echo "  <td></td>";
echo "  <td></td>";
echo "  <td></td>";
echo " </tr>";

$klasse = "k1";

$sql1 = mysql_query("SELECT * FROM cases ORDER BY place");
$count1 = mysql_num_rows($sql1);
while($r1 = mysql_fetch_array($sql1))

  $counter1++;

  if($r1['description1'])
  {$customer = "<b>&times;</b>";}
  if($r1['description2'])
  {$opg = "<b>&times;</b>";}
  if($r1['logo'])
  {$clogo = "<b>&times;</b>";}
  if($r1['top'])
  {$ctop = "<b>&times;</b>";}
  if($r1['website'])
  {$website = "<b>&times;</b>";}

  echo " <tr class='" . $klasse . "'>";
  echo "  <td width='16'><img src='icons/brick.png'></td>";
  echo "  <td>" . $r1['title'] . "</td>";
  echo "  <td align='center'>" . $customer . "</td>";
  echo "  <td align='center'>" . $opg . "</td>";
  echo "  <td align='center'>" . $clogo . "</td>";
  echo "  <td align='center'>" . $ctop . "</td>";
  echo "  <td align='center'>" . $website . "</td>";
  echo "  <td width='16'><a href='../viewcase.php?id=" . $r1['id'] . "' target='_blank'><img src='icons/zoom.png' title='Se case i nyt vindue'></a></td>";
  echo "  <td width='16'><a href='?id=" . $r1['id'] . "&sort=op'><img src='icons/up.png' title='Ryk op'></a></td>";
  echo "  <td width='16'><a href='?id=" . $r1['id'] . "&sort=ned'><img src='icons/down.png' title='Ryk ned'></a></td>";
  echo "  <td width='16'><a href='cases_extra.php?id=" . $r1['id'] . "'><img src='icons/bricks.png' title='Øvrige opgaver'></a></td>";
  echo "  <td width='16'><a href='cases_images.php?id=" . $r1['id'] . "'><img src='icons/pictures.png' title='Rediger billeder'></a></td>";
  echo "  <td width='16'><a href='cases_edit.php?id=" . $r1['id'] . "'><img src='icons/brick_edit.png' title='Rediger case'></a></td>";
  echo "  <td width='16'><a href='cases_delete.php?id=" . $r1['id'] . "'><img src='icons/brick_delete.png' title='Slet case'></a></td>";
  echo " </tr>";
 
  $customer = "";
  $opg = "";
  $clogo = "";
  $ctop = "";
  $website = "";
 
  if($klasse=="k1")
  {$klasse = "k2";}
  elseif($klasse=="k2")
  {$klasse = "k1";}
}

echo "</table>";

$obj = new BoxBottom();

include("includes/footer.php");
?>
Avatar billede jakobdo Ekspert
26. august 2008 - 15:59 #11
Jeg kan ikke gennemskue din kode. :o(

Men du må evt. prøve at debugge koden.

Udskriv $id og $_GET['sort']
Og ellers løbende udskrive variabler ned igennem koden og se om de indeholder hvad du forventer.

Og en ting jeg lige faldt over, ret:

if(!$_SESSION['login']=="ok")
{
  header("location: login.php");
}

til:
if(!$_SESSION['login']=="ok")
{
  header("location: login.php");
  exit();
}
Avatar billede ewax Nybegynder
26. august 2008 - 16:35 #12
Tak for rettelsen, er det meget nødvendigt med exit på? syntes ikke det gør nogen forskel? eller er det hvis der er fejl i headeren?
Avatar billede jakobdo Ekspert
26. august 2008 - 17:20 #13
Jeg ved ikke om det er nødvendigt, men jeg gør det altid.
Og kan se andre også gør det: http://dk.php.net/header (ikke at det selvfølgelig gør det rigtigt) :o)
Avatar billede dkfire Nybegynder
26. august 2008 - 19:47 #14
Hvis ikke du sætter exit, så kan du risikere at din script udføre mere kode efter header inden serveren når at modtage forespørgelsen for den nye side.
Avatar billede danielss Nybegynder
26. august 2008 - 23:38 #15
Hvorfor ikke bare lave så når man sletter en side bliver andre placeringer opdateret??

Jeg er selv igang med et CMS, og bruger dette:

$info = $db->fetch("SELECT `placement` FROM `pages` WHERE `id`='".$_GET['id']."'");
       
$db->query("DELETE FROM `pages` WHERE `id`='".$_GET['id']."'");

$db->query("UPDATE `pages` SET `placement`=`placement`-1 WHERE `placement`>'".$info['placement']."'");
Avatar billede jakobdo Ekspert
27. august 2008 - 08:04 #16
At opdatere placering er da spild af mysql operationer.
Så længe den hedder:

1,2,3,4,5
Og efter slet af 2 og 3
hedder den jo bare:
1,4,5
Samme rækkefølge.
Det er måske ikke pænt at kigge på, men hvem kigger i databasen ?
Avatar billede ewax Nybegynder
27. august 2008 - 11:46 #17
Ahh ja.. nu er jeg lige stået op, så hjernen er stadig kold.. :) kan man lave noget select mindre/størreend limit 1 ? og så bytte om på id der? hvis det igrunden ik er det som det script der gør :P
Avatar billede danielss Nybegynder
27. august 2008 - 11:58 #18
Jakobdo, når man skal bytte om på rækkefølgen er det nemmere hvis placeringerne er i rækkefølge uden nogen spring. Så slipper man for at skulle vælge den række før og den række efter, som jo er problemet her... Og det er jo kun 2 mysql operationer ekstra hvergang man sletter en side.. det gør jo ikke den store forskel.
Avatar billede jakobdo Ekspert
27. august 2008 - 12:25 #19
danielss: Du har en pointe. :o)
Avatar billede ewax Nybegynder
27. august 2008 - 12:29 #20
danielss

må jeg lige prøve at høre hvordan du sætter dine database udtrækninger op?


$info = $db->fetch();
     
$db->query();


det ligner noget array noget? :) har ikke set det sådan før
Avatar billede danielss Nybegynder
27. august 2008 - 12:34 #21
Ewax: Det er bare fordi jeg har sat det op i en class. Det er det samme som mysql_query() og mysql_query(mysql_fetch_array(...

Så den samlede kode, der burde virke uden problemer(Jeg har lige simplified den lidt man kan se hvad der helt præcis bliver gjort): http://pastebin.ca/1186218
Avatar billede danielss Nybegynder
27. august 2008 - 12:37 #22
Og så lige lavet om så det også er en delete function, og med mysql_query og mysql_fetch_array i stedet for $db class:

http://pastebin.ca/1186220

Så skulle du være good to go..
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester