Projekt na zlecenie. Z założenia miała być to strona do auto-prezentacji, na której klient może pokazywać swoje dzieła. Dlatego też głównym miejscem na stronie jest galeria zdjęć uzupełniona dodatkowo o krótką notkę biograficzną. Wszystko wykonane jako ‘OnePage’. Strona korzysta z ViewComposerów oraz została “zlokalizowana” w trzech językach.
Info
git clone https://github.com/ZielonyBuszmen/onePage-hafty.git
- Github - github.com/ZielonyBuszmen/onePage-hafty
- Działający projekt - hafty-kasi.cba.pl
- Użyte technologie - Larevel 5.3, Bootstrap, Angular2
- Kiedy - styczeń 2017
- Przeznaczenie projektu - Projekt na zlecenie. Na stronie znajduje się galeria zdjęć, księga gości i kilka informacji. Wszystko wykonane jako ‘OnePage’, bez przeładowywania witryny. Strona korzysta z ViewComposerów oraz została ‘zlokalizowana’ w trzech językach
Kilka spraw technicznych
Layout został podzielony na elementy, które dowolnie można usuwać lub zmieniać ich kolejność:
resources/views/default.blade.php
<!DOCTYPE html>
<html lang="pl">
<head>
@include('includes.head')
</head>
<body>
<!-- Navigation -->
@include('includes.navigation')
<!-- Header -->
@include('includes.header')
<!-- About -->
@include('includes.about')
<!-- Blueimp gallery LightBox ->
@include('includes.gallery_blueimp')
<!-- Guest Book -->
@include('includes.guest_book')
<!-- Footer -->
@include('includes.footer')
<!-- Bottom scripts -->
@include('includes.bottom_scripts')
</body>
</html>
W kodzie zaimplementowałem możliwość zmiany języka serwisu. Jest to brzydki kod, bo napisany w roucie zamiast w kontrolerze (lub jakiejś innej stosownej do tego klasie).
routes/web.php
Route::get('/locale/{locale}', function ($locale, \Illuminate\Http\Request $request) {
App::setLocale($locale);
$request->session()->put('lang', $locale);
return redirect("/");
})->where("locale", "(pl|en|es)");
Dodawanie nowych zdjęć:
- Duże zdjęcia znajdują się w
public/img/hafty
. Na podstawie tego katalogu skrypt tworzy array’a z odnośnikami do zdjęć. - Miniaturki są przechowywane w folderze
public/img/miniaturki
. Miniaturka musi nazywać się tak samo jak duże zdjęcie. Powinna mieć wymiary400px x 300px
. - Ustawienia odnośnie lokalizacji folderu ze zdjęciami oraz cały skrypt który przeszukuje te foldery znajdziemy w pliku
app/Repositories/PhotoRepository.php
. MetodagetAll()
zwraca gotowego array’a z linkami do zdjęć i miniaturek. Wynik tej funkcji jest zwracany do widokuresources/views/includes/gallery_blueimp.blade.php
. Nie jest to robione standardowo przez kontroler lub router, tylko poprzez tzw. ViewComposer o nazwiePhotoComposer
(lokalizacjaapp/Console/Http/ViewComposers/PhotoComposer.php
). Te dane są zwracane z kolei do zmiennej$photos
, którą możemy używać w widoku. - Repozytorium do ViewComposera jest wstrzykiwane dzięki mechanizmowi Dependency Injection
Sam ViewComposer prezentuje się następująco. Jak widzimy, repozytorium z fotografiami jest „wstrzykiwane” dzięki mechanizmowi Dependency Injection.
<?php
namespace App\Http\ViewComposers;
use App\Repositories\PhotoRepository;
use Illuminate\View\View;
class PhotoComposer
{
protected $photos;
public function __construct(PhotoRepository $photos)
{
$this->photos = $photos;
}
public function compose(View $view)
{
$view->with('photos', $this->photos->getAll());
}
}
ViewComposer jest wykonywany dzięki ServiceProviderowi: linie 18-20
<?php
namespace App\Providers;
use Illuminate\Support\Facades\View;
use Illuminate\Support\ServiceProvider;
class ComposerServiceProvider extends ServiceProvider
{
/**
* Register bindings in the container.
*
* @return void
*/
public function boot()
{
// Using class based composers...
View::composer(
'includes.gallery_blueimp', 'App\Http\ViewComposers\PhotoComposer'
);
}
/**
* Register the service provider.
*
* @return void
*/
public function register()
{
//
}
}
Instalacja
Standardowo -> pobieramy projekt do folderu htdocs
Xamppa, albo do www
Wampa (lampa, itp). Następnie otwieramy terminal (konsolę) w folderze z projektem i wpisujemy composer install
, a potem npm install
. Tak, projekt wymaga zainstalowanego Composera oraz Node.js.
Być może będzie wymagane odblokowanie php_intl.dll
w pliku php.ini
w konfiguracji naszego serwera, ale to już jest spowodowane przez wymagania samego Laravela.
Następnie musimy przejść do pliku node_modules/elixir-typescript/index.js
i zakomentować w nim linijkę: //.pipe($.concat(paths.output.name))
.
Na koniec wpisujemy komendę gulp
by skompilować assety (pliki TypeScript) Angulara 2.