Lançado Adianti Framework 8.1!
Clique aqui para saber mais
Validar hora Olá, como faço para validar um campo de hora(time no mysql) para não entrar valores inválidos? Obrigado....
MA
Validar hora  
Olá, como faço para validar um campo de hora(time no mysql) para não entrar valores inválidos?

Obrigado.

Curso Dominando o Adianti Framework

O material mais completo de treinamento do Framework.
Curso em vídeo aulas + Livro completo + Códigos fontes do projeto ERPHouse.
Conteúdo Atualizado!


Dominando o Adianti Framework Quero me inscrever agora!

Comentários (11)


NR

Veja os exemplos de validadores no tutor:
adianti.com.br/framework_files/tutor/index.php?class=FormValidationV

Se for o caso você pode criar um validador específico para hora.
FC

Podemos usar a classe TDateTime e criar um componente novo.

seguindo os passos do link
www.adianti.com.br/framework-extensibility

Criando a classe do novo componente salve em /app/lib/widget/TTime.php

  1. <?php
  2. /**
  3.  * TimePicker Widget
  4.  *
  5.  * @version    4.0
  6.  * @package    widget
  7.  * @subpackage form
  8.  * @author     Pablo Dall'Oglio / Felipe Cortez
  9.  * @copyright  Copyright (c) 2006 Adianti Solutions Ltd. (http://www.adianti.com.br)
  10.  * @license    http://www.adianti.com.br/framework-license
  11.  */
  12. class TTime extends TEntry implements AdiantiWidgetInterface
  13. {
  14.     private $mask;
  15.     private $dbmask;
  16.     protected $id;
  17.     protected $size;
  18.     protected $value;
  19.     
  20.     /**
  21.      * Class Constructor
  22.      * @param $name Name of the widget
  23.      */
  24.     public function __construct($name)
  25.     {
  26.         parent::__construct($name);
  27.         $this->id   'ttime_' mt_rand(10000000001999999999);
  28.         $this->mask 'hh:ii';
  29.         $this->dbmask null;
  30.     }
  31.     
  32.     /**
  33.      * Store the value inside the object
  34.      */
  35.     public function setValue($value)
  36.     {
  37.         if (!empty($this->dbmask) and ($this->mask !== $this->dbmask) )
  38.         {
  39.             return parent::setValueself::convertToMask($value$this->dbmask$this->mask) );
  40.         }
  41.         else
  42.         {
  43.             return parent::setValue($value);
  44.         }
  45.     }
  46.     
  47.     /**
  48.      * Return the post data
  49.      */
  50.     public function getPostData()
  51.     {
  52.         $value parent::getPostData();
  53.         
  54.         if (!empty($this->dbmask) and ($this->mask !== $this->dbmask) )
  55.         {
  56.             return self::convertToMask($value$this->mask$this->dbmask);
  57.         }
  58.         else
  59.         {
  60.             return $value;
  61.         }
  62.     }
  63.     
  64.     /**
  65.      * Convert from one mask to another
  66.      * @param $value original date
  67.      * @param $fromMask source mask
  68.      * @param $toMask target mask
  69.      */
  70.     public static function convertToMask($value$fromMask$toMask)
  71.     {
  72.         if ($value)
  73.         {
  74.             $value substr($value,0,strlen($fromMask));
  75.             
  76.             $phpFromMask str_replace( ['dd','mm''yyyy''hh''ii'], ['d','m','Y''H''i'], $fromMask);
  77.             $phpToMask   str_replace( ['dd','mm''yyyy''hh''ii'], ['d','m','Y''H''i'], $toMask);
  78.             
  79.             $date DateTime::createFromFormat($phpFromMask$value);
  80.             if ($date)
  81.             {
  82.                 return $date->format($phpToMask);
  83.             }
  84.         }
  85.         
  86.         return $value;
  87.     }
  88.     
  89.     /**
  90.      * Define the field's mask
  91.      * @param $mask  Mask for the field (dd-mm-yyyy)
  92.      */
  93.     public function setMask($mask)
  94.     {
  95.         $this->mask $mask;
  96.     }
  97.     
  98.     /**
  99.      *
  100.      */
  101.     public function setDatabaseMask($mask)
  102.     {
  103.         $this->dbmask $mask;
  104.     }
  105.     
  106.     /**
  107.      * Enable the field
  108.      * @param $form_name Form name
  109.      * @param $field Field name
  110.      */
  111.     public static function enableField($form_name$field)
  112.     {
  113.         TScript::create" tdate_enable_field('{$form_name}', '{$field}'); " );
  114.     }
  115.     
  116.     /**
  117.      * Disable the field
  118.      * @param $form_name Form name
  119.      * @param $field Field name
  120.      */
  121.     public static function disableField($form_name$field)
  122.     {
  123.         TScript::create" tdate_disable_field('{$form_name}', '{$field}'); " );
  124.     }
  125.     
  126.     /**
  127.      * Shows the widget at the screen
  128.      */
  129.     public function show()
  130.     {
  131.         $this->{'readonly'} = '1';
  132.         $wrapper = new TElement('div');
  133.         $wrapper->{'class'} = 'tdate-group tdatetimepicker input-append date ';
  134.         $wrapper->{'id'} = $this->id.'_wrapper';
  135.         $wrapper->{'data-date'} = $this->value;
  136.         $wrapper->{'data-date-format'} = $this->mask;
  137.         
  138.         if (strstr($this->size'%') !== FALSE)
  139.         {
  140.             $wrapper->{'style'} = "width: {$this->size}";
  141.             $this->size '100%';
  142.         }
  143.         
  144.         $span = new TElement('span');
  145.         $span->{'class'} = 'add-on btn btn-default tdate-group-addon';
  146.         
  147.         $i = new TElement('i');
  148.         $i->{'class'} = 'fa fa-clock-o icon-th';
  149.         $span->add($i);
  150.         ob_start();
  151.         parent::show();
  152.         $child ob_get_contents();
  153.         ob_end_clean();
  154.         $wrapper->add($child);
  155.         
  156.         if (parent::getEditable())
  157.         {
  158.             $wrapper->add($span);
  159.             TScript::create"ttime_start( '#{$this->id}_wrapper' );");
  160.         }
  161.         
  162.         $wrapper->show();
  163.     }
  164. }
  165. >?
  166. Altere o arquivo application.jsdentro de app/lib/include/
  167. function ttime_start(id) {
  168.     $(id).datetimepicker({
  169.         format"hh:ii",
  170.         autoclosetrue,
  171.         startView1,
  172.         minuteStep5
  173.         
  174.     })
  175. }
  176. Para saber mais sobre configurações do DataPicker http://www.malot.fr/bootstrap-datetimepicker/
  177. Depois pode usar esse exemplo do tutor para validar somente a hora 
  1. <?php
  2. /**
  3.  * FormQuickView
  4.  *
  5.  * @version    1.0
  6.  * @package    samples
  7.  * @subpackage tutor
  8.  * @author     Pablo Dall'Oglio
  9.  * @copyright  Copyright (c) 2006 Adianti Solutions Ltd. (http://www.adianti.com.br)
  10.  * @license    http://www.adianti.com.br/framework-license
  11.  */
  12. class FormQuickView extends TPage
  13. {
  14.     private $form;
  15.     
  16.     /**
  17.      * Class constructor
  18.      * Creates the page
  19.      */
  20.     function __construct()
  21.     {
  22.         parent::__construct();
  23.         
  24.         // create the form using TQuickForm class
  25.         $this->form = new TQuickForm;
  26.         $this->form->class 'tform';
  27.         $this->form->setFormTitle('Quick Form');
  28.         
  29.         // create the form fields
  30.         $id          = new TEntry('id');
  31.         $description = new TEntry('description');
  32.         $password    = new TPassword('password');
  33.         $created     = new TTime('created');
  34.         $expires     = new TDate('expires');
  35.         $value       = new TEntry('value');
  36.         $color       = new TColor('color');
  37.         $weight      = new TSpinner('weight');
  38.         $type        = new TCombo('type');
  39.         $text        = new TText('text');
  40.         
  41.         $id->setEditable(FALSE);
  42.         $created->setMask('hh:ii');
  43.         $expires->setMask('dd/mm/yyyy');
  44.         //$created->setDatabaseMask('hh:ii');
  45.         $expires->setDatabaseMask('yyyy-mm-dd');
  46.         $value->setNumericMask(2',''.'true);
  47.         $value->setSize(145);
  48.         $color->setSize(120);
  49.         $created->setSize(120);
  50.         $expires->setSize(120);
  51.         $weight->setRange(1,100,1);
  52.         $weight->setSize(130);
  53.         $type->setSize(140);
  54.         $type->addItems( [ 'a' => 'Type a''b' => 'Type b''c' => 'Type c'] );
  55.         
  56.         //$created->setValue( date('Y-m-d H:i') );
  57.         $expires->setValuedate('Y-m-d'strtotime("+1 days")) );
  58.         $value->setValue(123.45);
  59.         $weight->setValue(30);
  60.         $color->setValue('#FF0000');
  61.         $type->setValue('a');
  62.         
  63.         // add the fields inside the form
  64.         $this->form->addQuickField($l0=new TLabel('Id'),    $id,    40);
  65.         $this->form->addQuickField('Description'$description380);
  66.         $this->form->addQuickField('Password'$password380);
  67.         $this->form->addQuickFields('Created at', array($created$l1=new TLabel('Expires at'), $expires));
  68.         $this->form->addQuickFields('Value', array($value$l2=new TLabel('Color'), $color));
  69.         $this->form->addQuickFields('Weight', array($weight$l3=new TLabel('Type'), $type));
  70.         
  71.         $description->placeholder 'Description placeholder';
  72.         $description->setTip('Tip for description');
  73.         $l0->setFontColor('blue');
  74.         $l1->setSize(80);
  75.         $l2->setSize(80);
  76.         $l3->setSize(80);
  77.         
  78.         $row $this->form->addRow();
  79.         $row->class 'tformsection';
  80.         $cell $row->addCell( new TLabel('Division'));
  81.         $cell->colspan 2;
  82.         $cell->style 'height:30px; border-top: 1px solid gray;';
  83.         
  84.         $this->form->addQuickField('Description'$text120);
  85.         $text->setSize(38050);
  86.         
  87.         // define the form action 
  88.         $this->form->addQuickAction('Send', new TAction(array($this'onSend')), 'fa:check-circle-o green');
  89.         
  90.         // wrap the page content using vertical box
  91.         $vbox = new TVBox;
  92.         $vbox->add(new TXMLBreadCrumb('menu.xml'__CLASS__));
  93.         $vbox->add($this->form);
  94.         parent::add($vbox);
  95.     }
  96.     
  97.     /**
  98.      * Simulates an save button
  99.      * Show the form content
  100.      */
  101.     public function onSend($param)
  102.     {
  103.         $data $this->form->getData(); // optional parameter: active record class
  104.         
  105.         // put the data back to the form
  106.         $this->form->setData($data);
  107.         
  108.         // creates a string with the form element's values
  109.         $message 'Id: '           $data->id '<br>';
  110.         $message.= 'Description : ' $data->description '<br>';
  111.         $message.= 'Password : '    $data->password '<br>';
  112.         $message.= 'Created: '      $data->created '<br>';
  113.         $message.= 'Expires: '      $data->expires '<br>';
  114.         $message.= 'Value : '       $data->value '<br>';
  115.         $message.= 'Color : '       $data->color '<br>';
  116.         $message.= 'Weight : '      $data->weight '<br>';
  117.         $message.= 'Type : '        $data->type '<br>';
  118.         $message.= 'Text : '        $data->text '<br>';
  119.         
  120.         // show the message
  121.         new TMessage('info'$message);
  122.     }
  123. }
  124. ?>



