Bootstrao toggle perde a configuração

Prezados,
Preciso de uma ajuda para o seguinte problema:
Implementei o código do boostrap toogle em um campo da consulta (grid) no evento onRecord.
{campo} = ‘’;
Funcionou perfeitamente, só que ao navegar entre as páginas ou usar o quicksearch ele perde a configuração e aparece a imagem de um checkbox original do html.
Já tentei de todas as formas, porém não consegui resolver.
Será que alguem pode me ajudar?
Obrigado desde já

{campo} = input type=“checkbox” checked data-toggle=“toggle” data-on=“Confirmado” data-off=“Aguardando” data-data-onstyle=“primary” data-offstyle=“danger” data-offstyle=“danger” data-size=“small” data-width=“100” data-style=“slow”;
Obs: tirei as tags dos inputs para poder exibir o código utilizado

Seria isso?

https://dev.infinitusweb.net.br/scriptcase/grid_btn_run_com_toggle/
Captura de Tela 2020-08-26 às 20.06.46
*Navegue entre as páginas e selecione as linhas, verá que não perde a marcação.
*Obs: Não usa bootstrap.

para exibir código aqui, escreva o código entre [code] e [/code]

onApplicationInit

[iw] = new stdClass;
[iw]->ajax=sc_url_library('prj','apps','php/grid_dfrun_toggle_btn_ajax.php');
unset($_SESSION['grid_dfrun_toggle_btn']);

onScriptInit

sc_include_library('prj','BtnToggle','btntoggle.class.php');

$toggle = new BtnToggle();
$toggle->echoStyle('small', 'small_red','red', '0.6');
$toggle->echoStyle('small', 'small_blue','blue', '0.6');
$toggle->echoStyle('small', 'small_orange','orange', '0.6');

