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



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