Desabilitar vários campos de um formulário

Pessoal,

Coloquei o seguinte código no evento onLoad, mas não funciona. Alguém sabe onde está o erro? Aliás, não dá erro, mas também não desabilita os campos:

	sc_lookup(dsCampos, "SHOW COLUMNS FROM clientes;");
	$cont = count({dsCampos});

	for($x=0;$x<$cont;$x++){
		$campo = {dsCampos[$x][0]};
		sc_field_disabled($campo);
	}

Antes que alguém pergunte preciso desta função funcionando pois, no meu formulário, faço uma verificação (usando if) para saber se o usuário logado tem permissão ou não de alterar dados do cliente em questão. Se houver forma melhor de desabilitar o modo de edição do formulário para “somente leitura”, aceito a idéia, pois ainda tenho de desabilitar os sub-formulários.

tb sou novato e já sofri muito com estas macros…
talvez o problema seja a função sc_field_disabled

se é q vc não tentou estas coisas… vai a sugestão !!

sc_field_disabled({dsCampos[$x][0]});

$campo = “{”.{dsCampos[$x][0]}."}";

sc_field_disabled($campo);

Já descobri o problema: a macro sc_field_disabled, funciona se usar o campo diretamente com a macro, se caso tentar usar uma atribuição, no caso a variável $campo não irá funcionar.

Só não descobri a solução.

Obs: a alternativa “{”.{dsCampos[$x][0]}."}"; não funcionou; também tentei deixar a variável $campo dentro de aspas duplas mas não vai também; nem colocando todo o comando dentro do eval() também não funciona.

Bem é interessante ter controle sobre cada item dentro de um projeto, mas isso traz problemas como por exemplo a manutenção destes campos e suas respectivas permissões.
Por que você na implementa um controle usuário x cliente (1:n) em uma tabela de ligação e controla nas consultas os clientes que irão aparecer, ou melhor ainda se quiser que todos os clientes apareçam mas que somente o usuário autorizado faça alterações então desabilite o botão de update no form de acordo com a permissão. Controlar os campos com o crescimento da aplicação ficará quase que impossível, ou melhor dizendo inviável.

Senhores,

É provável que essa abordagem seja implementada sim.

Deixem-me explicar o que ocorre:

As macros Scriptcase não são funções normais PHP, elas funcionam como marcações para o gerador do ScriptCase. O gerador lê a macro e seus parâmetros, então substitui o código pelo PHP equivalente. Com os campos é a mesma coisa: {campo} é a mesma coisa que $this->campo. Isso significa que não dá pra colocar uma string como parâmetro para algumas macros, pois o gerador vai ler o código, não o conteúdo da String. Como ainda não existe tal implementação nativa, você pode utilizar essa construção:

   sc_lookup(dsCampos, "SHOW COLUMNS FROM clientes;");
   $cont = count({dsCampos});

for($x=0;$x<$cont;$x++)
   {
           $campo = {dsCampos[$x][0]};

           $bFlagRead_productid = false; 
           $this->NM_ajax_info['readOnly']['[b]".$campo."[/b]'] = $this->nmgp_cmp_readonly['[b]".$campo."[/b]'] = "on";
   }

Esse seu código desabilitará apenas os campos da base de dados. Se você quiser listar também os campos virtuais (aqueles criados com o ScriptCase), deverá utilizar o seguinte código:

$campos = array_keys($this->nmgp_dados_select);

A partir daqui, a variável $campos terá um array com todos os campos do formulário.

OBS: Esses códigos mexem diretamente com variáveis internas do ScriptCase. Não há garantia de que funcionem sempre, pois as variáveis internas do ScriptCase poderão sofrer mudanças sem aviso prévio.

==========================================================

UPDATE: Esse código deverá funcionar nos mesmos eventos/situações em que funciona a macro “sc_field_readonly”(Vide Manual).

Henrique,

Show de bola tua explicação. Assim é que podemos ter alternativas dentro do próprio SC. Parabéns!!!

Obrigado, Kelyber.