1 (edited by DY 2006-09-30 09:35:29)

Topic: Tinklapio adreso paėmimas

Kaip būtų galima rašant jungtį "paimti" esamą tinklapio adresą ir jį šiek tiek pakeisti, pridedant papildomų kintamųjų? T.y., kad būtų tokia funkcija, kuri, sakysim, visados pridėtų kintamąjį pavadinimu $kintamasis ir jei adresas yra:

http://www.tinklapis.lt/index.php?alfa=1&beta=15

tai paleidus šią funkciją jis pasidarytų:

http://www.tinklapis.lt/index.php?alfa= … ntamasis=2

O jei adresas būtų

http://www.tinklapis.lt/index.php?delta=1562

tai paleidus šią funkciją jis pasidarytų:

http://www.tinklapis.lt/index.php?delta … ntamasis=2

Na, manau supratote, ko noriu paklausti :) .

Mintys - blogas apie gyvenimą, politiką, ekonomiką, kultūrą, mokslą ir kitką.
Adventure Lietuva - kompiuteriniai žaidimai, kurie yra meno forma.
Pasaulio šalių himnai - įrašai, žodžiai ir jų vertimai, informacija.

Re: Tinklapio adreso paėmimas

La,

Tu nori prie tam tikro kintamojo reikšmės pridėti kitą reikšmę, ar nori nukreipti scriptą į kitą adresą?

header("Location: ". $_SERVER[HTTP_REFERER] . $_SERVER['REQUEST_URI'] . "&kintamasis=2");

3

Re: Tinklapio adreso paėmimas

Arba pridėti papildomą kintamąjį, arba pakeisti vieno kintamųjų reikšmę ir "refrešinti" su naująja reikšme. čia reikia padaryti taip, kad sąrašą būtų galima išrikiuoti pagal skirtingus kriterijus. Pvz. nuspaudus ant stulpelio tame sąraše pavadinimo "Pavadinimas" sąrašas (lentelė) būtų surikiuotas pagal pavadinimą, jei ant "Data" - pagal datą ir t.t. Tai pagalvojau, kad geriausia būtų tai padaryti su specialiu kintamuoju, jei tas kintamasis, pavyzdžiui, bus lygus vienam, rikiuos pagal vieną kriterijų, jei dviems - pagal kitą ir panašiai. Na o tose vietose, iš kur turėtų būti nuorodos į naujuosius sąrašo rikiavimus, turėtų būti HTML kode kažkas panašaus į <a href=ESAMAS URL&$rikiuoti=1>Rikiuoti pagal pavadinimus</a> arba atitinkamai paskutinysis kintamasis būtų pakeičiamas, jei jis jau yra nustatytas (jei nėra nustatytas tai pagal nutylėjimą būtų rikiuojama pagal kokį nors iš anksto parinktą kriterijų). Tai kaip suprantu, norint pridėti kintamąjį, reikėtų rašyti:

print "<a href=" . $_SERVER[HTTP_REFERER] . $_SERVER['REQUEST_URI'] . "&kintamasis=1>Rikiuoti pagal pavadinimus</a>";

O tada norint pakeisti kintamąjį? (t.y. jei yra kintamasis=1 pakeisti paskutinįjį skaičių į 2)

Taip pat, kadangi čia panaši tema, tuo pačiu paklausiu, ar įmanoma automatiškai pakeisti esamame tinklapio adrese fiksuotą skaičių raidžių (žinau tiksliai kelintos raidės adrese tai bus)? šitai reikalinga tam, kad iš lietuviškos tinklapio versijos būtų galima patekti vienu paspaudimu į anglišką to paties tinklapio versiją ir atvirkščiai (tinklapio adrese atitinkamai kistų raidės "lt" ir, pavyzdžiui, "en", o visa kita liktų taip pat)?

Mintys - blogas apie gyvenimą, politiką, ekonomiką, kultūrą, mokslą ir kitką.
Adventure Lietuva - kompiuteriniai žaidimai, kurie yra meno forma.
Pasaulio šalių himnai - įrašai, žodžiai ir jų vertimai, informacija.

Re: Tinklapio adreso paėmimas

a) Niekas tokiu atveju "esamo adreso" neprrašinėja. Tiesiog pagal kintamuosius iš $_GET masyvo formuoj puslapyje esamus URL'us su norimais kintamaisiais.

b) tas pats:

