Phalcon PHP Post Link mit JavaScript Bestätigungsdialog

8

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".

  1. JavaScript-Bestätigung "Möchten Sie diese Zeile wirklich löschen?"
  2. Der Benutzer klickt auf "Ja"
  3. Die Webseite macht einen POST an "/ users / delete / 1"

Ich weiß CakePHP hat eine Funktion ( FormHelper :: postLink () ), die genau das tun.

Ich habe mich gefragt, ob Phalcon PHP auch eine solche Funktion hatte.

    
Tijme 18.01.2015, 13:56
quelle

2 Antworten

5

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.

%Vor%

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:

%Vor%

Jetzt können Sie es wie folgt ausführen:

%Vor%

Viel Spaß beim Erweitern:)

    
yergo 10.11.2015, 11:27
quelle
4

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.

  1. Erstellen Sie ein Form -Verzeichnis.
  2. Aktualisieren Sie Ihre app/helpers/ -Datei, indem Sie einen Verweis auf unser neues Verzeichnis hinzufügen: app/config/config.php
  3. Aktualisieren Sie Ihre 'helpersDir'=> APP_PATH . '/app/helpers/' -Datei, indem Sie app/config/loader.php zu den registrierten Verzeichnissen hinzufügen.
  4. Erstellen Sie eine neue Datei $config->application->helpersDir
  5. Kopieren Sie den folgenden Code in die Datei:
%Vor%
  1. Bearbeiten Sie Ihre app/helpers/FormHelper.php -Datei und fügen Sie sie hinzu:
%Vor%

(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.)

  1. Bearbeiten Sie die Vorlage, mit der Sie den Code testen möchten, z. B. app/config/services.php
  2. Kopieren Sie den folgenden Code und fügen Sie ihn dort ein:
%Vor%

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:

%Vor%

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:

%Vor%

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.

    
Ultimater 11.11.2015 07:03
quelle

Tags und Links