2014-09-03 2 views
0

Как я могу устранить эту ошибку? Я попытался найти решение в google и некоторых документах Zend Framework2, но мне не повезло, любая помощь, которую я бы оценил. Я просто хочу отобразить форму без использования базы данных. Пожалуйста, помогите мнеZend Framework2 Неустранимая ошибка: вызов функции-члена setAttribute() для не-объекта в C: dir module Application view layout layout.phtml в строке 39

вот мой код scheduleRequestForm.php

namespace Application\Form; 

use Zend\Captcha; 
use Zend\Form\Element; 
use Zend\Form\Form; 

class scheduleRequestForm extends Form 
{ 
    public function __construct() /*$name = null*/ 
    { 
     parent::__construct('application\form'); 

     $this->setAttribute('method', 'post'); 

     $this->add(array( 
      'name' => 'firstname', 
      'type' => 'Zend\Form\Element\Text', 
      'attributes' => array( 
       'placeholder' => 'Type something...', 
       'required' => 'required', 
      ), 
      'options' => array( 
       'label' => 'First name', 
      ), 
     )); 

     $this->add(array( 
      'name' => 'lastname', 
      'type' => 'Zend\Form\Element\Text', 
      'attributes' => array( 
       'placeholder' => 'Type something...', 
       'required' => 'required', 
      ), 
      'options' => array( 
       'label' => 'Last Name', 
      ), 
     )); 

     $this->add(array( 
      'name' => 'csrf', 
      'type' => 'Zend\Form\Element\Csrf', 
     ));   
    } 
} 

вот Validator.php

<?php 
namespace Application\Form; 

use Zend\InputFilter\Factory as InputFactory; 
use Zend\InputFilter\InputFilter; 
use Zend\InputFilter\InputFilterAwareInterface; 
use Zend\InputFilter\InputFilterInterface; 

class scheduleRequestFormValidator implements InputFilterAwareInterface 
{ 
    protected $inputFilter; 

    public function setInputFilter(InputFilterInterface $inputFilter) 
    { 
     throw new \Exception("Not used"); 
    } 

    public function getInputFilter() 
    { 
     if (!$this->inputFilter) 
     { 
      $inputFilter = new InputFilter(); 
      $factory = new InputFactory(); 


     $inputFilter->add($factory->createInput([ 
      'name' => 'firstname', 
      'required' => true, 
      'filters' => array( 
       array('name' => 'StripTags'), 
       array('name' => 'StringTrim'), 
      ), 
      'validators' => array( 
      ), 
     ])); 

     $inputFilter->add($factory->createInput([ 
      'name' => 'lastname', 
      'required' => true, 
      'filters' => array( 
       array('name' => 'StripTags'), 
       array('name' => 'StringTrim'), 
      ), 
      'validators' => array( 
      ), 
     ])); 

      $this->inputFilter = $inputFilter; 
     } 

     return $this->inputFilter; 
    } 
} 

Вот мой IndexController.php

namespace Application\Controller; 

use Zend\Mvc\Controller\AbstractActionController; 
use Zend\View\Model\ViewModel; 
use Application\Form\ScheduleRequestForm; 
use Application\Form\Form\Validator; 
use Application\Form\Model\linel; 

class IndexController extends AbstractActionController 
{ 

    public function indexAction() 
    { 
     $form = new scheduleRequestForm(); 
     $request = $this->getRequest(); 

     if($request->isPost()) 
     { 
      $user = new linel(); 

      $formValidator = new scheduleRequestFormValidator(); 
      { 
       $form->setInputFilter($formValidator->getInputFilter()); 
       $form->setData($request->getPost()); 
      } 

      if($form->isValid()){ 
      { 
       $user->exchangeArray($form->getData()); 
      } 
     } 

     return ['form' => $form]; 
    } 
} 
} 

Вот мой макет скрипт вида .phtml

<?php 
$form = $this->form; 
$form->setAttribute('action', $this->url('home', array('action'=>'add'))); 

echo $this->formLabel($form->get('firstname')); 
echo $this->formElement($form->get('firstname')); 
echo $this->formElementErrors($form->get('firstname')); 
echo $this->formLabel($form->get('lastname')); 
echo $this->formElement($form->get('lastname')); 
echo $this->formElementErrors($form->get('lastname')); 
echo $this->form()->closeTag(); 
?> 

ответ

1

контроллер действия предназначены для возврата по меньшей мере ViewModel

public function indexAction() 
{ 
    // [...] your other stuff 

    $viewModel = new \Zend\View\Model\ViewModel(); 
    $viewModel->setVariable('form', $form); 
    $viewModel->setTemplate('/path/to/viewmodel/template/file.phtml'); 

    return $viewModel; 
} 

также заметить, что ваша $this->form переменная не присутствует в макете -> он присутствует в файле шаблона, где ваш ViewModel является точка. этот шаблон представления затем закачивается в макет с $this->content

файл шаблона

<?php 
    $form = $this->form; 
    $form->setAttribute('action', $this->url('home', array('action'=>'add'))); 

    echo $this->formLabel($form->get('firstname')); 
    echo $this->formElement($form->get('firstname')); 
    echo $this->formElementErrors($form->get('firstname')); 
    echo $this->formLabel($form->get('lastname')); 
    echo $this->formElement($form->get('lastname')); 
    echo $this->formElementErrors($form->get('lastname')); 
    echo $this->form()->closeTag(); 
?> 

расположение файла

<html> 
    <head> 
     <title>Test</title> 
    </head> 
    <body> 
     <div> 
      <?php echo $this->content; ?> 
     </div> 
    </body> 
</html> 
+0

спасибо, я получаю сейчас :) я положил всю форму в шаблон index.phtml и content; ?> показать его –