как использовать форвард с учетом Zend 2

Я хочу написать плагин в ZF2,

Примером плагина является кнопка «Мне нравится», которая отображается в каждом сообщении. Это должно например напечатать в PostsAction,

Я знаю, что могу использовать:

$like = $this->forward()->dispatch('Application\Controller\Index', array(
'action' => 'like',
'postId'   => $Id
));

$like Переменная возвращает кнопку, на которую пользователи могут нажать.
Но я хочу повторить это в представлении. В форварде вид не определен.

Также, если я использую

return $this->getView()->render('application/index/like', array('postId' => $Id));

У меня нет доступа к postId в likeController, потому что это установлено в представлении. Как я могу реализовать этот тип плагинов, которые нуждаются в динамических переменных?

1

Решение

Похоже, вам нужны только частичные. Партиал в ZF2 — это только вид, который вы печатаете в другом виде и задаете ему некоторые параметры.

Таким образом, вы можете определить вид:

// application/partials/button.phtml
<button data-postId="<?php echo $this->postId ?>">Like It!</button>

И использовать его в другом представлении:

echo $this->partial('application/partials/button.phtml', array(
'postId' => $thePostId
));

Официальная документация
Хороший ответ на SO, чтобы реализовать с template_map

1

Другие решения

Решение с использованием помощника вида

Я думаю, что вы ищете, это пользовательский помощник вида. Вы можете прочитать об этом в официальной документации ZF2.

Вы должны написать свой помощник вида кнопки, зарегистрировать его, а затем вы можете использовать его в своем представлении.

Вспомогательный класс:

namespace Application\View\Helper;

use Zend\View\Helper\AbstractHelper;

class LikeButtonHelper extends AbstractHelper
{
public function __invoke($post)
{
//return here your button logic, you will have access to $post

}
}

Зарегистрируйте своего помощника в файле конфигурации:

'view_helpers' => array(
'invokables' => array(
'likeButtonHelper' => 'Application\View\Helper\LikeButtonHelper',
),
)

И, наконец, в представлении вы можете использовать его так:

foreach($posts as $post){
echo( ... your code to show the post ...);
echo $this->likeButtonHelper($post);
}

ОБНОВЛЕНИЕ — Решение, использующее плагин forward

Я думаю, я понимаю, что вы имеете в виду сейчас. Я также думаю, что пример, о котором вы говорите, это то, что в документации к плагину ZF2 упоминается как «виджетизированный» контент.

Я думаю, что вы делаете это правильно. Вы можете прикрепить возвращаемое значение $like как ребенок, чтобы посмотреть на оригинальный контроллер (откуда вы перенаправлены в первую очередь).

Так в вашем WidgetController:

use Zend\View\Model\ViewModel;

class WidgetController extends AbstractActionController
{
public function likeAction()
{
$post= $this->params()->fromRoute('post');
$viewModel = new ViewModel(array('post' => $post));
$viewModel->setTemplate('view/widgets/like');

return $viewModel;
}
}

Так в вашем PostController:

use Zend\View\Model\ViewModel;

class PostController extends AbstractActionController
{
public function postsAction()
{
$likeWidget = $this->forward()->dispatch('Application\Controller\WidgetController', array(
'action' => 'like',
'post'   => $post
));

$viewModel = new ViewModel();
$viewModel->setTemplate('view/posts/post');
$viewModel = new ViewModel(array(
//...add your other view variables...
));

// Add the result from the forward plugin as child to the view model
if ($likeWidget instanceof ViewModel)
{
$viewModel->addChild($likeWidget , 'likeWidget');
}

return $view;
}
}

И, наконец, в свой пост просмотра шаблона добавьте:

echo($this->likeWidget);

Вот где в конечном итоге будет виджет.

Проблема остается в том, что вы не можете сделать это внутри цикла foreach (цикла для печати ваших сообщений) в представлении. Вот почему я предложил использовать помощник вида, а @copynpaste предлагает использовать частичное, это больше подходит для добавления дополнительной логики внутри вид.


Замечания:
Лично мне не нравится это прямое решение для чего-то такого простого, как кнопка «Мне нравится». В контроллере почти нет логики, и это кажется слишком сложным. Это больше подходит для повторного использования всего представления / страницы, которое будет отображаться как само по себе, так и в другом представлении.
Частичные помощники или помощники просмотра кажутся гораздо более подходящими для того, что вы хотите сделать, и это очень правильные решения ZF2.

1

Я нашел его, разработанный Мухаммедом Ростами, Особая благодарность ему:
Плагин в ZF2

0
По вопросам рекламы [email protected]