?><script src=<?php echo sc_url_library('prj','apps','js/grid_dfrun_toggle_btn.js');?> ></script><style>.scGridHeaderFont { color: #FFF !important; }</style><?php

onRecord

$seq={sc_seq_register};
$ajax=[iw]->ajax;
$toggle = new BtnToggle();

if ({valor} < 200) $color='red';
elseif ({valor} < 300) $color='orange';
else  $color='blue';

if (isset($_SESSION['grid_dfrun_toggle_btn'][{id}]) && $_SESSION['grid_dfrun_toggle_btn'][{id}]) :
	$checked='checked';
else:
	$checked='';
endif;

{Check}= $toggle->generateTag('chk'.$seq,'small_'.$color,"jscheck('chk$seq', {id}, '$ajax',{valor});",$checked);

Criar botão manualmente: Processar

if (isset($_SESSION['grid_dfrun_toggle_btn'])):
   ksort($_SESSION['grid_dfrun_toggle_btn']);
   $_arr=$_SESSION['grid_dfrun_toggle_btn'];
   foreach ($_arr as $key => $value) 
	{   
		if ($value != 1) 	{ unset($_arr[$key]);}
	   	else 				{ $_arr[$key]='Checked'; }
	} 
	echo '<pre>';
	print_r($_arr);
	echo '</pre>';

	unset($_SESSION['grid_dfrun_toggle_btn']);

endif;

Cabeçalho
valor: Total Selecionado: <b><span style=font-size:large id=idsel>R$ 0,00</span></b>

Desenvolvi essa classe para substituir o ruim botão run do SC, pois esse perde a marcação ao navegar entre as páginas.

Segue as bibliotecas que devem ser incorporadas como externa em projetos:

http://iwh.tec.br/download/apps.zip
http://iwh.tec.br/download/BtnToggle.zip

TAGS: HAROLDO, GRID, RUN, BOTÃO, TOGGLE, IOS

Um tópico referente: Mensagem Bootstrap

6 Curtidas

Caro Haroldo,
É exatamente isso!
O scriptcase até fornece um método ajax é depois a macro sc_refresh, entretanto quando a conexão é lenta o usuário acaba clicando várias vezes até atualizar. Com este método que você implementou isso não acontece.
Vou implementar seu código é logo após isso volto aqui para dar o feedback.
Obrigado por tudo.

1 Curtida

Excelente Haroldo ! A comunidade agradece !

2 Curtidas

Dica sensacional.
Obrigado, mestre Haroldo!

2 Curtidas

Simplesmente lindo de se ver.
Impagável.
“Desenvolvi essa classe para substituir o ruim botão run do SC, pois esse perde a marcação ao navegar entre as páginas.” Ruim é pouco para esse “run” do SC !!!
Muito obrigado por compartilhar.

2 Curtidas

Perfeito, funcionou.
Obrigado pela contribuição Haroldo.

1 Curtida

Show, muito boa orientação

Simplesmente fantástico!

1 Curtida

Haroldo, boa tarde!
tentei baixar suas classes para realizar o teste em meu sistema, mais a página está dando 404. Pode me ajudar?
Obs: só preciso incluir um toggle simples em uma grid, consegue me ajuda?

Não conseguiu baixar no meu GIT?

seria dos links que você sitou no seu post.
https://dev.infinitusweb.net.br/scriptcase/grid_btn_run_com_toggle/

http://iwh.tec.br/download/apps.zip
http://iwh.tec.br/download/BtnToggle.zip
se tiver isso no seu git e puder me enviar, eu agredeço.

Boa tarde! Já faz um tempo desde que esse tópico foi criado, rs. Gostaria de tirar uma dúvida sobre como capturar os IDs que foram desmarcados. Estou implementando um controle de gravidade para determinadas situações. Se o checkbox estiver marcado, faço o update para “grave”, e se for desmarcado, mudo para “não grave”.

O problema é que, quando desmarco, não retorna nenhum ID:

Array
(
)

Alguém poderia me ajudar a entender onde devo implementar a lógica para capturar os IDs desmarcados?

foreach ($_arr as $id => $status) {
if ($status == ‘Checked’) {
$sql = “UPDATE sga_Plano_Acao SET Gravidade = ‘Grave’ WHERE Id_PA = $id”;
} else {
$sql = “UPDATE sga_Plano_Acao SET Gravidade = ‘Não Grave’ WHERE Id_PA = $id”;
}
$nm_select = $sql;
$rf = $this->Db->Execute($nm_select);
if ($rf === false) {
$_erro = $this->Db->ErrorMsg();
} else {
$rf->Close();
}
}

a parte de fazer update em quando está check funciona normal.

Primeiro tem que explanar de qual forma está usando o toggle, tipo de aplicação, evento.

No evento do botão processar o código demonstra como testar se o objeto está checado ou não .

Porque não utiliza as macros do SC para update no banco de dados?

1 Curtida

Bom dia, Haroldo

Então, todo o resto está igual ao seu exemplo. O que mudei foi apenas o nome do ID e o campo que receberia o botão toggle.

A maior mudança foi no botão de processar, que coloquei para fazer os updates nos IDs retornados.

if (isset($_SESSION[‘grid_dfrun_toggle_btn’])):
ksort($_SESSION[‘grid_dfrun_toggle_btn’]);
$_arr=$_SESSION[‘grid_dfrun_toggle_btn’];
foreach ($_arr as $key => $value)
{
if ($value != 1) { unset($_arr[$key]);}
else { $_arr[$key]=‘Checked’; }
}
echo ‘

’;
print_r($_arr);
echo ‘
’;
$_SESSION['grid_dfrun_toggle_btn'] = $_arr;

foreach ($_arr as $id => $status) {
    if ($status == 'Checked') {
        $sql = "UPDATE sga_Plano_Acao SET Gravidade = 'Grave' WHERE Id_PA = $id";
		sc_exec_sql($sql);
    } else {
        $sql = "UPDATE sga_Plano_Acao SET Gravidade = 'Não Grave' WHERE Id_PA = $id";
		sc_exec_sql($sql);
    }
}

endif;

Em relação a não usar a macro do SC, como estou acostumada a fazer do zero com PHP, ainda não peguei o costume. Mas as macros estão aí para facilitar, então já fiz a troca.

Não vejo problemas no código, aparentemente.

o que resulta o print_r?

Quanto a não usar as macros do SC para update, não foi uma crítica, acho até legal usar em código php. Foi só uma curiosidade mesmo.

1 Curtida

Apesar do exemplo ser bastante antigo, eu gerei na versão mais recente do SC e continua funcionando normalmente.

OnApplicateionInit:

[iw] = new stdClass;
[iw]->ajax=sc_url_library('prj','apps','php/grid_dfrun_toggle_btn_ajax.php');
unset($_SESSION['grid_dfrun_toggle_btn']);

OnScriptInit:

sc_include_library('prj','BtnToggle','btntoggle.class.php');

$toggle = new BtnToggle();
$toggle->echoStyle('small', 'small_red','red', '0.6');
$toggle->echoStyle('small', 'small_blue','blue', '0.6');
$toggle->echoStyle('small', 'small_orange','orange', '0.6');

?>	
<script src=<?php echo sc_url_library('prj','apps','js/grid_dfrun_toggle_btn.js');?> ></script>

<style>.scGridHeaderFont { color: #FFF !important; }</style>
				   
<?php

OnRecord:

$seq={sc_seq_register};
$ajax=[iw]->ajax;
$toggle = new BtnToggle();

if ({valor} < 200) $color='red';
elseif ({valor} < 300) $color='orange';
else  $color='blue';

if (isset($_SESSION['grid_dfrun_toggle_btn'][{id}]) && $_SESSION['grid_dfrun_toggle_btn'][{id}]) :
	$checked='checked';
else:
	$checked='';
endif;

{Check}= $toggle->generateTag('chk'.$seq,'small_'.$color,"jscheck('chk$seq', {id}, '$ajax',{valor});",$checked);

Botão PHP Processar

if (isset($_SESSION['grid_dfrun_toggle_btn'])):
   ksort($_SESSION['grid_dfrun_toggle_btn']);
   $_arr=$_SESSION['grid_dfrun_toggle_btn'];
   foreach ($_arr as $key => $value) 
	{   
		if ($value != 1) 	{ unset($_arr[$key]);}
	   	else 				{ $_arr[$key]='Checked'; }
	} 
	echo '<pre>';
	print_r($_arr);
	echo '</pre>';

	unset($_SESSION['grid_dfrun_toggle_btn']);

endif;

Download biblioteca apps btntoggle:

https://iwh.tec.br/downloads/apps.zip

https://iwh.tec.br/downloads/BtnToggle.zip

2 Curtidas

Depois que você disse para verificar o print, eu depurei e vi o que estava acontecendo. Fiz algumas melhorias aqui e mudei o seguinte:

Antes
foreach ($_arr as $key => $value)
{
if ($value != 1) { unset($_arr[$key]);}
else { $_arr[$key]=‘Checked’; }
}

Depois

foreach ($_arr as $key => $value) {   
    if ($value != 1) { 
        $_arr[$key];
    } else { 
        $_arr[$key] = 'Checked';
    }
} 

No segundo código, eu removi o ‘unset’ porque ele estava excluindo elementos do array e perdendo os índices. Agora, eu apenas verifico os valores e altero os que são iguais a 1 para ‘Checked’, mantendo todos os elementos e seus índices originais.

Além disso, consegui tirar o botão de processar e usar um evento AJAX, o que deixou o processo automático, sem precisar que o usuário clique no botão para carregar as mudanças.

Obrigada pela ajuda sempre!!

1 Curtida