Ergebnis 1 bis 10 von 10

Thema: DCA-Filter nach parent-Tabelle

  1. #1
    Contao-Nutzer Avatar von dako314
    Registriert seit
    04.05.2013.
    Ort
    Mannheim
    Beiträge
    120

    Standard DCA-Filter nach parent-Tabelle

    Hallo zusammen,

    besteht irgendwie die Möglichkeit die Option "filter => true" oder auch "search => true" auch für Felder des Elterndatensatzes in einem eigenen DCA anzuzeigen?

    Zum Beispiel kann ein Bewerber sich auf Formate bewerben:

    Eltern: Bewerber (Attribute: Vorname, Nachname, Geburtsdatum, Universität)
    Kind: Bewerbung (Attribute: Bewerber, Event, Status der Bewerbung)

    In der Anzeige des Bewerbungen möchte ich nun beispielsweise nach der Universität filtern.

    Liebe Grüße
    Daniel

  2. #2
    Contao-Fan Avatar von eS_IT
    Registriert seit
    21.07.2010.
    Ort
    Werne a. d. Lippe
    Beiträge
    585
    Partner-ID
    6161
    User beschenken
    Wunschliste

    Standard

    Hallo Daniel,

    soweit ich weiß, kann Contao nur nach Felder der eigenen Tabelle suchen. Für Felder anderer Tabellen (auch Elterntabelle) müsste man eine Erweiterung schreiben, die es über Callbacks löst.
    Viele Grüße,
    eS_IT
    --
    e@sy Solutions IT - Ihr Partner für professionelle Softwareentwicklung
    Website - Contao Codebook - Partnerprofil - GitHub

  3. #3
    Contao-Nutzer Avatar von dako314
    Registriert seit
    04.05.2013.
    Ort
    Mannheim
    Beiträge
    120

    Standard

    Vielen Dank! Dann werde ich mir das mal mit Callbacks anschauen.

  4. #4
    Contao-Nutzer Avatar von dako314
    Registriert seit
    04.05.2013.
    Ort
    Mannheim
    Beiträge
    120

    Standard

    @eS_IT: Hast du eine Ahnung welchen Callback ich dafür benutzen könnte? Meinst du so ein Callback: https://docs.contao.org/dev/reference/dca/callbacks/ ? Danke schon mal.

  5. #5
    Community-Moderator
    Wandelndes Contao-Lexikon
    Avatar von Spooky
    Registriert seit
    12.04.2012.
    Ort
    Scotland
    Beiträge
    34.083
    Partner-ID
    10107

    Standard

    Ich werde mir das mal ansehen und evt. einen Guide dazu für die Doku schreiben, falls das realistisch machbar ist.
    » sponsor me via GitHub or PayPal or Revolut

  6. #6
    Contao-Fan Avatar von eS_IT
    Registriert seit
    21.07.2010.
    Ort
    Werne a. d. Lippe
    Beiträge
    585
    Partner-ID
    6161
    User beschenken
    Wunschliste

    Standard

    Ja, genau. Du kannst z.B. mit dem list-sorting-panel-callback-subpanel ein eigenes Filterfeld erstellen. (Ungetestet, den Fall hatte ich noch nie.) Fall das nicht geht, kannst Du immer noch mit einem Hook (z.B. outputBackendTemplate) die Ausgabe manipulieren. Du musst Dich nur um die Verarbeitung selber kümmern.
    Viele Grüße,
    eS_IT
    --
    e@sy Solutions IT - Ihr Partner für professionelle Softwareentwicklung
    Website - Contao Codebook - Partnerprofil - GitHub

  7. #7
    Contao-Nutzer Avatar von dako314
    Registriert seit
    04.05.2013.
    Ort
    Mannheim
    Beiträge
    120

    Standard

    @Spooky: Danke dir schon mal!

    @eS_IT: Danke, das schaue ich mir auch mal an. Sollte ich vorher schon was wissen, werde ich es hier posten.

  8. #8
    Contao-Nutzer Avatar von dako314
    Registriert seit
    04.05.2013.
    Ort
    Mannheim
    Beiträge
    120

    Standard

    @eS_IT: Ich habe jetzt den Callback erstellt:

    PHP-Code:
    /**
         * @Callback(table="tl_applicant", target="list.sorting.panel_callback.extrafilter")
         */
        
    public function listSortingPanelCallback(DataContainer $dca): String
        
    {
          
    //TODO: get option values from db
          //TODO: set active value as selected

          
    return '
            <div class="tl_filter tl_subpanel">
              <strong>Weitere Filter:</strong> 
              <select name="studentUniversity" id="studentUniversity" class="tl_select">
                <option value="tl_studentUniversity">Universität</option>
                <option value="tl_studentUniversity">---</option>
                <option value="uni-1">Uni 1</option>
                <option value="uni-2">Uni 2</option>
              </select>
            </div>
          '
    ;
        } 
    Gleichzeitig habe ich das Panel extrafilter in den DCA nach dem Filter eingefügt und dieser wird auch angezeigt.

    PHP-Code:
    'list' => [
        
    'sorting' => [
          
    'panelLayout' => 'extrafilter,filter;sort,search,limit'
        
    ],

    Jetzt müsste ich ja anhand des Filters irgendwo die WHERE-Bedingung für die Datenbank anpassen. Geht das irgendwie über den DCA?

    Update: Meine Idee wäre es, einen Callback (den config.onload) zu nutzen und dann den "filter" im DCA dynamisch anzupassen und mir dynamisch die passenden Datensätze selektieren. Würde das in die richtige Richtung gehen?

    LG
    Daniel
    Geändert von dako314 (28.08.2021 um 17:20 Uhr)

  9. #9
    Community-Moderator
    Wandelndes Contao-Lexikon
    Avatar von Spooky
    Registriert seit
    12.04.2012.
    Ort
    Scotland
    Beiträge
    34.083
    Partner-ID
    10107

    Standard

    Das wäre zumindest auch meine Idee, ohne jetzt genauer den Core inspiziert zu haben, was noch möglich wäre.
    » sponsor me via GitHub or PayPal or Revolut

  10. #10
    Contao-Nutzer Avatar von dako314
    Registriert seit
    04.05.2013.
    Ort
    Mannheim
    Beiträge
    120

    Standard

    Ich teile nochmals meine Erfahrungen damit, da ich letztens nun hinbekommen habe:

    Zunächst einmal muss der im DCA angegebene Bereich mit dem Namen *extrafilter* programmiert werden.

    PHP-Code:
    /**
      * @Callback(table="tl_events_event_applicant", target="list.sorting.panel_callback.extrafilter")
      */
    public function listSortingPanelCallback(DataContainer $dca): String
    {      
      if(
    Input::post('FORM_SUBMIT') === 'tl_filters') {
        
    $this->session->set('tl_studentCourse'Input::post('studentCourse'));
      }

      
    $applicants ApplicantModel::findAll();
      
      
    $studentCourse = [];
      
      foreach(
    $applicants as $applicant) {        
        
    $studentCourse[$applicant->studentCourse] = $applicant->studentCourse;
      }
      
      
    asort($studentCourse);

      
    $studentCourseOptions "";
      
      foreach(
    $studentCourse ?? [] as $key => $item) {
        
    $selected $this->session->get('tl_studentCourse') === $key ' selected' '';
        
        
    $studentCourseOptions .= "<option$selected value='$key'>$item</option>";
      }

      return 
    "
       <div class='tl_filter tl_subpanel'>
         <strong>Weitere Filter:</strong> 
         <select name='studentCourse' id='studentCourse' class='tl_select'>
           <option value='tl_studentCourse'>Studiengang</option>
           
    $studentCourseOptions
         </select>
       </div>
      "
    ;

    Dann muss nun darauf reagiert werden, so dass der Filter im DCA gesetzt wird:

    PHP-Code:
    /**
     * @Callback(table="tl_events_event_applicant", target="config.onload")
     */
    public function configOnload(DataContainer $dc null): void
    {
      
    $backendUser BackendUser::getInstance();
      
    $eventApplicants EventApplicantModel::findAll();

      
    $ids = [];
      
      foreach(
    $eventApplicants as $eventApplicant) {
        
    $applicant $eventApplicant->getRelated('applicant');

        
    $studentCourse $this->session->get('tl_studentCourse');
        
        if(
    $studentCourse === 'tl_studentCourse' || $studentCourse === $applicant->studentCourse) {
          
    $ids[] = $eventApplicant->id;
        }
      }
      
      
    $filter = ["id IN (-1)"];
      
      if(
    count($ids) > 0) {
        
    $ids implode(','$ids);
        
        
    $filter = ["id IN ($ids)"];
      }
      
      
    $GLOBALS['TL_DCA']['tl_events_event_applicant']['list']['sorting']['filter'] = $filter;


Aktive Benutzer

Aktive Benutzer

Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)

Lesezeichen

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •