Moro!!
Olisko kenelläkään valmista skriptiä/neuvoja suomeksi, kuinka tehdä ns. Full site nappi mobiilisivuille, käytän mobiledetect.nettiä
Onko kyseessä siis tämä? En tunne sitä mutta ilmeisesti tarkistat jollain isMobile() -funktiolle että ohjataanko mobiilisivulle?
Jos näin on, niin voithan tehdä keksin vaikka nimeltä "naytaKokoSivu" joka asetetaan kun painaa Full site -nappia ja tarkistaa isMobilen kanssa että onko keksi olemassa.
<?php //Kokoversion näyttäminen: tämäsivu.php?fullsite=1 require_once 'Mobile_Detect.php'; $detect = new Mobile_Detect; $isMobile = $detect->isMobile(); //Full site nappia painettu? if($_GET['fullsite'] == "1"){ setcookie("naytaKokoSivu", "true", time()+3600); } if($isMobile == true && isset($_COOKIE['naytaKokoSivu']) == false){ //Mobiilisivulle }else{ //Täysiversio } ?>
Quirzon esimerkissä on virhe: setcookie ei aseta evästettä saman sivunlatauksen $_COOKIE-taulukkoon, joten tuossa ensimmäisellä klikkauksella mennään edelleen mobiiliversioon. Ehkä muutenkin kannattaisi tehdä täysversionapille erillinen käsittelysivu, josta olisi uudelleenohjaus takaisin oikeaan kohtaan sivustolla, ettei selaimen osoitteeseen jää turhaan tuota parametria ?fullsite=1.
Jees aivan, eipä tullut tuo mieleen kun sessioiden kanssa lähinnä touhunnut. Elikkä ehkä hyvä ratkaisu olisi joku "taysiversioon.php" jossa keksi asetetaan ja sitten ohjataan takaisin tuolle sivulle.
Tein pienen keksin, joka disabloi mobiledetectin tunniksi, ja sen jalkeen taas enablettaa, Eli simppelein koodi ikina.
<?php if( isset($_GET['mobiili']) || isset($_COOKIE['mobiili']) ){ //Mobiilisivulle, jos eväste löytyy setcookie("mobiili", "true", time()+3600); include 'mobile.php'; } else { //Jos ei löytynyt evästeistä, kysy javascriptinä "Haluatko siirtyä mobiilisivulle?" echo(" <script> window.mobilecheck = function(){ var check = false; (function(a){if(/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows (ce|phone)|xda|xiino/i.test(a)||/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(a.substr(0,4)))check = true})(navigator.userAgent||navigator.vendor||window.opera); return check; } function getCookie(c_name){ var c_value = document.cookie; var c_start = c_value.indexOf(\" \" + c_name + \"=\"); if (c_start == -1){ c_start = c_value.indexOf(c_name + \"=\"); } if (c_start == -1){ c_value = null; } else { c_start = c_value.indexOf(\"=\", c_start) + 1; var c_end = c_value.indexOf(\";\", c_start); if (c_end == -1){ c_end = c_value.length; } c_value = unescape(c_value.substring(c_start,c_end)); } return c_value; } if( window.mobilecheck() && getCookie(\"mobiili\") == null ){ if( confirm(\"Käytät mobiililaitetta. Haluatko siirtyä mobiili sivulle?\") ){ window.location.assign(\"http://palvelin.fi/index.php?mobiili\"); } } </script> </head>"); //Jos ei mobiililaite (ei tunnistettu scriptinä tai evästeistä include 'home.php'; } ?>
Toiminta:
Jos PHP scripti löytää "mobiili" evästeen, ohjaa mobile.php tiedostoon. Muuten Javascript tarkistaa onko mobiililaite tai selain, jos on, näyttää viestin "Käytät mobiililaitetta. Haluatko siirtyä mobiiliversioon?". Jos ei evästettä tai ei ole mobiiliselain, näyttää home.php tiedoston.
include 'mobile.php'; ja 'home.php'; voi korvata myös header () funktiolla (uudelleenohjaus).
Mobiilisivun "Täysversio" painike tehdään Javascriptinä tuhoa eväste. Kun eväste tuhottu, sivusto kysyy uudelleen.
Oletko sinä koskaan kuullut koodin sisentämisestä? Plaintextin echottelu on muutenkin todella huono käytäntö. Näkeehän tuosta väristäkin: punainen tarkoittaa virhettä.
Pahoittelen etten ole sisentänyt koodia... Toimivuudessa ei ongelmia, mutta ymmärrän virheet, joita koodissa on.
Sisennyksen ja pitkän echon lisäksi koodissa on ainakin kaksi aivan konkreettista ongelmaa: HTML-koodista ei tule millään validia, ja tuollainen include on kaikin puolin huono tapa ”vaihtaa” sivua.
Minh Truong kirjoitti:
Toimivuudessa ei ongelmia, mutta ymmärrän virheet, joita koodissa on.
Mielestäni olisi silloin viisainta joko korjata virheet tai jättää koodi lähettämättä.
Tuossa esimerkissä palvelinpäässä tehtävä tarkistus on muutenkin aivan turhaa purkkaa. Mikä hyöty siitä on, kun kuitenkin tarkistus tehdään myös selaimessa? Esimerkiksi Maikkarin sivuilla käyttäjältä ei kysytä mitään vaan hänet ohjataan suoraan mobiilipuolelle, joten sellaisessa ratkaisussa voidaan taas käyttää pelkästään palvelimen puolella tehtävää tarkistusta.
Aihe on jo aika vanha, joten et voi enää vastata siihen.