Я хочу написать плагин в 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
, потому что это установлено в представлении. Как я могу реализовать этот тип плагинов, которые нуждаются в динамических переменных?
Похоже, вам нужны только частичные. Партиал в 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
Я думаю, что вы ищете, это пользовательский помощник вида. Вы можете прочитать об этом в официальной документации 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);
}
Я думаю, я понимаю, что вы имеете в виду сейчас. Я также думаю, что пример, о котором вы говорите, это то, что в документации к плагину 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.
Я нашел его, разработанный Мухаммедом Ростами, Особая благодарность ему:
Плагин в ZF2