<a href="http://www.tinklapis.lt/?language=<?php echo (($_GET["language"] == "lt") ? "en\">english" : "lt\">lietuviškai"); ?></a>

5

Re: Tinklapio adreso paėmimas

Tai kaip visgi padaryti, kad formuojant naują adresą visi GET masyvo kintamieji būtų palikti, kokie yra, o vienas pakeistas?

Atveju dėl lietuviško/angliško puslapio, tai čia esmė yra ta, kad kistų ne kintamasis, o URL. Tai yra pavyzdžiui http://www.tinklapis.lt ir http://www.tinklapis.eu, http://lt.tinklapis.com ir http://en.tinklapis.com . Abiejuose tinklpaiuose būtų beveik identiškas PHP scenarijus, įvardytas tokiu pat pavadinimu ir su tokiais pat kintamaisiais ir jungtųsi prie tos pačios duomenų bazės. Tik angliškoje svetainėje to PHP scenarijaus užklausose būtų nurodyti angliški elementų pavadinimai ir aprašymai, o lietuviškoje - lietuviški (o sąryšiai ir pan. liktų tie patys). Todėl realiai visais atvejais būtų galima pereiti iš angliškos svetainės į lietuvišką ir atvirkščiai tiesiog pakeičiant dvi URL raides, kurių pozicija visada yra fiksuota (pvz. jei tai http://lt.tinklapis.com ir http://en.tinklapis.com  tai aštuntas ir devintas simboliai nuo URL pradžios). Aišku, galimas dalykas, kad taip padaryti neįmanoma...

Mintys - blogas apie gyvenimą, politiką, ekonomiką, kultūrą, mokslą ir kitką.
Adventure Lietuva - kompiuteriniai žaidimai, kurie yra meno forma.
Pasaulio šalių himnai - įrašai, žodžiai ir jų vertimai, informacija.

Re: Tinklapio adreso paėmimas

Tai tavo klausimas kartojasi. Pabandysiu paprastą pvz.:

$url = "http://www.tinklapis.lt/?parametras1=" . $_GET["parametras1"] . "&parametras2=" . $_GET["parametras2"] . "&language=" . (($_GET["language"] == "lt") ? "en" : "lt";

čia parametrai "parametras1" ir "parametras2" bus nepakitę, o parametras "language" įgaus kitą reikšmę, priklausomai nuo dabartinės reikšmės.

Jeigu mes kreiptumėmės į skriptą taip:

tai skriptas išgeneruotų tokius adresus:

o jeigu kreiptumėmės į skriptą taip:

tai išgeneruotų:

7 (edited by DY 2006-09-30 19:27:03)

Re: Tinklapio adreso paėmimas

Supratau.

O kaip jei esamų kintamųjų kiekis ir vardai gali kisti? (čia pirmajam atvejui dėl rikiavimo). Tai yra, jei gali būti pvz. tik parametras1, tik parametras2, parametras1, parametras2 ir parametras3 (viso trys parametrai) o keisti bet kokiu atveju reikėtų tik vieną, rikiavimą atitinkantįjį.

$url = "http://www.tinklapis.lt/?parametras1=" . $_GET["parametras1"] . "&parametras2=" . $_GET["parametras2"] . "&language=" . (($_GET["language"] == "lt") ? "en" : "lt";

veiks normaliai tik tuomet, jei būtinai bus parametras1, parametras2 ir nebus jokių kitų parametrų. O funkcija gali būti iškviečiama esant bet kokiems parametrams ir reikėtų, kad visi parametrai liktų nepakitę, o tik vienas būtų pakeistas.

Mintys - blogas apie gyvenimą, politiką, ekonomiką, kultūrą, mokslą ir kitką.
Adventure Lietuva - kompiuteriniai žaidimai, kurie yra meno forma.
Pasaulio šalių himnai - įrašai, žodžiai ir jų vertimai, informacija.

Re: Tinklapio adreso paėmimas

Reikia tikrinti, kokie parametrai yra perduoti į skriptą per $_GET masyvą, ir pagal tai generuotį URL.

Kaip tai daryti priklauso nuo skripto logikos. Pateiksiu pora pavyzdžių:

a) mofidikuotas prieš tai pateiktas pavyzdys, kuriame dar yra papildomai tikrinama ar "parametras1" ir "parametras2" yra tikrai perduoti (tuo atveju jeigu jie neperduoti, tai jie ir neperduodami toliau):

$ar_pirmas = true;
$url = "http://www.tinklapis.lt/";

if(array_key_exists("parametras1", $_GET)){
  if($ar_pirmas){
    $ar_pirmas = false;
    $url .= "?";
  }else{
    $url .= "&";
  }
  $url .= "parametras1=" . $_GET["parametras1"];
}

if(array_key_exists("parametras2", $_GET)){
  if($ar_pirmas){
    $ar_pirmas = false;
    $url .= "?";
  }else{
    $url .= "&";
  }
  $url .= "parametras2=" . $_GET["parametras2"];
}

if($ar_pirmas){
  $ar_pirmas = false;
  $url .= "?";
}else{
  $url .= "&";
}
$url .= "language=" . (($_GET["language"] == "lt") ? "en" : "lt");

b) tikrinamas visas $_GET masyvas ir iš jo generuojamas naujas URL, su pakeistu parametru "language":

