Как реализовать Zend-маршрутизацию с помощью Ajax - PullRequest
1 голос
/ 18 марта 2011

Я новичок в Zend и не смог найти способ реализовать Ajax в Zend.

В общем, php довольно просто сделать ajax-запрос и показать ответ в нужной части нашей страницы. Но, что касается Zend, я понятия не имею, как это сделать.

Предположим, в моем файле index.phtml контроллера индекса у меня есть кнопка, и когда я нажимаю на нее, мне нужно сделать ajax-запрос к конкретному контроллеру и действию и загрузить представление связанной операции контроллера на моей странице.

Но я не мог понять, как указать URL для запроса ajax и как работает маршрутизация.

В настоящее время я сделал ajax-запрос для статической загрузки вида:

xmlhttp.open ( "GET", "../ приложение / просмотров / скрипты / зарегистрироваться / register.phtml", правда);

К вашему сведению, я использую маршрутизацию регулярных выражений в своем приложении, так что было бы лучше использовать curl для маршрутизации запросов?

Ответы [ 4 ]

7 голосов
/ 18 марта 2011

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

/register/register

Zend поставляется с отличным помощником действий, который называется AjaxContext .Этот помощник позволяет вам ответить с другим представлением, основанным на типе запроса (XmlHttpRequest) и параметре format, отключая любые обычно присутствующие макеты.

Чтобы установить его, поместите что-то подобное в контроллер вашего init() method

public function init()
{
    $this->_helper->ajaxContext->addActionContext('register', 'html')
                               ->initContext();
}

Затем добавьте скрипт представления с суффиксом ajax, например, register/register.ajax.phtml.

Создайте запрос AJAX GET для включения параметра format=html, например:

xmlhttp.open('GET', '/register/register/format/html', true);

или

xmlhttp.open('GET', '/register/register?format=html', true);

Будет возвращено отображаемое содержимое register.ajax.phtml без каких-либо макетов.

2 голосов
/ 18 марта 2011

Кроме того, что указано в других ответах, есть также вспомогательная функция просмотра URL, которая может быть полезна для вызова определенного действия на контроллере.Таким образом, вы можете просто использовать $this->url(array('controller' => 'your_controller', 'action' => 'your_action'), 'default', true);, чтобы получить ссылку на действие «your_action» на контроллере «your_controller» (используя маршрут по умолчанию).Вы также можете указать конкретный маршрут вместо «по умолчанию», если он у вас есть.

Так что для вашего примера вы бы использовали что-то вроде следующего в вашем phtml-файле вида (если вы используете маршрутизацию по умолчанию):

xmlhttp.open("GET","<?php echo $this->url(array('controller' => 'register', 'action' => 'register'), 'default', true);?>");

Для получения дополнительной информации обратитесь к Zend Framework - View Helpers .

1 голос
/ 05 марта 2017

Я напишу здесь почти полное руководство по реализации вызовов AJAX в Zendframework 3. Нам нужно:

  1. Объявление маршрута
  2. Контроллер
  3. Какой-то javaScript (не в порядке, возможно я покажу его в другом месте)

Объявление маршрута:

<?php
// editing a module.config.php in your project
// typical lines:
namespace Ajax2l; // my ajax module name
use Zend\Router\Http\Segment;
// ...
'router' => [
  // ... other routes
  'ajax2lsajaxcall'    => [
    'type'    => Segment::class,
    'options' => [
        'route' => '/ajax2l/ajaxrequest[/:action][/:garbage]',
        // the :action wildcard is a place to have extra parameters
        // the :garbage wildcard is a place to send random strings
        //      to ensure you break cache to get real process for
        //      all your calls, since every call will be different
        'defaults' => [
            'controller' => Controller\AjaxController::class,
            'action'     => 'ajaxrequest'                        
        ]
    ],
    'may_terminate' => true,
    'child_routes'  => [
      // other ajax routes if needed
    ]
],
// I only use one ajax route and one controller for all my sites' ajax 
// calls because they fire small db actions and reflect them on small
// parts of my pages. So I think I do not need a route and a controller
// for each ajax call. Instead, I use a Library and some services to get
// sets of elementary components and to perform tasks.

Расположен модуль Controller My Ajax2lв каталоге "myzend_project / module".

<?php
// Filename: /module/Ajax2l/src/Controller/AjaxController.php
namespace Ajax2l\Controller

use Zend\Mvc\Controller\AbstractActionController;
use Zend\View\Model\ViewModel;
// No more components are needed

class AjaxController extends AbstractActionController {
  public function ajaxrequestAction(){
    $request = $this->getRequest();
    $content = $request->getContent();
    $isHttpRequest = $this->ifIsValidHttpRequest();
    // if you have a real ajax call you must disable the normal output
    $viewmodel = new ViewModel();
    $viewmodel->setTerminal($is_xmlhttprequest);
    // If not an Ajax call (perhaps from untrusted eyes) serve a forgiven
    // page message
    if(!$isHttpRequest){
      return $this->forgivenPage();
    }
    // Now prepare a response and responds
    $requestParams = $this->preProcessRequest($content);
    // call the logics to process your params
    $output = $this->processRequestParams($requestParams);
    // and send a response
    $response = $this->getResponse();
    $response->setContent($output);
    return $response;
  }

  private function ifIsValidHttpRequest($content){
    // I use a small token string to verify if posted data matches 
    // perhaps not the proper way but is fast and works
    $token = 'my_secure_visitor_session_token_identifier';
    return (strpos($content, $token) > 2) ? 1 : 0;
    // the validation is simplified here it has some more
    // complex logics. To ensure validation of requesting source
  }

  private function preProcessRequest($content){
    // The logics to know what to do
    // ...
    // here you can identify and set properly the post params
  }

  function processRequestParams($requestParams){
    // some logics to process your data
    // ...
    // some logics to create a Json output
    // ...
    return $jsonObject;
  }

  protected function forgivenPage(){
    $view = new ViewModel([]);
    // set a forgiven message page as output
    $view->setTemplate('ajax2l/messages/forgiven.phtml');
    // note: the views directory uses lowercase for module names
    return $view;
  }
}

Надеюсь, это поможет.Я потерял много времени на чтение Zend Ajax безрезультатно.Надеюсь, я последний раз терял время на эту тему.

Луис

1 голос
/ 18 марта 2011

Вы никогда не должны запрашивать вид напрямую. Это просто неправильно. Запросите URI так:

xmlhttp.open("GET","/register/register");

Что означает «Я ищу модуль по умолчанию, контроллер регистра и действие регистра», или другими словами RegisterController :: registerAction ().

Это так же, как:

xmlhttp.open("GET","/default/register/register");

То же самое, модуль по умолчанию может быть опущен.

Zend Framework знает, где искать скрипт представления (если вы не используете какую-то необычную структуру каталогов).

Вы можете просто создать пустой макет и использовать его для действий контроллера ajax (или, как предложил Фил, AjaxContent, вероятно, лучше для этого).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...