-
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
-
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:
https://www.contao-community.de/show...highlight=ajax
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
-
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
-
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
-
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
-
Ich kriegs trotz der Anleitung nicht hin, kann bitte mal jemand eine Beispiel-Erweiterung hochladen?
Oder liegt es an Contao 3?
-
Könntest du auch sagen wo du welche Datein hingepackt hast?
Komme hier mit nicht so richtig klar :(