已更新!
ZF2,l10n查看助手。我无法理解如何在类中使用我的视图助手。
我想使用它:$this->t('STRING TO TRANSLATE');
吼叫的例子
NB!我只是本地化项目,我不允许改变代码结构或类似的东西。我也是ZF2中的绝对新手。
我的班级 -
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);
}
}
Controller中的用法:
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 :(得分:0)
您在类构造函数中调用tr
方法。 tr
方法调用$this->getServiceLocator()
。 $this->getServiceLocator()
不会返回服务定位器实例,因为它只会在创建实现ServiceLocatorAwareInterface
的对象后由服务管理器注入。
因此,您必须将服务定位器实例传递给构造函数,或者不要在__construct
方法中依赖它。可能最简单的方法是将代码从构造函数移动到init
方法。只要您通过Init
获得输入过滤器,就会自动调用InputFilterManager
。
此外,我认为您不需要translator
视图助手。您应该可以从服务管理器获取它:$serviceManager->get('translator')
答案 1 :(得分: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,您需要确保使用InputFilterPluginManager注册InputFilter并使用InputFilterPluginManager检索它而不是直接实例化