Компонент автономной формы Symfony 2.3/2.4

Я пытаюсь использовать компонент Symfony 2.3 Form Standalone для использования вне Symfony Framework.

Я попробовал следующий URL-адрес http://n.clavaud.free.fr/blog/index.php?article31/symfony2-standalone-form-component-tutorial

в приведенном выше коде URL хороший, но он основан на старых версиях фреймворка symfony.

У меня возникают проблемы при использовании Symfony 2.3

Я хочу, чтобы в URL-адресе был такой же код, как и выше, но он должен работать на Symfony 2.3 или любых других предложениях?

Я использую код ниже

<?php

use Symfony\Component\ClassLoader\UniversalClassLoader;

use Symfony\Component\Form\Forms;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilder;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\Form\FormFactory;
use Symfony\Component\Form\FormRenderer;
use Symfony\Component\Form\FormRendererInterface;
use Symfony\Component\Form\Extension\Core\CoreExtension;
use Symfony\Component\Form\Extension\Csrf\CsrfExtension;

use Symfony\Component\EventDispatcher\EventDispatcher;

use Symfony\Component\Templating\TemplateNameParser;
use Symfony\Component\Templating\TemplateNameParserInterface;
use Symfony\Component\Templating\TemplateReference;
use Symfony\Component\Templating\Loader\FilesystemLoader;
use Symfony\Component\Templating\PhpEngine;

use Symfony\Component\Translation\MessageSelector;
use Symfony\Component\Translation\Translator;
use Symfony\Component\Translation\TranslatorInterface;
use Symfony\Component\Validator\DefaultTranslator;

use Symfony\Bundle\FrameworkBundle\Templating\Helper\FormHelper;
use Symfony\Bundle\FrameworkBundle\Templating\Helper\TranslatorHelper;

// validation
use Symfony\Component\Form\Extension\Validator\ValidatorExtension;
use Symfony\Component\Validator\Validator;
use Symfony\Component\Validator\Mapping\ClassMetadata;
use Symfony\Component\Validator\Mapping\ClassMetadataFactory;
use Symfony\Component\Validator\Mapping\Loader\StaticMethodLoader;
use Symfony\Component\Validator\ConstraintValidatorFactory;
use Symfony\Component\Validator\Constraints as Constraints;
use Symfony\Component\Validator\Validation;

/**
 * Load and configure autoloader
 * @see http://symfony.com/doc/2.0/cookbook/tools/autoloader.html
 */
require_once 'Symfony/Component/ClassLoader/UniversalClassLoader.php';

$loader = new UniversalClassLoader();
$loader->register();
$loader->registerNamespace('Symfony', __DIR__.'/');

/**
 * Parameters
 */
$locale = null;

/**
 * Entity
 */
class Message
{

    public $sender;
    public $recipient;
    public $message;

    // validation
    public static function loadValidatorMetadata(ClassMetadata $metadata)
    {
        $metadata->addPropertyConstraint('sender', new Constraints\NotBlank());
        $metadata->addPropertyConstraint('sender', new Constraints\Email());
        $metadata->addPropertyConstraint('recipient', new Constraints\NotBlank());
        $metadata->addPropertyConstraint('recipient', new Constraints\Email());
        $metadata->addPropertyConstraint('message', new Constraints\NotBlank());
        $metadata->addPropertyConstraint('message', new Constraints\MinLength(10));
    }

}

/**
 * Form Class
 * @see http://symfony.com/doc/2.0/book/forms.html#creating-form-classes
 */
class MessageType extends AbstractType
{

    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
        ->add('sender', 'email')
        ->add('recipient', 'email')
        ->add('message', 'textarea');
    }

    public function getName()
    {
        return 'message';
    }

    public function getDefaultOptions(array $options)
    {
        return array(
            'data_class' => 'new\Message',
        );
    }

}

/**
 * Template name parser
 * @see Symfony\Bundle\FrameworkBundle\Tests\Templating\Helper\Fixtures\StubTemplateNameParser
 *
 * Needed to load the templates used for rendering form items.
 */
class StubTemplateNameParser implements TemplateNameParserInterface
{
    private $root;

    private $rootTheme;

    public function __construct($root, $rootTheme)
    {
        $this->root = $root;
        $this->rootTheme = $rootTheme;
    }

    public function parse($name)
    {

        list($bundle, $controller, $template) = explode(':', $name);

        if ($template[0] == '_') {
            $path = $this->rootTheme.'/Custom/'.$template;
        } elseif ($bundle === 'TestBundle') {
            $path = $this->rootTheme.'/'.$controller.'/'.$template;
        } else {
            $path = $this->root.'/'.$controller.'/'.$template;
        }

        return new TemplateReference($path, 'php');

    }
}

/**
 * Create an entity
 */
$message = new Message();
$message->sender = '[email protected]';

/**
 * Build a form from a form factory
 */
/* $form_factory = new FormFactory(array(
                                     new CoreExtension(),
                                     // validation
                                     new ValidatorExtension(
                                         new Validator(
                                             new ClassMetadataFactory(
                                                 new StaticMethodLoader()
                                             ),
                                             new ConstraintValidatorFactory(),
                                             new DefaultTranslator()
                                         )
                                     )
                                ));*/
$validator = Validation::createValidator();
$form_factory = Forms::createFormFactoryBuilder()
               ->addExtension(new CoreExtension())
               ->addExtension(new ValidatorExtension($validator))
               ->getFormFactory();
$form = $form_factory->create(new MessageType(), $message);

/**
 * Create a PHP template engine
 */
