Lançado Adianti Framework 7.6!
Clique aqui para saber mais
WFPNotification 1.0 (Componente de Notificação estilo Noty) Olá pessoal gostaria de deixar um componente para vocês (seguindo as diretrizes de extensibilidade do Adianti) O Componente mostra notificações no estilo Noty http://ned.im/noty/ > Noty WebPage O/s Componente/s,pastas,etc tem inicias de acordo com o Autor (Willian Fernando Padilha) > wfp O Componente permite emitir notificações Simples Tem configuração para tr...
WP
WFPNotification 1.0 (Componente de Notificação estilo Noty)  
Olá pessoal gostaria de deixar um componente para vocês (seguindo as diretrizes de extensibilidade do Adianti)
O Componente mostra notificações no estilo Noty ned.im/noty/ > Noty WebPage
O/s Componente/s,pastas,etc tem inicias de acordo com o Autor (Willian Fernando Padilha) > wfp


O Componente permite emitir notificações Simples
Tem configuração para trocar a posição da mensagem, trocar o tipo de mensagem, e o tempo que ela ficara visivel (opcional)
Tambem permite adicionar uma TAction (ação nativa do Adianti Framework) Ver exemplo de uso.


Passos a seguir para implementar o mesmo

1- Descompactar o Componente dentro da pasta lib (na raiz do projeto) vai ser criado uma pasta chamada wfp dentro dela estará outra pasta chamada wfpwidgets e dentro dessa o componente WFPNotification.php > ficando algo como lib/wfp/wfpwidgets/WFPNotification.php
2- Fazer download do Noty usando este link https://github.com/needim/noty/archive/v3.1.0.zip
3- Descompactar o arquivo dentro da pasta app/lib/include apos isso renomear a pasta noty-3.1.0 para noty
4- No arquivo libraries.html do seu Template de uso (theme1,theme2 ou theme3) que fica dentro de app/templates/theme(1,2 ou 3)/libraries.html
Adicionar as seguintes linhas
<link href="app/lib/include/noty/lib/noty.css" rel="stylesheet"></script> <script src="app/lib/include/noty/lib/noty.js" type="text/javascript"></script>



Limpar Cache (por via das duvidas)

Exemplo do componente em execução (imagens)

https://drive.google.com/open?id=0B4m-6Y4mJcdvT0xHUFM1djhWVmc > Gif Animado
https://drive.google.com/open?id=0B4m-6Y4mJcdvNmVTR2k2dFFEa1E > Imagen


Para usar o componente devem importalo para o uso com use Wfp\Wfpwidgets\WFPNotification;

O Componente esta altamente documentado basta abrir o arquivo e ver os metodos disponiveis (mas podem consultar quando quiser)

Podem tambem copiar o conteudo abaixo para fazer os testes (com alguns exemplos incluidos)

  1. <?php
  2. use Wfp\\Wfpwidgets\\WFPNotification;
  3. class PublicView extends TPage
  4. {
  5.     public function __construct()
  6.     {
  7.         parent::__construct();
  8.         
  9.         $html = new THtmlRenderer('app/resources/public.html');
  10.         // replace the main section variables
  11.         $html->enableSection('main', array());
  12.         
  13.         $panel = new TPanelGroup('Public!');
  14.         $panel->add($html);
  15.         $panel->style 'margin: 100px';        
  16.         $action = new TAction(array('PublicView''actionNoty1'));
  17.         $boton = new TElement('a');
  18.         $boton->{'class'} = 'btn btn-primary';
  19.         $boton->{'generator'} = 'adianti';
  20.         $boton->{'href'} = $action->serialize();
  21.         $boton->add('Execute Noty With Action');
  22.         $panel->add($boton);
  23.         
  24.         $action = new TAction(array('PublicView''actionNoty2'));
  25.         $boton = new TElement('a');
  26.         $boton->{'class'} = 'btn btn-primary';
  27.         $boton->{'generator'} = 'adianti';
  28.         $boton->{'href'} = $action->serialize();
  29.         $boton->add('Noty Examples');
  30.         $panel->add($boton);
  31.         
  32.         // add the template to the page
  33.         parent::add$panel );
  34.     }
  35.     public function actionNoty1($param) {
  36.         $action = new TAction(array('PublicView''showActionNoty'));
  37.         $noty = new WFPNotification();
  38.         $noty->setMessage('<big>Noty With TAction</big>');
  39.         $noty->setType('warning');
  40.         $noty->addActionButton('Process Action'$action);
  41.         $noty->show();
  42.     }
  43.     public function actionNoty2($param) {
  44.         new WFPNotification('Hello World Default (Information)');
  45.         //alert,success,warning,error,information
  46.         new WFPNotification('Hello World Alert','alert');
  47.         new WFPNotification('Hello World Success','success');
  48.         new WFPNotification('Hello World Warning','warning');
  49.         new WFPNotification('Hello World Error','error');
  50.     }
  51.     public function showActionNoty($param) {
  52.         $string_parametros "<i>Parameter of Action</i> \\r\\n".implode("\\r\\n"$param);
  53.         new WFPNotification($string_parametros);
  54.     }
  55. }
  56. ?>


