Пример #1
0
 /**
  * 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>&nbsp;&nbsp;{\$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}&nbsp;{\$form." . $name . ".html}&nbsp;{\$form." . $Endname . ".label}&nbsp;{\$form." . $Endname . '.html}</div>';
             }
         } elseif ($type == 'blank') {
             $ElementsToDisplay[] = '&nbsp;';
             // Si nombre impair d'elements a afficher, on rajoute un <td>&nbsp;</td>
             if (count($ElementsToDisplay) % 2 != 0) {
                 $ElementsToDisplay[] = '&nbsp;';
             }
         } 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}&nbsp;</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>&nbsp;</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'] . '\'"/>&nbsp;';
             }
         }
         $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;
 }
Пример #2
0
 /**
  * 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;
 }
Пример #3
0
 /**
  * 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;
 }