2014-11-17 2 views
0

Новое для ZF2. Довольно уверен, что это очень простой вопрос, поскольку я могу легко сделать это в процедурном стиле, но найти документацию сложно. Любые ссылки на документацию с радостью принимаются.ZF2 выпадающее значение возврата, а не id in view

Я сохраняю выпадающее значение формы как целое число, в db. Когда я вернусь результаты на мой взгляд она возвращается целое число, используя:

echo $this->escapeHtml($user->system); 

Как сопоставить этот ответ так, чтобы я показал фактическое значение выпадающего списка, который пользователь выбрал в форме?

+0

Я предполагаю, что вы не используете ORM ('$ user-> system' - это целочисленный/внешний ключ, а не объект' System')? – AlexP

+0

Нет, я не использую ORM, насколько мне известно. – anewvision

ответ

2

Один из вариантов будет через помощник вида, хотя есть и другие способы.

Создайте интерфейс для любого объекта, который «осведомлен» о системе, скажем SystemAwareInterface. Убедитесь, что ваш пользовательский класс (или любой другой класс) реализует этот интерфейс и возвращает идентификатор системы.

interface SystemAwareInterface { 
    public function getSystemId(); 
} 

Создать помощник вида, я предполагаю, в пространство имен верхнего уровня System и что у вас есть какие-то услуги, которые можно загрузить запись из базы данных это тождество (позволяет называть его SystemService с методом loadById()).

namespace System\View\Helper; 

use System\Entity\SystemAwareInterface; 
use System\Service\SystemService; 
use Zend\View\Helper\AbstractHelper; 

class System extends AbstractHelper 
{ 
    // Service used to 'load' a system 
    protected $systemService; 

    public function __construct(SystemService $systemService) 
    { 
     $this->systemService = $systemService; 
    } 

    public function __invoke(SystemAwareInterface $entity = null) 
    { 
     if (0 === func_num_args()) { 
      return $this; 
     } 
     return $this->render($entity); 
    } 

    public function render(SystemAwareInterface $entity) 
    { 
     return $this->systemService->loadById($entity->getSystemId()); 
    } 

    public function getName(SystemAwareInterface $entity) 
    { 
     $system = $this->render($entity); 

     return $system->getName(); 
    } 
} 

Затем зарегистрировать услугу с ViewHelperPluginManager, добавив фабрику getViewHelperConfig.

public function getViewHelperConfig() 
{ 
    return array(
     'factories' => array(
      'System' => function($vpm) { 
       $sm = $vpm->getServiceLocator(); 
       $service = $sm->get('System\Service\SystemService'); 

       return new View\Helper\Sysytem($service); 
      } 
     ), 
    ); 
} 

Теперь в скрипте просмотра вы можете эхом отослать имя системы с помощью помощника.

// echo out the name of the system 
echo $this->system()->getName($user); 

Вы также можете использовать другие помощники вида в вашем новом помощнике; поэтому вы можете получить помощника escapeHtml и избежать содержимого HTML в методе getName() (я оставлю это вам).

+0

Большое спасибо за ваш ответ, действительно ясно изложил. Я должен был быть более ясным с самого начала, есть модуль под названием 'user', в котором« система »- это просто поле в базе данных, как« имя »или« возраст ». В настоящее время я не использую папки, называемые '/ entity /'. Структура папок модуля 'user' приведена в структуре папок по умолчанию, сгенерированной zftool. Сможете ли вы отредактировать свой ответ, чтобы я мог видеть его в контексте структуры моего модуля пользователя? Извините, новичок в этом. Благодаря! – anewvision

+0

@ anewvision 'entity' - это просто папка/пространство имен без какого-либо конкретного смысла в ZF2 (' model' имеет тенденцию быть другим популярным). Таким образом, вы можете иметь интерфейс где-нибудь еще, что вам нравится, это просто организовать код в ваших модулях, чтобы, если бы я начал работать над вашим проектом, у меня было бы лучшее представление о том, где вы используете классы домена. То же самое касается «Сервис» и т. Д. Поэтому просто создайте его или дайте ему другое имя, если хотите. Единственное обязательное условие: у вас есть настройка автоматической загрузки, я считаю, что ZFTool позаботится об этом для вас в любом случае. – AlexP

+0

спасибо, это имеет смысл, я новичок в ZF2, так что все еще учась. Но я могу убрать из вашего комментария, что структура менее актуальна, чем я думал, и что пространство имен является ключевым. Примите ваш ответ. – anewvision

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