Podem opinar, perguntar, sugerir sem problemas , espero que seja util

Atte.: Willian Fernando Padilha

Tags: Componente, Component, Notificação, Noty, Notification, Alert

Curso completo Meu Negócio Pronto
Use para si, ou transforme em um negócio: Inclui aulas e códigos-fontes
Gestor de conteúdo (SITE) + Loja Virtual (E-Commerce) + Emissor de Notas para infoprodutos


Meu negócio pronto Quero me inscrever agora!

Comentários (15)


FC

Oi Willian

Tava passando por aqui e resolvi testar seu componente, me permite mudar um pouco a instalação?

A sua Classe WFPNotification.php pode ser salva em app/lib/widget/WFPNotification.php e não na pasta lib (está não deve ser alterada)

retire o names space e o use StdClass da mesma pronto pode rodar o exemplo sem o ( use WfpWfpwidgetsWFPNotification;)

Vai funcionar e não irá mexer no core do Adianti.

Abraços...
Felipe Cortez
WP

Olá Felipe, agradeço seu comentario porem segue as respostas

A sua Classe WFPNotification.php pode ser salva em app/lib/widget/WFPNotification.php e não na pasta lib (está não deve ser alterada)
* Em nenhum momento é alterada a estrutura natural/original da pasta* Veja o que diz adianti.com.br/framework-extensibility
Meu componente é de uso com NameSpace, e tambem no futuro vou contribuir com mais componentes, sendo assim os mesmo ja estarão organizados e devidamente estruturados

Vai funcionar e não irá mexer no core do Adianti.
* Em nenhum momento é alterado nada no core do Adianti

Abraços

P.D: O que achou do Componente?
FC

Achei muito bacana, a minha sugestão foi na direção de fazer o componente global assim não precisa ficar chamando a classe com use e não ter dificuldade em novas atualizações do framework visto que substituem os a pasta lib inteira.

No demais tá perfeito ótimo trabalho.

Sds
CM

Willian, boa tarde!
achei muito interessante, seu post.
Favor tirar uma dúvida:
Como faria para, através de um onSave, por exemplo, enviar uma notificação ao PC de um determinado usuário?


Obrigado!
WP

Celio , na versão atual do componente apenas é possivel emitir avisos para o usuario atual, ainda não é possivel enviar a outro usuario, mas a ideia é legal vou ver para implementar isso, sobre a regra de negocio do Adianti e seu template
CM

Valeu Willian!
Vou ficar aguardando, pois estou desenvolvendo um controle de portaria que vai precisar enviar notificação na chegada de um caminhão.

Obrigado pela atenção!
LG

Bom dia Willian Padilha, para utilizar este componente na versão 5.0 do adianti, precisa realizar alguns ajustes? já testou na nova versão?
WP

Ola Leandro ainda não testei
Em teoria segue o mesmo procedimento e deveria funcionar normalmente
LG

