Anleitung autocomplete

Einklappen
X
 
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge
  • landzone
    Contao-Fan
    • 12.03.2012
    • 256

    #1

    Anleitung autocomplete

    hallo,

    ich hoffe, ich bin im richtigen forum, denn meine frage ist etwas "extensionübergreifend".

    ich möchte in einem eigenen modul einem textfeld das autocomplete hinzufügen. ich habe sowohl die extension von leo unglaub probiert als auch das autocompletePlugin + ajax.php vo andreas schempp.
    mir ist bei beiden nicht klar, wie ich das konkret einbinden muss und nirgendwo konnte ich eine konkrete anleitung finden.

    ich habe mir die auto-complete-funktion von harald kirschner vorgenommen und in mein modul integriert und alles funktioniert. allerdings steh ich nun wie leo auch irgendwann in seinem testmodul "lu_auto_completer" vor dem problem, dass im php script die contao-funktionalität fehlt, will heissen, ich muss dort erneut und ohne contao-api eine db-verbindung herstellen usw. und dort weiss ich nicht weiter.

    folgenden code hab ich momentan:

    in meiner config.php hab ich die plugindateien eingebunden (autocompleterPlugin):
    PHP-Code:
    $GLOBALS['TL_JAVASCRIPT']['autocompleter.observer'] = 'plugins/autocompleter/js/ac_compress.js';
    $GLOBALS['TL_CSS'][] = 'plugins/autocompleter/css/auto_completer.css'; 
    
    in meinem template der javascript-aufruf und das formular mit dem suchfeld:
    PHP-Code:
    <script type="text/javascript">
    document.addEvent('domready', function() {
        var inputWord = $('ctrl_titlefor');
        new Autocompleter.Request.HTML(inputWord, '{{env::path}}/system/modules/testmodul/script.php', {
            'indicatorClass': 'autocompleter-loading' // class added to the input during request
        }); 
    });
    </script>
    <form action="" method="get">
    <input type="text" name="titlefor" id="ctrl_titlefor" class="text" value="<?php echo $this->titlefor; ?>">
    ...
    und meine script.php:
    PHP-Code:
    $search = stripslashes(strip_tags($_POST['value']));
     
    if (is_string($search) )
    {
        $connection=mysql_connect('localhost', 'user', 'password') or die
            ("Verbindungsversuch fehlgeschlagen");
        
        mysql_select_db('contaodb', $connection) or die("Konnte die Datenbank nicht waehlen.");
        
            $sql = "SELECT name FROM tl_tabelle WHERE name LIKE '".mysql_real_escape_string($search)."%'";
        $query = mysql_query($sql) or die("Anfrage nicht erfolgreich");
        
            $words=array();
            while ($result = mysql_fetch_row($query)) {
            $words[]= $result[0];
            }
    }
     
    foreach ($words as $word)
    {
        echo "<li>$word</li>";
    } 
    
    mir ist klar, dass die script.php in das contao-framework integriert werden muss und dort komme ich nicht weiter. kann mir da jemand helfen?
    danke und viele grüße
    silvia
    https://www.landzone.de
  • landzone
    Contao-Fan
    • 12.03.2012
    • 256

    #2
    erstmal danke für deine antwort und sorry für den "müll".
    mein problem ist ja, dass ich mit den vorhandenen plugins nicht klar gekommen bin und daher erstmal das grundscript von harald kirscher ausprobiert habe, um zu sehen, wo mein denkfehler ist. also ohne contao-framework.

    ich meine, das so ähnlich auch bei dir in deinem testmodul gesehen zu haben und in diesem thread hattest du eine ähnliche frage gestellt:

    aber da gab es auch keine antwort, die mir geholfen hätte.

    nach weiterem langen testen und dank deiner nochmaligen erklärung funktioniert es nun endlich, vielen dank.

    eine frage noch: funktionieren auch mehrere solcher suchfelder in einem formular?
    wie müsste ich das objekt dann erstellen?
    in meinem frontendmodul habe ich ein formular mit 2 texteingabefeldern, in einem kann man nach einem namen und in einem zweiten feld nach dem ort suchen. beide möchte ich nun mit autocomplete vervollständigen. und das erste funktioniert jetzt.

    hier nochmal meine schrittfolge für das einfache suchfeld, vielleicht hilft es ja auch jemand anderem.

    in der config.php des moduls registriere ich den hook:
    PHP-Code:
    $GLOBALS['TL_HOOKS']['getAutoCompleterChoices'][] = array('AcTestSearch', 'getChoices'); 
    
    in der compile()-funktion meines frontend-moduls erstelle ich das autocompleter objekt:
    PHP-Code:
    $objAutoCompleter = new AutoCompleter();
    $objAutoCompleter->formId = 'ctrl_keywords';
    $objAutoCompleter->minLength = '1';
    $objAutoCompleter->width = 'inherit';
    $objAutoCompleter->maxChoices = '10';
    $objAutoCompleter->zIndex = '35';
    $objAutoCompleter->delay = '400';
    $objAutoCompleter->generate(); 
    
    in meinem template habe ich das sucheingabefeld:
    PHP-Code:
    <input type="search" name="keywords" id="ctrl_keywords" class="text" value="<?php echo $this->defaultValue; ?>" onblur="if(this.value == '') { this.value='<?php echo $this->defaultValue; ?>'}" onfocus="if (this.value == '<?php echo $this->defaultValue; ?>') {this.value=''}">
    in der AcTestSearch.php die abfrage in der funktion getChoices()
    PHP-Code:
    public function getChoices()
        {
            $this->import('Database');
            $intAcid = str_replace('ctrl_keywords', '', $this->Input->get('acid'));
    
            $arrWhere = array();
            $arrValues = array();
    
            $arrWhere[] = 'keyword LIKE ?';
            $arrValues[] = '%' . strtolower($this->Input->post('value')) . '%';
    
            // get all keywords from the database
            $objKeyword = $this->Database->prepare('SELECT DISTINCT keyword FROM tl_keywords WHERE ' . implode(' AND ', $arrWhere) . ' ORDER BY   keyword DESC')
                ->limit(10)
                ->executeUncached($arrValues);
    
            if ($objKeyword->numRows > 0)
            {
                return $objKeyword->fetchEach('keyword');
            }
        }
    } 
    

    dann hab ich noch die css von harald kirschner eingebunden und das wars.
    korrigier mich, wenn ich wieder was falsches geschrieben hab.
    viele grüße
    silvia
    https://www.landzone.de

    Kommentar

    • landzone
      Contao-Fan
      • 12.03.2012
      • 256

      #3
      super, vielen dank. jetzt hab ich alles, wie ich es wollte.
      vielleicht ist es ja hilfreich, wenn ich mal ein kleines tutorial zu dem thema erstelle? denn ich könnte mir vorstellen, dass dies für einige hilfreich wäre.
      viele grüße
      silvia
      https://www.landzone.de

      Kommentar

      • Nikolas
        Contao-Fan
        • 22.08.2009
        • 493

        #4
        Hallo landzone,

        könntest du kurz schildern wie du mehrere Autocompleter letztendlich in ein Formular untergebracht hast?
        Ich bekomm das irgendwie nicht hin.

        Gruß
        Nikolas

        Kommentar

        • landzone
          Contao-Fan
          • 12.03.2012
          • 256

          #5
          im frontendmodul generiere ich 2 autocompleter-objekte:
          PHP-Code:
           // create the new Auto Completer object
              $objAutoCompleter_title = new AutoCompleter();
              $objAutoCompleter_title->formId = 'ctrl_titlefor';
              $objAutoCompleter_title->generate();
                   
              // create the new Auto Completer object
              $objAutoCompleter_location = new AutoCompleter();
              $objAutoCompleter_location->formId = 'ctrl_locationfor';
              $objAutoCompleter_location->generate(); 
          
          im template habe ich zwei sucheingabefelder:
          PHP-Code:
          <input type="search" name="titlefor" id="ctrl_titlefor" class="text" value="<?php echo $this->titlefor; ?>">
          <br />
          <input type="search" name="locationfor" id="ctrl_locationfor" class="text" value="<?php echo $this->locationfor; ?>">
          und in der getChoices() funktion frage ich nach der id des suchfeldes ab:
          PHP-Code:
          if($this->Input->get('acid') == 'ctrl_titlefor') 
                  {
                      $arrTitleWhere = array();
                      $arrTitleValues = array();
                      
                      ....
          
                  }
                  
                  if($this->Input->get('acid') == 'ctrl_locationfor') 
                          {
                                  ....
                          }
                  { 
          
          soweit in aller kürze, hoffe, das hilft.
          viele grüße
          silvia
          https://www.landzone.de

          Kommentar

          • Stranger
            Contao-Fan
            • 20.06.2009
            • 752

            #6
            Ich kriegs trotz der Anleitung nicht hin, kann bitte mal jemand eine Beispiel-Erweiterung hochladen?
            Oder liegt es an Contao 3?
            Zuletzt geändert von Stranger; 06.09.2013, 00:16.
            Du willst dich bei mir bedanken?
            Ich freue mich über Geschenke von meiner Amazon-Wunschliste.

            Contao-Anwender seit 2008
            Contao-Entwickler seit 2013, mehr als 50 Contao Erweiterungen programmiert

            Mein Unternehmen aus Blankenburg (Harz): Fast & Media

            Kommentar

            • WebRoxx
              Alter Contao-Hase
              • 18.07.2012
              • 1202

              #7
              Könntest du auch sagen wo du welche Datein hingepackt hast?

              Komme hier mit nicht so richtig klar
              Liebe Grüße
              WebRoxx

              Kommentar

              Lädt...