3
\$\begingroup\$

I have a Drupal site with roughly the following in my template.php hook_init block:

function mytemplate_init() {
    if (request_path() == "widgets_json") {
        drupal_json_output(_get_widgets());
        exit;
    }
    if (request_path() == "people_json") {
        drupal_json_output(_get_people());
        exit;
    }
}

Are there any problems with this approach?

On the face of it, the two main problems are that it's going to break if URL's ever change, and it's impossible to theme the output of those functions using an appropriate page--widget_json.tpl.php or page--people_json.tpl.php template. On the other hand, adding a content type just for a few JSON output pages that are never going to change paths seems like overkill.

What do you think of this approach?

\$\endgroup\$
1
\$\begingroup\$

From what I see, you could use two different methods: Ternaries and switches:


From a switch point of view, you could use the following to proceed:

function mytemplate_init() {
    switch(request_path()) {
       case "widgets_json":
           drupal_json_output(_get_widgets());
       break;
       case "people_json":
           drupal_json_output(_get_people());
       break;
    }
}

Or, one can replace that with a ternary to shorten it:

if (request_path() == "widgets_json") {
    drupal_json_output(_get_widgets());
    exit;
}
if (request_path() == "people_json") {
    drupal_json_output(_get_people());
    exit;
}

into:

request_path() == "widgets_json" ? drupal_json_output(_get_widgets()) : (request_path() == "people_json" ? drupal_json_output(_get_people()) : "" )
exit;

The shortside to ternaries is that you sacrifice readability for effectiveness.

However, if you can move past that, ternaries are an effective part of a Programmer's Toolbelt(TM)


Or, as I've since come to understand, we can use objects!

$functions = [
       "widgets_json" => _get_widgets,
       "people_json"  => _get_people
     ];
$functions[request_path()]();

Unfortunately, with such a small amount of code supplied, very little can be reviewed.

\$\endgroup\$
  • 1
    \$\begingroup\$ "shorter" doesn't always mean "simpler". In this case, I think the original is simpler: you know what's going on with only half eye open. The ternary is very very far from that. \$\endgroup\$ – Stop ongoing harm to Monica Jun 27 '15 at 16:17
  • 2
    \$\begingroup\$ Also, readability has been sacrificed as a trade-off. \$\endgroup\$ – Kid Diamond Jun 27 '15 at 17:18
  • \$\begingroup\$ Pretty old post, surprised to see it get an answer - I probably should have specified that I wanted answers from a Drupal perspective, but I thought the "Drupal" tag and the "on the face of it" para should make it fairly clear what my concerns are? I'm aware that I could rewrite the code with a switch or a ternary, but tbh I think both of those options are less clear than the current code. \$\endgroup\$ – George Jun 30 '15 at 5:23
  • \$\begingroup\$ How is that last example valid, unless the _get_widgets and _get_people are constants? They probably should the in quotes. \$\endgroup\$ – kodeart Nov 28 '15 at 18:00

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.