ОБНОВЛЕНО! 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;
}
Что я делаю неправильно?
Я обновил свой код , не могли бы вы проверить, что случилось. Может быть, мне нужно настроить какую-либо конфигурацию или мой метод 't' написан неправильно? –
Вы все еще полагаетесь на метод конструктора. Вам необходимо вручную передать локатор сервиса в конструктор - он не будет вводиться автоматически. Пожалуйста, переместите весь этот код из '__construct' в метод' init' и скажите мне, если это решит вашу проблему. Это может также помочь, если вы указали код, в котором вы действительно используете этот класс ввода, в частности, как ваш экземпляр/получение. – guessimtoolate
Я только локализую проект, поэтому мне не разрешено изменять __constructor() на init. В любом случае я попытался сделать это: init (Connection $ p4, $ mode) - нет результата. Также у меня красный, что метод init не поддерживается в ZF2. Я думал, что я уже передаю локатор службы вручную в качестве параметра, или это не значит, что и имел в виду?Не могли бы вы показать, как передать экземпляр локатора службы в конструктор вручную? он требует некоторой конфигурации в module.config.php? Я отредактирую тему, чтобы показать использование этого валидатора. –