2012-04-20 3 views
0

У меня возникла проблема с помощником просмотра действий, когда я пытаюсь вызвать действие из сценария вида. Представление находится в/views/scripts/home, и оно принадлежит HomeController, и я хочу получить доступ к действию из BookController.Zend Framework: Как вызвать действие из представления?

У меня есть следующий код на мой взгляд:

foreach ($this->books as $book) { 

    if (!empty($book['asin'])) {  
     $bookObj = $this->action('get-book-by-asin', 'book', null, 
           array('asin' => $book['asin'])); 

В getBookByAsinAction() Я хочу, чтобы вернуть переменную $ данных. Как отправить его обратно в ответ на вызов помощника действий?

Я теперь могу сделать foreach через переменную $ books в моем контроллере вместо того, чтобы делать это по-моему, но мне просто интересно. Или, возможно, в будущем я буду использовать Помощник по просмотру действий, когда конкретное действие может создать более полезный повторно используемый контент или «виджетаризованный» контент.

Если я получаю много строк из запроса БД, было бы лучше сделать просто foreach вместо двух? Один foreach был бы в представлении, чтобы правильно отобразить результат, и я должен рассмотреть возможность сделать еще один в контроллере, чтобы проверить, есть ли у книги или нет ASIN, а затем вызвать, например, веб-службы. Это оптимальное решение?

Или лучше использовать Action View Helper описанным образом?

+7

Это против фундаментальных принципов шаблона MVC, лучше реорганизовать ваш код - метод действия не должен возвращать данных, представление не должно иметь доступа к контроллеру. 'getBookByAsin()' принадлежит в пространстве модели или использует помощник вида. – Niko

+0

бизнес-логика, подобная этому, должна произойти задолго до того, как вы достигнете своего мнения. – dqhendricks

+0

просто создайте помощник представления! –

ответ

0

Мое решение было закончить getBookByAsinAction() с помощью следующей строки: $this->_response->setBody(json_encode($data)); и на мой взгляд $book = (array) json_decode($bookObj);

Я не создал представление get-book-by-asin.phtml для этого действия, поэтому я добавил $this->_helper->viewRenderer->setNoRender();

+2

Я отредактировал этот ответ, чтобы переместить заданный вами вопрос в ваш исходный вопрос. Помните, что это сайт Q/A, а не форум. Ответы, не должны содержать вопросов. Я рад, что вы нашли ответ на свою проблему. – vascowhite

0

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

Пусть говорят создать помощник действия под название getBookByAsin:

в представлении кода:

$gbba= Zend_Controller_Action_HelperBroker::getStaticHelper('getBookByAsin'); 

$var = $gbba->direct("asin"); 
+2

Почему вы должны использовать помощник _action_ в представлении? Есть помощники _view_. –

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