Files
TravianZ/Templates/Build/17.tpl
T
Ferywir 6d57cd7fe1 feat(preferences): apply auto-completion (village name suggestions) [#198]
Honour the per-user auto-completion checkboxes on the rally point and the
marketplace, where the target village is typed by name (dname field):
  - v1: own villages
  - v2: villages in the surroundings of the active village
  - v3: villages of the player's alliance members

A new Database::getAutoCompleteVillages() builds the bounded, de-duplicated
name list from the enabled categories (system accounts excluded). A shared
Templates/villageAutocomplete.tpl renders a native <datalist> consumed by
the dname input via list="dnameSuggest"; nothing is emitted when every box
is unchecked, keeping the previous behaviour. Removes the "not coded yet"
tag from the auto-completion section in the preferences form.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-12 09:28:20 +02:00

246 lines
13 KiB
Smarty

<?php
// 17.tpl - MARKETPLACE
global $database, $session, $village, $market, $generator, $form, $id;
$merchantAvail = (int)$market->merchantAvail();
$maxcarry = (int)$market->maxcarry;
$totalMerchants = (int)$market->merchant;
// --- POST sanitizat ---
$r = [];
for ($i = 1; $i <= 4; $i++) {
$r[$i] = isset($_POST['r'.$i])? max(0, (int)$_POST['r'.$i]) : 0;
}
$allres = array_sum($r);
$x = isset($_POST['x'])? trim($_POST['x']) : '';
$y = isset($_POST['y'])? trim($_POST['y']) : '';
$dname = isset($_POST['dname'])? trim($_POST['dname']) : '';
$send3 = isset($_POST['send3'])? (int)$_POST['send3'] : 1;
$ft = $_POST['ft']?? '';
// --- target ---
$getwref = 0;
$checkexist = false;
$target = null;
if ($x!== '' && $y!== '' && is_numeric($x) && is_numeric($y)) {
$getwref = (int)$database->getVilWref((int)$x, (int)$y);
$checkexist = $database->checkVilExist($getwref);
} elseif ($dname!== '') {
$getwref = (int)$database->getVillageByName($dname);
$checkexist = $database->checkVilExist($getwref);
}
if ($checkexist) {
$villageOwner = (int)$database->getVillageField($getwref, 'owner');
$userAccess = (int)$database->getUserField($villageOwner, 'access', 0);
$userVacation = (int)$database->getUserField($villageOwner, 'vac_mode', 0);
$userID = (int)$database->getUserField($villageOwner, 'id', 0);
$target = [
'wref' => $getwref,
'name' => $database->getVillageField($getwref, 'name'),
'owner' => $villageOwner,
'coor' => $database->getCoor($getwref),
];
$target['time'] = $generator->procDistanceTime($target['coor'], $village->coor, $session->tribe, 0);
}
$maxTotalCarry = $maxcarry * $merchantAvail;
$canRepeat = ($send3 === 1) || ($send3 >= 2 && $send3 <= 3 && $session->goldclub);
$validTarget = $checkexist && $getwref!== $village->wid;
$validAccess = $checkexist && ($userAccess == 2 || $userAccess == MULTIHUNTER || (defined('ADMIN_ALLOW_INCOMING_RAIDS') && ADMIN_ALLOW_INCOMING_RAIDS && $userAccess == ADMIN));
$showConfirm = ($ft === 'check' && $canRepeat && $validTarget && $allres > 0 && $allres <= $maxTotalCarry && $validAccess && $userVacation == 0);
// coordonate prefill din GET
$coor = ['x' => '', 'y' => ''];
if (isset($_GET['z'])) {
$coor = $database->getCoor((int)$_GET['z']);
}
?>
<div id="build" class="gid17">
<a href="#" onClick="return Popup(17,4);" class="build_logo">
<img class="building g17" src="img/x.gif" alt="<?php echo MARKETPLACE; ?>" title="<?php echo MARKETPLACE;?>" />
</a>
<h1><?php echo MARKETPLACE;?> <span class="level"><?php echo LEVEL;?> <?php echo (int)$village->resarray['f'.$id];?></span></h1>
<p class="build_desc"><?php echo MARKETPLACE_DESC;?></p>
<?php include("17_menu.tpl");?>
<script language="JavaScript">
</script>
<?php if ($showConfirm && $target):?>
<form method="POST" name="snd" action="build.php">
<input type="hidden" name="ft" value="mk1">
<input type="hidden" name="id" value="<?php echo (int)$id;?>">
<input type="hidden" name="send3" value="<?php echo $send3;?>">
<table id="send_select" class="send_res" cellpadding="1" cellspacing="1">
<?php for ($i = 1; $i <= 4; $i++):
$resNames = [1=>LUMBER,2=>CLAY,3=>IRON,4=>CROP];
?>
<tr>
<td class="ico"><img class="r<?php echo $i;?>" src="img/x.gif" alt="<?php echo $resNames[$i];?>" title="<?php echo $resNames[$i];?>" /></td>
<td class="nam"><?php echo $resNames[$i];?></td>
<td class="val"><input class="text disabled" type="text" name="r<?php echo $i;?>" id="r<?php echo $i;?>" value="<?php echo $r[$i];?>" readonly="readonly"></td>
<td class="max"> / <span class="none"><b><?php echo $maxcarry;?></b></span></td>
</tr>
<?php endfor;?>
</table>
<table id="target_validate" class="res_target" cellpadding="1" cellspacing="1">
<tbody>
<tr>
<th><?php echo COORDINATES;?>:</th>
<td><a href="karte.php?d=<?php echo $target['wref'];?>&c=<?php echo $generator->getMapCheck($target['wref']);?>"><?php echo htmlspecialchars($target['name']);?>(<?php echo (int)$target['coor']['x'];?>|<?php echo (int)$target['coor']['y'];?>)</a></td>
</tr>
<tr>
<th><?php echo PLAYER;?>:</th>
<td><a href="spieler.php?uid=<?php echo $target['owner'];?>"><?php echo htmlspecialchars($database->getUserField($target['owner'], 'username', 0));?></a></td>
</tr>
<tr>
<th><?php echo DURATION;?>:</th>
<td><?php echo $generator->getTimeFormat($target['time']);?></td>
</tr>
<tr>
<th><?php echo MERCHANT;?>:</th>
<td><?php echo ceil(($allres - 0.1) / $maxcarry);?></td>
</tr>
<tr><td colspan="2"></td></tr>
</tbody>
</table>
<input type="hidden" name="getwref" value="<?php echo $target['wref'];?>">
<div class="clear"></div>
<p><input type="image" value="ok" name="s1" id="btn_ok" class="dynamic_img" src="img/x.gif" tabindex="8" alt="OK" <?php if(!$merchantAvail) echo 'disabled';?> /></p>
</form>
<?php else:?>
<form method="POST" name="snd" action="build.php">
<input type="hidden" name="ft" value="check">
<input type="hidden" name="id" value="<?php echo (int)$id;?>">
<table id="send_select" class="send_res" cellpadding="1" cellspacing="1">
<?php for ($i = 1; $i <= 4; $i++):
$resNames = [1=>LUMBER,2=>CLAY,3=>IRON,4=>CROP];
?>
<tr>
<td class="ico"><a href="#" onClick="upd_res(<?php echo $i;?>,1); return false;"><img class="r<?php echo $i;?>" src="img/x.gif" alt="<?php echo $resNames[$i];?>" title="<?php echo $resNames[$i];?>" /></a></td>
<td class="nam"><?php echo $resNames[$i];?>:</td>
<td class="val"><input class="text" type="text" name="r<?php echo $i;?>" id="r<?php echo $i;?>" value="" maxlength="5" onKeyUp="upd_res(<?php echo $i;?>)" tabindex="<?php echo $i;?>"></td>
<td class="max"><a href="#" onMouseUp="add_res(<?php echo $i;?>);" onClick="return false;">(<?php echo $maxcarry;?>)</a></td>
</tr>
<?php endfor;?>
</table>
<table id="target_select" class="res_target" cellpadding="1" cellspacing="1">
<tr><td class="mer"><?php echo MERCHANT;?> <?php echo $merchantAvail;?>/<?php echo $totalMerchants;?></td></tr>
<tr><td class="vil"><span><?php echo VILLAGES;?>:</span> <input class="text" type="text" name="dname" value="" maxlength="30" tabindex="5" list="dnameSuggest" autocomplete="off"><?php include("Templates/villageAutocomplete.tpl"); ?></td></tr>
<tr><td class="or"><?php echo OR_;?></td></tr>
<tr>
<td class="coo">
<span>X:</span><input class="text" type="text" name="x" value="<?php echo htmlspecialchars($coor['x']);?>" maxlength="4" tabindex="6">
<span>Y:</span><input class="text" type="text" name="y" value="<?php echo htmlspecialchars($coor['y']);?>" maxlength="4" tabindex="7">
</td>
</tr>
</table>
<div class="clear"></div>
<?php if ($session->goldclub == 1):?>
<p><select name="send3"><option value="1" selected>1x</option><option value="2">2x</option><option value="3">3x</option></select> <?php echo GO;?></p>
<?php else:?>
<input type="hidden" name="send3" value="1">
<?php endif;?>
<p><input type="image" value="ok" name="s1" id="btn_ok" class="dynamic_img" src="img/x.gif" tabindex="8" alt="OK" <?php if(!$merchantAvail) echo 'disabled';?> /></p>
</form>
<?php
// --- erori ---
$error = '';
if ($ft === 'check') {
if ($form->returnErrors() > 0) {
$error = '<span class="error"><b>'.$form->getError("error").'</b></span>';
} elseif (!$checkexist) {
$error = '<span class="error"><b>'.NO_COORDINATES_SELECTED.'</b></span>';
} elseif ($getwref == $village->wid) {
$error = '<span class="error"><b>'.CANNOT_SEND_RESOURCES.'</b></span>';
} elseif (!$canRepeat) {
$error = '<span class="error"><b>'.INVALID_MERCHANTS_REPETITION.'</b></span>';
} elseif (!$validAccess) {
$error = '<span class="error"><b>'.BANNED_CANNOT_SEND_RESOURCES.'.</b></span>';
} elseif ($allres == 0) {
$error = '<span class="error"><b>'.RESOURCES_NO_SELECTED.'.</b></span>';
} elseif ($userVacation == 1) {
$error = '<span class="error"><b>Player is on vacation mode. You cannot send resources to him.</b></span>';
} elseif ($x === '' && $y === '' && $dname === '') {
$error = '<span class="error"><b>'.ENTER_COORDINATES.'.</b></span>';
} elseif ($allres > $maxTotalCarry) {
$error = '<span class="error"><b>'.TOO_FEW_MERCHANTS.'.</b></span>';
}
echo $error;
}
?>
<?php endif;?>
<p><?php echo MERCHANT_CARRY;?> <b><?php echo $maxcarry;?></b> <?php echo UNITS_OF_RESOURCE;?></p>
<?php
// --- comercianți care vin ---
if (count($market->recieving) > 0) {
echo "<h4>".MERCHANT_COMING.":</h4>";
foreach ($market->recieving as $recieve) {
$villageowner = (int)$database->getVillageField($recieve['from'], "owner");
echo '<table class="traders" cellpadding="1" cellspacing="1">';
echo '<thead><tr><td><a href="spieler.php?uid='.$villageowner.'">'.htmlspecialchars($database->getUserField($villageowner,"username",0)).'</a></td>';
echo '<td><a href="karte.php?d='.$recieve['from'].'&c='.$generator->getMapCheck($recieve['from']).'">'.TRANSPORT_FROM.' '.htmlspecialchars($database->getVillageField($recieve['from'],"name")).'</a></td></tr></thead>';
echo '<tbody><tr><th>'.ARRIVAL_IN.'</th><td>';
echo '<div class="in"><span id="timer'.(++$session->timer).'">'.$generator->getTimeFormat($recieve['endtime']-time()).'</span> h</div>';
$datetime = $generator->procMtime($recieve['endtime']);
echo '<div class="at">'.($datetime[0]!= "today"? ON." ".$datetime[0]." " : "").AT." ".$datetime[1].'</div>';
echo '</td></tr></tbody><tr class="res"><th>'.RESOURCES.'</th><td colspan="2"><span class="f10">';
echo '<img class="r1" src="img/x.gif" alt="'.LUMBER.'" title="'.LUMBER.'" />'.$recieve['wood'].' | ';
echo '<img class="r2" src="img/x.gif" alt="'.CLAY.'" title="'.CLAY.'" />'.$recieve['clay'].' | ';
echo '<img class="r3" src="img/x.gif" alt="'.IRON.'" title="'.IRON.'" />'.$recieve['iron'].' | ';
echo '<img class="r4" src="img/x.gif" alt="'.CROP.'" title="'.CROP.'" />'.$recieve['crop'];
echo '</span></td></tr></table>';
}
}
// --- comercianți trimiși ---
if (count($market->sending) > 0) {
echo "<h4>".OWN_MERCHANTS_ONWAY.":</h4>";
foreach ($market->sending as $send) {
$villageowner = (int)$database->getVillageField($send['to'],"owner");
echo '<table class="traders" cellpadding="1" cellspacing="1">';
echo '<thead><tr><td><a href="spieler.php?uid='.$villageowner.'">'.htmlspecialchars($database->getUserField($villageowner,"username",0)).'</a></td>';
echo '<td><a href="karte.php?d='.$send['to'].'&c='.$generator->getMapCheck($send['to']).'">'.TRANSPORT_TO.' '.htmlspecialchars($database->getVillageField($send['to'],"name")).'</a></td></tr></thead>';
echo '<tbody><tr><th>'.ARRIVAL_IN.'</th><td>';
echo '<div class="in"><span id="timer'.(++$session->timer).'">'.$generator->getTimeFormat($send['endtime']-time()).'</span> h</div>';
$datetime = $generator->procMtime($send['endtime']);
echo '<div class="at">'.($datetime[0]!= "today"? ON." ".$datetime[0]." " : "").AT." ".$datetime[1].'</div>';
echo '</td></tr><tr class="res"><th>'.RESOURCES.'</th><td>';
echo '<img class="r1" src="img/x.gif" alt="'.LUMBER.'" />'.$send['wood'].' | ';
echo '<img class="r2" src="img/x.gif" alt="'.CLAY.'" />'.$send['clay'].' | ';
echo '<img class="r3" src="img/x.gif" alt="'.IRON.'" />'.$send['iron'].' | ';
echo '<img class="r4" src="img/x.gif" alt="'.CROP.'" />'.$send['crop'];
echo '</td></tr></tbody></table>';
}
}
// --- comercianți care se întorc ---
if (count($market->return) > 0) {
echo "<h4>".MERCHANTS_RETURNING.":</h4>";
foreach ($market->return as $return) {
$villageowner = (int)$database->getVillageField($return['from'],"owner");
echo '<table class="traders" cellpadding="1" cellspacing="1">';
echo '<thead><tr><td><a href="spieler.php?uid='.$villageowner.'">'.htmlspecialchars($database->getUserField($villageowner,"username",0)).'</a></td>';
echo '<td><a href="karte.php?d='.$return['from'].'&c='.$generator->getMapCheck($return['from']).'">'.RETURNFROM.' '.htmlspecialchars($database->getVillageField($return['from'],"name")).'</a></td></tr></thead>';
echo '<tbody><tr><th>'.ARRIVAL_IN.'</th><td>';
echo '<div class="in"><span id="timer'.(++$session->timer).'">'.$generator->getTimeFormat($return['endtime']-time()).'</span> h</div>';
$datetime = $generator->procMtime($return['endtime']);
echo '<div class="at">'.($datetime[0]!= "today"? ON." ".$datetime[0]." " : "").AT." ".$datetime[1].'</div>';
echo '</td></tr></tbody></table>';
}
}
include("upgrade.tpl");
?>
</div>