$ar_pirmas = true;
$url = "http://www.tinklapis.lt/";
foreach($_GET AS $get_key => $get_value){
  if($ar_pirmas){
    $ar_pirmas = false;
    $url .= "?";
  }else{
    $url .= "&";
  }
  if($get_key=="language"){
    $url .= "language=" . (($_GET["language"] == "lt") ? "en" : "lt");
  }else{
    $url .= $get_key ."=" . $get_value;
  }
}

p.s.: PHP sintaksė netikrinta, neoptimali;

9 (edited by FDisk 2006-10-01 10:09:25)

Re: Tinklapio adreso paėmimas

O gal tiesiog tiktu toks?

<?
function url($url) {
    $url = strrchr($url, '?');
    $url = $_SERVER['PHP_SELF'].$url.(($url == '') ? '?' : '&');
    return $url.'kintamasis=2';
}
echo url('http://www.mrcbug.com/news.php').'<br>';
echo url('http://www.mrcbug.com/forum/viewthread.php?forum_id=20&thread_id=138#post_845');
?>

Sitas grazina toki rezultata:

/dummy.php?kintamasis=2
/dummy.php?forum_id=20&thread_id=138#post_845&kintamasis=2

Zinoma gali pasiredaguoti, prisideti i funkcija papildomu navarotu, pvz kreipdamasis i funkcija gali nurotyti kokius kintamuosius sudeti ir pan.
Ar cia ne tai ko tau reikia?

SELECT * FROM users WHERE gender = 'female' AND size > 'enough' AND leftsize = rightsize AND age >= 18 AND age < 30 LIMIT 1

Re: Tinklapio adreso paėmimas

Nors pala to PHP_SELF nei nereikia.
Ai vienu zodziu esme yra :)

SELECT * FROM users WHERE gender = 'female' AND size > 'enough' AND leftsize = rightsize AND age >= 18 AND age < 30 LIMIT 1

11

Re: Tinklapio adreso paėmimas

Dėkui. Rikiavimui panaudojau tokį kiek modifikuotą mindės pasiūlymą, kad jei $rikiavimas yra tai jį keistų, o jei nėra - pridėtų:

function rikiavimas($rikiavimas) {
$ar_pirmas = true;
$loginis = true;
$adresas = "http://www.?.lt/index.php";
foreach($_GET AS $pavadinimas => $reiksme){
  if($ar_pirmas){
    $ar_pirmas = false;
    $adresas .= "?";
  }else{
    $adresas .= "&";
  }
  if($pavadinimas=="rikiavimas"){
    $adresas .= "rikiavimas=" . $rikiavimas;
    $loginis=false;   
  }else{
    $adresas .= $pavadinimas ."=" . $reiksme;
  }
}
if ($loginis) $adresas .="&rikiavimas=" . $rikiavimas;
return($adresas);
}

Mintys - blogas apie gyvenimą, politiką, ekonomiką, kultūrą, mokslą ir kitką.
Adventure Lietuva - kompiuteriniai žaidimai, kurie yra meno forma.
Pasaulio šalių himnai - įrašai, žodžiai ir jų vertimai, informacija.

Re: Tinklapio adreso paėmimas

Niu tavo ideja isvysciau ir kelias naudingas funkcijas sukuriau:

<?
/**
 * Verciam array i nuoroda GET tipo
 *
 * @param array $params
 * @param null $str
 * @return url
 */
