Avatar billede grafik-anders Seniormester
31. juli 2011 - 19:39 Der er 27 kommentarer og
1 løsning

Hvordan kommer man tilbage fra en script-side og lander det rigtige sted på hovedsiden?

Hej

Når jeg laver en side med et PHP-script, som bliver kaldt med:

<a id="delete" href="http://www.shape.dk/delete-comment.php?deleteId=<?=$comment['id']?>"></a>

Hvordan kommer jeg så tilbage til min hovedside fra delete-comment.php? Lige nu laver jeg noget lidt underligt noget med:

$backPage = $_SESSION['backPage'];
header( 'Location: '.$backPage);

Er det bedre at sende tilbageadressen med URL'en eller er der en 3. og bedre måde? (det er der sikkert!)

Derudover vil jeg gerne tilbage på min hovedside samme sted, som hvor brugeren forlod den. Lige nu skal man selv scrolle op, hvilket ikke er særligt fedt. Hvordan undgår jeg det?

Jeg håber, at I forstår, hvad jeg mener?

Ps. Jeg udlovet 200 bobs, som evt. deles i to, hvis ikke den samme kan hjælpe med begge spørgsmål :)

Mvh.
Anders
Avatar billede webweaver Praktikant
31. juli 2011 - 19:59 #1
Skifter adressen, siden du ikke kan indtaste den direkte i din header location? Tit foregår sletning af nyheder, indlæg med mere det samme sted og derfor ved man hvor man skal sendes tilbage og kan altså også bare derfor taste adressen direkte ind.

Hvad mener du med, at du skal scrolle op for at havne det rigtige sted? Undrer mig at du skal scrolle op og ikke ned først og fremmest.
Avatar billede grafik-anders Seniormester
31. juli 2011 - 20:14 #2
ups,,, - jeg mener ned. Kan man undgå det?
Avatar billede webweaver Praktikant
31. juli 2011 - 20:45 #3
Ja, det kan du umiddelbart godt. Ved brug af anchorpoints i HTML fx kan du styre, hvorhenne på sitet du lander, afhængig af hvad du skriver i din url.

Det er meget simpelt.

Sådan kan URL se ud fx.
www.side.dk/fil.php#HTML

Ved at gå ind på ovenstående URL, lander du ved nedenstående a tag.

<a name="HTML"></a>

Dette placeres det sted på siden, hvor du ønsker at havne.

Fx automatisk i en while løkke, ved gang der indsættes en nyhed fra en database eller hvad det nu måtte være ...

I din header location, skal du så have #HTML med
eller en anden, hvis det er et andet anchorpoint du vil fange.
Den værdi kan du jo overføre til din header location via en variabel i delete_comment.php ...
Avatar billede olebole Juniormester
31. juli 2011 - 22:29 #4
<ole>

Ankerløsningen kan være udmærket, men man kommer ikke nødvendigvis tilbage til det samme sted på siden. Man kommer tilbage til siden med linket liggende allerøverst.

Vil man tilbage til samme sted, kunne dette være en løsning:


<script type="text/javascript">
function setPagePos(elmA) {
    var sHref = elmA.getAttribute("href"),
    sPosQuery = "pos=" + document.documentElement.scrollTop;
    sHref += (sHref.indexOf("?")>-1 ? "&" : "?") + sPosQuery;
    elmA.setAttribute("href", sHref);
}

window.onload = function() {
    /scr2=(\d+)/.test(location.search);
    var nPos = Number(RegExp.$1);
    document.documentElement.scrollTop = nPos;
}
</script>

<p>
    <a href="blabla.php?id=123" onclick="setPagePos(this)">Link</a>
</p>


I din PHP-header skriver du så bare:


header('Location: side.php?scr2='.$_GET['pos']);



/mvh
</bole>
Avatar billede olebole Juniormester
31. juli 2011 - 22:32 #5
PS: og den kunne for den sags skyld også let indrettes til at tage en horisontal scroll-værdi  =)
Avatar billede grafik-anders Seniormester
01. august 2011 - 08:04 #6
Hej Ole

Spændende forslag, men jeg kan ikke lige få det til at virke. Jeg får ikke nogen fejlmeddelelse - så langt - så godt - men siden hopper stadig op. Jeg har modificeret din kode for at sætte den ind, så den nu ser sådan her ud:

