Programming With Yii2: Using Ajax

Final product image
What You'll Be Creating

If you're asking, "What's Yii?", check out Introduction to the Yii Framework, which reviews the benefits of Yii and includes an overview of Yii 2.0, released in October 2014.

In this Programming With Yii2 series, I'm guiding readers in use of the Yii2 Framework for PHP. In this tutorial, we'll explore the implementation of interactive pages using Ajax. Specifically, I'm going to highlight the use of Ajax in two areas of the Meeting Planner application, which I'm writing the Building Your Startup series about in parallel.

First, we'll review how we load a Google Map on the page in response to the user entering a specific place. As shown below, after I enter Plum Bistro and click return, the map to the right loads dynamically without a page refresh.

Yii Ajax - Google Maps UX Example

Second, I'll show you how we record the changes a user makes to a meeting during the planning phase. Meeting Planner makes it easy for participants to identify their preferred places and date times and then ultimately choose the final one.

Yii Ajax - Meeting Planner UX Example

Ajax makes the process much easier and faster, allowing people to slide a number of switch controls to indicate their preferences without any page refresh.

Just a reminder, I do participate in the comment threads below. I'm especially interested if you have different approaches, additional ideas or want to suggest topics for future tutorials. If you have a question or topic suggestion, please post below. You can also reach me on Twitter @reifman directly.

Using Ajax With Yii

Yii Ajax - Wikipedia Ajax Flow vs HTTP
By DanielSHaischt, via Wikimedia Commons, CC BY-SA 3.0

If you're just beginning with Ajax and want to start slow, the Yii Playground has two simple examples of Ajax that may be helpful for you to review. One changes text on a page via Ajax, and another loads the response to a form on the same page, both without refreshing, and each includes detailed code samples.

Yii Ajax - Yii Playground AJAX Examples

Let's dive into our two primary examples. You can find all of the source for these examples in the Meeting Planner code repository at GitHub.

Interactively Displaying Google Maps

Building the Input Form

When the Create a Place form (/frontend/views/place/create_place_google.php) initially loads, it includes the Google Places live search widget:

Yii Ajax - Create a Place in Meeting Planner Using Google Places

Integrating the Google Places JavaScript API

The form loads the Google Maps JavaScript library and connects it to the place-searchbox input field:

The _formPlaceGoogle.php partial form includes some hidden fields in which the results from the map can be stored before the entire page is submitted, as well as a hidden div to display the map via Ajax.

The Meeting Planner Place table stores the Google name, place_id, location, website, vicinity and full_address for usage throughout the application.

The MapAsset included above loads our create_place.js file which operates between Google and our form; it basically manages the transmit and response of data via Ajax.

Our Ajax Managing JavaScript 

I'll guide you through create_place.js in pieces. First, there's setupListeners(), called by the parent form:

As the user begins typing, the widget drops down typeahead options for real-world places, and the place_changed event is processed with each key press. The keydown listener above prevents the return key (ASCII 13 or 0xD for you hex geeks) from submitting the form.

Here's what it looks like as you type. I'm entering Plum for Plum Bistro:

Yii Ajax - Google Places Dropdown List

Collecting the Resulting Map and Its Data

If the person has selected enter or clicked on a place in the dropdown, then populateResult() is called; if not, we do nothing. 

This fills all the hidden fields with data from Google and calls loadMap() to display the map:

Yii Ajax - Google Places Load Map via Ajax

The loadMap() function is very specific to Google's Place API and displays the map you see above at right:

The user experience is fast and impressive. Try it!

Dynamically Recording Meeting Changes

Next, let's look at how we record changes to meeting plans in real time. There's no Google API here; it's more vanilla AJAX within the Yii Framework.

As people add dates, times and places to their meeting plans, you'll see a page like this:

Yii Ajax - Meeting Planner Planning View with Sliders

The You and Them columns show each participant's favorability towards places and date times. The larger Choose slider allows the person to make the final decision about the meeting place and time.

There's a lot of data to collect from people, and we don't want to require a page refresh with each change. Ajax is the ideal solution for this problem.

I'll walk through the code for the Meeting-Place panel above. The Meeting-Time panel above works similarly.

Following the Code

Because of the MVC framework and my desire to reuse code partials, the flow here may feel difficult to follow. PHP helper functions and JavaScript sometimes had to be placed in parent files, not the partials they were most closely related to. I'll try to give you an overview first. I encourage you to make a few passes reading it over to fully understand it. And again, you can browse the code via GitHub.

Hint: Keep in mind that filenames for partials usually begin with an underscore.

  1. The Meeting planner page is loaded at /frontend/views/meeting/view.php. This file also includes helper JavaScript functions to manage the state of buttons such as Send and Finalize (i.e. after this change, can the user now send this invitation? With Meeting Planner, one place and one time generally must be selected before it can be sent) and displaying visual notifications that the changes will be emailed to other participants when the user finishes.
  2. When displaying the Where panel for places, it loads /frontend/views/meeting-place/_panel.php. This file includes helper PHP functions showOwnerStatus() and showParticipantStatus(), which will be reused by its child, _list.php. But, most importantly, _panel.php includes JavaScript methods for the Bootstrap slider switchChange event.
  3. The _panel.php file uses _list.php to display each individual row for each place. This file will render the Bootstrap sliders by calling _panel.php functions showOwnerStatus() and showParticipantStatus().
  4. The switchChange functions will make Ajax calls to MeetingPlaceChoiceController.php.
  5. And finally, MeetingPlaceChoiceController.php calls the MeetingPlaceChoice.php model to record the changes in the database.

I'm sorry the placement of relevant code is complicated and spread out. 

Now, I'll guide you through the key components step by step.

Ajax Code Step by Step 

Here's Meeting/view.php rendering Meeting-Place/_panel.php. This displays the partial for the rows of possible places and the participants' selections:

Below that is JavaScript related to actions that respond to Ajax results but are not directly needed for Ajax. You don't need to understand what these functions do to understand this Ajax example, but I included them since they are called in response to Ajax events.

Here in Meeting-Place/_panel.php, the table showing places and selections is created, invoking _list.php:

More importantly, it also includes the JavaScript below, which we use to make Ajax calls when the user moves a switch, changing its state. The chooser functions correspond to the bigger blue choice slider, while the choice functions correspond to the preference sliders.

The functions above make the call to actionSet() in MeetingPlaceChoiceController to respond to the switch change using Ajax requests:

Controller actions that respond via Ajax need to have a JSON response format (this way Yii knows they're not meant to deliver HTML):

Here's the MeetingPlaceChoice::set() method, which records the user's actions in the database and creates a MeetingLog entry, which watches all the changes during planning.

Features Related to Meeting Changes

In Meeting Planner, I keep a log of every single change. This allows me to know when a few minutes have elapsed since a person's last change and notify other meeting participants. It's an experiment I'm trying with this service, instead of requiring that participants hit submit every time they want to make change(s). 

However, this requires training them to understand it's okay to change it and leave it, i.e. close the browser window. So the displayNotifier() functions display some flash alerts to help with this—I'll ultimately polish these over time, and remove them for experienced users.

The MeetingLog also allows me to generate a text summary of the meeting's planning history. If you're interested in learning more about this, I've written about it in Building Your Startup: Notifying People About Meeting Changes and Delivering Notifications.

What's Next?

I hope these examples help you understand the basics of Ajax in Yii. If you're interested in more advanced Ajax, I'm planning to include Ajax loaded forms in the Meeting Planner series. And, admittedly, Ajax is an area where the Yii community hasn't shared a lot of examples. Generally, Ajax works similarly in Yii as it does in PHP and other frameworks, so you can learn from examples from other framework communities.

Watch for upcoming tutorials in our Programming With Yii2 series as we continue diving into different aspects of the framework. You may also want to check out our Building Your Startup With PHP series, which is using Yii2's advanced template as we build a real-world application.

If you'd like to know when the next Yii2 tutorial arrives, follow me @reifman on Twitter or check my instructor page. My instructor page will include all the articles from this series as soon as they are published. 

Related Links

Tags:

Comments

Related Articles