silvioprog / brookframework

Microframework which helps to develop web Pascal applications.
https://github.com/risoflora/brookframework
GNU Lesser General Public License v3.0
170 stars 37 forks source link

content different than expected output in CGI #44

Closed andersonsc10 closed 11 years ago

andersonsc10 commented 11 years ago

boa tarde, a horas estou tentando fazer este simples código funcionar, mesmo o CHome.Content estar apenas sendo referenciado a variavel VPgInterna, e em nenhum lugar mais, ele aparece na saida, acredito que seja pelo .Content do CHome, se eu comento //VPgInterna := CHome.Content; ou faço assim VPgInterna := ''; tudo volta ao normal, por isso acredito que seja alguma problema com a palavra content, abaixo um exemplo de código.

Good afternoon, the hours I'm trying to make this simple code to work, even just being CHome.Content be referenced variable VPgInterna, and nowhere else, it appears in the output, I believe it is the . The Content CHome if I comment / / VPgInterna: = CHome.Content, or do so VPgInterna: =''; everything back to normal, so I think it's some problem with the word content, below a sample code.

Templ := TJTemplate.Create; Templ.HTMLSupports := False; Templ.LoadFromFile(ANIVEL_ACIMA+AROOT_DIR_HTML+'index.html');

VPgInterna := CHome.Content; Templ.Fields.Add('centro', '');

//Templ.Replace(False); try Write(Templ.Content); finally Templ.Free; end;

silvioprog commented 11 years ago

Can you send the full code? It's almost impossible to reproduce a complex problem without having the full code.

andersonsc10 commented 11 years ago

só tem a função CHome alem doque esta ai

only has the function CHome doque beyond this there

function THome.CHome: TJTemplate; begin Result.HTMLSupports := False; Result.LoadFromFile(ANIVEL_ACIMA+AROOT_DIR_HTML+'home.html'); Result.Replace; end;

silvioprog commented 11 years ago

I couldn't test this code, I don't know what could be wrong. Without the full code to test it, unfortunately no one can help you.

Again, isolate the problem in a small project, compress it with ZIP, upload to a site of file sharing and paste the link here.

andersonsc10 commented 11 years ago

ready, oh this example.

http://www.sendspace.com/file/wyfr8a

silvioprog commented 11 years ago

I tested it. Isn't a bug. It's a fail in your implementation.

Change your implementation for it:

unit Unit1;

{$mode objfpc}{$H+}

interface

uses
  BrookAction, JTemplate, RUtils;

type
  TMyAction = class(TBrookAction)
  public
    procedure Get; override;
  end;

implementation

procedure TMyAction.Get;
var
  jtem: TJTemplate;
begin
  jtem := TJTemplate.Create;
  jtem.HTMLSupports := False;
  jtem.LoadFromFile('../pg1.html');
  jtem.Fields.Add('centro', FileToStr('../centro.html'));
  jtem.Replace;
  try
    Write(jtem.Content);
  finally
    jtem.Free;
  end;
end;

initialization
  TMyAction.Register('*');

end.

The result will:

titulo 1

Primeiro paragrafo

centro da pagina de teste, problema com content

rodapé da pagina

Download RUtils from: https://github.com/silvioprog/rutils.

Good luck, and close this issue if it work fine for you please!

andersonsc10 commented 11 years ago

eu não posso utilizar o filetostr, porque nesse outro html pode conter outros itens no qual eu precize utilizar o jtamplate para sobrescrever com o "tamplat.fields.add('var', 'valor');", então continua sendo um bug.

I can not use the filetostr because that other html can contain other items in which I precize jtamplate use to overwrite the "tamplat.fields.add ('var', 'value');" then still a bug.

silvioprog commented 11 years ago

Isn't bug! You is using an instance of JTemplate twice, so, the LoadFromFile reads the file twice, replacing the previously loaded file before. The logic in your code is wrong.

Or you keep the previously loaded file in a variable to use LoadFromFile twice, or your code will never work.

andersonsc10 commented 11 years ago

