Pergunta

Eu tenho uma função que percorre diferentes tipos de listagens puxado a partir do MySQL e exibe-os como um "feed" Facebook-esque. Cada tipo de lista tem uma aparência diferente, e, portanto, requer um modelo diferente.

Aqui está o exemplo abaixo função pode ser chamado 100 vezes (se houver 100 Resultados):

function display_listing($id,$type) {
    global $abs_path;

    switch($type) {

        case 'photo':
            include($abs_path . '/templates/photo.php');
            break;

        case 'video':
            include($abs_path . '/templates/video.php');
            break;

    }

}

Existe uma maneira melhor de fazer isso, onde eu não potencialmente acabar com 100 inclui - o que pode retardar o meu processo de baixo? Posso de alguma forma salvar o incluem uma vez na página, e se referem a ele tantas vezes quanto necessário?

... ou isso é a melhor prática?

Além disso, eu quero saber como fazer isso no meu próprio, sem um modelo de motor ...

EDIT:. O problema não é resolvido apenas por include_once (Eu não acredito) ... Eu preciso ser capaz de reutilizar o arquivo incluído várias vezes, substituindo as variáveis ??de cada vez

Foi útil?

Solução

Apesar de um switch não é a maneira mais escalável para escrever este código, eu tenho medo que inclui é a única maneira de manter seus modelos em arquivos separados, aqui.

Você poderia, de modo concebível, encapsular o código de cada modelo em uma função, no entanto:

/*
photoTemplate.php
*/

<?php
function loadPhotoTemplate($id) {
?>
  <div id="photo">
...
  </div>
<?php
}
?>


/*
listing.php
*/

function display_listing($id,$type) {
    global $abs_path;

    switch($type) {

        case 'photo':
            include_once($abs_path . '/templates/photo.php');
            loadPhotoTemplate($id);
            break;

        case 'video':
            include_once($abs_path . '/templates/video.php');
            loadVideoTemplate($id);
            break;
    }

}

Isso vai carregar cada arquivo de modelo no máximo uma vez, e depois é só chamar a função cada vez que você deseja exibir o modelo com os dados específicos para esse item.

Editar

Provavelmente seria ainda melhor para incluir todos os arquivos de modelo no início, em seguida, basta chamar a função apropriada no switch. * _Once do PHP () funções são lentos, como eles devem consultar a lista dos anteriormente incluídas / arquivos necessários cada vez que eles são chamados.

Outras dicas

criar uma matriz de modelos permitidos. tê-lo funcionar olhada para ver se o modelo solicitado é na matriz. se for, em seguida, usar a variável $ tipo de incluir o arquivo. sim, em geral, você não deve usar dados fornecidos pelo usuário em um nome de arquivo incluem, mas desde que você tenha validado contra uma matriz em boas condições de valores, é seguro.

Se a sua preocupação é o desempenho, eu, pessoalmente, não iria entrar neste circuito em tudo.

presumindo que os itens da lista são vistos com mais freqüência do que eles são criados, gostaria de gerar o HTML como os itens são criados e armazenar a saída ao lado dos dados no banco de dados. (Ou em memcache ou arquivos ou em outro lugar -. Mas gerá-lo e armazená-lo)

Ao fazer isso você mover esta de volta a lógica no processo de criação dos itens que você está fazendo a mesma declaração switch, mas somente para um item de cada vez -. Você está cortando o laço

Em seguida, em tempo de exibição, em vez de chamar display_listing(), você apenas ecoar o HTML que você já tenha armazenado.

Eu acho que você deve olhar para algumas coisas. Em primeiro lugar, há ainda a possibilidade de você incluir o mesmo "modelo" 100 vezes? Isso parece uma enorme quantidade de conteúdo para colocar em uma página.

Se eu estou usando minúsculos "snippets" - digamos, uma linha da tabela que de repetir muitas vezes - que tendem a utilizar uma função que retorna uma string, assim:

/* snippets.php */
function tableRow( $row )
{
    return
        '<tr><td>' . $row['var1'] . '</td>' .
        '<td>' . $row['var2'] . '</td></tr>';
}

/* main page/view */
foreach ( $data as $row )
    echo tableRow( $row );

A principal vantagem aqui é que você pode ter loops e todos os tipos na função.

Se você está procurando uma variável de substituição reta, você pode criar seus próprios mini-modelos em um arquivo HTML; algo como:

<p>{name}<br />
  Posted {date} by {author}</p>

Então leia no modelo, passar a corda toda para a sua função display_listing, que corre str_replace em todos os {} variáveis. Eu não acho que seria muito de um acerto de desempenho, mas você tem que experimentar para ter certeza.

Você quer usar a função include_once em vez de include.

O include_once () declaração inclui e avalia o arquivo especificado durante a execução do script. Este é um comportamento semelhante ao include (), com a única estar diferença de que, se o código de um arquivo já foi incluído, ele não será incluído novamente. Enquanto o nome sugere, ele será incluído apenas uma vez.

Se você estiver indo para ser incluindo modelos usando uma chave para diferentes palavras-chave, então você deve definir uma variável, digamos $ template_filename, no interruptor e, em seguida, uma vez que você sair da chave, faça o incluem assim:

include_once("/templates/{$filename}.php");

Se você não quiser usar incluindo em tudo, então você também pode usar um motor de templates ...

Este método parece-me razoável no entanto.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top