маршрутизатор
new Router(false);
Посмотреть
module/views/index/index.volt
маршрут
$router->add("/", array(
'module' => 'module',
'controller' => 'index',
'action' => 'index',
));
Как бы вы вызвали действие с именем «otherAction», установленное в контроллере индекса из index.volt, используя кнопку или привязку, не добавляя новый маршрут?
<?php
namespace Multiple\Module\Controllers;
class IndexController extends \Phalcon\Mvc\Controller
{
public function indexAction()
{
}
public function otherAction()
{
}
}
Короче говоря, я хотел бы отправить непосредственно из самого представления.
Я думаю, что ваш комментатор правильный, вы не можете сделать это в представлении phalcon. Я видел расширения лезвий Laravel, которые выполняют именно то, что вы просите, используя синтаксис {{controller @ method}}, но я не знаю ничего подобного для phalcon.
Лучшее, что я могу предложить, это:
<?php
namespace Multiple\Module\Controllers;
class IndexController extends \Phalcon\Mvc\Controller
{
public function indexAction()
{
$other_data = $this->otherAction();
// ... extract the required data from $other_data
// ... pass the required data to the view
}
public function otherAction()
{
}
}
Первоначально я предполагал, что вы не будете вызывать эту функцию из представления, однако это возможно, передав контроллер в представление как переменную представления. Я не уверен, что это лучшая идея, но вот как вы это сделаете:
public function indexAction()
{
$this->view->controller = $this;
}
Внутри представления вы можете сделать что-то вроде этого:
<?php $result = $controller->otherAction(); ?>
… тогда вам нужно будет интерпретировать значение $ result и действовать соответственно (в зависимости от того, как вы кодируете otherAction () и что он возвращает).
Еще раз, я не думаю, что это хорошая идея. Кодирование PHP внутри шаблонов немного нарушает разделение представления / контроллера, было бы лучше, чтобы код собирал все переменные в вашем контроллере и передавал их представлению, а не ожидал, что представление будет вызываться обратно в контроллер для извлечения вещей.
Если вы хотите скрыть некоторые действия и запустить их в зависимости от параметров, собранных / отправленных по запросу, вы не обязаны false
Router.
В одном из моих контроллеров у меня есть производственное решение, подобное этому:
инициализация
public function initialize()
{
// if someone tries to get to subaction of controller, prevent it.
if ($this->dispatcher->getActionName() != 'index') {
$this->dispatcher->setActionName('index');
}
// exploding request path - should you implement Path class.
if ($path = Path::get()) {
$this->hash = $path[1]; // or 2 or whatever you need
} else {
$this->dispatcher->forward(['controller' => 'notfound404']);
}
}
Таким образом, во всем контроллере у меня есть hash
свойство, имеющее параметр я могу case
над.
Пример indexAction
public function indexAction()
{
if (!$this->request->isPost()) {
// not a POST request, using mainAction to generate view.
$this->dispatcher->forward(['action' => 'main']);
} else {
switch ($this->hash) {
case 'stepOne':
case 'stepTwo':
case 'summary':
$this->dispatcher->forward(['action' => $this->hash]);
break;
default:
$this->dispatcher->forward(['action' => 'error']);
break;
}
}
}
Вероятно, не будет работать с выключенным маршрутизатором в любом случае.
Ваш вопрос недостаточно подробен.
ты пробовал :
<a href="index/other">Click to call otherAction</a>
в вашем представлении index.volt?