Zum Inhalt springen

tt_news: 3 DB-Abfragen: Anzahl der Datensätze bei 3. Abfrage abhängig von Anzahl der Datensätze bei 2. Abfrage

Erstellt am 14. Juli 2011 · 1 Antwort · letzte Antwort am 14. Juli 2011

Tags: Kategorien, tt_news, Frage

danton ·

Hi

Ich mache 3 DB-Abfragen der tt_news per TS.
Jede Abfrage hat seine eigene Kategorie also folgendermaßen.

Abfrage 1: Datensätze der Kategorie A
Abfrage 2: Datensätze der Kategorie B
Abfrage 3: Datensätze der Kategorie C

Jede Abfrage gibt max 2 Datensätze aus.

Jetzt soll es so sein:
Insgesamt sollen immer max 3 Datensätze ausgegeben werden.
D.h.
- Abfrage 2 liefert 2 Datensätze also soll bei Abfrage 3 keine Ausgabe erfolgen
- Abfrage 2 liefert 1 Datensatz also soll bei Abfrage 3 auch 1 Datensatz ausgegeben werden
- Abfrage 2 liefert keinen Datensatz also soll bei Abfrage 3 jetzt 2 Datensätze ausgegeben werden

D.h. die Abfrage 3 dient als Auffüller wenn bei Abfrage 2 weniger wie 2 Datensätze ausgegeben werden

Aktuell sieht mein TS folgermaßen aus

tmp.tt_news_db = CONTENT
tmp.tt_news_db {
  table = tt_news_cat
  select {
    # the category folder(s)
    pidInList = {$news.news_sysordner}
		join =  tt_news_cat_mm ON (tt_news_cat.uid = tt_news_cat_mm.uid_foreign)  INNER JOIN tt_news ON (tt_news.uid = tt_news_cat_mm.uid_local)
		where = tt_news.deleted=0 AND tt_news.hidden=0 AND tt_news.sys_language_uid=0 AND (tt_news_cat_mm.uid_foreign = 2)
		orderBy = datetime desc
		selectFields = tt_news.title, tt_news.bodytext, tt_news.deleted, tt_news.hidden, tt_news.uid, tt_news_cat.single_pid, tt_news_cat_mm.uid_foreign
    max = 2
  }
  renderObj = COA
  renderObj {
    wrap = <div class="news-list-item">|</div>
    10 = TEXT
    10{
      field = title
      wrap = <h3><p class="newsTitle">|</p></h3>
    }
    20 = COA
    20{
      wrap = <p>|</p>
      10 = TEXT
      10{
        field = bodytext
        stripHtml = 1
        crop = 70 | ... | 1
      }
      20 = TEXT
      20{
        value = [mehr]
        wrap = <span class="news-list-morelink">|</span>
        typolink{
          parameter.field = single_pid
          additionalParams = &no_cache=1&tx_ttnews[tt_news]={field:uid}
          additionalParams.insertData = 1
        }
      }
    }
    40 = COA
    40{
      wrap = <hr class="clearer" />|
    }
    /*
    100=TEXT
    100.data = debug:data
    */
  }
}
lib.newsTeaser = COA
lib.newsTeaser {
  wrap = <div class="news-list-container">|</div>
  
  ### HIGHLIGHT
  10 = CONTENT
  10 < tmp.tt_news_db
  10{
    select {
    	where = tt_news.deleted=0 AND tt_news.hidden=0 AND tt_news.sys_language_uid=0 AND (tt_news_cat_mm.uid_foreign = {$news.highlight_kategorie})
    }
    wrap = |
  }
  
  ### BEREICH
  20 = CONTENT
  20 < tmp.tt_news_db
  20{
    select {
    	where = tt_news.deleted=0 AND tt_news.hidden=0 AND tt_news.sys_language_uid=0 AND (tt_news_cat_mm.uid_foreign = {$news.bereich_kategorie})
    }
    wrap = |
  }
  
  ### ALLGEMEIN
  30 = CONTENT
  30 < tmp.tt_news_db
  30{
    select {
    	where = tt_news.deleted=0 AND tt_news.hidden=0 AND tt_news.sys_language_uid=0 AND (tt_news_cat_mm.uid_foreign = {$news.allgemein_kategorie})
    }
    wrap = |
  }
}

Ich hatte mir überlegt bei der 2. Abfrage mit einem Register die Anzahl der Datensätze zu zählen und bei Abfrage 3 dann diese Register abzufragen.
Allerdings ist bei der select Anweisung das max kein stdWrap oder sonst was nur int + calc + total daher kann ich hier wohl kein register ansprechen.

Für Hilfe wäre ich sehr dankbar
Grüßle Danton

danton ·

