Хобрук: Ваш путь к мастерству в программировании

Как я могу использовать ajax в Zend Framework 2?

Я пробую небольшое приложение ajax, в котором я хочу вернуть только строку приветствия из моего действия контроллера. он возвращает мир Hello, но вместе с этим он также возвращает мой файл шаблона. Я попытался отключить его шаблонирование, используя следующий код в действии моего контроллера

$this->_helper->layout()->disableLayout();
$this->_helper->viewRenderer->setNoRender( true );

но это возвращает мне эту ошибку

SCREAM: Error suppression ignored for
( ! ) Notice: Undefined property: Survey\Controller\SurveyController::$_helper in C:\wamp\www\zend\module\Survey\src\Survey\Controller\SurveyController.php on line 55

SCREAM: Error suppression ignored for
( ! ) Fatal error: Call to a member function layout() on a non-object in C:\wamp\www\zend\module\Survey\src\Survey\Controller\SurveyController.php on line 55
Call Stack

Как я могу это исправить ?

ИЗМЕНИТЬ

Я модифицировал контроллер так, чтобы он выглядел так

public function registerAction()
{
    $result = new JsonModel(array(
        'some_parameter' => 'some value',
        'success'=>true,
    ));

    return( $result );
}

Добавлены стратегии в module..module.config в папке appl модуля

'strategies' => array(
    'ViewJsonStrategy',
),

Тем не менее, в ответе ajax я получаю возвращаемый шаблон

13.02.2013

  • layout() не является функцией. Это должно быть: $this-›_helper-›layout-›disableLayout(); 13.02.2013
  • Кроме того, вы загружаете свой помощник по макету? 13.02.2013
  • @sTuR Нет улучшений, все та же ошибка 13.02.2013
  • @StuR layout() - это удобный метод для $this->plugin('layout')->__invoke(); Также ваше предложение недействительно для zf2 13.02.2013
  • Верните ViewModel и выполните setTerminal(true). Кроме того, есть JsonModel на случай, если он вам понадобится в будущем. 13.02.2013
  • вы хотите вернуть строку из контроллера, полностью минуя представление или отключив макет? Я думаю, для ajax вам понадобится ответ Json. Затем взгляните на JsonModel и стратегию рендеринга json. 13.02.2013
  • $this-›_helper-›layout()-›disableLayout(); и $this-›_helper-›viewRenderer-›setNoRender(true); являются методами ZF1. Для ZF2 вы должны вернуть модель Json, например, примечания @Xerkus. Читайте здесь: akrabat.com/zend- каркас-2/ 13.02.2013
  • Я все еще пытался, мне возвращают шаблон. Есть ли способ исправить это? 13.02.2013
  • Я понял проблему Спасибо, ребята 13.02.2013
  • @VimalBasdeo В этом случае, пожалуйста, дайте ответ на свой вопрос, чтобы этот вопрос был полезен и другим пользователям. 14.02.2013

Ответы:


1

Вот наглядный пример:

http://akrabat.com/zend-framework-2/returning-json-from-a-zf2-controller-action/

Вы должны использовать JsonMoodels для отправки ответа Json.

15.02.2013

2

я использую это в своем контроллере:

    $view = new ViewModel(array('form'=>$my_form));
    //disable layout if request by ajax
    $view->setTerminal($request->isXmlHttpRequest());
    $view->setTemplate('path/to/phtml');
    return $view;
18.05.2013

3

Пользователь хотел знать, как вернуть только html, а не json, как предлагает ответ Эндрюса.

Я также хотел, чтобы html возвращался, чтобы я мог использовать его с плагином jquery qtip, и вот как я это сделал. Мне также пришлось сделать так, чтобы страница изящно деградировала в случае сбоя javascript, например. выходные данные страницы должны правильно отображаться в шаблоне макета.

    /**
 * Tourist Summary action
 *
 * @return ViewModel
 */
public function touristSummaryAction()
{
    // Get the Id 
    $id = $this->params()->fromRoute('id', '');

    // Get the data from somewhere
    $data = array() ;

    // Get the html from the phtml
    $view = new ViewModel(
        array(
            'id' => $id ,
            'data' => $data ,
        )
    );

    //disable layout if request by ajax
    $view->setTerminal($this->getRequest()->isXmlHttpRequest());
    return $view;

}
20.03.2015

4

Самый простой способ отправки запросов ajax и обработки ответов — это модуль zf2 WasabiLib

Вам нужно только добавить «ajax_element» в атрибут класса к элементу, который вы хотите вызвать запрос ajax. Неважно, отправка формы, ссылка или кнопка. Посетите страницу с примерами http://www.wasabilib.org/application/pages/examples. Если ваше приложение много использует ajax, я рекомендую этот модуль.

14.12.2015

5

Взгляните на этот модуль. www.wasabilib.org Кажется, вы очень хорошо управляете ajax.