acho que você esta errado, e não esta dando atenção para o propósito da utilização que mais de uma instancia do Jtamplate daria para o desenvolvedor, eu ja uso isso, mas em forma de gambiarra, tenho mais de 10 Jtemplate a mesmo tempo, não são uma mas sim mais dez instancias, mas pra que funcione eu tenho que criar variaveis e ir jogando os conteudos dentro de variaveis, sei que você é inteligente pra entender o funcionamento e não me pedir um outro exemplo disso, caso não queira dar atenção para o bug, isso fica a seu critério, mas continua sendo um bug.

I think you're wrong, and is not paying attention to the purpose of using more than one instance of Jtamplate give to the developer, I already use it, but in the form of workaround, I have over 10 Jtemplate the same time, are not one but ten instances, but for it to work I have to create variables and go throwing the contents into variables, I know you are smart to understand the operation and did not order another example, if you do not want to give attention to the bug, it is up to you, but still a bug.

silvioprog commented 11 years ago

I can't fix out what is explicitly clear that isn't bug.

You are using LoadFromFile twice, so the old content is overwritten. What class you use in Free Pascal that allows use in this way?

andersonsc10 commented 11 years ago

e eu não estou usando a instancia do jtemplate duas vezes, são instancias diferentes...

and I'm not using an instance of jtemplate twice, instances are different ...

silvioprog commented 11 years ago

... See your implementation again, I commented it:

procedure TMyAction.Get;
Var
  jtem:TJTemplate;
begin
  jtem:=TJTemplate.Create;
  jtem.HTMLSupports := False;
  jtem.LoadFromFile('../pg1.html'); << FIRST load ...
  jtem.Fields.Add('centro', CHome.Content <<< LAST load, using the same instance, that is jtem );
  jtem.Replace;
  try
    write(jtem.Content);
  finally
    jtem.Free;
  end;
end;

It's wrong.

andersonsc10 commented 11 years ago

vou tentar novamente, mesmo achando desnecessario e ja vi que não vai resolver nada, vou ter que continuar com as gambiarras, são instancias diferentes, eu não dou um loadfromfile duas vezes no mesmo jtem.loadformfile, são em instancias separadas, mas fico por aqui, creio que fiz minha contribuição, encontrei o bug e reportei para o criador, agora cabe a você dar o proximo passo. eu não sou tão brilhante assim.

I'll try again, even finding unnecessary and've seen that will not solve anything, I have to continue with the hacks are different instances, I do not give a LoadFromFile twice in the same jtem.loadformfile are in separate instances, but I'm here I believe I made my contribution, I found the bug and reported it to the creator, now it's up to you to take the next step. I'm not so bright.

silvioprog commented 11 years ago

See in my comment above. Your logic is wrong.

andersonsc10 commented 11 years ago

por este motivo eu acho desnecessario um projeto demo, na primeira mensagem tem parte do codigo onde o CHOME.CONTENT, não esta atrelado a nada, esta vagando pelo corpo do get, e mesmo assim ele sobrepões tudo....

for this reason I think unnecessary project demo, the first message is part of the code where the CHOME.CONTENT, is not tied to anything, this wandering the body get, and even then it overlaps everything ....

silvioprog commented 11 years ago

I'll make other example and show them. Wait please...

andersonsc10 commented 11 years ago

não precisa se dar ao trabalho. O problema é com o content, em diversas situações muitos programadores vão precisar trabalhar com array de paginas, como é feito em outras linguagens, mas ja percebi que vamos ter que usar de artificios e gambiarras pra que isso funcione com a brook, esperava eu que postando aqui direto no site do projeto talves pudessemos resolver.

silvioprog commented 11 years ago

I'll reply in Portuguese, my English is not very good.

Você está sendo muito dramático. Tenha calma, vou mostrar o problema em SEU código, é impossível que o depurador do Free Pascal esteja errado.

Vou mandar um código para você depurar e ver com seus próprios olhos. Só um momento por favor...

andersonsc10 commented 11 years ago

não é ser dramático, é algo simples, um content de uma outra instancia esta sobrepondo o outro, e isso não esta certo, você só não quer entender, se eu tiver que usar 3 jtemplate e dar um loadfromfile, então eu não posso? então ele não esta se comportando como um objeto, ou então a brook esta pegando qualquer qualquer content e jogando na saida....

