In diesem Artikel wird erkl?rt wie Smarty 3 ins Zend Framework (Version 2) integriert werden kann.
Es muss die Datei “vendor/Zend/View/SmartyRenderer.php” erstellt werden:
Nun muss die Datei “module/Application/config/module.config.php” angepasst werden.
Beispiel:
Anpassen der Datei “module/Application/Module.php”
Anpassen der Datei “module/Application/src/Application/View/Listener.php”
=> Suche und Erstetze “.phtml” mit “.tpl”
Die Datei k?nnte anschlie?end wie folgt aussehen:
Entpacke Smarty 3 nach vendor/smarty/
Zum schluss muss nurnoch die “index.php” angepasst werden.
Hallo,
gibts denn schon eine überarbeitete Version oder eine Idee warum es nicht (mehr) funktioniert? Habe mich ehrlich gesagt noch nicht mit dem ZF2 auseinander gesetzt, werde aber umsteigen, sobald es mal einen richtigen release gibt. Dann würde ich allerdings gerne direkt auch auf das aktuellste Smarty upgraden, da bietet sich dies hier natürlich an.
Domi
Das hat nur für die Beta Version funktioniert.
In der Stable Version gab es ein paar gr??ere ?nderungen, wodurch das hier nicht mehr funktioniert.
Ich hatte bisher auch noch keine Zeit es wieder zum laufen zu bekommen.
Ich habe Smarty 3 in Verbindung mir dem aktuellen Zend 2 Release vom 04.09.2012 mit dem SmartyModule von
https://github.com/MurgaNikolay/SmartyModule
in Verbindung mit:
https://github.com/MurgaNikolay/ZendSkeletonApplication
nach ein paar kleineren Anpassungen zum Laufen bekommen.
Interessantes modul. Hab es auch soweit zum Laufen gekriegt, dass mal alles so fehlerfrei included wird und das modul in der application.config.php aktiviert, allerdings fehlt mir jetzt grad der entscheidende Tipp, was noch zu tun ist, dass er auch die .tpl files liest und anzeigt?
Meine Module Klasse sieht wie folgt aus:
My “module.config.php” sieht etwa so aus:
Wobei ROOT_DIR eine selbst definierte Konstante ist, die man auch durch __DIR__ ersetzen kann, je nachdem wo der Template Ordner liegen soll.
Hey Sascha,
du hilfst mir schon gut weiter! Aber was ich noch nicht verstehe: warum “benutzt” die SmartyStrategy aus dem SmartyModule das Zend\EventManager\ListenerAggregate wenn es dieses garnicht gibt?! hast du das in deiner Version selbst gebaut und eingebunden?
Vielen Dank für die Hilfe und ich hoffe, wir bekommen es noch zum Laufen
Gru?
Domi
Hi,
ja, hab vergessen, dass ich die Klasse angepasst habe.
Die Klassen ListerAggregate und EventCollection gibts nicht mehr.
Die SmartyStrategy sieht also so aus:
Die Klasse SmartyRenderer hat auch Anpassungen:
oh Sascha,
ich trau mich garnicht dich weiter zu nerven..
Fatal error: Uncaught exception 'Zend\ServiceManager\Exception\ServiceNotFoundException' with message 'Zend\ServiceManager\ServiceManager::get was unable to fetch or create an instance for SmartyModule\View\Strategy\SmartyStrategy' in ...../vendor/ZF2/library/Zend/ServiceManager/ServiceManager.php:420 Stack trace: #0 ...../module/SmartyModule/Module.php(28) ...
bin mir aber eigtl sicher, dass er auf das File zugreifen kann, daher ist mir das nicht so ganz erkl?rlich, warum er da nicht weiter kommt ..
Viiiiielen Dank soweit für die Hilfe, viel kanns jetzt ja nicht mehr sein.
Werde das resultat wenns l?uft auf jeden Fall zur Verfügung stellen auf gitHub.
irgendwo anders war der Hund begraben.. hatte scheinbar schon zuviel ge?ndert. Hab die Quellen mal neu geladen. Nun geht die Suche weiter: Den
Zend\Module\Consumer\AutoloaderProvider
der in der Module.php verwendet wird, den die class Module implementiert scheint es ja auch nicht mehr zu geben. Habe es nun mal so gemacht, passt das?
namespace SmartyModule;
use Zend\ModuleManager\ModuleManager,
Zend\ModuleManager\Feature\AutoloaderProviderInterface,
Zend\EventManager\StaticEventManager;
class Module implements AutoloaderProviderInterface
{
//...
Er zeigt mir nun die richtige layout.tpl an, allerdings l?uft diese scheinbar nicht durch smarty durch. Und scheinbar ruft er auch die render() im SmartyRenderer nicht auf. Irgendwas fehlt also noch ..
die Smarty.class.php wird allerdings irgendwann mal initialisiert, das scheint zu klappen ..
Noch Ideen?
Hi,
die Module Klassen müssen garkein Interface mehr implementieren:
Meine SmartyModule\Module Klasse sieht wie folgt aus:
Wichtig für den Controller ist noch, dass man ein ViewModel benutzt:
Beispiel:
im controller habe ich:
return new ViewModel(
array(
‘hello’ => ‘hello world. smarty works?!’,
)
);
aber was er mir jetzt noch bringt:
fatal error: Uncaught exception 'Zend\View\Exception\RuntimeException' with message 'SmartyModule\View\Renderer\SmartyRenderer::render: Unable to render template "application/index/index"; resolver could not resolve to a file
er kanns scheinbar also nicht aufl?sen. Hab mal versucht in den Klassen vom Zend phprenderer reinzuschauen aber springt er mir an einer stelle raus, an der ich es nicht erwartet habe. evtl kannst du mal über das modul nochmal drüber schauen?
https://github.com/Domi-cc/SmartyModule
w?re super gut von dir!
Domi
ah, so gehts:
public function onBootstrap($e) {
$this->initializeView($e);
$this->setupView($e);
}
aber falls doch noch was anzumerken hast, gerne
was er noch anmeckert wenn ichs nicht rauswerfe ist:
$renderer->setHelperPluginManager(new HelperPluginManager(new HelperConfig()));
$config = $serviceManager->get(‘config’);
$router = \Zend\Mvc\Router\SimpleRouteStack::factory($config['router']);
$renderer->plugin(‘url’)->setRouter($router);
Fatal error: Class 'SmartyModule\HelperPluginManager' not found in ..
.. hast du den selber geschrieben noch?
Hi,
nein das habe ich nicht selbst geschrieben. Wenn du diese “uses” rein machst, sollte es gehen:
Dadurch kannst du die Zend\Form View Helper verwenden:
z.b.:
Das Url Plugin ist dafür da, dass man im Smarty über den Router die Urls bauen kann:
<a href=”{$this->url(…)}”>…</a>
Hi
Sorry, I’m french, and really not good in German, so I try in english
Hi,
no problem, just wait a bit until Domi has made all fixes to https://github.com/Domi-cc/SmartyModule
or just ask your question in english.
Thanks
return array(
‘modules’ => array(
‘Application’,
‘SmartyModule’,
),
// …
);
I have this error :
Fatal error: Uncaught exception ‘Zend\ServiceManager\Exception\ServiceNotFoundException’ with message ‘Zend\ServiceManager\ServiceManager::get was unable to fetch or create an instance for Literal’ in C:\cch\zf2-smarty\vendor\zendframework\zendframework\library\Zend\ServiceManager\ServiceManager.php
I’m new to Zend, so I’m not sure to have installed it correctly
Oh , Domi made another update, it’s a lot better
You’re invited to improve it with me together. just fork it on github and commit your changes with a pull request.
Thank you
Domi
Hi Domi !
I don’t know how to use github yet, when I have a little time I’ll commit my changes. I just added a block in the SmartyRenderer class, in the render method :
// changes default suffix from “phtml” to “tpl”
foreach ($this->resolver() as $resolver)
if (get_class($resolver) == “Zend\View\Resolver\TemplatePathStack”)
$resolver->setDefaultSuffix(‘tpl’);
There’s surely a more elegant way to do it, but it is useful not to have to manually declare all my templates in the config file.
联系客服