MA

Ótimo Felipe isso vai atender, vou testar.
Ainda estou engatinhando em onde colocar os códigos e tal mas vamos em frente.

Obrigado.
AG

Boa tarde!
Eu fiz tudo como indicado no post do Felipe Cortez e de acordo com o link para a framework extensibility, mas estou a ter um problema na visualização do componente porque não aparecem as setas para mudar a data nem botões para cancelar ou voltar atrás, nem as cores correspondem ao template.

Um campo com TDateTime, no template 4, aparece com o cabeçalho vermelho. No outro com TTime aparece apenas a data atual (dia e mês) com fundo cinza.

Já verifiquei o código gerado e as classes são as mesmas por isso não percebo porque é que não aparece bem...

Alguém pode ajudar-me?

P.S. Sou novato no Adianti Studio

Obrigado,

Abel Gomes
AG

Olá a todos!

Depois de muito bater com a cabeça com o componente TTime, sugerido pelo amigo Felipe Cortez, pois não conseguia que aparecessem as formatações CSS corretamente (nem ícones, nem cores), acabei por procurar um pouco de informação sobre o bootstrapMaterialDatePicker, utilizado pelo componente TDateTime, e descobri que para desativar as datas e ficar apenas com as horas basta usar o método setOption com a opção 'date' = FALSE.

Fica assim:

  1. <?php 
  2.  $campo_hora=new TDateTime('campo_hora');  // de seguida basta utilizar os métodos abaixo:
  3. $campo_hora setOption('date'FALSE); // esta opção faz desaparecer o calendário e mostra logo o relógio, o que resolve o meu problema.
  4. $campo_hora setMask('hh:ii'); // aqui defino que só preciso de ver no meu campo as horas.
  5. ?>


Mais iformação em: https://www.jqueryscript.net/time-clock/Pretty-Date-Time-Picker-Plugin-For-Boots

Espero ter ajudado!

Um abraço.
Abel Gomes
BI

Ficou bom o novo componente, tem como alterar o layout?
pois ele exibe opções de 5 minutos, preciso de intervalo de 1 minuto.
AG

A mim aparece-me o relógio com intervalo de 5 em 5 minutos, mas dá para clicar no espaço vazio e ele devolve o minuto que escolhi. Pr exemplo, se clicar entre o 15 e 20 ele escolhe o 16, 17, 18 e 19, conforme a posição do clique.

Mais informações sobre o componente em t00rk.github.io/bootstrap-material-datetimepicker/

Um abraço.
Abel Gomes
BI

Abel, você criou o componente TTime ou só escondeu a data do TDateTime?
Estou utilizando o TTime e veja no print como aparece pra mim...

https://drive.google.com/file/d/17K63HPWX09IAyWdUE4mjWp-mmr7MKswh/view?usp=sharing
AG

Esse foi, justamente, o meu problema inicial: a classe TTime ficava desconfigurada em relação ao template.

A solução foi esconder a data no componente TDateTime com o método setOption com a opção 'date' = FALSE. e funcionou na perfeição.

Espero ter ajudado.

Abraço de Portugal!

Abel Gomes

FT

Olá pessoal. Coloquei o novo componente TTime mas quando vou usar em um form aparece apenas o campo bloqueado (cinza) sem nenhuma opção quando clico. Estou na versão 5 do adianti usando o tema adminlte tema 3
AG

Oi Felipe!
Será que você podia colocar um printscreen do que lhe está a acontecer? E já agora, a parte do código onde você utiliza o componente TTime.
Não sei se conseguirei ajudar, mas vou tentar... ;-)
Cumprimentos,
Abel Gomes