* @category class * @package core * @subpackage form * @copyright 2005-2017 Titan Framework * @license http://www.titanframework.com/license/ BSD License (3 Clause) * @see View, Form */ class Search { protected $file = ''; protected $primary = ''; protected $table = ''; protected $father = FALSE; protected $fields = array (); protected $blocked = array (); protected $cookie; protected $hash = '74770ea6b171e03791f9f388cecd74bc'; protected $timeout = 0; const TCLEAR = 0; const TSEARCH = 1; public function __construct () { $section = Business::singleton ()->getSection (Section::TCURRENT); $action = Business::singleton ()->getAction (Action::TCURRENT); $args = func_get_args(); $fileName = FALSE; if (is_object ($action) && $action->getXmlPath () !== FALSE && trim ($action->getXmlPath ()) != '') array_unshift ($args, $action->getXmlPath ()); foreach ($args as $trash => $arg) { if (!file_exists ('section/'. $section->getName () .'/'. $arg)) continue; $fileName = $arg; break; } if ($fileName === FALSE) throw new Exception ('Arquivo XML não encontrado em [section/'. $section->getName () .'/].'); $file = 'section/'. $section->getName () .'/'. $fileName; $cacheFile = Instance::singleton ()->getCachePath () .'parsed/'. fileName ($file) .'_'. md5_file ($file) .'.php'; if (file_exists ($cacheFile)) $array = include $cacheFile; else { $xml = new Xml ($file); $array = $xml->getArray (); if (!isset ($array ['search'][0])) throw new Exception ('A tag <search></search> não foi encontrada no XML ['. $fileName .']!'); xmlCache ($cacheFile, $array); } $array = $array ['search'][0]; $this->file = $fileName; if (array_key_exists ('table', $array)) $this->table = $array ['table']; if (array_key_exists ('father', $array) && isset ($_GET['fatherId']) && (int) $_GET['fatherId']) { $_POST['search'] = self::TSEARCH; $_POST ['search_'. $array ['father']] = $_GET['fatherId']; $this->father = TRUE; } $search = Instance::singleton ()->getSearch (); if (array_key_exists ('hash', $search)) $this->hash = $search ['hash']; if (array_key_exists ('timeout', $search)) $this->timeout = $search ['timeout']; $section = Business::singleton ()->getSection (Section::TCURRENT); $action = Business::singleton ()->getAction (Action::TCURRENT); $this->cookie = md5 (User::singleton ()->getId () .'-'. $this->getHash () .'-'. $file); if (isset ($_POST['search']) && $_POST['search'] == self::TCLEAR) { setcookie ($this->cookie, '', time() - 3600); unset ($_COOKIE [$this->cookie]); } $cookie = array (); if (isset ($_COOKIE [$this->cookie]) && $this->father === FALSE) $cookie = unserialize (base64_decode ($_COOKIE [$this->cookie])); if (array_key_exists ('field', $array) && is_array ($array ['field'])) foreach ($array ['field'] as $trash => $field) if ($obj = Type::factory ($this->getTable (), $field)) { if (array_key_exists ($obj->getAssign (), $cookie) && !is_object ($cookie [$obj->getAssign ()])) $obj->setValue ($cookie [$obj->getAssign ()]); $this->fields [$obj->getAssign ()] = $obj; } reset ($this->fields); } public function getFile () { return $this->file; } public function getTable () { return $this->table; } public function getHash () { return $this->hash; } public function getTimeout () { return $this->timeout; } public function getFields () { return $this->fields; } public function setFieldValue ($id, $value) { $this->fields [$id]->setValue ($value); } public function addBlock ($id, $value) { $this->fields [$id]->setValue ($value); $this->blocked [] = $id; } public function isBlocked ($id) { if (is_object ($id)) $id = $id->getAssign (); return in_array ($id, $this->blocked); } public function recovery () { if (!isset ($_POST['search']) || $_POST['search'] != self::TSEARCH) return FALSE; $formData = $_POST; $cookie = array (); foreach ($this->fields as $assign => $trash) if (array_key_exists ('search_'. $assign, $formData)) { $value = Search::fromForm ($this->fields [$assign], $formData ['search_'. $assign]); $this->fields [$assign]->setValue ($value); if (!$this->fields [$assign]->isEmpty ()) $cookie [$assign] = $value; } reset ($this->fields); setcookie ($this->cookie, base64_encode (serialize ($cookie)), time () + (int) $this->getTimeout ()); return TRUE; } public function makeWhere () { $aux = array (); foreach ($this->fields as $trash => $field) if (!$field->isEmpty ()) $aux [] = self::toWhere ($field); reset ($this->fields); //throw new Exception (implode (' AND ', $aux)); return implode (' AND ', $aux); } public function isEmpty () { foreach ($this->fields as $trash => $field) if (!$field->isEmpty ()) { reset ($this->fields); return FALSE; } reset ($this->fields); return TRUE; } public function getField ($assign = FALSE) { if ($assign !== FALSE) if (array_key_exists ($assign, $this->fields)) return $this->fields [$assign]; else return current ($this->fields); $field = each ($this->fields); if ($field !== FALSE) return $field ['value']; reset ($this->fields); return NULL; } public static function toForm ($field) { if (!is_object ($field)) return ''; $fieldName = 'search_'. $field->getAssign (); $fieldId = 'field_'. $field->getAssign (); $instance = Instance::singleton (); $db = Database::singleton (); $type = get_class ($field); do { $file = $instance->getTypePath ($type) .'toSearch.php'; if (file_exists ($file)) return include $file; $type = get_parent_class ($type); } while ($type != 'Type' && $type !== FALSE); $type = get_class ($field); do { $file = $instance->getTypePath ($type) .'toForm.php'; if (file_exists ($file)) return include $file; $type = get_parent_class ($type); } while ($type != 'Type' && $type !== FALSE); return ''; } public static function fromForm ($field, $value) { if (!is_object ($field)) return $value; $instance = Instance::singleton (); $type = get_class ($field); do { $file = $instance->getTypePath ($type) .'fromSearch.php'; if (file_exists ($file)) return include $file; $type = get_parent_class ($type); } while ($type != 'Type' && $type !== FALSE); $type = get_class ($field); do { $file = $instance->getTypePath ($type) .'fromForm.php'; if (file_exists ($file)) return include $file; $type = get_parent_class ($type); } while ($type != 'Type' && $type !== FALSE); return $value; } public static function toWhere ($field) { if (!is_object ($field)) return $field; $instance = Instance::singleton (); $type = get_class ($field); do { $file = $instance->getTypePath ($type) .'toWhere.php'; if (file_exists ($file)) return include $file; $type = get_parent_class ($type); } while ($type != 'Type' && $type !== FALSE); return $field->getTable () .'.'. $field->getColumn () ." = ". Database::toValue ($field); } public static function toHtml ($field) { if (!is_object ($field)) return $field; $instance = Instance::singleton (); $fieldId = 'field_'. $field->getAssign (); $db = Database::singleton (); $type = get_class ($field); do { $file = $instance->getTypePath ($type) .'toChoose.php'; if (file_exists ($file)) return include $file; $type = get_parent_class ($type); } while ($type != 'Type' && $type !== FALSE); $type = get_class ($field); do { $file = $instance->getTypePath ($type) .'toHtml.php'; if (file_exists ($file)) return include $file; $type = get_parent_class ($type); } while ($type != 'Type' && $type !== FALSE); return $field->getValue (); } }