Sodele Lösung ist gefunden

tmp.tt_news_db = CONTENT
tmp.tt_news_db {
  table = tt_news_cat
  select {
    # the category folder(s)
    pidInList = {$news.news_sysordner}
		join =  tt_news_cat_mm ON (tt_news_cat.uid = tt_news_cat_mm.uid_foreign)  INNER JOIN tt_news ON (tt_news.uid = tt_news_cat_mm.uid_local)
		where = tt_news.deleted=0 AND tt_news.hidden=0 AND tt_news.sys_language_uid=0 AND (tt_news_cat_mm.uid_foreign = 2)
		orderBy = datetime desc
		selectFields = tt_news.title, tt_news.bodytext, tt_news.deleted, tt_news.hidden, tt_news.uid, tt_news_cat.single_pid, tt_news_cat_mm.uid_foreign
    max = 2
  }
  renderObj = COA
  renderObj {
    wrap = <div class="news-list-item">|</div>
    10 = TEXT
    10{
      field = title
      wrap = <h3><p class="newsTitle">|</p></h3>
    }
    20 = COA
    20{
      wrap = <p>|</p>
      10 = TEXT
      10{
        field = bodytext
        stripHtml = 1
        crop = 70 | ... | 1
      }
      20 = TEXT
      20{
        value = [mehr]
        wrap = <span class="news-list-morelink">|</span>
        typolink{
          parameter.field = single_pid
          additionalParams = &no_cache=1&tx_ttnews[tt_news]={field:uid}
          additionalParams.insertData = 1
        }
      }
    }
    40 = COA
    40{
      wrap = <hr class="clearer" />|
    }
    /*
    100=TEXT
    100.data = debug:data
    */
  }
}

lib.newsTeaser = COA
lib.newsTeaser {
  wrap = <div class="news-list-container">|</div>
  
  ### HIGHLIGHT
  10 = CONTENT
  10 < tmp.tt_news_db
  10{
    select {
    	where = tt_news.deleted=0 AND tt_news.hidden=0 AND tt_news.sys_language_uid=0 AND (tt_news_cat_mm.uid_foreign = {$news.highlight_kategorie})
    }
    wrap = |
  }
  
  ### BEREICH
  20 = CONTENT
  20 < tmp.tt_news_db
  20{
    select {
    	where = tt_news.deleted=0 AND tt_news.hidden=0 AND tt_news.sys_language_uid=0 AND (tt_news_cat_mm.uid_foreign = {$news.bereich_kategorie})
    }
    wrap = |
  }
  
  ### Register BereichsIdx
  25 = LOAD_REGISTER
  25{
    BereichsIdx.numRows{
      table < tmp.tt_news_db.table
      select.pidInList < tmp.tt_news_db.select.pidInList
      select.join < tmp.tt_news_db.select.join
      select.where = tt_news.deleted=0 AND tt_news.hidden=0 AND tt_news.sys_language_uid=0 AND (tt_news_cat_mm.uid_foreign = {$news.bereich_kategorie})
    }
  }

  ### ALLGEMEIN - 1 zusaetzlichen Datensatz ausgeben da BEREICH nur 1 hat
  32 = COA
  32{
    if{
      value = 1
      equals.data = register:BereichsIdx
    }
    10 = CONTENT
    10 < tmp.tt_news_db
    10{
      select {
      	where = tt_news.deleted=0 AND tt_news.hidden=0 AND tt_news.sys_language_uid=0 AND (tt_news_cat_mm.uid_foreign = {$news.allgemein_kategorie})
        max = 1
      }
      wrap = |
    }
  }

  ### ALLGEMEIN - 2 zusaetzliche Datensaetze ausgeben da BEREICH keinen hat
  33 = COA
  33{
    if{
      value = 
      equals.data = register:BereichsIdx
    }
    10 = CONTENT
    10 < tmp.tt_news_db
    10{
      select {
      	where = tt_news.deleted=0 AND tt_news.hidden=0 AND tt_news.sys_language_uid=0 AND (tt_news_cat_mm.uid_foreign = {$news.allgemein_kategorie})
        max = 2
      }
      wrap = |
    }
  }
}

Kurz zusammengefaßt:
- In einem Register per numRows die Anzahl der Datensätze von Abfrage 2 zählen.
- Danach 2 COAs aufbauen.
- 1. COA bei if den register mit value = 1 vergleichen
- 1. COA enthält 3. Abfrage mit max=1
- 2. COA bei if den register mit value = vergleichen
- 2. COA enthält 3. Abfrage mit max=2

Leider formatiert das Forum hier den numRows-Script-Teil falsch.
Richtig ist lib.newsTeaser.25.BereichsIdx.numRows{

Gruß Danton