<?php

/**
 * Smarty {json} plugin
 *
 * Type:       function
 * Name:       json
 * Date:       Apr 12, 2009
 * Purpose:    Read JSON from file, decode and assign data to Smarty template variable
 * Syntax:     {json file="filename.json"}: 'file' is a required parameter (URL)
 *             Predefined additional parameters:
 *             - assign="data": assign all JSON data to template variable $data
 *             - obj2obj [ Boolean | default:false ]:
 *               decodes JSON objects as either PHP associative arrays or PHP objects
 *             - debug [ Boolean | default:false ]: print decoded data in template
 *             Variable parameters:
 *             {json file="filename.json" home="homepage" lang="languages"}:
 *               assign (JSONdata)["homepage"] to template variable $home
 *               and (JSONdata)["languages"] to $lang,
 *               compare to: {config_load file="filename.conf" section="homepage"}
 * Install:    Drop into the plugin directory
 * @link       http://jlix.net/extensions/smarty/json
 * @author     Sander Aarts <smarty at jlix dot net>
 * @copyright  2009 Sander Aarts
 * @license    LGPL License
 * @version    1.0.1
 * @param      array
 * @param      Smarty
 */
function function_json($params, &$smarty) {


    $params['file'] = isset($params['file']) ? $params['file'] : null;
    $params['obj2obj'] = isset($params['obj2obj']) ? $params['obj2obj'] : true;
    $params['debug'] = isset($params['debug']) ? $params['debug'] : false;
    
    $larConfigDir = $smarty->getConfigDir();
    $lstConfigDir = $larConfigDir[0];

    //echo "<pre>";
    //print_r($smarty->template_dir);
    //echo "</pre>";
    //echo "<h1>Params</h1>";
    //echo "<pre>";
    //print_r($params);
    //echo "</pre>";
    if (!is_callable('json_decode')) {
        $smarty->_trigger_fatal_error("{json} requires json_decode() function (PHP 5.2.0+)");
    }
    if (empty($params['file'])) {
        $smarty->_trigger_fatal_error("{json} parameter 'file' must not be empty");
    }
    if (isset($params['assign'], $params[$params['assign']])) {
        $smarty->_trigger_fatal_error("{json} parameter 'assign' conflicts with a variable assign parameter (both refer to the same variable)");
    }

    $assoc = ($params['obj2obj'] == true) ? false : true;
    $json = trim(file_get_contents($lstConfigDir . $params['file']));
    $data = json_decode($json, $assoc);

    /* echo "<h1>Data</h1>";
      echo "<pre>";
      print_r($data);
      echo "</pre>"; */

    if ($params['debug'] == true) {
        /* echo "<pre>";
          print_r($data);
          echo "</pre>"; */
    }

    unset($params['file'], $params['obj2obj'], $params['debug']);

    $assign = array();
    foreach ($params as $key => $value) {
        if ($key === 'assign')
            $assign[$value] = $data;
        else
            $assign[$key] = $assoc ? $data[$value] : $data->$value;
    }
//    echo "<h1>Assign</h1>";
//    echo "<pre>";
//    print_r($assign);
//    echo "</pre>";
    if (count($assign) > 0) {
        $smarty->assign($assign);
    } else {
        return $data;
    }
}
