/** * Retourne le rendu HTML du formulaire, en appliquant le template * * @access public * @param $template string: emplacement du template * (par defaut, le template generique, construit dynamiquement) * @return string */ public function render($template = '') { $smarty = $this->_smarty; $renderer = new HTML_QuickForm_Renderer_ArraySmarty($smarty); $form = $this->_form; $reset = ""; // Contient le code HTML pour reset le form $Elements = $this->_elementsToDisplay; $ElementsToDisplay = array(); $elts = $form->_elements; // Prend en compte les preferences pour l'user connecte, si besoin $this->checkPreferences(); foreach ($Elements as $name => $type) { if (in_array($name, $this->hiddenCriteriaByUser)) { continue; } if ($type == 'checkbox') { $ElementsToDisplay[] = "<label for=\"" . strtolower($name) . "\">{\$form." . $name . ".label}</label> {\$form." . $name . ".html}"; } elseif (!(false === strpos($type, 'date2date'))) { // si creneau de dates // si plusieurs creneaux de date, indice du creneau $Date2DateIndex = substr($type, strlen($type) - 1, 1); $DisplayDate = 'DisplayDate' . $Date2DateIndex; // Si le checkBox associe est masque, on ignore ce critere if (in_array('DateOrder' . $Date2DateIndex, $this->hiddenCriteriaByUser)) { continue; } $keys = array_keys($Elements, $type); if (isset($keys[1])) { $Endname = $keys[1]; unset($Elements[$Endname]); // suppression de cet element // s'il faut afficher les widgets de date if (isset($_REQUEST['DateOrder' . $Date2DateIndex]) || isset($_SESSION['DateOrder' . $Date2DateIndex]) && (!isset($_REQUEST['formSubmitted']) && !$this->IsFirstArrival())) { $DisplayDate = 'block'; } else { $DisplayDate = 'none'; } $smarty->assign('DisplayDate' . $Date2DateIndex, $DisplayDate); $ElementsToDisplay[] = "<div id='Date" . $Date2DateIndex . "' style=\"display: {\$DisplayDate" . $Date2DateIndex . "}\">{\$form." . $name . ".label} {\$form." . $name . ".html} {\$form." . $Endname . ".label} {\$form." . $Endname . '.html}</div>'; } } elseif ($type == 'blank') { $ElementsToDisplay[] = ' '; // Si nombre impair d'elements a afficher, on rajoute un <td> </td> if (count($ElementsToDisplay) % 2 != 0) { $ElementsToDisplay[] = ' '; } } else { // On verifie s'il y a un label a afficher for ($i = 0; $i < count($elts); $i++) { $attr = $elts[$i]->_attributes; if (isset($attr['name']) && $attr['name'] == $name || isset($elts[$i]->_name) && $elts[$i]->_name == $name) { $label = $elts[$i]->_label; break; } } if (!empty($label)) { $ElementsToDisplay[] = "<label for=\"" . strtolower($name) . "\">{\$form." . $name . ".label} </label>:"; } // Si c'est un type date, on encapsule dans un DIV $ElementsToDisplay[] = $type != 'date' ? "{\$form." . $name . ".html}" : "<div id=\"" . $name . "\">{\$form." . $name . ".html}</div>"; } /* Generation du js pour reinitialiser le form */ if ($type == 'text') { $reset .= '$(\'' . $this->_name . '\').' . $name . ".value='';"; } if ($type == 'checkbox') { // Ici, on prend en compte le defaultValues pour reinitialiser // (serait généralisable aux autres types de champs) $values = $this->getDefaultValues(); $resetValue = isset($values[$name]) && $values[$name] == 1 ? 'true' : 'false'; $reset .= '$(\'' . $this->_name . '\').' . $name . '.checked=' . $resetValue . ';'; } if ($type == 'selectM') { // select multiple $reset .= '$(\'' . $this->_name . '\').' . "elements['" . $name . "[]'].selectedIndex=0;"; } if ($type == 'select') { $reset .= '$(\'' . $this->_name . '\').' . "elements['" . $name . "'].selectedIndex=0;"; } if (0 < strpos($type, "2date")) { // si creneau de dates $reset .= "\$('Date" . $Date2DateIndex . "').style.display='{\$Display}';"; } } $smarty->assign('reset', $reset); /* Gestion des valeurs affichees par defaut ds le form */ $defaultValues = array(); if (SearchTools::requestOrSessionExist('LastEntitySearched', $this->_name)) { // recupere les saisies faites precedemment et mises en session $defaultValues = SearchTools::dataInSessionToDisplay(); } // affiche le form avec les valeurs par defaut $form->setDefaults(array_merge($this->getDefaultValues(), $defaultValues)); $form->accept($renderer); // affecte au form le renderer personnalise $smarty->assign('form', $renderer->toArray()); /* Pour completer correctement le tableau HTML si besoin */ if (count($ElementsToDisplay) % 4 != 0) { $nbTD = 4 - count($ElementsToDisplay) % 4; $TD = ""; for ($i = 0; $i < $nbTD; $i++) { $TD .= '<td> </td>'; } $smarty->assign('ExtraTD', $TD); } $smarty->assign('FormElements', $ElementsToDisplay); $smarty->assign('FormName', $this->_name); $smarty->assign('ShowHideImageSource', SHOWHIDE_IMAGE); $smarty->assign('withResetButton', $this->withResetButton); $smarty->assign('CustomDisplayImage', AbstractGrid::CUSTOM_DISPLAY_IMAGE); $smarty->assign('CustomDisplayBarImage', AbstractGrid::CUSTOM_DISPLAY_BAR_IMAGE); $smarty->assign('customizationEnabled', $this->customizationEnabled); // Gestion du customize searchform: il est possible que precedemment dans // render(), on ait supprime 1 ou n criteres (enabled=false) if ($this->customizationEnabled) { $this->_customDisplay($smarty); } /* Gestion des actions eventuelles */ if (count($this->_actionArray) > 0) { $actions = ""; // va recevoir le contenu HTML a afficher $Auth = Auth::Singleton(); foreach ($this->_actionArray as $index => $params) { // Test si Enable ou pas if ($params['Enable'] == false) { continue; } /* Test s'il y a des restrictions par profile */ if (!isset($params['Profiles']) || in_array($Auth->getProfile(), $params['Profiles'])) { $actionName = isset($params['Name']) ? $params['Name'] : 'searchAction_' . $index; $actionId = strtolower($actionName); $actions .= '<input type="button" name="' . $actionName . '" ' . 'id="' . $actionId . '" class="button" value="' . $params['Caption'] . '" onclick="' . 'location.href=\'' . $params['URL'] . '\'"/> '; } } $smarty->assign('actions', $actions); } /* Gestion des variables smarty additionnelles: ds le template par defaut, placees en debut de form */ foreach ($this->_additionalSmartyValues as $name => $value) { $smarty->assign($name, $value); } $smarty->assign('AdditionalSmartyValues', $this->_additionalSmartyValues); /* Si on affiche le grid, on n'affiche pas le form par defaut */ if (true === $this->displayGrid() || false === $this->getDisplayForm()) { $smarty->assign('DisplayForm', 'none'); } $template = $template != '' ? $template : SEARCHFORM_TEMPLATE; $pageContent = $smarty->fetch($template); return $pageContent; }
/** * Retourne un FilterComponent * * @param string $Attribute nom de l'attribut sur lequel s'effectue le filtre * @param string $DbTablesPath chemin en cas de jointure, ou '' si pas de jointure * Exple: ''ActivatedOperation.ActivatedChain.CommandItem().Command.CommandNo' * les () expriment une relation 1..* ou *..* * Autre type de path autorise: Command@ProductCommand.CommandItem().Product.BaseReference * le "@" permet de gerer le pb de l'heritage: on force la classe ProductCommand ici * @param string $Operator "Like" ou "Equal" ou "NotLike", ...: * cf ds SearchTools::getToSqlOperator() tous les operateurs disponibles * @param string $Value valeur du champs: facultatif * @param int $force (facultatif): si vaut 1 (0 par defaut), force la * construction du FilterComponent, * même si pas de var REQUEST ou SESSION reçue * @param string $startEntity nom de l'entité cherché dans le cas où il y a * une relation 1..* ou *..* * @static * @return object FilterComponent ou false */ static function newFilterComponent($Attribute, $DbTablesPath, $Operator = 'Equals', $Value = '', $force = 0, $startEntity = '') { $OperatorArray = array('Like', 'NotLike', 'Equals', 'NotEquals', 'GreaterThan', 'GreaterThanOrEquals', 'LowerThan', 'LowerThanOrEquals', 'In', 'NotIn', 'IsNull', 'IsNotNull'); if (!in_array($Operator, $OperatorArray)) { Template::errorDialog('Bad operator. Filter can\'t be builded.', $_SERVER['PHP_SELF']); exit; } unset($FilterComponent); $FilterComponent = new FilterComponent(); $FilterRuleOperator = SearchTools::getToSqlOperator($Operator); $pos = strpos($DbTablesPath, "()"); if ($pos === false) { // Pas de relation * ds la jointure eventuelle if (isset($_REQUEST[$Attribute]) && $_REQUEST[$Attribute] != '' && $_REQUEST[$Attribute] != '##' || isset($_SESSION[$Attribute]) && $_SESSION[$Attribute] != '' && $_SESSION[$Attribute] != '##' || $force == 1) { // || !(is_string($Value) && $Value == '') // selon si jointure ou pas $DbTablesPath = $DbTablesPath == "" ? $Attribute : $DbTablesPath; /* si c'est c'est un tab de valeurs, par exple un select multiple */ if (isset($_REQUEST[$Attribute]) && is_array($_REQUEST[$Attribute]) || isset($_SESSION[$Attribute]) && is_array($_SESSION[$Attribute]) || is_array($Value)) { if ($force == 1) { $Array = $Value; } else { $Array = isset($_REQUEST[$Attribute]) ? $_REQUEST[$Attribute] : $_SESSION[$Attribute]; } // pour une raison que j'ignore, $Array n'est dans certains // cas pas un array :/ on fait ce truc ici donc pour s'en // assurer: if (!is_array($Array)) { $Array = array($Array); } if (!in_array('##', $Array, true)) { // si la bonne selection foreach ($Array as $key => $val) { $Array[$key] = $Operator == 'Like' || $Operator == 'NotLike' ? str_replace('*', "%", $val) : $val; } if (in_array($Operator, array('Equals', 'In'))) { $ope = FilterRule::OPERATOR_IN; } elseif (in_array($Operator, array('NotEquals', 'NotIn'))) { $ope = FilterRule::OPERATOR_NOT_IN; } elseif (in_array($Operator, array('Like', 'NotLike'))) { foreach ($Array as $key => $val) { $FilterComponent->setItem(new FilterRule($DbTablesPath, $FilterRuleOperator, $Array[$key])); // c'est un OR ds ce cas!! $FilterComponent->operator = FilterComponent::OPERATOR_OR; } return $FilterComponent; } else { return null; } // Pas de sens dans ce cas (autres operateurs) $FilterComponent->setItem(new FilterRule($DbTablesPath, $ope, $Array)); } else { return false; } // si '##' selectionne } else { if (is_string($Value) && $Value == "") { // !empty($Value) if ($force == 0) { if (isset($_REQUEST[$Attribute]) && ($_REQUEST[$Attribute] == '' || $_REQUEST[$Attribute] == '##')) { return false; // pas de filtre dans ce cas } $Value = isset($_REQUEST[$Attribute]) ? strtoupper($_REQUEST[$Attribute]) : strtoupper($_SESSION[$Attribute]); } } else { $Value = is_string($Value) ? strtoupper($Value) : $Value; } $AttributeValue = $Operator == 'Like' || $Operator == 'NotLike' ? str_replace('*', "%", $Value) : $Value; $FilterComponent->setItem(new FilterRule($DbTablesPath, $FilterRuleOperator, $AttributeValue)); } return $FilterComponent; } } else { // Au moins une relation 1..* ou *..* ds la jointure eventuelle if (isset($_REQUEST[$Attribute]) && $_REQUEST[$Attribute] != '' && $_REQUEST[$Attribute] != '##' || isset($_SESSION[$Attribute]) && $_SESSION[$Attribute] != '' && $_SESSION[$Attribute] != '##' || $force == 1 || !empty($Value)) { // ne pas oublier de preciser ce parametre pour les relation 1..* if ($startEntity == '') { trigger_error('There is a 1..* relation in search criterions: you have to define EntitySearched in SearchForm constructor call !!', E_USER_ERROR); exit; } if ($Value == '' && SearchTools::requestOrSessionExist($Attribute) !== false) { $Value = SearchTools::requestOrSessionExist($Attribute); } if (is_string($Value)) { $Value = strtoupper($Value); } elseif (is_array($Value) && in_array('##', $Value)) { return false; } // Recuperation des Id qui conviennent $sql = SearchTools::getSQLfromMacro($startEntity, $DbTablesPath, $FilterRuleOperator, $Value); $result = Database::connection()->execute($sql); if (false === $result) { // si erreur sql if (DEV_VERSION) { echo $sql . '<br />'; } trigger_error(Database::connection()->ErrorMsg(), E_USER_ERROR); } if ($result->_numOfRows == 0) { // si 0 resultat $FilterComponent->setItem(new FilterRule('Id', FilterRule::OPERATOR_EQUALS, 0)); return $FilterComponent; } $valueArray = array(); while (!$result->EOF) { $valueArray[] = (int) $result->fields['_Id']; $result->moveNext(); } $FilterComponent->setItem(new FilterRule('Id', FilterRule::OPERATOR_IN, $valueArray)); return $FilterComponent; } } return false; }
/** * Transforme une date issue d'un Widget de date de QuickForm de la forme: * 'dMY H:i' * * @static * @param $fieldName string nom du champs * @access public * @return string */ static function quickFormDateToMySQL($fieldName) { if (SearchTools::requestOrSessionExist($fieldName) == false) { return false; } $date = SearchTools::requestOrSessionExist($fieldName); $month = isset($date['m']) ? $date['m'] : $date['M']; $return = $date['Y'] . '-' . sprintf('%02d', $month) . '-' . sprintf('%02d', $date['d']); if (isset($date['H'])) { $return .= ' ' . sprintf('%02d', $date['H']) . ':' . sprintf('%02d', $date['i']) . ':' . '00'; } return $return; }