Jump to content


Photo

Problema Com Loop Smarty...


  • Faça o login para participar
2 replies to this topic

#1 Bruno Augusto

Bruno Augusto

    ∙•● Restarting... ●•∙

  • Usuários
  • 1968 posts
  • Sexo:Não informado
  • Localidade:Itajubá

Posted 17/01/2007, 15:37

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() #continuar depois de fazer o que cria as settings
	{
		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&section=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.

Viiram? Os valores se duplicam em tantos campos quantos existam.

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?

[]'s

#2 Fr0ZeN

Fr0ZeN

    12 Horas

  • Usuários
  • 124 posts
  • Sexo:Não informado

Posted 17/01/2007, 20:26

$type[i]
seria $type[$i]

#3 Bruno Augusto

Bruno Augusto

    ∙•● Restarting... ●•∙

  • Usuários
  • 1968 posts
  • Sexo:Não informado
  • Localidade:Itajubá

Posted 18/01/2007, 07:59

Não pois o i de $type, não é um "identificador" como em um laço for().

É identificador do Smarty, como atributo de name=, em um {section}

[]'s




1 user(s) are reading this topic

0 membro(s), 1 visitante(s) e 0 membros anônimo(s)

IPB Skin By Virteq