Olá Wilian, realizei aqui a depuração, e o erro ocorria na linha 158.
theme: 'mint',//default theme
removir o comentário e parou de dar erro.
fica ai a solução caso alguem passe pelo mesmo problema, só não entendir porque isto só ocorre na versão nova.
WP

Vlw Leandro pelo Feedback
Vou anotar aqui e fazer os testes na vr. 5 e liberar a correção 👍
WP

Componente atualizado e corrigido os Bugs mencionados, tambem foi melhorado a geração do Script do mesmo, estou disponibilizando ele no Onedrive (ainda não tenho GitHub)

https://1drv.ms/f/s!AhsroCiTfrMLkTRuFqRUidbvOFRb

foi totalmente atualizado agora esta funcional em todos os Templates (1,2,3,4)
JR

Olá, Wiliam. Testei aqui e ficou show!

Eu vi que tem como colocar um som ou efeitos nessas notificações.
Como é feito isso pelo adianti?

Abraço
FK

Estou utilizando muito legal, parabéns.
LC

Willian, parabéns, funcionando aqui com a versão 5.7, detalhe que eu segui a instalação conforme o Felipe, ficando o arquivo WFPNotification.php na pasta
"\app\lib\widget"
para usar em varias classes sem ter que colocar
use Wfp\Wfpwidgets\WFPNotification
, assim mudei o inicio do arquivo comentando as linhas:
  1. <?php
  2. //namespace Wfp\Wfpwidgets;
  3. /**
  4.  * Description of WFPNotification
  5.  * Notifacacions con la biblioteca NOTY Jquery (http://ned.im/noty/)
  6.  * @version    1.0
  7.  * @package    wfp
  8.  * @subpackage wfpwidgets
  9.  * @author     Willian Padilha - Paraguay (willan_fer@hotmail.com / Skype:willian-padilha)
  10.  */
  11. //use Adianti\Widget\Base\TScript;
  12. //use Adianti\Control\TAction;
  13. //use Adianti\Widget\Dialog\TMessage;
  14. //use Adianti\Widget\Util\TImage;
  15. //use ReflectionMethod;
  16. //use stdClass;
  17. ?>
LC

Fiz mais uma pequena mudança, coloquei opção para alterar o tema, vou colocar o código todo completo abaixo

O tema esta como padrão o mint alterei para relax(achei mais bonito), mais pode ser mudado usando, exemplo:

  1. <?php
  2.     $noty = new WFPNotification();
  3.     $noty->setMessage(TAdiantiCoreTranslator::translate('Record saved'));
  4.     $noty->setType('success');
  5.     $noty->setTheme('bootstrap-v3');
  6.     $noty->show();
  7. ?>

ou
  1. <?php
  2.     new WFPNotification(TAdiantiCoreTranslator::translate('Record saved'), 'success''topRight'3.5FALSE'bootstrap-v4');
  3. ?>


