MobileDetect – detekce mobiliních zařízení
- akadlec
- Člen | 1326
Pokud jste narazili na problém s detekci zařízení které si prohlíží vaši aplikaci, je tento doplněk právě pro vás. Dokáže detekovat různá mobilní zařízení jako jsou telefony tak i tablety, tv a různe zobrazovače.
Celá detekce je založená na mobilním detektoru kteří jistě někteří z vás již znají a je inspirována podobným rozšířením pro symfony
Jejím použitím tak získáte službu která vám dokáže detekovat jaké zařízení uživatel používá, jaký má mobilní OS a mobilního User-Agenta. Jsou ze k dispozici i Latte makra a tak můžete podle zařízení přizpůsobit i smotný generovaný HTML obsah.
Pokud využíváte mobilní url, tak můžete také nastavit automatické přesměrování na tuto verzi, takže pokud vám uživatel navštíví stránky s mobilním zařízením, můžete jej přesměrovat na mobilní verzi např.: http://m.vase-stranka.cz či tabletovou verzi http://t.vase-stranka.cz atd. Chování jak se má přesměrovat se nastavuje v konfiguraci
Snad se vám bude toto rozšíření hodit. Vítám každý podnět na fix, upgrade atd…
TODO:
- Pro přesměrování chci přidat možnost zapsání routy místo absolutní url, či mít možnost vybrat
- Vyřešit předávání služeb do Latte maker
- Přidat možnost vyřadit přesměrování pro konkrétní routy
Možné TODO:
- Uvažuju že k tomu přidám ještě DeviceDetection co by mohla detekovat základní info i z klasických prohlížečů pokud by o to byl zájem
- DeviceDetection by pak mohl umět i s kooperací s JS detekovat viewport atd. a tak by PHPko mohlo vědět jak velké zobrazovací zařízení má k dispozici uživatel a podle toho vybrat správný layout.
Editoval akadlec (10. 1. 2015 19:32)
- Jiří Nápravník
- Člen | 710
suepr, brzo budu zase mobilní verzi řešit, tak to nebudu muset psát sám. Řeší to nějak i případ, když přijde člověk s mobilem, dostane se tedy na mobilní a on se přepne na full verzi, tak aby když příště přijde,tak se dostal na full verzi, jako chtěl minule a nebyl hozený na mobilní zase?
- akadlec
- Člen | 1326
No teoreticky by se v eventu mohly uprvit podminky a pokud si user setne
verzi tak by mu ji mělo načítat.
Teď je to uděláno tak že pokud máš mobil a máš aktivní přesměrování
na mobilní verzi, tak tě to přepne
na url mobilní verze vždy.
Pokud ovšem nepoužíváš mobilní url, ale jen měníš layout tak si to ukládá jaký view máš aktuálně zvolen. Takže pokud přijde z mobilu na nemobilní verzi (bez přesměrování) tak si to do cookies uloží info že bys měl mít mobilní view. Info o tom pak budeš mít v tom helperu deviceView a nebo přímo v latte makrech. Pokud provedeš změnu pomocí služby deviceView tak si to změni cookie a můžeš na mobilu vidět i nemobilní nebo tablet verzi.
- Jiří Nápravník
- Člen | 710
Zatím jsem vždy používal mobilní URL. Ale když nad tím přemýšlím, možná by bylo i lepší používat jenom přepnutí view. Ještě uvidím jak to budu implementovat.
- Zax
- Člen | 370
akadlec napsal(a):
@sKopheK: pro samotnou detekci to využívá knihovnu která je poměrně solidně aktualizována. Responzivní web se nehodí vždy a všude.
Promiň, nechci flejmovat, ale kdy se třeba responzivní web nehodí? Měl jsem pár klientů, kteří si mysleli, že nic takového nepotřebují, ale když jsem jim pak ukázal web na netbooku a nutil je scrollovat do stran, tak hned obrátili :-) (netbook je teď kaput, ale záměrně si budu kupovat tablet s nízkým rozlišením, protože nic jiného než praktická ukázka klienta nepřesvědčí, hehe)
Máš nějaký příklad webu, který by bylo nevhodné dělat responzivně, ať se poučím? Díky.
- Jiří Nápravník
- Člen | 710
Zax: Preferuji v nekoiak pripadech radeji mobilni verzi nez responsive. Responsive resi jen preskladani ale ty data si stejne stahuje. napriklad mam nejaky pravy sidebar, ktery je nesmyslny mit na malem rozliseni jako je mobil. No a prenaset takovy sidebar na mobilnim internetu muze byt nekdy az zbytecny porod, a uzivatele s FUPem ti nepodekuji. Ostatne proc maji velke zrpavodajske portaly typu idnes, ihned apod pord mobiln iverze a ne responsives
- akadlec
- Člen | 1326
@Zax: tak jak uvedl @Jiří Nápravník jsou prostě weby kde je zbytečné řešit responzivitu pomocí css, js atd…nepotřebuješ zpracovat X požadavků atd pokud je to uživatel z mobilu, proč posilat XXXKb uživateli které pak zahodí? Pokud děláš nějaký blog či malou firemní prezentaci tak ti je mobilní verze zřejmě na nic, ale pokud děláš něco složitejšího je vhodné i k tomuto upravit výstup.
- Zax
- Člen | 370
To je sice fakt, ale i když máš mobilní verzi, tak se pořád hodí udělat full verzi responzivně. Responzivní weby totiž nejsou responzivní jen kvůli různým druhům přístrojů, ale i kvůli různým způsobům používání prohlížeče.
Představ si, že máš jen jeden monitor a z nějakého důvodu
potřebuješ něco na netu a prohlížeč si chceš zobrazit v úzké nudli
(typicky abys měl na očích nějaký program, ve kterém zrovna pracuješ).
Proč by se ten obsah neměl přeskládat tak, abys nemusel scrollovat do
stran?
Nebo máš nějakého seniora, který používá nějakou prehistorickou
obrazovku 800×600 jenže ouha, tvůj web je optimalizovaný pro 1024×768 a
chudák stařík aby se naučil používat vodorovný scrollbar.
Nebo naopak máš někoho s obří obrazovkou s nějakým brutálním
rozlišením, tak proč mu nepřeskládat informace nějak horizontálněji, aby
se ta plocha využila?
Ono to ani není nijak moc nákladnější na vývoj, stačí si udělat pár webů responzivně a pak už to jde úplně samo a přínos to má myslím si dost velký, byť jde třeba jen o jednotky procent návštěvníků.
EDIT: nicméně sidebar bych asi řešil třeba tím, že bych použil ten detector a jednoduchou podmínkou bych ho buď vykreslil nebo nevykreslil :-) Nechci, aby z mého příspěvku nějak vyplynulo, že tvůj detector sucks, mobile version sucks nebo tak něco, jenom si myslím, že responzivní weby se hodí všude ;-)
Editoval Zax (24. 4. 2014 23:25)
- Tomáš Kolinger
- Člen | 136
Já také preferuji jako uživatel mobilní verzi z výše uvedených důvodů.
Mimochodem… Vývoj responzivního designu je zaručeně nákladnejší a né o málo. Už jenom řešení pro obrázky je složité a vyžaduje proti klasickému řešení velkou režii.
Editoval Tomáš Kolinger (25. 4. 2014 0:30)
- Zax
- Člen | 370
@Tomáš Kolinger: Co máš na mysli? Načítání obrázků se správnou velikostí kvůli úspoře dat nebo prostě jen ten fakt, že obrázek musíš dát do divu a napsat pár řádků css (což dost často musíš tak jako tak)? S tím načítáním souhlasím že je to složitější, ale určitě ne o moc víc než celá mobilní verze a pokud už máme mobilní verzi, tak nás to ani vůbec trápit nemusí a můžeme v responzivní verzi klidně načítat plnou kvalitu.
Sorry že tu tak flejmuji, ale já si musím responzivní design hájit. Mobilní verzi nijak neodsuzuji, jen si myslím, že existence mobilní verze není dostatečný důvod se na responzivnost úplně vyprdnout, protože to není jenom o tom, že se to zobrazí i na mobilu. Je to o tom, že se to zobrazí i když je člověk na PC a otevře si to v úzké nudli (a určitě přitom nebude lozit někde v patičce a hledat odkaz na mobilní verzi).
- akadlec
- Člen | 1326
Pánové myslím že se tady tak trošku odbočilo od tématu. Pokud chcete řešit to zda responzivní web ano či ne tak prosím jiné téma ano? Tady to nechme na diskuzi k doplňku.
Pokud někoho zajímá jaké zařízení a jejich OS toto rozšíření dokáže identifikovat, tak zde nalezene jejich seznam.
- Yess
- Člen | 16
Ahoj.. predovšetkým vďaka za super rozšírenie. Testoval som ho na čistom sandboxe aktuálnej verzie Nette 2.1.2. Detekcia funguje pekne, akurát som narazil na problém pri zmene device_view prostredníctvom GET parametru. Napríklad: ?device_view=full … Vznikne tento problém:
Possible problem: you are sending a HTTP header while already having some data in output buffer. Try OutputDebugger or start session earlier.
Otázka znie: Čo som spravil blbo? ..resp na čo som zabudol?
- Yess
- Člen | 16
akadlec napsal(a):
Nemáš tam ještě něco přidáno či poměněno? Zkusil sem to v čistém sandboxu jak na homepage tak i na podstránce a provede se to korektně bez chyby. Jaký máš config?
Takže stiahol som čistý sandbox. Cez composer som nainštaloval podľa Git-u rozšírenie („ipub/mobile-detect“: „dev-master“). Podľa návodu na GitHube som pokraačoval ďalej samozrejme .. prihodil som do configu extension a v BasePresenteri mám len ten trait a funkciu createTemplate. Skúšal som detekciu zariadenia, čo funguje OK, takže toto by malo byť všetko vporiadku.
V configu mám momentálne toto:
# Mobile detector
mobileDetect:
redirect:
mobile:
isEnabled: true
statusCode: 301
action: noRedirect
detectTabletAsMobile: true
switchDeviceView:
saveRefererPath: true
a ešte do session som prihodil
autoStart: smart
- Yess
- Člen | 16
Čo na to hovoríš? Ja som prehľadal súbory, či tam niekde nieje BOM .. ale bez úspechu..
Skúsil som do index.php hodiť:
ob_start(function($s, $flag) {
if ($flag & PHP_OUTPUT_HANDLER_START) {
$e = new \Exception;
$s = nl2br("Output started here:\n{$e->getTraceAsString()}\n\n") . $s;
}
return $s;
}, 2);
rekuže čo to vypľuje … a ladenka zrazu nič nevypisuje.. ale tuším to nebude riešenie :D
akurát nastali ďaľšie problémiky:
- ten redirect spraví takto: localhost/sandbox/www → localhost/sandbox/www/sandbox/www
- do cookies správne zapíše len v prípade, ak je GET parameter device_view=full. V ostatných prípadoch nastaví cookie na not_mobile
Editoval Yess (28. 4. 2014 14:13)
- rumcais1
- Člen | 80
Tady to mám na hostingu. http://hosting.pilsfree.net/rumcais/www/?…
Editoval rumcais1 (28. 5. 2014 12:52)
- Jiří Nápravník
- Člen | 710
@akadlec tak jsem se až teď dostal k té mobilní verzi. Nakonec jsem se rozhodl, že půjdu cestou, že podle zařízení pošlu konkrétní šablonu. Jde nějak rozumně udělat, že budu mít například šablonu homepage.latte a pro mobilní verzi se bude sahat na homepage.mobile.latte – ci neco podobného? Nepřijde mi moc ideální udělat jednu šablonu a tam ifovat.
- David Matějka
- Moderator | 6445
@JiříNápravník muzes prekryt metody formatTemplateFiles resp formatLayoutTemplateFiles v presenteru
- Jiří Nápravník
- Člen | 710
Díky za tip. Je nějaké obdobné řešení i pro komponenty? Předpokládám, že tam asi bude nejlepší nastavovat šablonu přes nějaky BaseControl, který se vždy podívá, zda nejde o mobil, či pod. nebo něco lepšího?
- akadlec
- Člen | 1326
@Jiří Nápravník: no pokud upravíš ty metody jak psal @matej21 tak si to můžeš rozhodnout tam ale to je pro některé už vyšší dívčí ;) proto to není uvedeno v readme. Ad komponenty, já to dělám tak že si v attached metodě ověřím co zobrazit a podle toho nastavím template. Aktuálně to používám na rozhodnutí zda daný control hodit to modalu nebo klasicky, když to bude na mobilu tak se zobrazí klasicky atd…
- Siam
- Člen | 54
Detekce funguje skvěle, ale bohužel funkce isMobile/isNotMobile nedělá to co jsem si myslel, že má dělat a to je detekce (pouze) mobilního telefonu. Tablet je brán totiž také jako mobilní zařízení.
Nešlo by přidat funkci jenom pro mobilní telefony? Jde mi hlavně o latte makra. Mohla by se jmenovat klasicky isPhone/isNotPhone.
- akadlec
- Člen | 1326
hele teoreticky to tam asi šlo dodělat, ale můžeš udělat podmínku s exkludování tabletu:
// Exclude tablets.
if( $detect->isMobile() && !$detect->isTablet() ){
}
pravda v makrech by to bylo hnusnější, takže to makro tam dodělám ;)
UP: tak jo je to teda tam. Je to tedy jedno makro:
{isPhone}Tady to bude videt jen na telefonu{/isPhone}
Makro isNotPhone je dle mě zbytečné, buď je to tedy mobilní zařízení phone/tablet a nebo to není mobilní zařízení, pokud chceš něco jen na mobilní zařízení ale aby to nebylo na telefonech tak na to je makro isTablet
Editoval akadlec (5. 1. 2015 20:32)
- Siam
- Člen | 54
akadlec:
podle mě není zbytečné. Tablet a desktop mají větší display a tak
můžou zobrazovat stejné věci a také mají obecně lepší připojení
k internetu. Na druhou stranu mobil je většinou připojený přes 3G síť,
na které je fup a je pomalejší než třeba wifi. Proto se hodí něco
nezobrazovat jenom pro mobily.
Třeba já osobně mám stránky, na kterých je anketa, lišta s tlačítky typu sdílet na FB, G+ apod a sloupec ve kterém jsou poslední komentáře. Jsou to vcelku užitečné věci, ale ne až tak moc, abych kvůli tomu zatěžoval stránky na mobilech. Takže to chci jenom na desktopu a tabletu.
Mohl by se tam prosím ještě dát i to isNotPhone?
- Rypi
- Člen | 38
Ahoj,
také mám problém, pokud zavolám stránku s parametrem: ?device_view=mobile, dostanu stejnou chybu jako lidé výše.
do mailu ti pošlu laděnku, pokud se ti problém ještě nepodařilo reprodukovat…
Rozšíření registruji v configu, žádné nastavení neuvádím a ani
v presenteru pak nic nemám. Jen v šabloně makra.
Automatická detekce funguje dobře, ale pokud uvedu ten parametr, tak tak mě
to redirectuje a nette vyhodí zaloguje chybu. (nebo to tracy zachytí a
redirect neproběhne…)
- Tomáš Brchaň
- Člen | 13
Ahoj,
díky za super doplněk.
Mám jen takovou drobnost. Trochu se tam bije označení. Chci úplně jednoduchou věc, přepínat z notMobileView na mobileView. Očekával bych, že v makrech bude fungovat isMobileView a opakem bude isNotMobileView. Ale to není pravda, protože když přepnu na FULL view, tak makro isNotMobileView mi hodí false, takže musím dát isFullView. Jenže isFullView nefunguje u klasického desktopu (když ještě neznovolím žádný view), protože $this->deviceView->getViewType() mi vrátí ‚not_mobile‘.
Podle mě jsou tam zbytečně 2 stavy, které se vlastně kdyjí: ‚not_mobile‘ a ‚full‘. A nebo musí být doladěna podmínka pro makro isNotMobileView, protože isFullView patří do podmnožiny isNotMobileView.