Problemas com Smarty...
Pessoal, é incrível como uma porcariazinha de loop pode parar um sistema inteiro.
Pior e mais ridículo que o problema dá-se no template e não no código.
Dêem uma olhada:
Trecho do código PHP
public function setting() { global $Smarty, $link; if( ! isset( $_GET['group'] ) || $_GET['group'] == '' ) { $this -> error( 'Você deve especificar um ID existente entre os sets de idioma.<br /> Por favor, volte e tente novamente.' ); exit; } //----------------------------------------- // Retrieving Setting Group Name $result = mysql_query( current_groupname( $_GET['group'] ), $link ) or die( mysql_error() ); $r = mysql_fetch_array( $result ); if( mysql_num_rows( $result ) > 0 ) { $Smarty -> assign( 'ID', $r['ID'] ); $Smarty -> assign( 'group', $r['title'] ); } //----------------------------------------- // Retrieving Settings List $result = mysql_query( list_settings( $_GET['group'] ), $link ) or die( mysql_error() ); if( mysql_num_rows( $result ) > 0 ) { while( $row = mysql_fetch_array( $result ) ) { $ID[] = $row['ID']; $title[] = $row['title']; $description[] = $row['description']; $type[] = $row['type']; $key[] = $row['key']; $value[] = $row['value']; $extra[] = $row['extra']; $original[] = $row['original']; if( $row['type'] == 'dropdown' ) { foreach( explode( "\n", $row['extra'] ) as $l ) { list ( $k, $v ) = explode( "=", $l ); if ( $k != "" and $v != "" ) { $dropdown[] = array( trim( $k ), trim( $v ) ); } } $Smarty -> assign( 'dropdown', $dropdown ); } elseif( $row['type'] == 'multi' ) { foreach( explode( ",", $row['extra'] ) as $l ) { list ( $k, $v ) = explode( "=", $l ); if ( $k != "" and $v != "" ) { $multi[] = array( trim( $k ), trim( $v ) ); } } foreach( explode( ",", $row['value'] ) as $s ) { $selected[] = $s; } $Smarty -> assign( 'multi', $multi ); $Smarty -> assign( 'selected', $selected ); } } } $Smarty -> assign( 'title', $title ); $Smarty -> assign( 'description', $description ); $Smarty -> assign( 'type', $type ); $Smarty -> assign( 'key', $key ); $Smarty -> assign( 'value', $value ); $Smarty -> assign( 'original', $original ); $Smarty -> assign( 'groupID', $_GET['group'] ); $Smarty -> assign( 'position', $ID ); //----------------------------------------- // Display Template $Smarty -> display( 'admin/settings/system/setting.tpl' ); }Essa é uma das funções do módulo inteiro.****
Trecho do template (parte condicional)
<table width="100%" border="0">{section name=i loop=$type} <tr> <td width="47%"> <strong>{$title[i]}</strong><br /> {$description[i]} </td> <td width="42%"> {if $type[i] eq "text"} <input name="{$key[i]}" type="text" value="{$value[i]}" size="30" /> {elseif $type[i] eq "dropdown"} <select name="{$key[i]}"> <option value="none">{$original[i]}</option> {section name=A loop=$dropdown} {html_options values=$dropdown[A][0] selected=$value[i] output=$dropdown[A][1]} {/section} </select> {elseif $type[i] eq "radio"} Sim <input name="{$key[i]}" type="radio" value="yes" {if $value[i] eq 1}checked="checked"{/if}/> <input name="{$key[i]}" type="radio" value="no" {if $value[i] eq 0}checked="checked"{/if}/> Não {elseif $type[i] eq "textarea"} <textarea name="{$key[i]}" cols="60" rows="5" id="{$key[i]}">{$value[i]}</textarea> {elseif $type[i] eq "multi"} <select name="{$key[i]}[]" size="5" multiple="multiple"> {section name=B loop=$multi} {html_options values=$multi[B][0] selected=$selected output=$multi[B][1]} {/section} </select> {elseif $type[i] eq "wysiwyg"} <textarea name="{$key[i]}" cols="60" rows="5" id="{$key[i]}">{$value[i]}</textarea> {/if} </td> <td width="7%"> <a href="admin.php?act=settings§ion=system&option=editsetting&ID={$position[i]}">Editar</a></td> <td width="4%"> <input name="cp_{$position[i]}" type="text" value="{$position[i]}" size="2" /> </td> </tr>{/section}</table>Ele exibe um elemento de formulário diferente para cada "tipo" válido recebido do banco de dados, cuja estrutura é:
>
CREATE TABLE `settings` (
`ID` smallint(5) NOT NULL auto_increment,
`title` varchar(255) collate latin1_bin NOT NULL,
`description` text collate latin1_bin NOT NULL,
`group` char(2) collate latin1_bin NOT NULL,
`type` text collate latin1_bin NOT NULL,
`key` text collate latin1_bin NOT NULL,
`value` text collate latin1_bin NOT NULL,
`extra` text collate latin1_bin,
`original` text collate latin1_bin NOT NULL,
PRIMARY KEY (`ID`)
) ENGINE=MyISAM CHARSET=latin1 COLLATE=latin1_bin;
Deveria funcionar da seguinte maneira:[*]Por uma página que não vem ao caso, as configurações são inseridas no banco de dados
[*]Nessa página específica, os dados são retornados do banco para visualização e possível edição.
[*]De acordo com o campo type da estrutura exibe um elemento de formulário diferente.
Acontece que SE existe apenas um elemento de cada tipo funciona perfeitamente.
Já se eu incluo (pela página de adição) duas ou mais configurações com o mesmo tipo de elemento os dados "se duplicam"
Agora o mais estranho é que tal problema SÓ ACONTECE com os tipos: radio (sim / não), dropdown (lista) e multi (multiplas seleções).
Vejam a imagem e vão entender, com um exemplo do que acontece em um do tipo dropdown.
Viram? Os valores se duplicam em tantos campos quantos existam.
A imagem mostra o problema nos campos dropdown, mas como entre eles e os multi-selector, o que muda é a forma com os dados são explodidos( dropdown, explode por \n e multi explode por , ).
E nos radiobuttons, ocorre o mesmo. Se o primeiro campo radio tem value = YES e o segundo value = NO, ambos ficam com o value= YES.
Agora como posso corrigir?
Busquei no manual, no PHPInsider, no Pixel2Life, no Google trocentas vezes e nada.
O problema está na forma como fiz o template ou falta algo na codificação?
Se for possível corrigir com os trecho passados, maravilha. Senão mais tarde, ainda hoje (espero) passo os dois arquivos envolvidos no conflito.
[]'s
Discussão (1)
Carregando comentários...