feat: kein interner-name-feld mehr - ID automatisch aus anbietername
- Dienst-Zeile zeigt/erfordert nur noch den Anbietername. - Interne ID wird beim Speichern aus dem Namen abgeleitet (sanitize_title), bestehende IDs bleiben via Hidden-Field stabil; Eindeutigkeit erzwungen. - Shortcode-Hilfe erklaert: ID = Anbietername in Kleinbuchstaben mit Bindestrichen. - EN-Uebersetzung (120) aktualisiert. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -11,15 +11,13 @@
|
||||
$( '.cb-color-picker', ctx ).wpColorPicker();
|
||||
}
|
||||
|
||||
/* ── Live header update: "interner-name — Anbietername" ── */
|
||||
/* ── Live header update: provider name ── */
|
||||
function syncTitle( box ) {
|
||||
const id = ( $( '.cb-input-id', box ).val() || '' ).trim();
|
||||
const name = ( $( '.cb-input-name', box ).val() || '' ).trim();
|
||||
const head = ( id || ( cbAdmin.newServiceLbl || 'neu' ) ) + ( name ? ' — ' + name : '' );
|
||||
$( '.cb-service-title', box ).first().text( head );
|
||||
$( '.cb-service-title', box ).first().text( name || ( cbAdmin.newServiceLbl || 'Neuer Dienst' ) );
|
||||
}
|
||||
function bindNameSync( box ) {
|
||||
$( '.cb-input-name, .cb-input-id', box ).on( 'input', function () {
|
||||
$( '.cb-input-name', box ).on( 'input', function () {
|
||||
syncTitle( box );
|
||||
} );
|
||||
}
|
||||
@@ -239,7 +237,7 @@
|
||||
const $box = addServiceRow( data );
|
||||
if ( $box && $box.length ) {
|
||||
$box[ 0 ].scrollIntoView( { behavior: 'smooth', block: 'center' } );
|
||||
$box.find( '.cb-input-id' ).trigger( 'focus' );
|
||||
$box.find( '.cb-input-name' ).trigger( 'focus' );
|
||||
}
|
||||
} )
|
||||
.appendTo( $act );
|
||||
|
||||
@@ -104,17 +104,36 @@ class CB_Settings {
|
||||
: [];
|
||||
|
||||
$services = [];
|
||||
$used_ids = [];
|
||||
foreach ( $raw_services as $item ) {
|
||||
if ( ! is_array( $item ) ) {
|
||||
continue;
|
||||
}
|
||||
$name = sanitize_text_field( $item['name'] ?? '' );
|
||||
if ( $name === '' ) {
|
||||
continue; // a service needs at least a provider name
|
||||
}
|
||||
|
||||
// Keep the existing id stable (hidden field); derive from the name
|
||||
// for new services. Ensure uniqueness.
|
||||
$id = sanitize_key( $item['id'] ?? '' );
|
||||
if ( $id === '' ) {
|
||||
continue;
|
||||
$id = sanitize_title( $name );
|
||||
}
|
||||
if ( $id === '' ) {
|
||||
$id = 'dienst';
|
||||
}
|
||||
$base_id = $id;
|
||||
$n = 2;
|
||||
while ( in_array( $id, $used_ids, true ) ) {
|
||||
$id = $base_id . '-' . $n;
|
||||
$n++;
|
||||
}
|
||||
$used_ids[] = $id;
|
||||
|
||||
$services[] = [
|
||||
'id' => $id,
|
||||
'name' => sanitize_text_field( $item['name'] ?? '' ),
|
||||
'name' => $name,
|
||||
'enabled' => ! empty( $item['enabled'] ),
|
||||
'match_pattern' => sanitize_text_field( $item['match_pattern'] ?? '' ),
|
||||
'recipient' => sanitize_text_field( $item['recipient'] ?? '' ),
|
||||
@@ -530,8 +549,8 @@ class CB_Settings {
|
||||
$name = $svc['name'] ?? '';
|
||||
$id = $svc['id'] ?? '';
|
||||
$enabled = $svc['enabled'] ?? true; // default ON (new + legacy services)
|
||||
// Header label: "interner-name — Anbietername"
|
||||
$headname = trim( ( $id !== '' ? $id : __( 'neu', 'gdpr-content-blocker' ) ) . ( $name !== '' ? ' — ' . $name : '' ) );
|
||||
// Header shows just the provider name (internal id is auto-derived).
|
||||
$headname = $name !== '' ? $name : __( 'Neuer Dienst', 'gdpr-content-blocker' );
|
||||
?>
|
||||
<div class="cb-service-box" data-cb-index="<?php echo $idx; ?>">
|
||||
<div class="cb-service-head">
|
||||
@@ -548,13 +567,10 @@ class CB_Settings {
|
||||
<span class="dashicons dashicons-trash"></span>
|
||||
</button>
|
||||
</div>
|
||||
<?php // Internal id is kept stable for existing services and auto-derived
|
||||
// from the name for new ones (no separate field). ?>
|
||||
<input type="hidden" class="cb-input-id" name="cb_services[<?php echo $idx; ?>][id]" value="<?php echo $f( 'id' ); ?>">
|
||||
<div class="cb-service-grid" style="display:none;">
|
||||
<div class="cb-field">
|
||||
<label><?php esc_html_e( 'Interner Name (Slug)', 'gdpr-content-blocker' ); ?> *</label>
|
||||
<input type="text" name="cb_services[<?php echo $idx; ?>][id]"
|
||||
value="<?php echo $f( 'id' ); ?>" required
|
||||
placeholder="google-maps" pattern="[a-z0-9\-]+" class="cb-input-id">
|
||||
</div>
|
||||
<div class="cb-field">
|
||||
<label><?php esc_html_e( 'Anbietername', 'gdpr-content-blocker' ); ?> *</label>
|
||||
<input type="text" name="cb_services[<?php echo $idx; ?>][name]"
|
||||
@@ -650,7 +666,7 @@ class CB_Settings {
|
||||
<tr>
|
||||
<td style="vertical-align:top;"><strong><?php esc_html_e( 'Inhalt manuell blockieren', 'gdpr-content-blocker' ); ?></strong><br>
|
||||
<?php echo $code( '[content_blocker id="google-maps"]…iframe…[/content_blocker]' ); ?></td>
|
||||
<td><?php esc_html_e( 'Umschließt ein iframe und ersetzt es durch den Platzhalter des angegebenen Dienstes. Verwenden Sie den internen Namen aus dem Tab „Dienste".', 'gdpr-content-blocker' ); ?></td>
|
||||
<td><?php esc_html_e( 'Umschließt ein iframe und ersetzt es durch den Platzhalter des angegebenen Dienstes. Die ID ist der Anbietername in Kleinbuchstaben mit Bindestrichen (z. B. „Google Maps" → google-maps).', 'gdpr-content-blocker' ); ?></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style="vertical-align:top;"><strong><?php esc_html_e( 'Dienste-Übersicht (Datenschutzerklärung)', 'gdpr-content-blocker' ); ?></strong><br>
|
||||
|
||||
Binary file not shown.
@@ -243,9 +243,6 @@ msgstr "Scan website"
|
||||
msgid "Darstellung speichern"
|
||||
msgstr "Save appearance"
|
||||
|
||||
msgid "neu"
|
||||
msgstr "new"
|
||||
|
||||
msgid "Details anzeigen/ausblenden"
|
||||
msgstr "Show/hide details"
|
||||
|
||||
@@ -255,9 +252,6 @@ msgstr "Blocker on/off"
|
||||
msgid "Dienst entfernen"
|
||||
msgstr "Remove service"
|
||||
|
||||
msgid "Interner Name (Slug)"
|
||||
msgstr "Internal name (slug)"
|
||||
|
||||
msgid "Anbietername"
|
||||
msgstr "Provider name"
|
||||
|
||||
@@ -318,8 +312,8 @@ msgstr "Renders a clearly visible link that withdraws consent for external embed
|
||||
msgid "Inhalt manuell blockieren"
|
||||
msgstr "Block content manually"
|
||||
|
||||
msgid "Umschließt ein iframe und ersetzt es durch den Platzhalter des angegebenen Dienstes. Verwenden Sie den internen Namen aus dem Tab „Dienste\"."
|
||||
msgstr "Wraps an iframe and replaces it with the placeholder of the given service. Use the internal name from the \"Services\" tab."
|
||||
msgid "Umschließt ein iframe und ersetzt es durch den Platzhalter des angegebenen Dienstes. Die ID ist der Anbietername in Kleinbuchstaben mit Bindestrichen (z. B. „Google Maps\" → google-maps)."
|
||||
msgstr "Wraps an iframe and replaces it with the placeholder of the given service. The ID is the provider name in lowercase with hyphens (e.g. \"Google Maps\" → google-maps)."
|
||||
|
||||
msgid "Dienste-Übersicht (Datenschutzerklärung)"
|
||||
msgstr "Services overview (privacy policy)"
|
||||
|
||||
Reference in New Issue
Block a user