function arr_url($params,$str='') {
    foreach ($params as $key => $value) {
        $str .= (strlen($str) < 1) ? '' : '&';
        $str .= $key . '=' . rawurlencode($value);
    }
    return ($str);
}

/**
 * Sutvarkom nuoroda. Jei nuorodoje
 * Yra kintamuju juos atnaujinam naujom reiksmem
 * Jei nurodytas linkas paruosiam nuoroda tam linkui
 * Galima kreiptis ir su MASYVU (array)
 *
 * @param unknown_type $str
 * @param unknown_type $link
 * @return url
 */
function url($str,$link=''){
    if (!empty($_GET)) { $url = $_GET; }
    else { $url = '?'; }
    if ($url != '?') {
        if (!is_array($str)) { parse_str($str, $str); }
        return $link.'?'.arr_url(array_merge($url,$str));
    }
    else {
        if (is_array($str)) { $str = arr_url($str); }
        return $link.$url.$str;
    }
}

//echo url("bla=aaai&sdfsf=dg");
//echo url(array('g' => '1','ble' => 'l','jo','nr'),'boba.php');
?>

galima naudoti mazdaug taip:
<a href="<?=url('sort=true')?>">Rusiuoti</a>
Sis budas nesugadina esamo adreso tarkim jei $_GET yra

viewtopic.php?id=73

tai ta funkcija prie tokios nuorodos pridetu

viewtopic.php?id=73&sort=true

Ir jei $_GET tuscias tai

viewtopic.php?sort=true

Taippat, jei $_GET butu lygus

viewtopic.php?id=73&sort=blablabla

Tai si funkcija atnaujintu tokia nuoroda ir pakeistu i

viewtopic.php?id=73&sort=true

Taippat si funkcija array (masyva) pavercia i ur $_GET kintamuosius.
pvz:

echo url(array('g' => '1','ble' => 'l','jo','nr'),'boba.php');
//boba.php?g=1&ble=l&0=jo&1=nr
SELECT * FROM users WHERE gender = 'female' AND size > 'enough' AND leftsize = rightsize AND age >= 18 AND age < 30 LIMIT 1

13 (edited by sliekas_kanibalas 2006-10-13 01:16:52)

Re: Tinklapio adreso paėmimas

šiaip šiek tiek nuo temos nukrypsiu : stringo tikrinimui ar jis netuščias rekomenduoju naudoti empty() f-ją , o ne strlen() < 1 ar pan, nes empty greičiau veikia... ir klausimas : o nebūtų paprasčiau padaryt f-ją, kuriai paduodi du parametrus - masyvus (pirmas - _GET, antras - parametrai, kuriuos nori pakeisti tame _GET'e). tada ta f-ja juos tiesiog sumerge'ina, ir antro masyvo reikšmės perrašo pirmojo masyvo reikšmes. nu tarkim :

turim _GET'e masyvą 'moliushis' => 'asiliukas', 'puslapis' => 2 . norim padaryt kad suformuotų url su "puslapis" => 3:  tai nukopinam get'o masyvą į laikiną masyvą, ir sukuriam kitą masyvą su norimom reikšmėm, t.y. 'puslapis' => 3. tada sumerge'inam tuos du masyvus, ir tada iš to masyvo suformuojam url. tada galima būtų padaryt metodą, kuris formuoja url ir laisvai keičia betkurio kintamojo reikšmę.


ir funkciją arr_url būtų galima padaryti optimaliau:

function arr_url($params,$str='') {
    $strs = array();

    foreach ($params as $key => $value) {       
        $strs[] = $key . '=' . rawurlencode($value);
    }
   
    $str .= implode( "&", $strs );
    return ($str);
}

šitas variantas imho greitesnis (reiktų patikrint), nes netikrina kiekvieną kartą ar stringas yra tuščias. tai pasijaučia kai vienam puslapio išvedime daug linkų formavimų, ir kai didelis lankomumas saito :] jei kurioj nors vietoj pagrybavau - pataisykit ir akmenų nemėtykit ;] gero vakaro :]


p.s. gal geriau f-jos aprašyme prie kintamųjų tipų rašyti ne "unknown", o "mixed" :] šiek tiek aiškiau, o ir situacija tada atrodo valdoma :]] (nepagalvokit kad kabinėjuosi, čia šiaip pasiūlymas)

p.p.s. jei mano mintis pasirodė neaiški, tai sakykit, parašysiu kažką panašaus į f-ją...