Как расширить Zend View для реализации конкретной функции? - PullRequest
6 голосов
/ 29 апреля 2009

Я хочу, чтобы наши дизайнеры как можно проще локализовали строки в представлениях, а это значит, что я хочу сделать это:

...
<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, но единственный способ, которым я знаю, как это сделать, делает код в представлении более подробным. Любые указатели (нет, не такие) будут высоко оценены. Спасибо!

Ответы [ 4 ]

14 голосов
/ 29 апреля 2009

Очевидно, игнорируй мои пути для своего собственного ...

  1. Расширить Zend_View
  2. Поместите ваш метод в этот расширенный класс
  3. Создание экземпляра класса (например, в вашей начальной загрузке)
  4. Назначить его ViewRenderer
  5. Передать этот viewrenderer в Zend_Controller_Action_HelperBroker's метод addHelper
  6. Используйте это по вашему мнению

В / library / MegaHAL / Zend / create 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>

Я верю, что будет делать то, что вы хотите, да?

2 голосов
/ 29 апреля 2009

Я думаю, что вы ищете способ создания пользовательских помощников вида .

Пример:

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!");
1 голос
/ 29 апреля 2009

Хотя я думаю, что использование помощников вида было бы правильным "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().

0 голосов
/ 29 апреля 2009

При правильной настройке Poedit может автоматически извлекать строки из функций, отличных от _ ().

...