Zend Framework, запустить запрос без представления? - PullRequest
7 голосов
/ 07 февраля 2009

В настоящее время я создаю небольшую административную секцию для веб-сайта с использованием Zend Framework, это мой второй опыт использования фреймворка, поэтому я немного не уверен в чем-то. например, есть ли у меня опция архивирования для новостных статей, где, как мы надеемся, пользователь щелкнет ссылку, и статья будет заархивирована, однако я не могу понять, как заставить это работать без просмотра?

это мой контроллер

public function archiveNewsAction()
{

    //die(var_dump($this->_request->getParam('news_id')));
    $oNews = new news();
    $this->_request->getParam('news_id');
    $oNews->archiveNewsArticle($news_id);
    //die(var_dump($oNews));
    $this->_redirect('/admin/list-all');
}

а это моя модель

public function archiveNewsArticle($news_id)
{
    //die($news_id);
    $db = Zend_Registry::get('db');
    $sql = "UPDATE $this->_name SET live = '0' WHERE news_id = '$news_id' LIMIT 1";
    die($sql);
    $query = $db->query($sql);
    $row = $query->fetch();

    return $row;
}

Буду признателен за любую помощь.

Спасибо

Sico

Ответы [ 4 ]

21 голосов
/ 07 февраля 2009

Я использую это для вызовов действий только для AJAX, которые я либо не хочу выводить, либо использую другой вывод, например, XML или JSON:

// Disable the main layout renderer
$this->_helper->layout->disableLayout();
// Do not even attempt to render a view
$this->_helper->viewRenderer->setNoRender(true);

Это дает дополнительное преимущество: нет затрат на перенаправление, если то, что вы делаете, не имеет вывода / вывода не в формате HTML.

5 голосов
/ 07 февраля 2009

Чтобы отключить рендеринг представления в действии (укажите это в определенном действии. Если вы хотите, чтобы это было для всего контроллера, поместите его в метод init):

$this->_helper->viewRenderer->setNoRender();

Если вы используете компонент макета ZF, добавьте также:

$this->_helper->layout->disableLayout();
3 голосов
/ 07 февраля 2009

Я не мог понять ваш код там. в вашей модели вы вызываете die (). Зачем? это остановит казнь. ты уверен в этой линии? в любом случае, если у вас есть контроллер в Zend Framework и вам не нужно какое-либо представление, вы можете отключить его с помощью этой строки:

// code in your controller
$this->_helper->viewRenderer->setNoRender(true);
// the rest of the controller

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

$this->_redirect() 

после того, как вся работа вашего контроллера завершена.

0 голосов
/ 07 февраля 2009

Оригинальный ответ:

Ваш звонок:

$this->_redirect();

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


Последующий ответ:

Чтобы вызвать действие, не отправляя пользователя на другую «страницу», а затем перенаправить обратно, вам необходимо использовать вызов XMLHttpRequest (AJAX). Эти ссылки должны предоставить необходимую информацию:

http://developer.mozilla.org/en/AJAX
http://www.ibm.com/developerworks/xml/library/wa-ajaxintro1.html
http://www.oracle.com/technology/pub/articles/schalk-ajax.html

Также взгляните на некоторые JS-фреймворки, которые значительно упрощают использование кросс-браузера XMLHttpRequest:

http://www.prototypejs.org/
http://mootools.net/

Zend Framework на самом деле имеет встроенную поддержку платформы Dojo JS, что может показаться вам более простым:

http://framework.zend.com/manual/en/zend.dojo.html
http://www.dojotoolkit.org/

...