Classe completa (conforme a original, com as alterações do tema):
  1. <?php
  2. namespace Wfp\Wfpwidgets;
  3. /**
  4.  * Description of WFPNotification
  5.  * Notifacacions con la biblioteca NOTY Jquery (http://ned.im/noty/)
  6.  * @version    1.0
  7.  * @package    wfp
  8.  * @subpackage wfpwidgets
  9.  * @author     Willian Padilha - Paraguay (willan_fer@hotmail.com / Skype:willian-padilha)
  10.  */
  11. use Adianti\Widget\Base\TScript;
  12. use Adianti\Control\TAction;
  13. use Adianti\Widget\Dialog\TMessage;
  14. use Adianti\Widget\Util\TImage;
  15. use ReflectionMethod;
  16. use stdClass;
  17. class WFPNotification {
  18.     /**
  19.      *
  20.      * @var stdClass $message Estructura del Mensaje a ser Emitido
  21.      */
  22.     private $message;
  23.     private $id;
  24.     private $actions;
  25.     private $ok TRUE;
  26.     private $theme;
  27.     /**
  28.      * constructor puede recibir parametros directamente
  29.      * @param string $message Mensaje a ser mostrado (si este no se informa se debe utilizar los metodos auxiliares) Puede Ser un HTML
  30.      * @param string $tipo Tipo del mensaje a ser mostrado 
  31.      *                      (alert,success,warning,error,information)
  32.      *                      >> En caso de ser del Tipo Error no tiene TimeOut
  33.      * @param string $position Posicion del mensaje 
  34.      *                          (top,topLeft,topCenter,topRight,center,centerLeft,centerRight,bottom,bottomLeft,bottomCenter,bottomRight)
  35.      * @param bool/numeric $timeout TimeOut para desaparecer el mensaje (si es FALSE no tiene Timeout)
  36.      * @param bool $modal Si se muestra en formato MODAL o NO
  37.      * @param string $theme (mint, sunset, relax, nest, metroui, semanticui, light, bootstrap-v3, bootstrap-v4)
  38.      */
  39.     public function __construct($message NULL$tipo 'information'$position 'topRight'$timeout 3.5$modal FALSE$theme 'relax') {
  40.         $this->id 'wfp_noty_' mt_rand(10000000001999999999);
  41.         $this->message = new stdClass();
  42.         $this->actions = array();
  43.         $this->setMessage($message);
  44.         $this->setType($tipo);
  45.         $this->setPosition($position);
  46.         $this->setTimeOut($timeout);
  47.         $this->message->modal $modal;
  48.         $this->setTheme($theme);
  49.         if (!is_null($message)) {
  50.             $this->show();
  51.         }
  52.     }
  53.     /**
  54.      * Setear la posicion en donde aparecer la notiicacion
  55.      * @param string $position (top,topLeft,topCenter,topRight,center,centerLeft,centerRight,bottom,bottomLeft,bottomCenter,bottomRight)
  56.      */
  57.     public function setPosition($position) {
  58.         $positions = array('top''topLeft''topCenter''topRight''center''centerLeft''centerRight''bottom''bottomLeft''bottomCenter''bottomRight');
  59.         if (!array_search($position$positions)) {
  60.             new TMessage('error'"Position <b>'{$position}'</b> Not Suported For WFPNotification");
  61.             $this->ok FALSE;
  62.             return;
  63.         }
  64.         $this->message->position $position;
  65.     }
  66.     /**
  67.      * Setear el Timeout de la Notificacion (si es FALSE no tiene Notificacion)
  68.      * @param boll/numeric $timeout (En Segundos)
  69.      */
  70.     public function setTimeOut($timeout) {
  71.         if (isset($this->message->tipo) && $this->message->tipo == 'error') {
  72.             //en caso de error no tiene TimeOut (esto es para que de el tiempo suficiente del usuario leer el mensaje)
  73.             $this->message->timeout 'false';
  74.             return;
  75.         }
  76.         $timeout_val = ($timeout === FALSE FALSE : (is_numeric($timeout) ? $timeout 3.5));
  77.         if (is_numeric($timeout)) {
  78.             $timeout_val $timeout 1000;
  79.         }
  80.         $this->message->timeout $timeout_val;
  81.     }
  82.     /**
  83.      * Setear el Mensaje de la Notificacion
  84.      * @param string $message
  85.      */
  86.     public function setMessage($message) {
  87.         $this->message->msg $message;
  88.     }
  89.     /**
  90.      * Setear el Tipo de la Notificacion
  91.      * @param string $tipo (alert,success,warning,error,information)
  92.      */
  93.     public function setType($tipo) {
  94.         $tipos = array('alert''success''warning''error''information');
  95.         if (!in_array($tipo$tipos)) {
  96.             new TMessage('error'"Option <b>'{$tipo}'</b> Not Suported For WFPNotification");
  97.             $this->ok FALSE;
  98.             return;
  99.         }
  100.         $this->message->tipo $tipo;
  101.     }
  102.     /**
  103.      * Setear el Theme de la Notificacion
  104.      * @param string $theme (mint, sunset, relax, nest, metroui, semanticui, light, bootstrap-v3, bootstrap-v4)
  105.      */
  106.     public function setTheme($theme) {
  107.         $themes = array('mint''sunset''relax''nest''metroui''semanticui''light''bootstrap-v3''bootstrap-v4');
  108.         if (!in_array($theme$themes)) {
  109.             $this->theme 'mint';
  110.         }
  111.         else {
  112.             $this->theme $theme;   
  113.         }
  114.     }
  115.     /**
  116.      * 
  117.      * @param string $titulo_action Titulo del Boton de Acción
  118.      * @param TAction $action Objeto Accion
  119.      * @param string $class_btn Class del BTN a tener la accion
  120.      * @param string $iconBtn Icono o Imagen para el BTN
  121.      */
  122.     public function addActionButton($titulo_actionTAction $action$class_btn 'primary'$iconBtn FALSE) {
  123.         if ($iconBtn) {
  124.             $titulo_action = new TImage($iconBtn) . $titulo_action;
  125.             $titulo_action $titulo_action;
  126.         }
  127.         $class_name $action->getAction();
  128.         $class is_object($class_name[0]) ? get_class($class_name[0]) : $class_name[0];
  129.         $method $class_name[1];
  130.         if (method_exists($class$method)) {
  131.             $method = new ReflectionMethod("{$class}::{$method}");
  132.             if ($method->isStatic()) {
  133.                 $action->setParameter('static'1);
  134.             }
  135.         }
  136.         $btn 'Noty.button('.json_encode($titulo_action).", \"btn btn-{$class_btn}\", function () {__adianti_load_page(\"{$action->serialize()}\"); {{$this->id}.close();}})";
  137.         $this->actions[] = $btn;
  138.     }
  139.     /**
  140.      * Mostrar Notificacion
  141.      */
  142.     public function show() {
  143.         if (!$this->ok) {
  144.             return;
  145.         }
  146.         //Si tiene acciones se deshabilita el TimeOut (para que el usuario tenga el tiempo de interactuar)
  147.         if (count($this->actions) > 0) {
  148.             $this->setTimeOut(FALSE);
  149.         }
  150.         $buttons '';
  151.         foreach ($this->actions as $key => $value) {
  152.             if ($key 0) {
  153.                 $buttons .= ',';
  154.             }
  155.             $buttons .= $value;
  156.         }
  157.         $object_noty = new stdClass();
  158.         $object_noty->type $this->message->tipo;
  159.         $object_noty->layout $this->message->position;
  160.         $object_noty->theme $this->theme;
  161.         $object_noty->text $this->message->msg;
  162.         $object_noty->timeout $this->message->timeout;
  163.         $object_noty->progressBar TRUE;
  164.         $object_noty->modal $this->message->modal;
  165.         $object_noty->closeWith = array('click''button');
  166.         $obj_animation = new stdClass();
  167.         $obj_animation->open 'noty_effects_open';
  168.         $obj_animation->close 'noty_effects_close';
  169.         $object_noty->animation $obj_animation;
  170.         $object_noty->id FALSE;
  171.         $object_noty->force FALSE;
  172.         $object_noty->killer FALSE;
  173.         $object_noty->queue 'global';
  174.         $object_noty->container FALSE;
  175.         $object_noty->buttons '#BUTTONS#';
  176.         $obj_sounds = new stdClass();
  177.         $obj_sounds->sources = array();
  178.         $obj_sounds->volume 1;
  179.         $obj_sounds->conditions = array();
  180.         $object_noty->sounds $obj_sounds;
  181.         $obj_titleCount = new stdClass();
  182.         $obj_titleCount->conditions = array();
  183.         $object_noty->titleCount $obj_titleCount;
  184.         $script "var {$this->id} = new Noty(".json_encode($object_noty).").show();";
  185.         $script str_replace('"#BUTTONS#"''['.$buttons.']'$script);
  186.         TScript::create($script);
  187.     }
  188. }
  189. ?>