<a id="delete" href="http://www.shape.dk/delete-comment.php?deleteId=<?=$comment['id']?>&kryds=slet" onclick="setPagePos(this)"></a>

...//...

$backPage = $_SESSION['backPage'];
header( 'Location: '.$backPage.'?scr2='.$_GET['pos']);

Selve javascriptet har jeg ikke ændret - skal jeg det? Skal 'test' udskiftets med sidens navn eller sådan noget? Jeg har lagt det helt øverst på siden lige før </head>.

/A
Avatar billede olebole Juniormester
01. august 2011 - 14:49 #7
Nej, du skal ikke ændre på JavaScriptet. 'test' er en indbygget metode på RegExp objektet, så det skal endelig ikke ændres - og det ligger fint i slutningen af HEAD elementet

Det skulle meget gerne virke - afhængigt af, hvad $_SESSION['backPage'] indeholder. Hvad står der i adresselinjen, når du kommer tilbage på siden? Du har ikke by any chance to '?' i adressen?
Avatar billede olebole Juniormester
01. august 2011 - 15:19 #8
Hvis problemet er, at du har to spørgsmålstegn i adressen, kan du i stedet sætter headeren sådan:


$backPage = $_SESSION['backPage'];
$backPage .= strpos($backPage, "?")===false ? "?" : "&";
header( 'Location: '.$backPage.'scr2='.$_GET['pos']);


- og det er nok smart at ændre det under alle omstændigheder
Avatar billede grafik-anders Seniormester
01. august 2011 - 17:03 #9
nix: Adresselinjen siger:

http://www.shape.dk/test.php?scr2=465 (alt efter, hvor på siden jeg står)

?
Avatar billede olebole Juniormester
01. august 2011 - 17:40 #10
Det burde helt klart virke - og det gør det, når jeg tester.

Hvilken browser bruger du? Ligger der evt. iframe(s) på siden? Kan det ske, du overskriver onload eventen? Prøv lige en alert her:


window.onload = function() {
    /scr2=(\d+)/.test(location.search);
    var nPos = Number(RegExp.$1);
    document.documentElement.scrollTop = nPos;
    alert("Kommer vi hertil? nPos=" + nPos);
}

Avatar billede grafik-anders Seniormester
01. august 2011 - 18:05 #11
Der sker intet og jeg har ikke nogen iframes. Jeg har testet i firefox og ie.

Jeg har indsat det på siden: http://www.shape.dk/test.php?scr2=388

Er det ikke fordi, at jeg mangler et eller andet smart på den server, hvor mit site ligger?

/A
Avatar billede olebole Juniormester
01. august 2011 - 21:51 #12
Det er onload handleren på dit BODY element, der overskriver koden ovenfor. Det er vist en gammel DreamWeaver preloader af billeder, som ikke bruges på siden. Ret hele BODY start-tagget til slet og ret:

<body>
Avatar billede olebole Juniormester
01. august 2011 - 21:56 #13
- og jeg spurgte om iframes, fordi en iframe i toppen, som loader efter onload-scriptet er kørt - og siden er scrollet ned - vil trække focus og få siden til at scrolle til top
Avatar billede grafik-anders Seniormester
02. august 2011 - 00:10 #14
Fantastisk! - du tryller jo!

Nu mangler jeg bare at vide, hvordan jeg også får den på en knap (form)?
Avatar billede olebole Juniormester
02. august 2011 - 00:41 #15
POST eller GET?
Avatar billede olebole Juniormester
02. august 2011 - 00:45 #16
Njaahhh ... det er ligemeget  =)


<form action="" method=" ... " onsubmit="this.form.pos.value=document.documentElement.scrollTop">
<input name="pos" type="hidden">

Avatar billede olebole Juniormester
02. august 2011 - 00:47 #17
- og i virkeligheden bare:


<form action="" method=" ... " onsubmit="this.pos.value=document.documentElement.scrollTop">
<input name="pos" type="hidden">

Avatar billede grafik-anders Seniormester
02. august 2011 - 08:40 #18
hmmm,,, den kunne jeg heller ikke lige få til at virke i første hug. Den fulde linje blev:

