Как вы называете действие, не используя маршрут, из вида?

маршрутизатор

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()
{

}
}

Короче говоря, я хотел бы отправить непосредственно из самого представления.

0

Решение

Я думаю, что ваш комментатор правильный, вы не можете сделать это в представлении 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 внутри шаблонов немного нарушает разделение представления / контроллера, было бы лучше, чтобы код собирал все переменные в вашем контроллере и передавал их представлению, а не ожидал, что представление будет вызываться обратно в контроллер для извлечения вещей.

1

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

Если вы хотите скрыть некоторые действия и запустить их в зависимости от параметров, собранных / отправленных по запросу, вы не обязаны 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;
}
}
}

Вероятно, не будет работать с выключенным маршрутизатором в любом случае.

1

Ваш вопрос недостаточно подробен.

ты пробовал :

<a href="index/other">Click to call otherAction</a>

в вашем представлении index.volt?

0
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector