1

I am building a custom plugin for Craft and I am hitting some REST APIs in my backend service to fetch some data using Ajax calls in JS. What I would like to do when the AJAX calls complete and come back with data, is to store some data in Craft. I know I can use projectConfig to store and retrieve plugin based data and settings but how to call those Craft functions through my JS files. The way I figured is to call it using REST routes that I can define via my plugin.

But I am not sure how to register routes using my plugin and how to setup controllers for the same.

Main plugin file:

Event::on(UrlManager::class, UrlManager::EVENT_REGISTER_CP_URL_RULES, function(RegisterUrlRulesEvent $event) {
            $event->rules['poptin/signup'] = 'poptin/default/signup';
        });

DefaultController.php

<?php
/**
 * poptin plugin for Craft CMS 3.x
 *
 * Create advanced website popups and forms, and improve your website's conversion rate within a few minutes.
 *
 * @link      poptin.com
 * @copyright Copyright (c) 2020 Poptin
 */

namespace poptin\poptin\controllers;

use poptin\poptin\Poptin;

use Craft;
use craft\web\Controller;

/**
 * Default Controller
 *
 * Generally speaking, controllers are the middlemen between the front end of
 * the CP/website and your plugin’s services. They contain action methods which
 * handle individual tasks.
 *
 * A common pattern used throughout Craft involves a controller action gathering
 * post data, saving it on a model, passing the model off to a service, and then
 * responding to the request appropriately depending on the service method’s response.
 *
 * Action methods begin with the prefix “action”, followed by a description of what
 * the method does (for example, actionSaveIngredient()).
 *
 * https://craftcms.com/docs/plugins/controllers
 *
 * @author    Poptin
 * @package   Poptin
 * @since     1.0.0
 */
class DefaultController extends Controller
{

    // Protected Properties
    // =========================================================================

    /**
     * @var    bool|array Allows anonymous access to this controller's actions.
     *         The actions must be in 'kebab-case'
     * @access protected
     */
    protected $allowAnonymous = ['index', 'signup'];

    // Public Methods
    // =========================================================================

    /**
     * Handle a request going to our plugin's index action URL,
     * e.g.: actions/poptin/default
     *
     * @return mixed
     */
    public function actionIndex()
    {
        $result = 'Welcome to the DefaultController actionIndex() method';

        return $result;
    }

    /**
     * Handle a request going to our plugin's actionDoSomething URL,
     * e.g.: actions/poptin/default/do-something
     *
     * @return mixed
     */
    public function actionSignup()
    {
        $result = 'Welcome to the DefaultController actionSignup() method';

        return $result;
    }
}

I see this error:

Error

  • You are using EVENT_REGISTER_CP_URL_RULES which only registers control panel routes. If you are creating a route for the outside of the control panel, you should use EVENT_REGISTER_SITE_URL_RULES. See the documentation for more information here: docs.craftcms.com/api/v3/craft-web-urlmanager.html#events – Jason McCallister Jun 15 '20 at 13:26
  • So what I basically want to do is when a user clicks something on my plugin page, I want to hit that route and run some php code in craft. What should I use? EVENT_REGISTER_CP_URL_RULES or EVENT_REGISTER_SITE_URL_RULES – Rohan Jun 15 '20 at 13:32
  • EVENT_REGISTER_SITE_URL_RULES is triggered when registering URL rules for the front-end site (from the documentation link). For your scenario, that would be the correct event. – Jason McCallister Jun 15 '20 at 13:36
2

Your code is almost there, Craft allows registering routes for the Control Panel and the front-end of the site. You need to change EVENT_REGISTER_CP_URL_RULES to EVENT_REGISTER_SITE_URL_RULES.

You are listening for an event on EVENT_REGISTER_CP_URL_RULES which will only register routes inside the control panel. This is useful for plugins that want to add controllers for settings and custom logic.

The event that is triggered when registering URL rules for the control panel.

https://docs.craftcms.com/api/v3/craft-web-urlmanager.html#events

However, in the scenario where access is needed outside of the control panel, Craft triggers the EVENT_REGISTER_SITE_URL_RULES. This allows access for users that do not have control panel access (e.g. site guests and regular users).

The event that is triggered when registering URL rules for the front-end site.

  • 1
    Worked like a charm! Thanks! – Rohan Jun 16 '20 at 6:06

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.