<form name="delete" action="delete-comment.php?deleteId=<? echo $comment['id']; ?>" method="post" onsubmit="this.pos.value=document.documentElement.scrollTop"><input name="pos" type="hidden">

værdien bliver ikke tilføjet url'en?
Avatar billede olebole Juniormester
02. august 2011 - 11:00 #19
Problemet skyldes, at du roder GET og POST sammen.

*) Når du bruger GET, lægges alle variabler med deres værdier i URL'en.
*) Når du bruger POST, sendes alle variabler med deres værdier som 'skjulte' datapakker.

Desværre har man muligheden for at sende en form med POST og samtidig sende data i URL'en - men det er noget rod.

Skriv sådan:


<form name="delete" action="delete-comment.php" method="post" onsubmit="this.pos.value=document.documentElement.scrollTop">
<input name="deleteId" value="<? echo $comment['id']; ?>" type="hidden">
<input name="pos" type="hidden">


- så ligger både deleteID og pos i $_POST arrayet ved modtagelsen i PHP dokumentet. Dér bør du (naturligvis) forvente, at alle dine variabler ligger, når du sender en form med POST  *o)
Avatar billede grafik-anders Seniormester
02. august 2011 - 16:49 #20
Fik det nu til at virke - sådan næsten da - den hopper stadig lidt, men ikke så meget - test evt.?

Jeg lavede en lille work-around ved at tilføje en if-sætning til min sletnings-side, så den nu både kan hente via POST og GET. Problemet er, at den skal til siden allerede ved det første link, hvor jeg stadig bruger GET:

<a id="delete" href="http://www.shape.dk/ (...) onclick="setPagePos(this)"></a>

,,, , men kan man lave det om til en, som bruger POST?

Mine if's hedder:

$deleteId = $_GET['deleteId']; //skaffer nummeret på den kommentar fra forrige side via adresselinjen
if ($deleteId=="") {
    $deleteId = $_POST['deleteId']; // ved sletninger kommer den via post
}

$pos = $_GET['pos'];
if ($pos=="") {
    $pos = $_POST['pos']; // ved sletninger kommer den via post
}

ps. Hvordan laver du de blå rammer her på eksperten?
Avatar billede webweaver Praktikant
02. august 2011 - 16:54 #21
Diverse BB tags du kan bruge på Eksperten :)
http://www.eksperten.dk/guide/1325
Avatar billede olebole Juniormester
02. august 2011 - 20:03 #22
Hvis det er det samme, du foretager dig med link og form, kan du vel bare bruge method="get". Så ligger alle variabler i $_GET arrayet
Avatar billede grafik-anders Seniormester
02. august 2011 - 20:43 #23
ok, - det er også det, som jeg har gjort, men kan man lave et link, som bruger POST?

Du må gerne lige sende en svar - så vil jeg afslutte denne her, men der kommer nye spørgsmål fra mig hele tiden - jeg skal jo lige lære det ;)

Mit seneste spørgsmål ligger her:
http://www.eksperten.dk/spm/944253

Forresten vil jeg anbefale andre nybegyndere i PHP (som mig) at kigge i denne her: http://www.phpartikler.dk/index.php

Mvh.
Anders
Avatar billede grafik-anders Seniormester
02. august 2011 - 20:53 #24
Du skal bruge java til at brug post på et link - der er ikke nogle måder i PHP?
Avatar billede olebole Juniormester
02. august 2011 - 21:30 #25
Nej, det er ikke nødvendigt at blande Java ind i det. JavaScript kan heller ikke alene, men kan instantiere og kalde et XHR (XMLHttpRequest) objekt, som kan kommunikere med serveren med POST.

Jeg samler ikke points, men tak for tilbudet  =)
Avatar billede grafik-anders Seniormester
02. august 2011 - 21:50 #26
Ok, - du har ellers fortjent det mere end nogen. Jeg sætter virkelig pris på din hjælp!
Avatar billede olebole Juniormester
02. august 2011 - 21:58 #27
Selvtak. Spørg lige weabweaver, om han vil have del i pointene. Ellers lægger du bare selv et svar og accepterer det, så tråden lukkes  =)
Avatar billede grafik-anders Seniormester
02. august 2011 - 22:03 #28
TAk
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