Results 1 to 7 of 7

Thread: Herhalende gegevens (lijst) in een webapp

  1. #1

    Herhalende gegevens (lijst) in een webapp

    Ik ben momenteel bezig met het leren hoe je een webapp maakt maar loop tegen een probleem aan. Verder vraag ik me af of wat ik maak wel correct (beste) is.

    Ik heb 2 PageProducers, welke een overzicht van gebruikers moeten kunnen geven. Bij de OnCreate stel ik de templates in:
    Code:
      PageUsers.HTMLFile := AppSettings.TemplateDirectory + 'users.html';
      PageUser.HTMLFile := AppSettings.TemplateDirectory + 'user.html';
    De template users.html ziet er als volgt uit:
    Code:
    <html>
    <body>
    <h1>Users</h1>
    <#include name="users">
    </body>
    </html>
    en de user.html ziet er zo uit:
    Code:
    <#userdata field="name"><br>
    <#userdata field="address"><br>
    <#userdata field="city"><br>
    <hr>
    Vervolgens doe ik bij de PageUsers in de OnHTMLTag dit:
    Code:
    if TagString = 'include' then
      begin
        if TagParams.Values['name'] = 'users' then
        begin
          ReplaceText := ReplaceText + PageUser.Content;
          ReplaceText := ReplaceText + PageUser.Content;
        end;
      end;
    En in de PageUser.OnHTMLTag dit:
    Code:
      if TagString = 'userdata' then
      begin
        if TagParams.Values['field'] = 'name' then
          ReplaceText := 'een naam';
        if TagParams.Values['field'] = 'address' then
          ReplaceText := 'een straat en misschien wel een huisnummer';
        if TagParams.Values['field'] = 'city' then
          ReplaceText := 'een stad';
      end;
    Dit werkt opzich goed, hij laat keurig 2 gebruikers zien. Alleen hoe weet de PageUser welke user hij moet afdrukken? Hij toont nu namelijk 2 gelijke (natuurlijk). Liefst zou ik een ID/Index mee moeten kunnen geven ofzo. En is de manier die ik hier gebruik de beste om met templates te werken e.d.?

  2. #2
    Senior Member PsychoMark's Avatar
    Join Date
    Nov 2001
    Location
    Raamsdonksveer
    Posts
    10,269
    Normaal gesproken waar jij je ReplaceText aanvult staat een loopje om bijvoorbeeld database records op te halen. Voordat je de template toevoegd laat je dan een variabele ('FData') wijzen naar jouw data (bijvoorbeeld een TQuery), dan voeg je de template toe aan ReplaceText, OnHTMLTag wordt aangeroepen en je gebruikt FData.FieldByName(TagParams.Values['field'])).AsString als ReplaceText... (ervan uitgaande dat het veld bestaat, anders krijg je een error, zou je eventueel af kunnen vangen met een 'if FindField = nil' bijvoorbeeld)...


    Nu moet ik er wel bij zeggen, ik werk niet met PageProducer, en mensen met ervaring hebben misschien betere ideeën. Ook ga ik er van uit dat als je Content opvraagt dat je PageProducer dan opnieuw de tags gaat parsen, anders zou je even moeten kijken hoe je ervoor zorgt dat ie dat wel doet (herladen van de template bijvoorbeeld, maar dat is misschien overbodig)... maar het geeft je misschien een idee van een mogelijke werking van zo'n template
    Qui custodiet ipsos custodes

  3. #3
    Dan maak je dus gebruik van een extra variable. Dan zou het er bij mij zo uit komen te zien:
    Code:
    var
      x: Integer;
    const
      UserCount = 8;
    begin
      if TagString = 'include' then
      begin
        if TagParams.Values['name'] = 'users' then
        begin
          for x := 0 to UserCount - 1 do
          begin
            CurrentUserId := x;
            ReplaceText := ReplaceText + PageUser.Content;
          end;
        end;
      end;
    end;
    Waar CurrentUserId een private variable is binnen de WebModule.

    Het vullen van de user template ziet er dan als volgt uit:
    Code:
      if TagString = 'userdata' then
      begin
        if TagParams.Values['field'] = 'number' then
          ReplaceText := IntToStr(CurrentUserId);
        if TagParams.Values['field'] = 'name' then
          ReplaceText := 'een naam';
        if TagParams.Values['field'] = 'address' then
          ReplaceText := 'een straat en misschien wel een huisnummer';
        if TagParams.Values['field'] = 'city' then
          ReplaceText := 'een stad';
      end;
    Dit werkt opzich goed, alleen moet je dan voor al dit soort lijstjes de huidige index bijhouden in een private variable binnen de WebModule

  4. #4
    Iemand toevallig nog een leuke oplossing voor het bovenstaande probleem?

  5. #5
    Senior Member Anders's Avatar
    Join Date
    Dec 2001
    Location
    Doetinchem
    Posts
    1,415
    Ik heb geen tijd om nu naar te kijken, maar ik herinner mij dat op The Delphi Apostle een op lossing was voor het nesten van PageProducers - misschien is dat wat?

    Link naar artikel van Shiv Matlus
    Anders

    May your code compile!

  6. #6
    Het opvragen van je diverse velden wordt zo wel erg bewerkelijk. Ik zou dat gewoon direct koppelen met je dataset zodat je met een FieldByName(TagParams.Values['field']) alle velden aankunt.

    Verder kom je er inderdaad niet onderuit om een ID mee te geven, de primary key lijkt me de beste keuze hiervoor.
    Marcel

  7. #7
    Nou is het zo dat er niet echt een database (en dus dataset) achter deze applicatie zit, vandaard mijn opzet.
    Maar dan nog is het huidige ID (Index) opslaan in een private variable een oplossing. Bedankt voor de reacties.

Thread Information

Users Browsing this Thread

There are currently 1 users browsing this thread. (0 members and 1 guests)

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •