Einführung
arbeite ich durch eine wiederverwendbare Admin-Modul; verantwortlich für die Handhabung von Authentifizierung und ACL. Dieses Modul verfügt über einen Basiscontroller, den jedes andere implementierte Modul erben kann. Also dieser Controller ist der Cp\AdminController
und ist nicht zugänglich, aber geerbt von allen anderen Controllern.Zend Framework 2 - Ausgabeformularelement, Objekte als HTML Felder
Das Problem
Ich habe einen Standard/home-Controller Cp\HomeController
, die mehrere Aktionen hat; Einloggen, abmelden und vergessen/Passwort zurücksetzen. Momentan arbeite ich an der Cp\HomeController::indexAction
. Innerhalb dieser Methode kann ich einfach folgendes:
// ... controller logic ...
public function indexAction()
{
if ($this->getAuth()->hasIdentity()) {
# XXX: This is the authorised view/dashboard.
} else {
# XXX: This is the unauthorised view; login page.
$loginForm = new Form\Login();
# XXX: validation, and login form handling here.
return array(
'form' => $loginForm
);
}
}
// ... controller logic ...
Die Frage ist hier, die Cp\HomeController
verwendet standardmäßig die ./module/Cp/view/cp/home/index.phtml
Vorlage; und wie folgt aussieht:
<h1>Authorisation Required</h1>
<section id="admin-login">
<?= $form ?>
</section>
ich Zend\Form
mit meiner eigenen Form Klasse ./module/Cp/src/Cp/Form.php
verlängert haben, wird dieser dann erweitert durch beliebige Formularklassen. _Bedenken Sie, ich werde diese Klasse in die App verschieben, so dass sie vollständig entkoppelt und vollständig wiederverwendbar ist.
<?php
// @file: ./module/Cp/src/Cp/Form.php
namespace Cp;
use Zend\Form\Form as ZendForm;
use Zend\Form\Fieldset;
use Zend\InputFilter\Input;
use Zend\InputFilter\InputFilter;
use Zend\View\Model\ViewModel;
use Zend\View\Renderer\PhpRenderer;
use Zend\View\Resolver;
class Form extends ZendForm
{
/**
* Define the form template path.
* @var String
*/
protected $__templatePath;
/**
* Define the view variables.
* @var Array
*/
protected $__viewVariables = array();
/**
* Set the view variable.
* @param String $key The index for the variable.
* @param Mixed $value The value for the view variable.
* @return Cp\Form
*/
public function set($key, $value)
{
$this->__viewVariables[$key] = $value;
return $this;
}
/**
* Set the template path.
* @param String $path The path for the template file.
* @return Cp\Form
*/
public function setTemplatePath($path)
{
$this->__templatePath = $path;
return $this;
}
/**
* When the object is buffered in output, we're going to generate the view
* and render it.
* @return String
*/
public function __toString()
{
// Define our template file as form for resolver to map.
$map = new Resolver\TemplateMapResolver(array(
'form' => $this->__templatePath
));
// Define the render instance responsible for rendering the form.
$renderer = new PhpRenderer();
$renderer->setResolver(new Resolver\TemplateMapResolver($map));
// The form view model will generate the form; parsing the vars to it.
$view = new ViewModel();
$view->setVariable('form', $this);
$view->setTemplate('form');
foreach ($this->__viewVariables as $key => $value) {
if (! property_exists($view, $key)) {
$view->setVariable($key, $value);
}
}
return $renderer->render($view);
}
}
ich erben diese Formularklasse, um meine Login-Formular zu erstellen, eine Standard-E-Mail-Adresse und Passwort-Feld, etwas, das wiederverwendet werden kann überall Authentifizierung auftreten können.
<?php
namespace Cp\Form;
use Zend\Form\Element;
class Login extends \Cp\Form
{
public function __construct($name = 'Login', $action)
{
// Parse the form name to our parent constructor.
parent::__construct($name);
// Override default template, defining our form view.
$this->setTemplatePath(MODULE_DIR . 'Cp/view/cp/form/login.phtml');
// Create our form elements, and validation requirements.
$email = new Element\Email('email');
$email->setLabel('E-mail Address');
$password = new Element\Password('password');
$password->setLabel('Password');
$submit = new Element\Submit('login');
$this->setAttribute('action', $action)
->setAttribute('method', 'post')
->setAttribute('autocomplete', 'autocomplete')
->add($email)
->add($password)
->add($submit);
}
}
Welche die geerbte __toString
Methode wird die definierte Formularansicht, nehmen und es macht. Diese ist, wo mein Problem ist, und meine Frage auftritt. In der Ansicht (siehe unten) versuche ich, das Formular zu erstellen, indem ich das Framework verwende, ohne die HTML-Elemente hart zu codieren. Da die Cp\Form\Login
Klasse könnte erweitert und modifiziert werden, mit einem anderen Feld oder zusätzliche Felder, optional oder obligatorisch oder bedingt.
Gibt es eine Möglichkeit, schnell, Zend zu bekommen, um das folgende HTML zu generieren? Ohne Teilansichten zu verwenden oder physisch zu schreiben <input type="<?= ... ?>" name="<?= ... ?>" />
. Dies liegt daran, dass die Attribute innerhalb der Controller definiert oder überschrieben werden können, daher sind die Attribute zu diesem Zeitpunkt unbekannt. und sollte offen für Flexibilität sein.
<section class="authentication-form">
<h2>Authentication Required</h2>
<!-- How-to: Generate the <form> tag and all it's attributes. -->
<?= $form->openTag() ?>
<? if ($ipAllowed): ?>
<p>Please choose an account to log in through.</p>
<fieldset>
<?= $form->get('email') ?>
</fieldset>
<? else: ?>
<p>Please log in using your e-mail address and password.</p>
<fieldset>
<?= $form->get('email') ?>
<?= $form->get('password') ?>
</fieldset>
<? endif ?>
<div class="action">
<!-- How-To: Generate the <input type="submit" name="" ... attributes ... />
<?= $form->get('login') ?>
</div>
<!-- How-To: Generate the form close tag.
<?= $form->closeTag() ?>
</section>
Hoffentlich ist dies klarer, als zuvor.
Wenn es eine Form zu machen, ohne zu wissen, war, wie es gebaut ist, könnten Sie einfach 'echo $ this-> form ($ form);'. Können Sie bitte klären, was die genaue Frage ist? – Ocramius
Ich habe die Frage aktualisiert, ich hoffe, meine Frage und Absichten sind klarer – ash