MVC - ładujemy treść w zależności od urządzenia

Data: 2018-09-26, autor: Michał Misztal

Kiedyś 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.

Komentarze (3)

[2018-09-26 22:36:34] Korsarz pisze: Mobilnie i stabilnie
Oprawą wyprzedzamy Sekuraka. No to Frugo.
[2018-10-05 08:29:38] Arczi pisze: Takie porady
Zacząłem czytać ten wpis i chyba w pierwszym zdaniu chodzi o mnie :P te gotowe autoloadery to raczej przyjęty standard i chodzi tu konkretnie o Composera. Nie wyobrażam sobie pisania czegokolwiek bardziej skomplikowanego niż one-file-script bez jego pomocy. Konfiguracja namespace'ów, customowe komendy odpalania vendorów (chociażby PHPUnit dla testów lub cs-fixer dla zgodności ze standardami PSR) i gigantyczny zbiór gotowego oprogramowania, bo po co wymyślać koło na nowo? Tak samo jeśli chcesz napisać swój framework nie potrzebujesz instalować od razu całego Symfony czy Laravela. Osobiście polecam same komponenty - dla przykładu YAML parser jest bardzo dobrze napisany i pokryty testami więc z powodzeniem możesz go uzyć w swoim projekcie. Co do prostych stronek, które nie wymagają jakichś skomplikowanych funkcjonalności - dla przykładu blog - polecam użycie Forestry (https://forestry.io/).
[2018-10-05 20:24:26] csk(admin) pisze: Re: Takie porady
Fajnie, że ktoś z bardziej technicznych tutaj zagląda i wytyka. To dobrze. Jak wyświetleń będzie więcej to może i dla takich "wytykaczy" będzie coś, np długopis z logiem pobliskiej hurtowni hydraulicznej, oczywiście wysyłane za pobraniem. A tak na serio - sam również nie wyobrażam sobie pisania wszystkiego od zera. Ten projekcik to raczej produktywna forma spędzania wolnego czasu. Czasem wykorzystam go dalej. Ale obsługa bazy danych, formularzy, wyjątków itp to za dużo. Trzeba sięgnąć po sprawdzone rozwiązania. Także prosty blog, strona wizytówka czy strona lokalnej telewizji jeszcze pod własny framework podpada ale dodanie czegoś więcej wymusi zastosowanie gotowych rozwiązań. I albo to będzie Django albo CodeIgniter.

Skomentuj lub zgłoś błąd

© Michał Misztal 2018

Czytasz właśnie

MVC - ładujemy treść w zależności od urządzenia
Autor: Michał Misztal
Data: 2018-09-26

Podobne wpisy