Code Coverage
 
Classes and Traits
Functions and Methods
Lines
Total
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 10
CRAP
0.00% covered (danger)
0.00%
0 / 61
iaFiller
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 10
870.00
0.00% covered (danger)
0.00%
0 / 61
 __construct
0.00% covered (danger)
0.00%
0 / 1
2.00
0.00% covered (danger)
0.00%
0 / 5
 mayEditDeduce
0.00% covered (danger)
0.00%
0 / 1
56.00
0.00% covered (danger)
0.00%
0 / 7
 webPathDeduce
0.00% covered (danger)
0.00%
0 / 1
20.00
0.00% covered (danger)
0.00%
0 / 6
 htmlHead
0.00% covered (danger)
0.00%
0 / 1
2.00
0.00% covered (danger)
0.00%
0 / 1
 css
0.00% covered (danger)
0.00%
0 / 1
2.00
0.00% covered (danger)
0.00%
0 / 1
 js_lib
0.00% covered (danger)
0.00%
0 / 1
2.00
0.00% covered (danger)
0.00%
0 / 2
 jsInit
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 8
 lista
0.00% covered (danger)
0.00%
0 / 1
12.00
0.00% covered (danger)
0.00%
0 / 6
 delete
0.00% covered (danger)
0.00%
0 / 1
12.00
0.00% covered (danger)
0.00%
0 / 8
 save
0.00% covered (danger)
0.00%
0 / 1
30.00
0.00% covered (danger)
0.00%
0 / 17
 createTable
n/a
0 / 0
1
n/a
0 / 0
<?php
/** @noinspection SqlNoDataSourceInspection */
/** @noinspection SqlResolve */
namespace ia\Lib;
use ia\Util\Str;
/*
//@TODO log update/delete?
//@TODO js to jqplguin?
//@TODO js write contorlito en html, poner clear use clear | save del
//@TODO js toast tooltip? ya tiene jqueryui
//@TODO js inited read templates
//@TODO js juntar todo en uno?
*/
/**
 * iaFiller
 *    html
 * <head>
 * <link jqueryui.min.css />
 * <script src='js_lib/jquery.min.js'></script>
 * <script src='js_lib/jqueryui.min.js'></script>
 * <script src='js_lib/diatrics.min.js'></script>
 * //@TODO integrate iaValuesIn, populateForm (si) y diatrics?
 * <?php
 * $iaFiller = new iaFiller(true, 'tag', );
 * $iaFiller->htmlHead('#iaFiller', 'dataToFill')
 * ?>
 * </head>
 * <body>
 * <div id="iaFiller"></div>
 * <div id='dataToFill'>
 * ...
 * </div>
 * ...
 *
 *
 */