silvioprog commented 11 years ago

Pronto. Baixe esse projeto: http://www.sendspace.com/file/lega5k.

Notará que o botão "Run" do Lazarus estará habilitado, e notará também que deixei dois breakpoints. Fiz isso para você depurar aí. Para testar é muito simples, abra o projeto na IDE, use F9 para rodar o programa e logo em seguida chame a seguinte URL em seu browser:

http://localhost:5445

O ícone da IDE piscará na barra de tarefas. Vá até ela e use pausadamente F8, para ir executando o código linha a linha. Não deixe de ver os comentários no código, lá explico tudo claramente.

Se tiver dúvidas ou souber outra forma de expor o problema, mande em outro demo, detalhando-o. Caso entenda que é problema de logica, feche este issue por favor.

PS. o debug do Lazarus não está OK no Linux, já reportei mas não sei se já resolveram, logo, é altamente recomendado você fazer este teste no Windows.

silvioprog commented 11 years ago

Pera que vou mandar outro código, meu comentário ficou errado no primeiro ...

silvioprog commented 11 years ago

Pronto: http://www.sendspace.com/file/jbply3.

andersonsc10 commented 11 years ago

olha o exemplo....agora o conteudo esta sendo atribuido a uma variavel, eu vou ficando por aqui, e vou deixar a issue aberta, pra ver se alguem concegue resolver

http://www.sendspace.com/file/t72eyb

silvioprog commented 11 years ago

Você escreveu:

conteudo_do_chome := CHome.Content;   //agora esta sendo atribuido a algo?

A resposta é a mesma: Não! Pois CHome continua sem ser atribuída a nada, e continua usando uma instância fantasma de jtem. O que você está fazendo aí é apenas passando um valor para conteudo_do_chome porém de uma instância fantasma em CHome. Repetindo, continua sem atribuir CHome a nada. Entendeu?

Ou você atribui CHome a outra instância que não seja jtem, ou seu código nunca irá funcionar corretamente. Eu pensei que depurando o código você ia ver e entender, mas acho que não depurou.

Vou fechar este issue. Está super claro para qualquer um que seu CHome é um método implementado na ação e que não está apontado para ninguém, e você quer pq quer que este método seja "magicamente" atribuído a alguma instância. Não sei nem como isso não deu um AV, mas uma hora que o processador decidir liberar o lixo temporário criado pela primeira instancia você verá o que estou tentando explicar repetidamente e acredito que entenderá.

Isso funcionaria:

unit Unit1;

{$mode objfpc}{$H+}

interface

uses
  BrookAction, JTemplate;

type
  TMyAction = class(TBrookAction)
  private
    function CHome: TJTemplate;
  public
    procedure Get; override;
  end;

implementation

function TMyAction.CHome: TJTemplate;
begin
  Result := TJTemplate.Create;
  Result.HTMLSupports := False;
  Result.LoadFromFile('centro.html');
  Result.Replace;
end;

procedure TMyAction.Get;
var
  jtem: TJTemplate;
begin
  jtem := TJTemplate.Create;
  try
    jtem.HTMLSupports := False;
    jtem.LoadFromFile('pg1.html');
    jtem.Fields.Add('centro', CHome.Content);
    jtem.Replace;
    Write(jtem.Content);
  finally
    CHome.Free;
    jtem.Free;
  end;
end;

initialization
  TMyAction.Register('*');

end.
andersonsc10 commented 11 years ago

desde o inicio vc sabia da resposta? porque demorou tanto?, obrigado! resolveu minhas gambiarras, agora vou testar...

silvioprog commented 11 years ago

Não meu amigo, não sabia, pois não sou adivinho. E depois deste seu último comentário fico sem entender se isso seja realmente um pedido de ajuda ou uma provocação.

Que bom que resolveu o problema, e que tenha entendido que o erro era em sua lógica, mesmo eu tendo deixado isso bem claro no início e você oferecido resistência em entender.

andersonsc10 commented 11 years ago

não meu amigo, não é provocação, na verdade ajuda eu te pedi pelo gtalk...

silvioprog commented 11 years ago

Então tudo certo.

andersonsc10 commented 11 years ago

tudo 100% certo, obrigado novamente...