Если у вас нет приложения, вы можете использовать скелет Wasabilib https://github.com/WasabiLib/wasabilib_zf2_skeleton_application. Он поставляется со всеми необходимыми активами в нужном месте.

Если у вас уже есть приложение, вам следует клонировать модуль: https://github.com/WasabiLib/wasabilib.

Минимальные требования: jQuery, ZF2

  1. Добавьте модуль в application.config.php.
  2. Включите wasabilib.min.js после jquery в заголовок вашего layout.phtml.

Как это работает в вашем .phtml-файле у вас есть такая форма:

<form id="simpleForm" class="ajax_element" action="simpleFormExample" method="POST">
<input type="text" name="written_text">
<input type="submit" value="try it">
</form>

В любом другом месте вашего phtml вы можете поместить элемент, где отображается ответ.

In your Controller the following method:

public function simpleFormExampleAction(){
    $postArray = $this->getRequest()->getPost();
    $input = $postArray['written_text'];
    $response = new Response(new InnerHtml("#element_simple_form","Server     Response: ".$input));
    return $this->getResponse()->setContent($response);
}

Форма имеет класс "ajax_element", это скажет библиотеке, что запрос будет выполнен с помощью xmlhttp-запроса. Это не сработает, если вы не дадите идентификатор запрашивающему элементу. Таким образом, форма имеет идентификатор «simpleForm». Действие — это «путь/к/контроллеру», как и при обычном запросе.

В действии контроллера создается экземпляр нового объекта WasabiLib\Ajax\Response. Класс InnerHtml предназначен для замены, добавления и добавления HTML или обычного текста к селектору. В этом случае селектор представляет собой идентификатор "element_simple_form". Первый параметр класса InnerHtml — это селектор. Убедитесь, что вы написали #yourElementId или .yourClassSelector. Для идентификаторов "#" и для селекторов классов "."

Второй параметр — это текст, которым вы хотите заполнить этот элемент.

Объект ответа может обрабатывать гораздо больше ответов, которые вы можете добавить с помощью

$response->add($anotherResponseType);

Список возможных типов ответа находится здесь: http://www.wasabilib.org/application/pages/components

Модуль построен для обработки ajax-запросов и ответов очень простым способом. Как только вы поймете поведение, вы сможете справиться почти со всеми практическими потребностями ajax.

16.06.2015
  • Пожалуйста, добавьте важные моменты из ссылки здесь, а затем дайте ссылку на ссылку. 16.06.2015

  • 6

    Это работает для меня:

    public function ajaxAction(){
        $data = array(
            'var1' => 'var1Value',
            'var2' => 'var2Value',
        );
    
        $response = $this->getResponse();
        $response->setStatusCode(200);
        $response->setContent(json_encode($data));
    
        $headers = $response->getHeaders();
        $headers->addHeaderLine('Content-Type', 'application/json');
    
        return $response;
    }
    

    Выход:

    {"var1":"var1Value","var2":"var2Value"}
    
    14.02.2013
  • это не способ сделать это в zf2. Следует использовать jsonModel и стратегию рендеринга json. 14.02.2013
  • Новые материалы

    Dall-E 2: недавние исследования показывают недостатки в искусстве, созданном искусственным интеллектом
    DALL-E 2 — это всеобщее внимание в индустрии искусственного интеллекта. Люди в списке ожидания пытаются заполучить продукт. Что это означает для развития креативной индустрии? О применении ИИ в..

    «Очень простой» эволюционный подход к обучению с подкреплением
    В прошлом семестре я посетил лекцию по обучению с подкреплением (RL) в моем университете. Честно говоря, я присоединился к нему официально, но я редко ходил на лекции, потому что в целом я нахожу..

    Освоение информационного поиска: создание интеллектуальных поисковых систем (глава 1)
    Глава 1. Поиск по ключевым словам: основы информационного поиска Справочная глава: «Оценка моделей поиска информации: подробное руководство по показателям производительности » Глава 1: «Поиск..

    Фишинг — Упаковано и зашифровано
    Будучи старшим ИТ-специалистом в небольшой фирме, я могу делать много разных вещей. Одна из этих вещей: специалист по кибербезопасности. Мне нравится это делать, потому что в настоящее время я..

    ВЫ РЕГРЕСС ЭТО?
    Чтобы понять, когда использовать регрессионный анализ, мы должны сначала понять, что именно он делает. Вот простой ответ, который появляется, когда вы используете Google: Регрессионный..

    Не зря же это называют интеллектом
    Стек — C#, Oracle Опыт — 4 года Работа — Разведывательный корпус Мне пора служить Может быть, я немного приукрашиваю себя, но там, где я живу, есть обязательная военная служба на 3..

    LeetCode Проблема 41. Первый пропущенный положительный результат
    LeetCode Проблема 41. Первый пропущенный положительный результат Учитывая несортированный массив целых чисел, найдите наименьшее пропущенное положительное целое число. Пример 1: Input:..