class iaFiller {
    protected $mayEdit = true;
    protected $tag = 'base';
    protected $db;
    protected $webRoot;
    /**
     * iaFiller::__construct()
     *
     * @param mixed $db
     * @param mixed $tag
     * @param mixed $mayEdit
     * @param mixed $webRoot
     * @return
     */
    public function __construct($db, $tag, $mayEdit = null, $webRoot = null) {
        $this->db = $db;
        $this->tag = $tag;
        $this->mayEdit = $this->mayEditDeduce($mayEdit);
        $this->webRoot = $this->webPathDeduce($webRoot);
    }
    /**
     * iaFiller::mayEditDeduce()
     *
     * @param mixed $mayEdit
     * @return
     */
    protected function mayEditDeduce($mayEdit) {
        if($mayEdit === true || $mayEdit === false) {
            return $mayEdit;
        }
        if(empty($mayEdit) && isset($_SESSION['may_iaFiller'])) {
                $mayEdit = $_SESSION['may_iaFiller'];
        }
        if(strcasecmp($mayEdit,'No')===0 || strcasecmp($mayEdit,'R/O')===0) {
            return false;
        }
        return true;
    }
    /**
     * iaFiller::webPathDeduce()
     *
     * @param mixed $webRoot
     * @return
     */
    protected function webPathDeduce($webRoot) {
        if(!empty($webRoot)) {
            return $webRoot;
        }
        global $gConfig;
        if(isset($gConfig) && !empty($gConfig['WEB_ROOT'])) {
            return $gConfig['WEB_ROOT'];
        }
    }
    /**
     * iaFiller::htmlHead()
     *
     * @param string $dataContainerSelector
     * @param string $iaFillerSelector
     * @param string $ajaUrl
     * @return
     */
    public function htmlHead($dataContainerSelector='#iaFilterForm', $iaFillerSelector='#iaFiller', $ajaUrl='') {
        return $this->css().PHP_EOL.$this->js_lib().PHP_EOL.$this->jsInit();
    }
    /**
     * iaFiller::css()
     *
     * @return
     */
    public function css() {
        return "<style>".file_get_contents($this->pwd() . "/../css/iaFiller.css")."</style>";
    }
    /**
     * iaFiller::js_lib()
     *
     * @return
     */
    public function js_lib() {
        $jsWebPath = $this->webRoot . '/widgets_ia/iaFiller/js';
        return "<script src=''>$jsWebPath/iaFiller.js</script>";
    }
    /**
     * iaFiller::jsInit()
     *
     * @param string $dataContainerSelector
     * @param string $fillerSelector
     * @param string $ajaxUrl
     * @return
     */
    public function jsInit($dataContainerSelector='#iaFilterForm', $fillerSelector='#iaFiller', $ajaxUrl='') {
        if(empty($ajaxUrl)) {
            $ajaxUrl = $this->webRoot . '/widgets_ia/iaFiller/iaFiller.php';
        }
        $options = json_encode([
            'container'=>$dataContainerSelector,
            'tag'=>$this->tag,
            'mayEdit'=>$this->mayEdit,
            'url'=>$ajaxUrl,
        ]);
        return "<script>\$(function(){\$( $fillerSelector ).iaFiller({ $options }); });</script>";
    }
    /**
     * iaFiller::list()
     *
     * @return array
     */
    public function lista() {
        $ret = $this->db->selectArrayIndex("SELECT /*".__METHOD__."*/ iaFiller_id, nombre, descripcion, color, vals FROM iaFiller WHERE tag=".Str::strit($this->tag)." ORDER BY nombre");
        if($ret === false) {
            return ['ok'=>false, 'errorMessage'=>'Error inesperado al trabajar con la base de datos'];
        }
        foreach($ret as &$d) {
            $d['vals'] = json_decode($d['vals']);
        }
        return $ret;
    }
    /**
     * iaFiller::delete()
     *
     * @param mixed $iaFiller_id
     * @return
     */
    public function delete($iaFiller_id) {
        //@TODO log
        if(!$this->mayEdit) {
            return ['ok'=>false, 'errorMessage'=>'Sin permiso de editar las plantillas'];
        }
        $ok = $this->db->query("DELETE /*".__METHOD__."*/ FROM iaFiller WHERE iaFiller_id=".Str::strit($iaFiller_id)." AND tag=".Str::strit($this->tag));
        return [
            'ok' => $ok,
            'errorMessage' => $ok ? '' : 'Error al intentar borrar la plantilla',
            'iaFiller_id' => $iaFiller_id,
            'dime' => json_encode($this->db->errorLog_get()),
            'Sql' => "DELETE /*".__METHOD__."*/ FROM iaFiller WHERE iaFiller_id=".Str::strit($iaFiller_id)." AND tag=".Str::strit($this->tag),
        ];
    }
    /**
     * Save, updateing or inserting, plantilla definition
     *
     * @param int $iaFiller_id
     * @param string $nombre nombre de la plantilla
     * @param string $descripcion explicacion de la plantilla
     * @param string $color clase para presentar la plantilla
     * @param string $vals an array o string with the plantilla definition
     * @return string json string of row received or json informing db error
     */
    public function save($iaFiller_id, $nombre, $descripcion, $color, $vals) {
        //@TODO log
        if(!$this->mayEdit) {
            return ['ok'=>false, 'errorMessage'=>'Sin permiso de editar las plantillas'];
        }
        $plantilla = [
            'nombre' => Str::strim($nombre),
            'descripcion' => Str::strim($descripcion),
            'color' => Str::strim($color),
            'vals' => is_array($vals) ? json_encode($vals) : $vals,
            'tag' => $this->tag,
        ];
        $builder = new ia\Sql\Mysql\SqlBuilder();
        $sql = $builder->insert('iaFiller', $plantilla, true);
        $ok = $this->db->query( $sql );
        if($ok == false) {
            return ['ok'=>false, 'errorMessage'=>'Error inesperado al trabajar con la base de datos'];
        }
        $ret = $this->db->singleton("SELECT * FROM iaFiller WHERE nombre=".Str::strit($plantilla['nombre'])." AND tag=".Str::strit($this->tag));
        if($ret === false) {
            return ['ok'=>false, 'errorMessage'=>'Error inesperado al trabajar con la base de datos'];
        }
        $ret['vals'] = json_decode($ret['vals']);
        return $ret;
    }
    /**
     * iaFiller::createTable()
     *
     * @return
     */
    protected function createTable() { return;
        $sql = "
CREATE TABLE IF NOT EXISTS iaFiller (
    iaFiller_id MEDIUMINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
    nombre VARCHAR(64) NOT NULL COMMENT 'nombre de los valores a llenar',
    descripcion  VARCHAR(128) NOT NULL DEFAULT '' COMMENT 'Descripcion para recordar que quiere decir el nombre',
    tag VARCHAR(64) NOT NULL COMMENT 'clasificacion de la plantilla',
    color VARCHAR(32) NOT NULL DEFAULT 'iaFillerNormal' COMMENT 'css class de la plantilla',
    vals LONGTEXT COMMENT 'json con los valores a llenar',
    alta_db DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'fecha de alta',
    ultimo_cambio  DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'ultima fecha en que se actualizo',
    UNIQUE KEY nombre_unico(tag,nombre)
) ENGINE=Innodb DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci COMMENT 'Plantillas de iaFiller';
        ";
        $this->db->query($sql);
    }
}