Fase 3 v1: new qr types, svg export, clipboard, frame text, batch CSV
New static qr types: - App Link: Android intent:// links (with package + optional browser fallback) or a generic custom-scheme URI. iOS Universal Links need no special encoding (they're just plain https:// URLs). - Bluetooth: device name + MAC address. Purely informational, since unlike WIFI:/vCard there's no OS-native "scan to pair" convention. SVG export: already worked (format whitelist/dropdown existed since Fase 1), verified rather than reimplemented. Copy-to-clipboard button next to the download button on both qr list tables, using the Clipboard API against a fetched blob. Optional frame text label rendered below the qr code via GD after generation (raster formats only, no-op for svg/eps). Batch CSV upload (batch_qrcode.php): filename,link rows create dynamic qr codes with sane defaults, downloadable as a zip. Required refactoring Qrcode-intchil.php's generation path (previously always redirected/exited via failure()/success(), which can't run in a loop) into a private renderAndStore() that throws instead, shared by addQrcode() and the new addQrcodeBatch(). Qrcode.php's addQrcodeBatch() is a separate, deliberately duplicated implementation instead, since its generation logic is small enough that duplication carries less risk than refactoring the working external-API code path.
This commit is contained in:
@@ -0,0 +1,73 @@
|
||||
<form class="form" action="static_qrcode.php?type=applink" method="post" id="static_form" enctype="multipart/form-data">
|
||||
<?php echo csrf_field(); ?>
|
||||
<?php include BASE_PATH.'/forms/qrcode_options.php'; ?>
|
||||
<!-- Input forms -->
|
||||
<div class="col-sm-12 mb-2">
|
||||
<div class="row">
|
||||
|
||||
<div class="col-6 col-md-3">
|
||||
<div class="form-group">
|
||||
<label>Platform *</label>
|
||||
<select name="platform" id="applink-platform" class="form-control">
|
||||
<option value="android" selected>Android (intent link)</option>
|
||||
<option value="generic">Generic (custom scheme)</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="col-6 col-md-3">
|
||||
<div class="form-group">
|
||||
<label>Scheme *</label>
|
||||
<input type="text" name="scheme" value="" placeholder="myapp" class="form-control">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="col-6 col-md-3">
|
||||
<div class="form-group">
|
||||
<label>Path *</label>
|
||||
<input type="text" name="path" value="" placeholder="open?ref=123" class="form-control">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="col-6 col-md-3" id="applink-package-group">
|
||||
<div class="form-group">
|
||||
<label>Android package *</label>
|
||||
<input type="text" name="package" value="" placeholder="com.example.app" class="form-control">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="col-6 col-md-3" id="applink-fallback-group">
|
||||
<div class="form-group">
|
||||
<label>Fallback URL</label>
|
||||
<input type="text" name="fallback_url" value="" placeholder="https://play.google.com/store/apps/details?id=..." class="form-control">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
(function () {
|
||||
var platformSelect = document.getElementById('applink-platform');
|
||||
var packageGroup = document.getElementById('applink-package-group');
|
||||
var fallbackGroup = document.getElementById('applink-fallback-group');
|
||||
|
||||
function updateVisibility() {
|
||||
var isAndroid = platformSelect.value === 'android';
|
||||
packageGroup.style.display = isAndroid ? '' : 'none';
|
||||
fallbackGroup.style.display = isAndroid ? '' : 'none';
|
||||
}
|
||||
|
||||
platformSelect.addEventListener('change', updateVisibility);
|
||||
updateVisibility();
|
||||
})();
|
||||
</script>
|
||||
|
||||
<div class="col-sm-12 mb-2">
|
||||
<div class="row">
|
||||
<div class="col-6 col-md-3">
|
||||
<button type="submit" class="btn btn-primary">Submit</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</form>
|
||||
Reference in New Issue
Block a user