0

ОБНОВЛЕНО! ZF2, l10n вид помощника. Я не могу понять, как использовать помощник представления внутри класса. Я хочу использовать его как: $this->t('STRING TO TRANSLATE'); пример ниже NB! Я только локализую проект, мне не разрешено изменять структуру кода или что-то подобное. Также я абсолютный newb в ZF2. мой класс -ZF2 использовать вид помощника в классе Validator

class Project extends InputFilter{ 

, как я понял, я должен реализовать интерфейс ServiceLocatorAwareInterface, попытался это:

use Zend\ServiceManager\ServiceLocatorInterface as ServiceLocator; 

class Project extends InputFilter implements ServiceLocator 
{ 
    protected $services; 

    public function __construct(Connection $p4, $mode, ServiceLocator $services) 
    { 
     $this->services = $services; 

     //some code 
     $this->add(...); 

     $this->add(
      array(
       'name'   => 'name', 
       'filters'  => array('trim'), 
       'validators' => array(
        array(
         'name'  => 'NotEmpty', 
         'options' => array(
          'message' => "Name is required and can't be empty." 
         ) 
        ), 
        array(
         'name'  => '\Application\Validator\Callback', 
         'options' => array(
          'callback' => function ($value) use ($p4, $toId, $mode, $reserved) { 
           $id = $toId($value); 
           if (!$id) { 
            return $this->t('STRING TO TRANSLATE'); 
           } 

// more code here 
           return true; 
          } 
         ) 
        ) 
       ) 
      ) 
     );   

     //some code 
     $this->add(...); 

    }  


    public function setServiceLocator(ServiceLocatorInterface $serviceLocator) { 
     $this->serviceLocator = $serviceLocator; 
    } 

    public function getServiceLocator() { 
     return $this->serviceLocator; 
    } 
    //how to get this method work ??? 
    public function t($msg) { 
     $translate = $this->services->get('ViewHelperManager')->get('t'); 
     return $translate($msg); 
    } 


} 

Использование в контроллере:

use Projects\Filter\Project as ProjectFilter; 

...

protected function doAddEdit($mode, $project = null) 
{ 
    $p4Admin = $this->getServiceLocator()->get('p4_admin'); 
    $request = $this->getRequest(); 

    // process add request. 
    if ($request->isPost()) { 
     // pull out the data 
     $data = $request->getPost(); 

     // configure our filter with the p4 connection and add/edit mode 
     $filter = new ProjectFilter($p4Admin, $mode); // 
     $filter->setData($data); 

     // if the data is valid, setup the project and save it 
     $isValid = $filter->isValid(); 
     if ($isValid) { 
      $values = $filter->getValues(); 
      $project = new Project($p4Admin); 
      $project->set($values) 
       ->save(); 
     } 

     return new JsonModel(
      array(
       'isValid' => $isValid, 
       'messages' => $filter->getMessages(), // THESE array of messages i want to localize 
       'redirect' => '/projects/' . $filter->getValue('id') 
      ) 
     ); 
    } 

    // prepare view for form. 
    $view = new ViewModel; 
    $view->setVariables(
     array(
      'mode'  => $mode, 
      'project' => $project ?: new Project 
     ) 
    ); 

    return $view; 
} 

Что я делаю неправильно?

ответ

0

Вы вызываете метод tr внутри конструктора класса. tr способ звонки $this->getServiceLocator(). $this->getServiceLocator() не будет возвращать экземпляр локатора службы, поскольку он будет введен только администратором службы после создания объекта, который реализует ServiceLocatorAwareInterface.

Таким образом, вам нужно передать экземпляр локатора службы в конструктор или не зависеть от него в методе __construct. Вероятно, самый простой способ - переместить код из конструктора в метод init. Init предполагается получить автоматически, если вы получите свой входной фильтр через InputFilterManager.

Также я не думаю, что вам нужен вспомогательный помощник translator. Вы должны иметь возможность получить это от менеджера службы так: $serviceManager->get('translator')

+0

Я обновил свой код , не могли бы вы проверить, что случилось. Может быть, мне нужно настроить какую-либо конфигурацию или мой метод 't' написан неправильно? –

+0

Вы все еще полагаетесь на метод конструктора. Вам необходимо вручную передать локатор сервиса в конструктор - он не будет вводиться автоматически. Пожалуйста, переместите весь этот код из '__construct' в метод' init' и скажите мне, если это решит вашу проблему. Это может также помочь, если вы указали код, в котором вы действительно используете этот класс ввода, в частности, как ваш экземпляр/получение. – guessimtoolate

+0

Я только локализую проект, поэтому мне не разрешено изменять __constructor() на init. В любом случае я попытался сделать это: init (Connection $ p4, $ mode) - нет результата. Также у меня красный, что метод init не поддерживается в ZF2. Я думал, что я уже передаю локатор службы вручную в качестве параметра, или это не значит, что и имел в виду?Не могли бы вы показать, как передать экземпляр локатора службы в конструктор вручную? он требует некоторой конфигурации в module.config.php? Я отредактирую тему, чтобы показать использование этого валидатора. –

0

Нет необходимости делать это вообще, валидационное сообщение будет транслироваться валидатором в любом случае. Но ваш конфиг немного неправильно, я думаю, что

$this->add(
     array(
      'name'   => 'name', 
      'filters'  => array('trim'),) 
      'validators' => array(
       array(
        'name'  => 'NotEmpty', 
        'options' => array(
         'messages' => array(
            \Zend\Validator\NotEmpty::IS_EMPTY => 'YOUR_TRANSLATION_STRING_IS_EMPTY', 
            \Zend\Validator\NotEmpty::INVALID => 'YOUR_TRANSLATION_STRING_INVALID', 
         ) 
        ) 
      ) 
    ), 

Есть Распознать https://zf2-docs.readthedocs.org/en/latest/modules/zend.validator.html#translating-messages

Вам нужно будет убедиться, что вы управляете своими зависимостями правильно для этого работать так действительно зависит, как вы используете входной фильтр ,

Если вы не непосредственно при добавлении к форме или с помощью InputFilterAwareInterface на вашу модели вы должны убедиться, что ваш InputFilter зарегистрирован InputFilterPluginManager и вы получите его с помощью InputFilterPluginManager, а не инстанцирование непосредственно

Смежные вопросы