$root = realpath(__DIR__ . '/Symfony/Bundle/FrameworkBundle/Resources/views');
$rootTheme = realpath(__DIR__ . '/Symfony/Bundle/FrameworkBundle/Resources');
$templateNameParser = new StubTemplateNameParser($root, $rootTheme);
$loader = new FilesystemLoader(array());
$engine = new PhpEngine($templateNameParser, $loader);

/**
 * This helper will help rendering form items
 */
/*$form_helper = new FormHelper($engine, array(
                                            'FrameworkBundle:Form',
                                       ));*/
$form_helper = new FormHelper(new FormRendererInterface());

/**
 * Bind it to the engine
 */
$engine->setHelpers(array(
                         $form_helper,
                         new TranslatorHelper(new Translator($locale, new MessageSelector())),
                    ));

/**
 * Bind submitted data
 */
$submitted = false;
$valid = null;
if (isset($_POST[$form->getName()])) {
    $form->bind($_POST[$form->getName()]);
    $submitted = true;
    // validation
    if ($valid = $form->isValid()) {
        // you may want to redirect at this state
        $data = $form->getData();
        echo 'validated success';
        var_dump($data);
    }
}

/**
 * Create the form view
 */
$form_view = $form->createView();

/**
 * Now, it's time to render HTML!
 */
header('Content-type: text/html; charset=utf-8');
?>
<!DOCTYPE html>
<html>
<body>
<form action="" method="post"
    <?php print $form_helper->enctype($form_view) ?>
      novalidate="novalidate">
    <?php print $form_helper->widget($form_view) ?></div>
    <input type="submit" />
</form>

<?php if ($submitted && $valid) : ?>
    <p><strong>Submitted form is valid.</strong></p>
<?php endif; ?>

<p><em>Message object:</em></p>
<pre><?php print print_r($message, true); ?></pre>
</body>
</html>

я получаю эту ошибку

Неустранимая ошибка: невозможно создать интерфейс Symfony\Component\Form\FormRendererInterface в /var/www/new/test.php в строке 193.


person Ganesh    schedule 04.09.2013    source источник
comment
В чем проблема? Любое сообщение об ошибке?   -  person Touki    schedule 04.09.2013


Ответы (1)


Вы пытаетесь создать интерфейс:

$form_helper = new FormHelper(new FormRendererInterface());

Интерфейсы не являются классами, и вы не можете создавать их экземпляры (см. http://php.net/interface и прочтите что-нибудь об ООП). ).

Посмотрите пример автономного использования компонента формы: https://github.com/bschussek/standalone-forms< /а>

person Jakub Zalas    schedule 04.09.2013
comment
Привет, Якуб Залас, спасибо за ответ, но он не работает, и он следует за Symfony 2.1, выдавая ошибку Неустранимая ошибка: класс Symfony\Component\Form\Extension\Csrf\CsrfProvider\DefaultCsrfProvider' не найден в /Library/WebServer/Documents /eeee/src/setup.php в строке 26 - person Ganesh; 04.09.2013
comment
Привет, у кого-нибудь есть обновления по этому поводу? Я пробовал по-разному, теперь я получаю сообщение об ошибке Неперехваченное исключение «Symfony\Component\Form\Exception\LogicException» с сообщением «Невозможно отобразить форму, поскольку не существует ни одного из следующих блоков: _message_enctype, message_enctype, form_enctype - person Ganesh; 16.09.2013
comment
Я только что попробовал bschussek/standaolne-forms, и он работает (просто клонируйте репозиторий и запустите установку композитора - установите, а не обновите). Он основан на 2.1, и вам придется выяснить, как обновить его до последней версии. - person Jakub Zalas; 16.09.2013
comment
На самом деле есть одна маленькая вещь, которую вам нужно исправить для версии 2.3 — в index.php замените MinLength на Length. Имя этого ограничения изменилось. - person Jakub Zalas; 16.09.2013
comment
Привет, Якуб Залас, спасибо за ответ. Я хочу использовать PHP в качестве механизма шаблонов, как я могу это сделать. Еще одно и мое основное требование — создание настраиваемых типов полей. - person Ganesh; 18.09.2013
comment
Нет проблем, репозиторий, который я вам порекомендовал, имеет ветку с PHP-шаблонами. Вы пробовали это? Пожалуйста, задавайте конкретные вопросы о проблемах, с которыми вы сталкиваетесь. - person Jakub Zalas; 18.09.2013
comment
Это совершенно новый вопрос. Я думаю, что мой ответ удовлетворителен для вашего первоначального ответа, нет? Регистрация вашего пользовательского типа потребует некоторой работы с вашей стороны (если вы также не готовы использовать компонент DI). Посмотрите, как это организовано в FrameworkBundle. Кроме того, проверьте PreloadedExtension. - person Jakub Zalas; 18.09.2013
comment
Привет, Якуб Залас, есть ли какие-либо новости для меня о создании настраиваемых типов полей форм с использованием автономных форм? - person Ganesh; 23.09.2013
comment
Привет, Ганеш, есть ли какая-нибудь информация о том, что ты на самом деле пытался решить ВАШУ проблему? - person Jakub Zalas; 23.09.2013
comment
Да, Якуб Залас, отображающий встроенные типы полей в шаблоне php, работает, но мне нужно настраиваемое поле, как реализовать их с помощью автономного компонента формы - person Ganesh; 25.09.2013
comment
И что вы пытались сделать для этого? Кроме того, похоже, мой ответ решил проблему из вашего вопроса. Вам не кажется, что вы должны пометить это как решенное? - person Jakub Zalas; 25.09.2013
comment
Тем не менее моя проблема существует, я хочу использовать автономную форму в версии Symfony 2.3 - person Ganesh; 26.09.2013