Ich entwickle ein CRUD -System in Phalcon PHP (Version 1.3.4).
Mein Ziel ist es, einen Link zu erstellen (Zeile löschen), der beim Klicken (JavaScript-Bestätigungsfeld) eine Bestätigung verlangt und dann (Anfragetyp POST) an den Link geht.
Nehmen wir an, ein Benutzer klickt auf die Schaltfläche "Zeile löschen".
Ich weiß CakePHP hat eine Funktion ( FormHelper :: postLink () ), die genau das tun.
Ich habe mich gefragt, ob Phalcon PHP auch eine solche Funktion hatte.
Ich sehe drei Möglichkeiten, um zu erreichen, was Sie wollen. Eine besteht darin, ein Makro in der Volt-Vorlage zu erstellen, das zweite ist das Hinzufügen einer Funktion zu Ihrer Anzeigen . Drittens und am nächsten - was ich verstehe ist dein Wunsch - ist es, Phalcons zu erweitern Tag-Helfer und das ist ein Teil, den ich hier beschreiben werde.
Phalcon hat einen eigenen Tag-Helfer, mit dem Sie einfach einige Elemente erstellen können. postLink
ist kein Teil, der dort implementiert wird, aber Sie können es leicht erreichen. In meinem Beispiel habe ich den Namespace Application
mit der Klasse Tag
, der von \Phalcon\Tag
ausgeht. Dies ist meine Basis für dieses Tutorial.
Um zu erzwingen, dass Phalcon DI diese Klasse verwendet, muss die Standarddeklaration der Engine überschrieben werden, indem sie manuell als neuer DI-Dienst deklariert wird:
%Vor% Sie können testen, ob es richtig funktioniert, indem Sie {{ tag.postLink() }}
in der Volt-Vorlage eingeben oder mit $this->tag->postLink()
, wenn Sie die phtml-Vorlage verwenden.
Nun können Sie Ihre Tag::postLink()
-Methode mit HTML und Parametern füllen, die Sie erzeugen möchten:
Jetzt können Sie es wie folgt ausführen:
%Vor%Viel Spaß beim Erweitern:)
Es gibt einige Möglichkeiten, ein solches Verhalten in phalcon zu implementieren. Vor allem müssen wir verstehen, wie Ansichten und View-Helfer in Phalcon funktionieren. Und wenn Sie genau aufpassen, werden Sie feststellen, sowohl .volt
als auch .phtml
haben direkten Zugriff auf die DI
.
In Volt können Sie beispielsweise auf den Dienst flash
zugreifen und ausgeben seine Nachrichten durch Aufruf von:
{{ flash.output() }}
welches in den phtml konvertiert wird: <?php echo $this->flash->output(); ?>
Daher konzentriert sich meine Lösung auf die Definition eines neuen Dienstes in der DI, auf den Volt zugreifen kann. In CakePHP sieht die Syntax für postLink()
aus etwas wie: echo $this->Form->postLink()
, während die Funktion tatsächlich in einer Klasse namens % co_de definiert ist % Also wird meine Lösung dasselbe tun, eine Klasse FormHelper
definieren und sie dann unter dem Namen FormHelper
in die Ansicht einfügen.
Form
-Verzeichnis. app/helpers/
-Datei, indem Sie einen Verweis auf unser neues Verzeichnis hinzufügen: app/config/config.php
'helpersDir'=> APP_PATH . '/app/helpers/'
-Datei, indem Sie app/config/loader.php
zu den registrierten Verzeichnissen hinzufügen. $config->application->helpersDir
app/helpers/FormHelper.php
-Datei und fügen Sie sie hinzu: (Sie könnten "Form" klein schreiben, wenn Sie wollen, beide funktionieren. Ich habe es groß gemacht, um der CakePHP-Syntax ähnlicher zu sein. Beachten Sie, dass Volt Groß- und Kleinschreibung beachtet, wenn Sie versuchen, auf Dienste zuzugreifen, aber phtml wird es klein schreiben.)
app/config/services.php
Alternativ für phtml, verwenden Sie:
%Vor% Führen Sie es aus und beobachten Sie, wie es funktioniert. Rendern Sie einfach Ihre index / test.volt-Vorlage, indem Sie app/views/index/test.volt
in Ihrer Adressleiste aufrufen. (Stellen Sie sicher, dass Sie eine solche Aktion in Ihrem Index-Controller definiert haben)
Im Hinblick auf andere Lösungen könnten Sie auch /index/test
verwenden Funktionen für Volt zur Verfügung stellen, eins zur Zeit. Die Seite im Handbuch gibt das Beispiel von $compiler->addFunction()
. Sie können versuchen, den FactoryDefault für "Tag" im DI zu überschreiben und den Helfer zu verwenden, den wir bereits definiert haben und der das Tag erweitert. Sie würden es also einfach von "form" in "tag" ändern: $compiler->addFunction('shuffle', 'str_shuffle');
, aber wie Sie sehen, wird die Funktion $di->set('tag',function () {return new FormHelper();});
für Volt nicht als Funktion verfügbar sein, Sie werden es bemerken muss immer noch als postLink()
darauf zugreifen. Vielmehr sind alle \ Phalcon \ Tag-Funktionen tatsächlich fest in die Volt-Engine codiert. Sie können dies deutlich sehen, indem Sie den Zephir-Quellcode der Klasse tag.postLink()
anzeigen, die über hier . Für Ihre Bequemlichkeit und für den Fall, dass der Link jemals kaputt gehen sollte, habe ich hier ein Snippet geschrieben, das zeigt, dass die "Tag" -Funktionen in Volt tatsächlich fest darin codiert sind:
Wenn Sie also in ein paar mehr Methoden "hacken" möchten, indem Sie die Klasse \Phalcon\Mvc\View\Engine\Volt\Compiler
erweitern, haben Sie kein Glück. auf der Volt-Dokumentationsseite gibt es jedoch das Konzept, benutzerdefinierte Erweiterungen zu registrieren mit Volt arbeiten. Die Dokumentation zeigt das Beispiel: \Phalcon\Tags
Wo die Quelle der Klasse ist:
Dies ermöglicht den Zugriff auf jede gewünschte Funktion, ohne dass Sie jede Funktion, die Sie möglicherweise benötigen, manuell registrieren müssen. Sie können dies testen, indem Sie versuchen, auf $compiler->addExtension(new PhpFunctionExtension());
in Volt zuzugreifen, wie zuvor mit str_shuffle
, aber dieses Mal, ohne es registrieren zu müssen.
In Bezug auf andere Lösungen könnten Sie auch versuchen, CakePHP und PhalconPHP zusammen zu integrieren und versuchen, CakePHPs View-Helfer von PhalconPHP aufzurufen, aber dann würden Sie auf ein Problem von CakePHP stoßen, wenn Sie Ihr Router-Setup nicht verstehen Phalkon. Aber wenn Sie entschlossen sind, könnten Sie alle Routen und Konfigurationen für CakePHP kodieren und sie neben PhalconPHP laufen lassen, aber ich würde von solch einer verzweifelten Abhilfe abraten. Und schließlich, wenn Sie verstehen, wie die Funktion funktioniert, und Sie es kaum verwenden, könnten Sie mit nur hart-Codierung der HTML in erster Linie durchkommen. Ehrlich gesagt, CakePHPs Logik sieht für mich zunächst nicht so gut aus, weil es Ihr HTML-Dokument mit einem eingefügten Formular beschädigen muss, was Ihr Layout stören kann.Ich denke, es wäre sinnvoller, ein Formular dynamisch mit JavaScript zu erstellen, wenn wir bereits JavaScript verwenden, und es an die $compiler->addFunction('shuffle', 'str_shuffle');
anzuhängen, wenn auf die Schaltfläche geklickt wird, und das Formular, das wir gerade erstellt haben, dynamisch zu übermitteln. Aber Sie wollten eine CakePHP-Implementierung, also kodierte ich sie so nah wie möglich an der Logik. Es ist nicht perfekt in Bezug auf die Unterstützung all ihrer Funktionen wie <body>
, aber es sollte die meisten Ihrer Bedürfnisse erfüllen.
Ich kann meine Implementierung immer überarbeiten, aber ich denke, dass es zeigt, wie man mit Phalcon ziemlich gut für diejenigen arbeitet, die von CakePHP migrieren.