Suppression du module Smarty en standalone pour passer sur composer

This commit is contained in:
bglacial 2018-06-25 23:20:44 +02:00
parent f9229a6025
commit adfdfe2b63
24 changed files with 542 additions and 818 deletions

View File

@ -57,6 +57,9 @@ return [
'doctype' => 'HTML5', 'doctype' => 'HTML5',
'not_found_template' => 'error/404', 'not_found_template' => 'error/404',
'exception_template' => 'error/index', 'exception_template' => 'error/index',
'strategies' => [
'Smarty\View\Strategy'
],
'template_map' => [ 'template_map' => [
'layout/layout' => __DIR__ . '/../view/layout/layout.tpl', 'layout/layout' => __DIR__ . '/../view/layout/layout.tpl',
'application/index/index' => __DIR__ . '/../view/application/index/index.tpl', 'application/index/index' => __DIR__ . '/../view/application/index/index.tpl',

View File

@ -31,7 +31,544 @@
</div> </div>
</div> </div>
{$content}
<!--------------------------------------HEADER-------------------------------------->
<header id="main-header">
<div class="header-wrapper">
<a class="logo" href="#">Nicolas</a>
<div class="mobile-toggle">
<span></span>
<span></span>
<span></span>
</div>
<nav>
<ul>
<!--Main nav to navigate to different parts of the page-->
<li><a id="hero-link" href="#hero">Accueil</a></li>
<li><a id="about-link" href="#about">À propos </a></li>
<li><a id="competences-link" href="#competences">Competences</a></li>
<li><a id="experiences-link" href="#experiences">Experiences</a></li>
{*<li><a id="engagement-link" href="#engagement">Engagements</a></li>*}
<li><a id="contact-link" href="#contact">Contact</a></li>
</ul>
</nav>
</div>
</header>
<!--------------------------------------HERO IMAGE-------------------------------------->
<section id="hero">
<div id="particles-js">
<div class="row center-xs center-sm center-md center-lg middle-xs middle-sm middle-md middle-lg">
<div class="static col-xs-10 col-sm-10 col-md-10 col-lg-10">
<div class="hero-content">
<img src="img/profile-pic2.jpg">
<h1>Nicolas Riault</h1>
<h2 id="hero-text-animation">Web Developer Full Stack, Consultant IT</h2>
<button class="download"><a download href="downloads/example.txt">Télécharger mon CV</a></button>
<!--To add your file simply replace example.txt with whatever file you want-->
</div>
</div>
</div>
</div>
</section>
<!--------------------------------------ABOUT SECTION-------------------------------------->
<section id="about">
<div class="container">
<div class="row left-xs left-sm left-md left-lg">
<div class="col-xs-12 col-sm-12 col-md-6 col-lg-6">
<div class="about-text">
<h2>Bonjour, je m'appelle <span class="accent-text">Nicolas</span></h2>
<p>
Ouvert et curieux de caractère, je suis à laise dans la relation client et apprécie le travail
en équipe.
Jaime ce travail de développeur qui nécessite une capacité dadaptation et découte au service
dun projet.
<br>
Du point de vue technique, je développe principalement en PHP, C#. Je suis également a l'aise
avec SQL Server et la solution MSBI.
<br>
Sur mon temps libre je travaille sur des projets personnels que j'autilise au quotidien en
utilisant de nouvelles technologies (AngularJs, Ionic ... ).
</p>
<ul class="about-social">
<!--Social icons for the about section-->
<!--These icons are font-awesome icons and more can be looked up at https://fontawesome.com/icons?d=gallery-->
<li><a href="http://www.google.com"><i class="fab fa-facebook-f"></i></a></li>
<!--Simply replace the google link with your social media link-->
<li><a href="http://www.google.com"><i class="fab fa-twitter"></i></a></li>
<li><a href="http://www.google.com"><i class="far fa-envelope"></i></a></li>
<li><a href="http://www.google.com"><i class="fab fa-google-plus-g"></i></a></li>
<li><a href="http://www.google.com"><i class="fab fa-youtube"></i></a></li>
</ul>
</div>
</div>
<div class="col-xs-12 col-sm-12 col-md-6 col-lg-6">
<div class="about-resume">
<div class="education">
<h2>Cursus et certifications</h2>
<div class="eduction-block">
<h4>SQL Server 2014 Performance Tuning and Optimization</h4>
<p>2017 - IB Formation - Paris</p>
</div>
<div class="eduction-block">
<h4>Licence Professionelle logiciel libre et propriétaire</h4>
<p>2012 - UFR Des Sciences - Angers</p>
</div>
<div class="eduction-block">
<h4>BTS Informatique de Gestion</h4>
<p>2011 - Lycée Chevrollier - Angers</p>
</div>
<div class="eduction-block">
<h4>Lycée Notre Dame</h4>
<p>2009 - Baccalauréat Scientifique - La Flèche</p>
</div>
</div>
</div>
</div>
</div>
</div>
</section>
<!--------------------------------------COMPETENCES SECTION-------------------------------------->
<section id="competences">
<div class="container">
<div class="section-title">
<h1>Mes <span class="accent-text">Compétences</span></h1>
</div>
<div class="row left-xs left-sm left-md left-lg">
<div class="col-xs-12 col-sm-12 col-md-6 col-lg-6">
<div class="about-resume">
<div class="skills">
<h2>Développement</h2>
<div class="skill-progress-container">
<p>PHP</p>
<div class="skill-bar">
<div class="bar-percent php">
<div class="inner-percent"></div>
</div>
</div>
</div>
<div class="skill-progress-container">
<p>Javascript</p>
<div class="skill-bar">
<div class="bar-percent php">
<div class="inner-percent"></div>
</div>
</div>
</div>
<div class="skill-progress-container">
<p>HTML / CSS</p>
<div class="skill-bar">
<div class="bar-percent html">
<div class="inner-percent"></div>
</div>
</div>
</div>
<div class="skill-progress-container">
<p>.NET / C#</p>
<div class="skill-bar">
<div class="bar-percent net">
<div class="inner-percent"></div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="col-xs-12 col-sm-12 col-md-6 col-lg-6">
<div class="about-resume">
<div class="skills">
<h2>SGBD / Business intelligence</h2>
<div class="skill-progress-container">
<p>SQL Server</p>
<div class="skill-bar">
<div class="bar-percent php">
<div class="inner-percent"></div>
</div>
</div>
</div>
<div class="skill-progress-container">
<p>Microsoft BI</p>
<div class="skill-bar">
<div class="bar-percent msbi">
<div class="inner-percent"></div>
</div>
</div>
</div>
<div class="skill-progress-container">
<p>MySQL</p>
<div class="skill-bar">
<div class="bar-percent mysql">
<div class="inner-percent"></div>
</div>
</div>
</div>
<div class="skill-progress-container">
<p>PostgreSQL</p>
<div class="skill-bar">
<div class="bar-percent postgresql">
<div class="inner-percent"></div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="row left-xs left-sm left-md left-lg">
<div class="col-xs-12 col-sm-12 col-md-6 col-lg-6">
<div class="about-resume">
<div class="skills">
<h2>Autres</h2>
<div class="skill-progress-container">
<p>MongoDb / CassandraDb</p>
<div class="skill-bar">
<div class="bar-percent msbi">
<div class="inner-percent"></div>
</div>
</div>
</div>
<div class="skill-progress-container">
<p>Python</p>
<div class="skill-bar">
<div class="bar-percent msbi">
<div class="inner-percent"></div>
</div>
</div>
</div>
<div class="skill-progress-container">
<p>NodeJs</p>
<div class="skill-bar">
<div class="bar-percent mysql">
<div class="inner-percent"></div>
</div>
</div>
</div>
<div class="skill-progress-container">
<p>AngularJS</p>
<div class="skill-bar">
<div class="bar-percent mysql">
<div class="inner-percent"></div>
</div>
</div>
</div>
<div class="skill-progress-container">
<p>Ionic Framework</p>
<div class="skill-bar">
<div class="bar-percent postgresql">
<div class="inner-percent"></div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</section>
<!--------------------------------------EXPERIENCES SECTION-------------------------------------->
<section id="experiences" class="timeline">
<div class="container">
<div class="section-title">
<h1>Mes <span class="accent-text">Experiences</span></h1>
</div>
<div class="timeline-item">
<div class="timeline-img"></div>
<div class="timeline-content js--fadeInLeft">
<h3>Développeur Full Stack - Serveurcom</h3>
<div class="date">12/2015 - Actuel</div>
<p>
Maintenance évolutive d'une application de facturation pour les télécoms.
<br>
Macro gestion de l'équipe de développement.
<br>
Formation Microsoft 55144B.
</p>
<a class="bnt-more" onclick="launchModale('#modalServeurcom')">Détail</a>
</div>
</div>
<div class="timeline-item">
<div class="timeline-img"></div>
<div class="timeline-content js--fadeInRight">
<h3>Consultant SI - Capgémini</h3>
<div class="date">02/2013 - 11/2015</div>
<p>
Développeur référent pour une TMA pour le groupe La Poste.
<br>
<small><i>PHP(CakePhp), MSBI/Asp.NET ( SSAS, SSRS, SSIS)</i></small>
<br>
TMA pour le ministère des sports.
<br>
<small><i>.NET/MSBI</i></small>
<br>
TMA pour l'Agence nationale de la recherche.
<br>
<small><i>C#, ASP, Sharepoint</i></small>
<br>
</p>
<a class="bnt-more" onclick="launchModale('#modalCapgemini')">Détail</a>
</div>
</div>
<div class="timeline-item">
<div class="timeline-img"></div>
<div class="timeline-content js--fadeInLeft">
<div class="date">04/2012 - 11/2012</div>
<h3>Développeur - INRA</h3>
<p>
Développement d'une application web pour informatiser le métier des chercheurs.
<br>
<small><i>Qooxdoo, Python, PostgreSQL</i></small>
</p>
</div>
</div>
<div class="timeline-item">
<div class="timeline-img"></div>
<div class="timeline-content js--fadeInRight">
<h3>Développeur Web - Archimède</h3>
<div class="date">06/2011 - 07/2011</div>
<p>Developpement d'un site vitrine sous Joomla</p>
</div>
</div>
</div>
</section>
<!--------------------------------------ENGAGEMENT SECTION-------------------------------------->
{*
<section id="engagement">
<div class="container">
<div class="section-title">
<h1>Mes <span class="accent-text">Engagements</span></h1>
</div>
<div class="row center-xs center-sm center-md center-lg trigger"><!--Row 1-->
<div class="col-xs-12 col-sm-6 col-md-4 col-lg-4 hb vb">
<div class="service-block">
<i class="icon fas fa-code"></i>
<h3>Web Development</h3>
</div>
</div>
<div class="col-xs-12 col-sm-6 col-md-4 col-lg-4 hb vb">
<div class="service-block">
<i class="icon fas fa-laptop"></i>
<h3>Web Design</h3>
</div>
</div>
<div class="col-xs-12 col-sm-6 col-md-4 col-lg-4 hb vb">
<div class="service-block">
<i class="icon fas fa-mobile-alt"></i>
<h3>Responsif</h3>
</div>
</div>
<div class="col-xs-12 col-sm-6 col-md-4 col-lg-4 hb vb">
<div class="service-block">
<i class="icon far fa-file-alt"></i>
<h3>Documentation</h3>
<p>
Analyse du besoin, qualification, chiffrage, rédaction des spécifications et des cahiers de
test.
</p>
</div>
</div>
<div class="col-xs-12 col-sm-6 col-md-4 col-lg-4 hb vb">
<div class="service-block">
<i class="icon far fa-copy"></i>
<h3>Clean Coder</h3>
<p>
Adepte du manifeste "Software craftsmanship manifesto".
<br>
<small>
<i>Pas seulement une application qui marche, mais une application bien faite, perreine,
robuste, maintenable et évolutive. </i>
</small>
</p>
</div>
</div>
<div class="col-xs-12 col-sm-6 col-md-4 col-lg-4 hb vb">
<div class="service-block">
<i class="icon fas fa-cogs"></i>
<h3>Support</h3>
<p>Gestion du SAV, priorisation des tickets.</p>
</div>
</div>
</div>
</div>
</section>
*}
<!--------------------------------------CONTACT SECTION-------------------------------------->
<section id="contact">
<div class="container">
<div class="section-title">
<h1>Contactez <span class="accent-text">Moi</span></h1>
</div>
<div class="row center-xs center-sm center-md center-lg">
<div class="col-xs-12 col-sm-4 col-md-4 col-lg-4">
<div class="contact-info">
<div class="contact-block">
<i class="fas fa-mobile-alt"></i>
<div class="contact-text">
<p>Numéro :</p>
<p>+33637290170</p>
</div>
</div>
<div class="contact-block">
<i class="far fa-envelope"></i>
<div class="contact-text">
<p>Email : </p>
<p>nicolas.riault@gmail.com</p>
</div>
</div>
<div class="contact-block">
<i class="fas fa-location-arrow"></i>
<div class="contact-text">
<p>
Addresse :
</p>
<p>
90 boulevard de la butte
72230 - Mulsanne
</p>
</div>
</div>
</div>
</div>
<div class="col-xs-12 col-sm-8 col-md-8 col-lg-8">
<form id="contact-form" onsubmit="submitForm(); return false;">
<div class="field">
Nom<br>
<input type="text" id="name" value="" required>
</div>
<div class="field">
Email<br>
<input type="text" id="email" value="" required>
</div>
<div class="field">
Sujet<br>
<input type="text" id="subject" value="" required>
</div>
<div class="field">
Message<br>
<textarea id="message" rows="10" cols="75"
required></textarea>
</div>
<div class="field">
<input type="submit" id="contact-submit" value="Envoyer"><span id="status"></span>
</div>
</form>
</div>
</div>
</div>
</section>
<!--------------------------------------MODALES LIST-------------------------------------->
<div class="modal fade" id="modalServeurcom" tabindex="-1" role="dialog">
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title">Développeur Full Stack - Serveurcom</h5>
</div>
<div class="modal-body">
<p>
Reprise en interne puis maintenance évolutive d'une application de facturation
Télécom développée par un prestataire externe.<br>
Développements de plusieurs briques dont une refonte visuelle complète de
l'application et la création de tableaux de bords complets dans le but de suivre
l'activité de l'entreprise mais aussi permettre aux revendeurs de suivre leur
activité.<br>
Responsable de la tenue des performances et de l'optimisation des traitements de
facturation sous SQL Server 2014.<br>
Rédaction de spécifications fonctionnelles pour les évolutions, définition de
roadmap pour planifier les besoins, macro gestion de l'équipe de développeurs et
organisation de daily meetings pour gérer lactivité de l'équipe de développement.<br>
Mise en place de JIRA pour gérer les taches de l'équipe.<br>
<br>
Formation Microsoft 55144B : "SQL Server 2014 Performance Tuning and
Optimization"
</p>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-dismiss="modal">Fermer</button>
</div>
</div>
</div>
</div>
<div class="modal fade" id="modalCapgemini" tabindex="-1" role="dialog">
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title">Consultant SI - Capgémini</h5>
</div>
<div class="modal-body">
<p>
Projet de TMA pour le groupe La Poste, Développeur référent <br>
- 6 applications php, sous framework CakePhp<br>
- 3 applications MSBI/Asp.NET ( SSAS, SSRS, SSIS)<br>
- Outre le développement pur, j'ai régulièrement réalisé les conceptions techniques, la mise à jour
des spécifications fonctionnelles, mais aussi la rédaction et le passage des campagnes de tests sous
quality center.<br>
-Communication régulière avec le client<br><br>
TMA pour le ministère des sports.<br>
- Développeur en support pour 2 applications .NET/MSBI pour le ministère des sports.<br>
- Réalisation de conception techniques, mise à jour des spécifications fonctionnelles, rédaction et
passage des campagnes de tests sous quality center.<br><br>
Développeur - Projet de TMA pour l'ANR.<br>
- Maintenance et évolution d'une application de gestion des demandes
</p>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-dismiss="modal">Fermer</button>
</div>
</div>
</div>
</div>
<!--------------------------------------FOOTER SECTION-------------------------------------->
<footer>
<p>Copyright &#169; 2018 bricho.com And Made With Love All Rights Reserved.</p>
</footer>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script> <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script src="https://unpkg.com/isotope-layout@3/dist/isotope.pkgd.min.js"></script> <script src="https://unpkg.com/isotope-layout@3/dist/isotope.pkgd.min.js"></script>
@ -43,7 +580,7 @@
<script src="js/scrollmagic/uncompressed/plugins/debug.addIndicators.js"></script> <script src="js/scrollmagic/uncompressed/plugins/debug.addIndicators.js"></script>
<script src="js/bootstrap.js"></script> <script src="js/bootstrap.js"></script>
<script src="js/main.js"></script> <script src="js/main.js"></script>
<!--<script src="js/timeline.js"></script>--> <!--<script src="js/timeline.js"></script>-->view_manager
<script src="https://cdn.jsdelivr.net/scrollreveal.js/3.3.1/scrollreveal.min.js"></script> <script src="https://cdn.jsdelivr.net/scrollreveal.js/3.3.1/scrollreveal.min.js"></script>
</body> </body>

View File

@ -1,7 +0,0 @@
.idea
vendor
composer.lock
composer.phar
phpunit.xml
phpmd.xml
phpdox.xml

View File

@ -1,21 +0,0 @@
The MIT License (MIT)
Copyright (c) 2016 skillfish
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

View File

@ -1,88 +0,0 @@
# zf3-smarty-module
Based on https://github.com/randlem/zf2-smarty-module and modified for use with ZF3
# Installation
Although you could just clone this repository, it is highly recommended to install the module via composer.
- run `php composer.phar require skillfish/zf3-smarty-module`
- add Smarty to your ZF3 modules Configuration e.g /config/modules.config.php
- change the View Manager Strategy to Smarty in your module or apllication config like:
```php
<?php
return [
'view_manager' => [
'strategies' => [
'Smarty\View\Strategy'
],
],
];
```
you might also want to change your View Manager's Template Map to actually use .tpl files instead of the default .phtml
```php
<?php
return [
'view_manager' => [
'template_map' => [
'layout/layout' => '/module/Application/view/layout/layout.tpl',
'application/index/index' => '/module/Application/view/application/index/index.tpl',
'error/404' => '/module/Application/view/error/404.tpl',
'error/index' => '/module/Applicationview/error/index.tpl',
],
],
];
```
# Template Inheritance
In order for template inheritance to work, you must terminate your ViewModel inside your Controller with `$viewModel->setTerminal(true);` and make use of the smarty `{extends}` tag. Otherwise the ViewModel will render the default layout template and inheritance won't work.
### Example
layout.tpl
```html
<html>
<head>
<title>{block 'title'}Page name{/block}</title>
</head>
<body>
{block 'content'}{/block}
</body>
</html>
```
index.tpl
```html
{extends 'layout.tpl'}
{block 'title' append} - Index{/block}
{block 'content'}This is the index template{/block}
```
Controller
```php
public function indexAction()
{
$viewModel = new ViewModel();
$viewModel->setTerminal(true);
return $viewModel;
}
```
will result in
```html
<html>
<head>
<title>Page name - Index</title>
</head>
<body>
This is the index template
</body>
</html>
```
# Requirements
The composer module currently requires:
```json
"require": {
"php": ">5.4",
"smarty/smarty": "~3.1.29",
"zendframework/zend-stdlib": "~3.0.1",
"zendframework/zend-mvc": "~3.0.1",
"zendframework/zend-servicemanager": "~3.1",
"zendframework/zend-modulemanager": "~2.7.1"
},
```

View File

@ -1,30 +0,0 @@
{
"name": "skillfish/zf3-smarty-module",
"description": "Zend Framework 3 Module for integrating Smarty 3 as View Manager",
"type": "library",
"license": "MIT",
"keywords": [
"smarty",
"module",
"zf3"
],
"authors": [
{
"name": "Heiko Baumgärtner",
"email": "skillfish@gmail.com"
}
],
"require": {
"php": ">5.4",
"smarty/smarty": "^3.1",
"zendframework/zend-stdlib": "^3.0",
"zendframework/zend-mvc": "^3.0",
"zendframework/zend-servicemanager": "^3.1",
"zendframework/zend-modulemanager": "^2.7"
},
"autoload": {
"psr-4": {
"Smarty\\": "src/"
}
}
}

View File

@ -1,60 +0,0 @@
<?php
namespace Smarty2;
use Smarty\View\Strategy;
use Smarty\Service\StrategyFactory;
use Smarty\View\Renderer;
use Smarty\Service\RendererFactory;
use Smarty\Service\PluginManager;
use Smarty\Service\PluginManagerFactory;
use Smarty\Service\PluginDelegator;
return [
'view_manager' => [
'strategies' => [
Strategy::class,
],
],
'service_manager' => [
'factories' => [
Strategy::class => StrategyFactory::class,
Renderer::class => RendererFactory::class,
PluginManager::class => PluginManagerFactory::class,
],
'delegators' => [
Renderer::class => [
PluginDelegator::class,
],
],
],
'smarty' => [
'suffix' => 'tpl',
'compile_dir' => getcwd() . '/data/smarty/templates_c',
'config_file' => getcwd() . '/config/autoload/smarty.conf',
'escape_html' => true,
'caching' => false,
'cache_dir' => getcwd() . '/data/smarty/cache',
'plugins_dir' => getcwd() . '/data/smarty/plugins',
'plugins' => [
// Plugin manager configuration.
'manager' => [
],
// Plugins.
// For example (MyFuncPlugin should be added in Plugin manager):
// 'functions' => [
// 'my_func' => MyFuncPlugin::class,
// ]
// This config register MyFuncPlugin with "my_func" name in Smarty.
'functions' => [
],
'modifiers' => [
],
'blocks' => [
],
'if_blocks' => [
],
'cycle_blocks' => [
],
],
],
];

View File

@ -1,8 +0,0 @@
<?php
namespace Smarty\Exception;
use Zend\ServiceManager\Exception\InvalidServiceException as ZendInvalidServiceException;
class InvalidServiceException extends ZendInvalidServiceException
{
}

View File

@ -1,10 +0,0 @@
<?php
namespace Smarty;
class Module
{
public function getConfig()
{
return include __DIR__ . '/../config/module.config.php';
}
}

View File

@ -1,20 +0,0 @@
<?php
namespace Smarty\Plugin;
use Smarty;
/**
* Interface to detect if a class is Smarty Block plugin.
*/
interface BlockPluginInterface extends PluginInterface
{
/**
* @param array $params
* @param string $content
* @param Smarty $smarty
* @param bool $repeat
*
* @return string
*/
public function prepare(array $params, $content, $smarty, &$repeat);
}

View File

@ -1,51 +0,0 @@
<?php
namespace Smarty\Plugin;
use Smarty;
/**
* Interface to detect if a class is Smarty CycleBlock plugin.
*/
interface CycleBlockPluginInterface extends PluginInterface
{
/**
* Call before cycle.
*
* @param array $params
* @param Smarty $smarty
*
* @return string|null
*/
public function init(array $params, $smarty);
/**
* Call before iteration.
*
* @param array $params
* @param Smarty $smarty
*
* @return bool true - if the current iteration is valid.
*/
public function isValid(array $params, $smarty);
/**
* Attention: move the pointer to this method.
*
* @param array $params
* @param string $content
* @param Smarty $smarty
*
* @return string Content of the current iteration.
*/
public function prepareIteration(array $params, $content, $smarty);
/**
* Call after cycle.
*
* @param array $params
* @param Smarty $smarty
*
* @return string|null
*/
public function end(array $params, $smarty);
}

View File

@ -1,18 +0,0 @@
<?php
namespace Smarty\Plugin;
use Smarty;
/**
* Interface to detect if a class is Smarty Function plugin.
*/
interface FunctionPluginInterface extends PluginInterface
{
/**
* @param array $params
* @param Smarty $smarty
*
* @return mixed
*/
public function run(array $params, $smarty);
}

View File

@ -1,36 +0,0 @@
<?php
namespace Smarty\Plugin;
use Smarty;
/**
* Interface to detect if a class is Smarty IfBlock plugin.
*/
interface IfBlockPluginInterface extends PluginInterface
{
/**
* @param array $params
* @param Smarty $smarty
*
* @return bool
*/
public function checkCondition(array $params, $smarty);
/**
* @param array $params
* @param string $content
* @param Smarty $smarty
*
* @return string Content, if the condition is true.
*/
public function prepareTrue(array $params, $content, $smarty);
/**
* @param array $params
* @param string $content
* @param Smarty $smarty
*
* @return string Content, if the condition is false.
*/
public function prepareFalse(array $params, $content, $smarty);
}

View File

@ -1,16 +0,0 @@
<?php
namespace Smarty\Plugin;
/**
* Interface to detect if a class is Smarty Modifier plugin.
*/
interface ModifierPluginInterface extends PluginInterface
{
/**
* @param mixed $value
* @param mixed ...
*
* @return mixed
*/
public function modify($value);
}

View File

@ -1,13 +0,0 @@
<?php
namespace Smarty\Plugin;
/**
* Interface to detect if a class is Smarty plugin.
*
* Abstract base interface that cannot be implemented alone. Instead it must be
* implemented by either FunctionPluginInterface, ModifierPluginInterface,
* BlockPluginInterface or IfBlockPluginInterface.
*/
interface PluginInterface
{
}

View File

@ -1,117 +0,0 @@
<?php
namespace Smarty\Service;
use Zend\ServiceManager\Factory\DelegatorFactoryInterface;
use Zend\ServiceManager\PluginManagerInterface;
use Interop\Container\ContainerInterface;
use Smarty;
use Smarty\Service\PluginManager;
use Smarty\Service\PluginProxy\IfBlockProxy;
use Smarty\Service\PluginProxy\CycleBlockProxy;
use Smarty\Exception\InvalidServiceException;
use Smarty\Plugin\FunctionPluginInterface;
use Smarty\Plugin\ModifierPluginInterface;
use Smarty\Plugin\BlockPluginInterface;
use Smarty\Plugin\IfBlockPluginInterface;
use Smarty\Plugin\CycleBlockPluginInterface;
/**
* This delegator used for registration Object-plugins in Smarty.
*/
class PluginDelegator implements DelegatorFactoryInterface
{
/**
* @var Smarty
*/
private $smarty;
/**
* @var PluginManagerInterface
*/
private $pluginManager;
/**
* {@inheritdoc}
*/
public function __invoke(ContainerInterface $container, $name, callable $callback, array $options = null)
{
$config = $container->get('Configuration');
$pluginsConfig = $config['smarty']['plugins'];
$renderer = call_user_func($callback);
$this->smarty = $renderer->getEngine();
$this->pluginManager = $container->get(PluginManager::class);
$this->registerFunctionPlugins($pluginsConfig['functions']);
$this->registerModifierPlugins($pluginsConfig['modifiers']);
$this->registerBlockPlugins($pluginsConfig['blocks']);
$this->registerIfBlockPlugins($pluginsConfig['if_blocks']);
$this->registerCycleBlockPlugins($pluginsConfig['cycle_blocks']);
return $renderer;
}
/**
* @param array $pluginsConfig
* @param string $expectedInstance
*
* @throws InvalidServiceException
*
* @return PluginInterface[]
*/
protected function getPlugins(array $pluginsConfig, $expectedInstance)
{
$plugins = [];
foreach ($pluginsConfig as $name => $pluginClass) {
$plugin = $this->pluginManager->build($pluginClass, ['name' => $name]);
if (!$plugin instanceOf $expectedInstance) {
throw new InvalidServiceException(sprintf(
'Plugin delegator "%s" expected an instance of type "%s", but "%s" was received',
__CLASS__,
$expectedInstance,
is_object($plugin) ? get_class($plugin) : gettype($plugin)
));
}
$plugins[$name] = $plugin;
}
return $plugins;
}
public function registerFunctionPlugins(array $plugins)
{
foreach ($this->getPlugins($plugins, FunctionPluginInterface::class) as $name => $plugin) {
$this->smarty->registerPlugin('function', $name, [$plugin, 'run']);
}
}
public function registerModifierPlugins(array $plugins)
{
foreach ($this->getPlugins($plugins, ModifierPluginInterface::class) as $name => $plugin) {
$this->smarty->registerPlugin('modifier', $name, [$plugin, 'modify']);
}
}
public function registerBlockPlugins(array $plugins)
{
foreach ($this->getPlugins($plugins, BlockPluginInterface::class) as $name => $plugin) {
$this->smarty->registerPlugin('block', $name, [$plugin, 'prepare']);
}
}
public function registerIfBlockPlugins(array $plugins)
{
foreach ($this->getPlugins($plugins, IfBlockPluginInterface::class) as $name => $plugin) {
$proxy = new IfBlockProxy($plugin, $name);
$this->smarty->registerPlugin('block', $name, [$proxy, '__invoke']);
$this->smarty->registerPlugin('function', $name . '_else', [$proxy, 'elseFunction']);
}
}
public function registerCycleBlockPlugins(array $plugins)
{
foreach ($this->getPlugins($plugins, CycleBlockPluginInterface::class) as $name => $plugin) {
$proxy = new CycleBlockProxy($plugin);
$this->smarty->registerPlugin('block', $name, [$proxy, '__invoke']);
}
}
}

View File

@ -1,10 +0,0 @@
<?php
namespace Smarty\Service;
use Zend\ServiceManager\AbstractPluginManager;
use Smarty\Plugin\PluginInterface;
class PluginManager extends AbstractPluginManager
{
protected $instanceOf = PluginInterface::class;
}

View File

@ -1,16 +0,0 @@
<?php
namespace Smarty\Service;
use Zend\ServiceManager\Factory\FactoryInterface;
use Interop\Container\ContainerInterface;
use Zend\ServiceManager\ServiceManager;
class PluginManagerFactory implements FactoryInterface
{
public function __invoke(ContainerInterface $container, $requestedName, array $options = null)
{
$config = $container->get('Configuration');
$config = $config['smarty']['plugins'];
return new PluginManager($container, $config['manager']);
}
}

View File

@ -1,33 +0,0 @@
<?php
namespace Smarty\Service\PluginProxy;
use Smarty\Plugin\CycleBlockPluginInterface;
class CycleBlockProxy
{
/**
* @var IfBlockPluginInterface
*/
private $plugin;
/**
* @param IfBlockPluginInterface $plugin
*/
public function __construct(CycleBlockPluginInterface $plugin)
{
$this->plugin = $plugin;
}
public function __invoke(array $params, $content, $smarty, &$repeat)
{
if (is_null($content)) {
return $this->plugin->init($params, $smarty);
}
if (!$this->plugin->isValid($params, $smarty)) {
$repeat = false;
return $this->plugin->end($params, $smarty);
}
$repeat = true;
return $this->plugin->prepareIteration($params, $content, $smarty);
}
}

View File

@ -1,46 +0,0 @@
<?php
namespace Smarty\Service\PluginProxy;
use Smarty\Plugin\IfBlockPluginInterface;
class IfBlockProxy
{
/**
* @var IfBlockPluginInterface
*/
private $plugin;
/**
* @var string
*/
private $name;
/**
* @param IfBlockPluginInterface $plugin
* @param string $name
*/
public function __construct(IfBlockPluginInterface $plugin, $name)
{
$this->plugin = $plugin;
$this->name = $name;
}
public function __invoke(array $params, $content, $smarty, &$repeat)
{
$trueFalseBlockContents = explode(sprintf('{%s_else}', $this->name), $content);
if (!isset($trueFalseBlockContents[1])) {
$trueFalseBlockContents[1] = '';
}
if (!$this->plugin->checkCondition($params, $smarty)) {
return $this->plugin->prepareFalse($params, $trueFalseBlockContents[1], $smarty);
}
return $this->plugin->prepareTrue($params, $trueFalseBlockContents[0], $smarty);
}
public function elseFunction(array $params, $smarty)
{
return $smarty->left_delimiter . $this->name . '_else' . $smarty->right_delimiter;
}
}

View File

@ -1,43 +0,0 @@
<?php
namespace Smarty\Service;
use Zend\ServiceManager\Factory\FactoryInterface;
use Interop\Container\ContainerInterface;
use Smarty\View\Renderer;
use Smarty;
class RendererFactory implements FactoryInterface
{
public function __invoke(ContainerInterface $container, $requestedName, array $options = null)
{
$config = $container->get('Configuration');
$config = $config['smarty'];
/** @var $pathResolver \Zend\View\Resolver\TemplatePathStack */
$pathResolver = clone $container->get('ViewTemplatePathStack');
$pathResolver->setDefaultSuffix($config['suffix']);
/** @var $resolver \Zend\View\Resolver\AggregateResolver */
$resolver = $container->get('ViewResolver');
$resolver->attach($pathResolver);
$engine = new Smarty();
$engine->setCompileDir($config['compile_dir']);
$engine->setEscapeHtml($config['escape_html']);
$engine->setTemplateDir($pathResolver->getPaths()->toArray());
$engine->setCaching($config['caching']);
$engine->setCacheDir($config['cache_dir']);
$engine->addPluginsDir($config['plugins_dir']);
if (file_exists($config['config_file'])) {
$engine->configLoad($config['config_file']);
}
$renderer = new Renderer();
$renderer->setEngine($engine);
$renderer->setSuffix($config['suffix']);
$renderer->setResolver($resolver);
return $renderer;
}
}

View File

@ -1,17 +0,0 @@
<?php
namespace Smarty\Service;
use Zend\ServiceManager\Factory\FactoryInterface;
use Interop\Container\ContainerInterface;
use Smarty\View\Renderer;
use Smarty\View\Strategy;
class StrategyFactory implements FactoryInterface
{
public function __invoke(ContainerInterface $container, $requestedName, array $options = null)
{
$renderer = $container->get(Renderer::class);
$strategy = new Strategy($renderer);
return $strategy;
}
}

View File

@ -1,99 +0,0 @@
<?php
namespace Smarty\View;
use Zend\View\Renderer\RendererInterface;
use Zend\View\Resolver\ResolverInterface;
use Zend\View\Model\ModelInterface;
use Zend\View\Exception\DomainException;
use Smarty;
use ArrayObject;
class Renderer implements RendererInterface
{
/**
* @var Smarty
*/
protected $engine;
/**
* @var ResolverInterface
*/
protected $resolver;
/**
* Template suffix for this renderer
* @var string
*/
protected $suffix;
public function setEngine(Smarty $engine)
{
$this->engine = $engine;
$this->engine->assign('this', $this);
}
public function getEngine()
{
return $this->engine;
}
public function setResolver(ResolverInterface $resolver)
{
$this->resolver = $resolver;
}
public function render($nameOrModel, $values = null)
{
if ($nameOrModel instanceof ModelInterface) {
$model = $nameOrModel;
$nameOrModel = $nameOrModel->getTemplate();
if (empty($nameOrModel)) {
throw new DomainException(sprintf(
'%s: recieved View Model argument, but template is empty.',
__METHOD__
));
}
$values = $model->getVariables();
unset($model);
}
if (!($file = $this->resolver->resolve($nameOrModel))) {
throw new DomainException(sprintf(
'Unable to find template "%s"',
$nameOrModel
));
}
if ($values instanceof ArrayObject) {
$values = $values->getArrayCopy();
}
$smarty = $this->getEngine();
$smarty->clearAllAssign();
$smarty->assign($values);
$content = $smarty->fetch($file);
return $content;
}
public function canRender($nameOrModel)
{
if ($nameOrModel instanceof ModelInterface) {
$nameOrModel = $nameOrModel->getTemplate();
}
$tpl = $this->resolver->resolve($nameOrModel);
$ext = pathinfo($tpl, PATHINFO_EXTENSION);
if ($tpl && $ext == $this->getSuffix()) {
return true;
}
return false;
}
public function setSuffix($suffix)
{
$this->suffix = $suffix;
}
public function getSuffix()
{
return $this->suffix;
}
}

View File

@ -1,57 +0,0 @@
<?php
namespace Smarty\View;
use Zend\EventManager\ListenerAggregateInterface;
use Zend\EventManager\EventManagerInterface;
use Zend\View\ViewEvent;
use Smarty\View\Renderer;
class Strategy implements ListenerAggregateInterface
{
/**
* @var callable
*/
protected $listeners = [];
/**
* @var Renderer
*/
protected $renderer;
public function __construct(Renderer $renderer)
{
$this->renderer = $renderer;
}
public function attach(EventManagerInterface $events, $priority = 100)
{
$this->listeners[] = $events->attach(ViewEvent::EVENT_RENDERER, [$this, 'selectRenderer'], $priority);
$this->listeners[] = $events->attach(ViewEvent::EVENT_RESPONSE, [$this, 'injectResponse'], $priority);
}
public function detach(EventManagerInterface $events)
{
foreach ($this->listeners as $index => $listener) {
$events->detach($listener);
unset($this->listeners[$index]);
}
}
public function selectRenderer(ViewEvent $e)
{
if (!$this->renderer->canRender($e->getModel())) {
return false;
}
return $this->renderer;
}
public function injectResponse(ViewEvent $e)
{
$renderer = $e->getRenderer();
if ($renderer !== $this->renderer) {
return false;
}
$result = $e->getResult();
$response = $e->getResponse();
$response->setContent($result);
}
}