Как расширить представление Zend для реализации конкретной функции?
-
03-07-2019 - |
Вопрос
Я хочу, чтобы нашим дизайнерам было как можно проще локализовать строки в представлениях, а это значит, что я хочу сделать следующее:
...
<p><?php echo $this->_("Hello, world!"); ?></p>
...
Обозначение подчеркивания здесь необходимо, чтобы позволить Poedit автоматически извлекать все строки для локализации.Реализация тривиальна:
public function _($string)
{
return Zend_Registry::get('Zend_Translate')->_($string);
}
На данный момент я вставил это прямо в Zend_View_Abstract
, что плохо (я не хочу делать это, изменяя какую-либо библиотеку Zend).В идеале я бы расширил Zend_View_Abstract
чтобы позволить мне реализовать другие конкретные функции, которые нам нужны, но я не знаю, как это настроить.Альтернативой может быть реализация View Helper, но единственный известный мне способ сделать это делает код в представлении более многословным.Любые указатели (нет, не такие) будем очень признательны.Спасибо!
Решение
Очевидно, игнорируйте мои пути ради своих собственных...
- Продлевать
Zend_View
- Поместите свой метод в этот расширенный класс
- Создайте экземпляр класса (например, в вашем загрузочном файле)
- Назначьте его ViewRenderer
- Передайте этот зрительский рендерер
Zend_Controller_Action_HelperBroker's
метод addHelper - Используйте это на свой взгляд
В /library/MegaHAL/Zend/ создайте View.php:
class MegaHAL_Zend_View extends Zend_View
{
public function _($string)
{
return Zend_Registry::get('translate')->_($string);
}
}
В вашем бутстрапе:
require_once APPLICATION_PATH.'../library/MegaHAL/Zend/View.php';
$view = new MegaHAL_Zend_View();
$viewRenderer = new Zend_Controller_Action_Helper_ViewRenderer();
$viewRenderer->setView($view);
Zend_Controller_Action_HelperBroker::addHelper($viewRenderer);
На ваш взгляд:
<p><?php echo $this->_("Hello");?></p>
Я верю, что это сделает то, что ты хочешь, да?
Другие советы
Я думаю, что вы ищете способ создать помощники по пользовательскому представлению.
Пример:
class My_View_Helper extends Zend_View_Helper_Abstract
{
public function translate($string)
{
//...
}
}
...
$view->setHelperPath('/path/to/helpers', 'My_View_Helper');
...
Затем в ваших представлениях вы можете использовать его:
echo $this->translate("Hello, World!");
Хотя я думаю, что использование помощников представлений было бы правильным способом сделать это в Zend-Framework, вы можете расширить Zend_View
и реализовать все дополнительные методы, которые вы хотели бы иметь - таким образом вы не потеряете возможности Zend_View
.
class My_View extends Zend_View
{
public function _($string)
{
return Zend_Registry::get('Zend_Translate')->_($string);
}
}
Затем вам нужно только убедиться, что ваш новый класс представления создан и зарегистрирован как представление по умолчанию в контроллер (установка Zend_Controller_Action::$view
переменную экземпляра в экземпляр вашего класса) и в вашем Zend_Layout
(при использовании макетов;передача вашего представления в качестве параметра конфигурации с помощью ключа view
), когда не используется ViewRenderer
или в ViewRenderer
при использовании ViewRenderer
с использованием Zend_Controller_Action_Helper_ViewRenderer::setView()
.
При правильной настройке Poedit может автоматически извлекать строки из функций, отличных от _().