MVC - ładujemy treść w zależności od urządzenia
Data: 2018-09-26, autor: Michał MisztalKiedyś ktoś napisał do mnie (komentarz tylko dla admina) pod wpisami odnośnie własnego MVC dlaczego ja to robię. Są przecież gotowe autoloadery + gotowe frameworki. Po co to robić skoro wszystko jest. Do tego wszystko jest już skonfigurowane tak by zacząć pracę. Tak, prawdę mówiąc (albo pisząc), to obecnie staram się przyzwoić sobie Symfony4. Podoba mi się to, że linia komend działa nawet na Home.pl (sprawdziłem). Strony jeszcze żadnej nie wrzuciłem - jedynie testowy projekt. Po pierwsze dlatego, że nie znam jeszcze dobrze tego Frameworka.
Jeśli chodzi o naukę Symfony czy Laravela to raczej przyda mi się przy własnym frameworku. Po pierwsze dlatego, że nie podoba mi się idea nadmiarowości. Na razie pracuję nad stronkami które nie są skomplikowane i chcę żeby całość działała szybko u klientów/odbiorców. Unikam Wordpressa i Joomli jak tylko mogę, choć czasem się nie da. A wszystko po to by całość zajmowała jak najmniej i była uszyta na miarę. Nie twierdzę, że frameworki to coś złego. Wręcz przeciwnie. Gdy wszystko zaczyna się rozrastać stanowią sposób by nad tym zapanować.
Teraz przygotowuję stronę dla firmy taksówkowej. Założenia są takie - prosta strona, po kliknięciu na link od razu przenosi do dzwoniena. Do tego możliwość importu kontaktu w formacie vCard 2.1. Na razie działa ok. Ale jest jeden szkopuł. Funkcjonalność RWD jest ale to jeszcze nie to. Większość wyświetleń pewnie będzie pochodzić z komórek. Fakt - dziś prawie każdy ma normalny internet w smartfonie. Ale ta niepotrzebna nadmiarowość mi się nie podoba. Na oryginalnej stronie jest sporo obrazków by całość się ładnie prezentowała. Oczywiście mógłbym przygotować kilka wersji obrazków - ładowanych asynchronicznie przez AJAX. Ale zrobię to z poziomu PHP unikając nadmiarowego ruchu.
Wszystko opiera się o ciąg UserAgent. Słowani kluczowymi będą "Android", "iPhone" i "Windows Phone" (MS zapomniał a ja jeszcze pamiętam o tym systemie). Przygotowałem dwie wersje obrazków i w zależności od UserAgenta odpowiednie obrazki będą ładowane. Na początku utwórzmy sobie plik traits/Devices.php na cechy typowe dla urządzeń z których korzystają użytkownicy. Jego zawartość to
trait Devices{
function checkIfMobile() : bool {
$ret = false;
$uAgent = htmlentities($_SERVER['HTTP_USER_AGENT']);
$mobileEx = ['Android', 'iPhone', 'Windows Phone'];
foreach($mobileEx as $v){
if(strpos($uAgent, $v) !== false){
$ret = true;
break;
}
}
return $ret;
}
}
W pliku /index.php musimy go włączyć do projektu funkcją require. Teraz przechodzimy do kontrolera IndexController i uzupełniamy go np tak
class IndexController extends Controller {
use Devices;
function index($url, $args=null) {
$imgPrefix = '';
if($this->checkIfMobile() === true){
$imgPrefix = 'micro/';
}
$this->view->render('index/index', [
'imgPrefix' => $imgPrefix
]);
}
}
Spostrzegawczy zapewne dostrzegą, że całość frameworka trochę się zmieniła. Tak, musiałem zrobić porządek. Jak widzicie polecenie renderowania wygląda jak w Symfony. To celowy zabieg bo wprowadza porządek. A plik libs/View.php wygląda tak
class View {
protected $name, $args;
function __construct() {
}
function render($name, $args = null){
$this->name = $name;
$this->args = $args;
require 'views/base.php';
}
}
Przesunąłem cechy z widoku do kontrolera i dzięki temu muszę pamiętać o strukturze jednego a nie dwóch plików - wielki sukces. No i nazwę pliku views/main.php zmieniłem na views/base.php. Jeszcze tylko parser dla yamla i Symfony nie będzie mi potrzebny. No i dzisiaj to na tyle.