Eintrag
WEBSTORM PHPSTORM 
 
Web- & PhpStorm | Warnung beim Überschreiben von Dateien (02.04.2025)
Da es leider öfters vorkommt, dass aktuellere Dateien mit den lokalen Dateien überschrieben werden, gibt es in Web- und PhpStorm eine nützliche Einstellung. Dies sollte am besten jeder bei sich umstellen, damit wir es so gut wie möglich minimieren können :)

1. Für bestehende Projekte muss man einmal in den Settings -> Build, Execution, Deployment -> Warn when uploading over newer file auf "Compare content" setzen.

2. Für neue Projekte kann man allgemein die Option anpassen. Dies kann man unter File ->New Projects Setup -> Settings for New Projects… und dort wie bei 1. die Einstellung vornehmen.


WEB JS CSS MOBILE-BROWSER 
 
Berechnung des Titelbildes unter Berücksichtigung des Browserchromes (24.03.2025)
Wenn man mobil eine Fullscreensection erstellen will, die nicht vom Chrome beschnitten oder verdeckt werden soll, habe ich eine Möglichkeit herausgefunden, wie man diese dynamisch berechnen kann. Hierzu reicht ein kleines Javascript und eine CSS-Anpassung des betreffenden Elementes.

// CSS-Anpassung des betreffenden Elementes:
.entsprechender-container {
height: 100vh;
height: calc(var(--vh, 1vh) * 100);
}
// Browser-Heightcalculating for mobile// First we get the viewport height and we multiple it by 1% to get a value for a vh unitlet vh = window.innerHeight * 0.01;// Then we set the value in the --vh custom property to the root of the documentdocument.documentElement.style.setProperty('--vh', `${vh}px`);// We listen to the resize eventwindow.addEventListener('resize', () => {  // We execute the same script as before  let vh = window.innerHeight * 0.01;  document.documentElement.style.setProperty('--vh', `${vh}px`);});
https://codepen.io/team/css-tricks/pen/WKdJaB


WEB SWIPER JS DESIGN 
 
Swiper-Slide Konfiguration (21.03.2025)
Falls ihr mal einen Swiper einsetzt, der Elemente anschneidet, interpretiert der Swiper dieses Element als „angeschnitten“ und slicet es bei Klick vollständig in den sichtbaren Bereich. Wenn ihr das unterbinden wollt und der Slider immer auf Klick reagieren soll, habe ich ein Snippet erstellt, was initial ein Autoplay mit Pause on MouseEnter und Mousescroll in Kombination mit dem schoon angesprochenen Klickverhalten beinhaltet.
var facilitiesSwiperDetailEquipment = new Swiper('.facilitiesSwiperDetailEquipment', {  pagination: {    el: ".swiper-pagination-equipment",    type: "fraction",  },  speed: 5000,  watchSlidesProgress: true,  autoplay: {    delay: 2500,    disableOnInteraction: false,    pauseOnMouseEnter: true,  },  mousewheel: {    releaseOnEdges: true,    direction: "horizontal",    followFinger: true,  },  breakpoints: {    320: {      slidesPerView: 1,      spaceBetween: 60    },    768: {      slidesPerView: 1.8,      spaceBetween: 60    },    992: {      slidesPerView: 1.8,      spaceBetween: 60    },    1200: {      slidesPerView: 1.8,      spaceBetween: 60    }  }});


ARBEITSZEITEN REGELUNGEN AGENTUR 
 
Aktualisierte Regelungen ab 01.03.2025: Arbeitszeit, Gleitzeit, FlexTime, Remote, Krankheit, Payback & Co. (28.02.2025)

Ab dem 01.03.2025 gelten folgende Regeln, bis auf Widerruf.
Besonders die flexiblen Arbeitszeitmodelle und angepassten Öffnungszeiten können bei Nichteinhaltung der Regeln widerrufen werden.

Bitte tragt alle dazu bei, dass dies nicht geschehen muss.
Danke, David & Jens

1. Büro- und Kernarbeitszeiten

Bürozeiten:
• Mo–Do: 08:00–17:00 Uhr, Fr: 08:00–15:00 Uhr
• Die Zentrale ist telefonisch besetzt, und aus jedem Bereich ist stets mindestens ein ausgelernter Mitarbeiter vor Ort. Besonders zwischen 08:00 und 10:00 Uhr muss volle Erreichbarkeit gewährleistet sein.

Kernarbeitszeit:
• Mo–Do: 10:00–17:00 Uhr, Fr: 10:00–15:00 Uhr
• Alle Mitarbeiter müssen in dieser Zeit regulär anwesend sein.

2. Arbeitszeitvorgaben und Mittagspause

Arbeitszeitvorgaben:
• Mindestarbeitszeit: 36 Stunden pro Woche bzw. 160 Stunden pro Monat.
• Wird in einer Woche weniger als 40 Stunden gearbeitet, erfolgt der Ausgleich im selben Monat.

Mittagspause:
• Wahl zwischen 30 oder 60 Minuten, Start jeweils um 12:00 oder 13:00 Uhr.

3. Flexibles Zeitmanagement

Flexible Arbeitszeiten (Gleitzeit):
• Arbeitsbeginn: Mo–Fr flexibel zwischen 07:00 und 10:00 Uhr.
• Arbeitsende: Mo–Do auch nach 17:00 Uhr, Fr auch nach 15:00 Uhr (zunächst max. bis 19:00 Uhr bzw. bis 17:00 Uhr oder nach Absprache/Genehmigung)

Verkürzter Arbeitstag (Flextime):
• Ermöglicht, die tägliche Kernarbeitszeit um bis zu 2 Stunden (in 30-Minuten-Schritten) zu verkürzen, sodass ein früherer Feierabend möglich ist (Mo–Do ab 15:00 Uhr, Fr ab 13:00 Uhr).
• Diese Option darf nicht unmittelbar an die Mittagspause anschließen.
• Vorab erfolgt eine Abstimmung im jeweiligen Team; der Antrag ist frühzeitig über „projects“ einzureichen und wird von David oder Jens genehmigt/abgelehnt.
• Für Auszubildende gilt zusätzlich, dass diese Option maximal 2× pro Monat in Absprache mit dem zuständigen Ausbilder genutzt werden darf.
• Die Einhaltung der Monatsarbeitszeit muss durch Vor- oder Nacharbeit gewährleistet werden.

4. Agenturschlüssel, Fahrstuhl/Treppenhaus & Alarmanlage
• Um sowohl den Festangestellten als auch den Auszubildenden Zugang zum flexiblen Arbeitszeitmodell zu gewähren, bekommen ab sofort auch Auszubildende ab dem 2. Lehrjahr einen Agenturschlüssel für die Agenturräume (300er Schlüssel).
• Der Zugang zu den Agenturräumen ist ausdrücklich nur Mitarbeitern während der offiziellen Öffnungszeiten bzw. im Rahmen der Gleitzeitregeln gestattet.
• Ein Zugang außerhalb der Öffnungszeiten oder mit betriebsfremden Personen ist ausdrücklich untersagt und führt zur sofortigen Rückgabe der Schlüssel. Es gibt keine Ausnahmen.
• Die Alarmanlag in der Agentur ist bis 07:00 Uhr und ab 19:00 Uhr aktiviert.
• Die Zwischentür im Treppenhaus ist zwischen 06:30 Uhr und 19:00 Uhr geöffnet. Ebenso ist der Fahrstuhl nur in dieser Zeit in Betrieb. Außerhalb dieser Zeit ist der Zugang nur mit dem 1000er-Schlüssel (Tür unten) möglich und somit nicht mit dem 300er „Azubi-Schlüssel“ für die Agentur-Tür.
• Der Verlust eines Schlüssels muss unverzüglich gemeldet werden.

5. Remote-Arbeit
• Remote darf für die application und creation maximal 2× pro Woche und für die communication 1× pro Woche genutzt werden.
• Remote muss frühzeitig über „projects“ beantragt und von David oder Jens freigegeben werden.
• Die maximale Arbeitszeit im Remote beträgt 8 Stunden.
• Die Remote-Möglichkeit gilt zunächst nur für Festangestellte.
• Zudem muss immer mindestens ein festangestellter Mitarbeiter aus jedem Bereich vor Ort sein.

6. Urlaub
• Es gibt ganze und halbe Urlaubstage (4 oder 8 Stunden), die rechtzeitig über „projects“ zu beantragen und durch David oder Jens freizugeben sind.
• Resturlaub aus dem Vorjahr muss bis zum 31.03. des Folgejahres genommen werden, ansonsten verfällt dieser.

7. Krankheit
• Bei Krankheit bitte umgehend telefonisch mit David oder Jens abstimmen, damit notwendige Vertretungen organisiert werden können.
• Die voraussichtliche Dauer sollte kommuniziert werden.
• Eine ärztliche Krankmeldung (gelber Schein) ist ab dem 1. Krankheitstag erforderlich. Dieser wird automatisch vom Arzt an die Krankenkasse übermittelt und muss nicht mehr physisch in der Agentur vorgelegt werden.
• Bei Kindkrank-Tagen ist die entsprechend ausgefüllte Bescheinigung weiterhin digital bei David oder Jens vorzulegen.

8. Arztbesuch
• Akute Arztbesuche bitte vorher mit David oder Jens absprechen.
• Andere Arztbesuche sollten möglichst außerhalb der Arbeitszeit erfolgen (Gleitzeit und Flextime nutzen) oder innerhalb der Kernarbeitszeit abgesprochen werden.
• Arztbesuche sind keine Arbeitszeit und müssen nicht in der Zeiterfassung erfasst werden.
• Kalendereinträge sollten aus Datenschutzgründen allgemein gehalten werden.

9. Verspätungen durch externe Umstände
• Verspätungen, die die Kernarbeitszeit betreffen (z. B. durch Stau, ÖPNV, Wetterbedingungen), sind schnellstmöglich David oder Jens mitzuteilen.
• Die Arbeitszeit ist innerhalb der Woche oder durch Gleitzeit innerhalb des Monats nachzuholen.

10. Zeiterfassung
• Die Zeiterfassung sollte umgehend erfolgen und einem Kunden zugewiesen werden.
• Die Zeiten sollten möglichst präzise dem korrekten Kundenprojekt zugeordnet werden.
• Pauschales Buchen auf interne Zeiten für mehr als 4 Stunden am Tag gilt es zu vermeiden.

11. Payback-Modell
• Das Payback-Modell gilt für alle Vollzeit-Mitarbeiter oder nach Vereinbarung anteilig.
• Azubis steigen ab dem 2. Lehrjahr mit 50 % Payback ein.
• Die Stufen werden regelmäßig an die Teamstärke angeglichen.



APP TYPO3 BUG 
 
TYPO3 v12 auf v13 Update: FlexForm-Fehler in DCE lösen (10.01.2025)
Fehlerbeschreibung : „ Invalid flex form data structure on field name "image" with element "settings.akkordeon" in section container "container_akkordeon":
Nesting elements that have database relations in flex form sections is not allowed.“

Ursache des Problems : In TYPO3 13 und DCE 3.2.4 ist es nicht mehr erlaubt, Datenbank-Beziehungen (z. B. FAL für Bilder) innerhalb von FlexForm-Sections zu verschachteln. Das führt zu einem Fehler, wenn "image"-Felder (mit FAL) in einer Section als wiederholbare Elemente verwendet werden.

Lösungsschritte
- Fehlerhafte Felder finden : Zuerst müssen die betroffenen Felder gefunden werden, die noch die alte TCA-Struktur nutzen.

- TCA-Felder aktualisieren : Die gefundenen Felder werden mit der neuen TCA-Struktur ersetzt.

- Cache löschen : Nach dem Update muss der Cache im Ordner var/cache manuell gelöscht werden, damit die Änderungen wirksam werden.

- Update Wizard abschließen : Führen Sie anschließend im Backend den TYPO3 Update Wizard erneut aus, um das Update abzuschließen.
Alte TCA-Struktur für das "image“-Feld
<config>
	<type>group</type>
	<internal_type>db</internal_type>
	<appearance>
		<elementBrowserType>file</elementBrowserType>
		<elementBrowserAllowed>jpg,jpeg,png,gif,svg</elementBrowserAllowed>
	</appearance>
	<allowed>sys_file</allowed>
	<size>1</size>
	<minitems>0</minitems>
	<maxitems>1</maxitems>
	<show_thumbs>1</show_thumbs>
</config>

Neue TCA-Struktur für das "image“-Feld
<config>
	<type>input</type>
	<renderType>inputLink</renderType>
	<size>30</size>
	<eval>trim</eval>
	<softref>typolink,typolink_tag,images,url</softref>
	<fieldControl>
		<linkPopup>
			<options>
				<!--<blindLinkOptions>file,mail,page,spec,url</blindLinkOptions>-->
				<!--<blindLinkFields>class,params,target,title</blindLinkFields>-->
			</options>
		</linkPopup>
	</fieldControl>
</config>

Beispiel-SQL-Abfrage:
SELECT * FROM tx_dce_domain_model_dcefield WHERE configuration LIKE "%jpg,jpeg%“

Beispiel-SQL-Abfrage:
UPDATE tx_dce_domain_model_dcefield
SET configuration = '<config>
<type>input</type>
<renderType>inputLink</renderType>
<size>30</size>
<eval>trim</eval>
<softref>typolink,typolink_tag,images,url</softref>
<fieldControl>
<linkPopup>
<options>
<!--<blindLinkOptions>file,mail,page,spec,url</blindLinkOptions>-->
<!--<blindLinkFields>class,params,target,title</blindLinkFields>-->
</options>
</linkPopup>
</fieldControl>
</config>'
WHERE configuration LIKE "%jpg,jpeg%"

https://docs.typo3.org/m/typo3/reference-coreapi/main/en-us/Administration/Upgrade/Major/Index.html


WEB TYPO3 FORMS YAML 
 
Formularanpassungen via yaml-Dateien (03.12.2024)
Falls ihr mal Formulare (wie bei BvL) individuell im Hinblick auf Breiten der Felder bearbeiten müsst, macht es Sinn diese via .yaml-Daten zu bearbeiten.
Hierzu müsste ihr einmal in den betreffenden Ordner mit Namen „form_definitions“ gehen.
Am Beispiel von BvL wäre es wie folgt:

Pfad zur den Formularen:
group_2023 > typo3_11 > public > fileadmin > form_definitions

Pfad zu einer Beispiel yaml:
group_2023 > typo3_11 > public > fileadmin > form_definitions > anfrageBvLFibreCut.form.yaml

Wenn ihr nun die Breite eines einzelnen Elementes anpassen wollt, müsst ihr in der yaml darauf achten, dass ihr den Bereich innerhalb der „renderables“ erwischt. Diesen Abschnitt seht ihr beispielhaft im untenstehenden Snippet. Hier ist die zusätzliche Klasse in den Properties des fieldset-1 (elementClassAttribute: w33)

renderables:
-
renderingOptions:
previousButtonLabel: 'Previous step'
nextButtonLabel: 'Next step'
type: Page
identifier: page-1
label: ''
renderables:
-
type: Fieldset
identifier: fieldset-1
label: 'Ihre Kontaktdaten'
renderables:
-
properties:
elementClassAttribute: w33
renderables:  -    renderingOptions:      previousButtonLabel: 'Previous step'      nextButtonLabel: 'Next step'    type: Page    identifier: page-1    label: ''    renderables:    -        type: Fieldset        identifier: fieldset-1        label: 'Ihre Kontaktdaten'        renderables:          -            properties:              elementClassAttribute: w33
http://dummy.cybob.com//_dummy/yaml-forms/lokalisierung-formulare.jpg | dummy.cybob.com//_dummy/yaml-forms/anpassung-formulardatensatz.jpg


WEB APP TYPO3 SERVER 
 
TYPO3 Update von v11 auf v12: Voraussetzungen und Tipps (14.11.2024)
TYPO3 von Version 11 auf Version 12 aktualisieren: Vorbereitungen und Mindestanforderungen

Voraussetzungen:
- PHP-Version: 8.1 oder höher
- MySQL-Version: 8 oder höher
- Subdomain-Erstellung: Richten Sie eine Subdomain ein, um die neue Version während der Aktualisierung zu testen.
- Ausreichender Speicherplatz: Stellen Sie sicher, dass genug Speicherplatz für Backups und die neue Installation vorhanden ist.
- Server-/Hosting-Kompatibilität: Falls der aktuelle Server diese Anforderungen nicht erfüllt, sollte ein alternativer Server oder ein neues Hosting in Betracht gezogen werden.

Weitere Informationen zu den Anforderungen für TYPO3 v12 finden Sie hier:
https://typo3.org/article/new-system-requirements-for-upcoming-typo3-v12


HTML CSS DESIGN TYPOGRAFIE TYPO 
 
CSS Text-Ausgleich (06.11.2024)
Wir alle kennen diese Überschriften, bei denen das letzte Wort in eine neue Zeile umbricht und dort allein steht, was total doof aussieht.
Die Lösung: text-wrap: balance

Durch Anwendung der Eigenschaft text-wrap: balance berechnet der Browser automatisch die Anzahl der Wörter und teilt sie gleichmäßig auf zwei Zeilen auf. Dies ist nicht nur für Überschriften nützlich, sondern auch für Seitentitel, Kartentitel, Tooltipps, Modals und FAQs. -> Funktioniert tatsächlich in den meisten Browsern :)

Bei größeren Textblöcken, wie z. B. Absätzen, ist text-wrap: pretty eine systemeigene CSS-Lösung zur Vermeidung von Waisen (alleinstehende Wörter) in der letzten Zeile. Es werden sogar die Silbentrennung und die vorherigen Zeilen angepasst, um Platz zu schaffen. Die Eigenschaft wird allerdings derzeit leider nur vom Chrome und Edge unterstützt.

Probiert es einfach mal aus!
text-wrap: balance;
text-wrap: pretty;
https://ishadeed.com/article/css-text-wrap-balance/


SEO WEB WEBOPTIMIERT BILDER IMAGES JPG PNG GIF SVG LADEGESCHWINDIGKEIT 
 
Bilder weboptimiert abspeichern // Suchmaschinenoptimierte Bildbenennungen (30.10.2024)
Für die Ladegeschwindigkeit einer Website oder auch App ist es wichtig Bilder weboptimiert anzulegen und abzuspeichern. Der richtige Einsatz von Bildgrößen und auch Dateiformaten spielt für die Sichtbarkeit bei Google eine wichtige Rolle. Außerdem halten wir mit optimierten Bildern den Server schlank, was sich auch wieder auf die Ladegeschwindigkeit auswirkt

DATEIFORMATE (s. auch den Eintrag „Dateiformate im Bezug auf Einsatzbereiche“ von Sascha)
JPG: Standardformat für sämtliche Bilder im Web, benötigt verhältnismäßig wenig Speicherplatz
PNG: Einsatz AUSSCHLIESSLICH wenn Transparenzen dargestellt werden müssen, benötigt wesentlich mehr Speicherplatz als ein JPG
GIF: für ganz einfache Animationen (z.B. Werbebanner), für Grafiken/Icons mit wenig Farben, kann Transparenzen darstellen
SVG: Einsatz für Icons, Logos, Grafiken -> ACHTUNG: auch eine SVG kann sehr viel Speicherplatz benötigen! Große und umfangreiche Bilder daher ggf. besser als JPG oder GIF anlegen, Beispiel Weltkarten, Anfahrtskizzen

WEBOPTIMIERT SPEICHERN
Auch wenn Bilder bei richtigem Templating automatisch auf die richtige Größe je Bildschirmbreite gebracht wird, ist es essenziell wichtig, dass wir die Bilder in der richtigen Größe bereitsstellen. Dafür sollten wir uns die Seite auch responsiv ansehen. Grade Teaserbilder oder Thumbbilder neben dem Text die in der Desktopansicht vielleicht ? der Bildschirmbreite einnehmen, werden für Tablets oder Smartphones über die ganze Breite dargestellt wodurch sie responsive dann größer benötigt werden. Ein Bild sollte generell nicht größer abgespeichert werden als benötigt. Bilder daher in Photoshop entweder über die Arbeitsfläche (Bild -> Arbeitsfläche) oder die Bildgröße (Bild -> Bildgröße) Pixelgenau anlegen.
Auch wie wir das Bild speichern ist wichtig.
Photoshop: Datei -> Exportieren -> Für Web speichern (Legacy) // Qualität „Hoch“ mit ca. 60%
Illustrator: Datei -> Exportieren -> Exportieren als -> SVG // Haken bei Responsive deaktivieren (einheitlichere Darstellung in unterschiedlichen Browsern)

Nach dem Speichern sollten wir alles Bilder vorm Hochladen auf den Server nochmals über ImageOptim (oder ein vergleichbares Tool) nochmals komprimieren. Das spart meistens noch ein paar Prozente in der Dateigröße.

BILDBENENNUNGEN
Damit Bilder vom Kunden und uns auch im Nachhinein leichter zugewiesen werden können, aber auch für die Bildersuche von Suchmaschinen spielt die Benennung der Bilder eine wichtige Rolle.
Zur besseren Orientierung und Sichtbarkeit sollten Bilder daher immer je Einsatz benannt werden. Für eine optimale Bewertung von Google sollten Bildbezeichnungen außerdem keine Leerzeichen, Sonderzeichen (wie z. B. ? ; & #), Unterstriche oder Umlaute (wie z. B. ö, ä, ü, ß) beinhalten.? Für eine bestmögliche Dateiübersicht, sollten Dateiordner sinnvoll und gleichartig strukturiert werden. Empfehlenswert sind z. B. Ordner auf Basis der Bildnutzung (titelimages, teaser, content, etc.) oder Ordner auf Basis der Websitestruktur (startseite, impressionen, etc.).
Beispiele:
teaser-bereich-firmenname.jpg (-> teaser-referenzhagemeinster-cybob.jpg)
produktabbildung-produktkaregorie-produktname-firmenname.jpg ( -> produkt-isolierkanne-samba-emsa.jpg // produkt-farbe-innen-hartwachsoel-original-osmo.jpg)
slider-bereich-fimenname.jpg (-> slider-refenenzen-muenster-thieme-stadtmobiliar.jpg)


NEWSLETTER EMAIL CLEVERREACH ANLEITUNG SCHULUNGSUNTERLAGEN 
 
Newsletterversand per CleverReach (30.10.2024)
Für diverse Kunden aber auch für cybob selbst verschicken wir Newsletter über das Tool CleverReach.
Die Erstellung der Newsletter sollte idealerweise über Typo3 erfolgen, sodass wir uns tatsächlich nur um den reinen Versand kümmern müssen.

Eine Anleitung zum Versand findet ihr bei uns auf dem Dummy-Server.
http://dummy.cybob.com/_dummy/newsletter/202408_cleverreach_anleitung_volage_anlegen_versand.pdf


WEB TYPO3 
 
Fluid to inline converter (24.10.2024)
Da man ja öfters mal eine inline Schreibweise eines fluid tags benötigt, gibt es hier ein kleines Tool um sich diese aus einem fluid tag konvertieren zu lassen.
https://fluid-to-inline-converter.com/


TYPO3 
 
TYPO3 Strukturbaum (Tree) einfärben und IDs anzeigen (17.10.2024)
Um einen Teilbereich in der Struktur einzufärben oder IDs anzuzeigen kann man mein jeweiligen Benutzer in den Einstellungen unter Optionen im Feld TSconfig folgendes eintragen:

Die Zahl nach backgroundColor (in diesem Fall 2) ist die Page-ID, der Wert #c7dfb6 die anzuzeigende Farbe.
options.pageTree{
  showPageIdWithTitle = 1
}

options.pageTree{
  backgroundColor.2 = #c7dfb6
}


WEB APP JS CODE 
 
Google Maps FitBounds Funktion (15.10.2024)
Die Funktion nimmt die Grenzen eines Kreises, der mit einem bestimmten Mittelpunkt und einem Radius erstellt wurde. Diese Grenzen werden verwendet, um die Karte automatisch so einzustellen, dass der gesamte Bereich des Kreises sichtbar ist. Die Funktion zoomt die Karte entsprechend, sodass der Benutzer alle Punkte innerhalb des Kreises sehen kann.
function adjustMapToFitCircle(center, radius) {
	const bounds = new google.maps.LatLngBounds();

	// Calculate the circle's NE and SW bounds
	const northEast = google.maps.geometry.spherical.computeOffset(center, radius * 1000, 45);
	const southWest = google.maps.geometry.spherical.computeOffset(center, radius * 1000, 225);

	// Extend bounds to include these points
	bounds.extend(northEast); bounds.extend(southWest);

	// Fit the map to the bounds of the
	circle map.fitBounds(bounds);
}


WEB JS APP CODE 
 
Google Maps Autocomplete (15.10.2024)
Google Maps Autocomplete ist eine Funktion, die dem Nutzer während der Eingabe einer Adresse oder eines Ortsnamen automatisch Vorschläge anzeigt. Während der Eingabe erscheinen Vorschläge aus der Google-Datenbank, und wenn ein Ort ausgewählt wird, werden die genauen Informationen (Koordinaten, formatierte Adresse) automatisch übernommen. Dadurch wird die Eingabe von Adressen schnell und präzise.

<!-- Input field for element autocomplete -->
<input id="placeInput" type="text" placeholder="Enter a location" style="width: 300px;“>

<script>
const $placeInput = $('#placeInput'); // Select the input element using jQuery (make sure jQuery is included)
function initAutocomplete() {
	const autocompleteOptions = {
		fields: ['geometry', 'formatted_address'], // Request only the geometry and formatted address
	};
	const autocomplete = new google.maps.places.Autocomplete($placeInput.get(0), autocompleteOptions);
	autocomplete.addListener('place_changed', () => {
		const place = autocomplete.getPlace();
		if (!place.geometry || !place.geometry.location) {
			console.log(`No details available for input: ${place.name}`);
			return;
			} // Do something with the selected place's geometry or address
	console.log(place.geometry.location);
	console.log(place.formatted_address);
	});
}

// Initialize autocomplete once the page is loaded
window.onload = initAutocomplete;
</script>



SERVER 
 
E-Mail Zustellung (SPF und DKIM) (14.10.2024)
SPF: Es muss in den DNS-Einstellungen einer Domain erlaubt werden, dass der Server im Namen der Domain E-Mails versenden darf. Dazu ist ein SPF-Eintrag als TXT-Eintrag nötig.

Beispiel (in einer Zeile):

v=spf1 a mx a:cybob-one.com a:cybob-three.com a:cybob-four.com a:cybob-five.com -all

Bei Mittwald heißt der zu erlaubende Server agenturserver.de, wenn zusätzlich Mittwald erlaubt werden soll ergibt sich z. B.
v=spf1 include:agenturserver.de a mx a:cybob-one.com a:cybob-three.com a:cybob-four.com a:cybob-five.com -all

Siehe auch Doku von Mittwald:
https://www.mittwald.de/faq/e-mail/faq/spf-records


DKIM: Seit 2024 gibt es bei Google und Co. erhöhte Sicherheitseinstellungen. Bei den Domains muss ein bzw. zwei DKIM Einträge gesetzt werden, damit ein Mailserver auch Mails an Google etc. zustellt.

Mittwald erfodert daher zwei Einträge als TXT-Eintrag:

1. Für die Subdomain agenturserver._domainkey.domain.tld

v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC3U8kqa4SiUlO5WBe8DwVPhhLNooNNe8VLEJ+9PbDHVeEw0O6mY2O6AvcqbnSeBO5Ac9Ix0RQzxe9krqSgWDR84IvROW/u4kMxELn+Q+Jy2QXYASbVWnYs4T6p1yIqBEgRfWDFnNtmRDvNFCAcRv2VkA0ykkRMq3u9E6FZTLMnGQIDAQAB

2. Für die Subdomain agenturserver2048._domainkey.domain.tld

v=DKIM1; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA1BM9Prf00dhyP0i/fH0/k01oMSafqpl7biZMPjz/zxRJn+1YgSdeXt84NR3wZ5w+HWhtR27p1IEjchu179VOOyZ+xOte4owM+6FO7BVGnr/5IAlmRnC4fMvSeePdwun9fBExfkOroxwdEM4Y1+BqaSnpMT2xV6a2hRklymFzDkNQdmKrtm2AWSqg44iiMt3buEtZ0/y5SSBNd41zJYsp7UdPO2fgzF+C5gJrpyKhTWGB9ELLK83cd2Vdb8N+CC1Oh62eybgsMt2iBmxgnYAwp1LdTuxxNFYT2gEOFGL5KE01WM0L0+KALhwDQBcGcSC7Eup855OI/v8F4YDTZ3NCgQIDAQAB

Siehe auch Doku von Mittwald:
https://www.mittwald.de/faq/e-mail/faq/was-ist-dkim-und-dmarc





WEB HTML CSS SCSS GRUNDLAGE DUMMY 
 
Dummyerstellung einer Website (09.10.2024)
Wenn ein neuer Dummy für eine Website erstellt werden soll, sollten wir einheitlich den cybob Dummy auf dummy.cybob.com als Vorlage nutzen. Der Dummy basiert auf Bootstrap und enthält bereits ein paar Grundelemente die häufig auf unseren Websites vorkommen.
Dafür den kompletten Ordner kopieren und in einen entsprechenden Kundenordner (idealerweise mit Kundennummer) schieben.

Hierbei sollten einige Dinge beachtet werden:
- nach Möglichkeit viele Bootstrap-Eigenschaften verwenden. So halten wir unsere eigenen SCSS schlank und Elemente lassen sich leicht auf andere Kunden adaptieren.
- Die Datenstruktur basiert auf den aktuellen Strukturen in Typo3 (default wird durch den Kundennamen ausgetauscht, Bsp. krone_styles, krone_site_package)
- Die SCSS Daten sollten wie folgt aufgeteilt bleiben :
default_global.scss (generelle Angaben wie Schriftgrößen, Mixins, Aufteilungen)
default_navigation.scss (sämtliche Angaben zur Navigation, vorallem beim Megamenü wie kröne-trailer.com)
default_formular.scss (Angaben zu Formularen)
default_styles.scss (enthält kundenspeziefische Styles und überschreibt die andern Angaben für z.B. Farben und Schriften, kundenspezifische Elemente)

Es empfielt sich SCSS Dateien für größere Bereiche wie z.B. für eine Händlersuche o.ä. auszulagern. So werden die Daten schlanker gehalten und können ggf. für andere Kunden leichter mitgenutzt werden. Außerdem können einzelne Dateien/Scripte später beim Templating explizit für einzelne Templates eingebunden werden.
http://dummy.cybob.com/_dummy/clean_dummy_bs-5-2_bs-icons/


 
PHP Storm - jQuery erkennen (12.09.2024)
In den Einstellungen kann man jQuery nachladen und erkennen
https://medium.com/@zacbanas27/phpstorm-isnt-recognizing-jquery-easy-fix-d79f2f950314#:~:text=Click%20on%20preferences%20in%20the,jQuery%20buried%20in%20that%20list.


WEB HTML TEMPLATING COOKIES OPTIN/OPTOUT 
 
Templates mit YouTube-iFrames (30.08.2024)
Denkt bitte beim Templating daran, dass ihr bei Templates mit iFrames von YouTube auch die Optin und Optout-Möglichkeiten verwendet und berücksichtigt. Im Snippet ist hierzu ein Beispiel.
<div class="container">    <div class="analytics_youtube-optout col-12">        <div class="no-external-media" style="background-image:url(/typo3conf/ext/site_package/Resources/Public/Images/cookie-video-placeholder.jpg);">             <div class="notice">                 <div class="noticetext">                     <p>                        <f:translate key="label.youtubeOverlayText" extensionName="site_package"/>                         <f:link.page pageUid="17" class="cookie_link" target="_blank">                        <f:translate key="label.privacypolicylink" extensionName="site_package"/></f:link.page>.                    </p>                    <a href="#" class="reset-cookies">                         <button class="button"> <f:translate key="label.youtubeOvelayPrivacySettings" extensionName="site_package"/>                         </button>                    </a>                 </div>            </div>        </div>    </div>    <div class="analytics_youtube-optin col-12">        <iframe width="1200" height="550" src="" data-category="marketing" data-src="https://www.youtube.com/embed/{field.embedcode}" title="YouTube video player" loading="lazy" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen=""></iframe></div>


WEB CODE SERVER PHP 
 
Google Maps snapshot PNG erstellen (29.08.2024)
Diese PHP Funktion generiert mithilfe der Google Maps static api einen Screenshot von einer Map, die man z.B. in eine PDF einbinden kann.

Die Werte, die in Caps geschrieben sind müssen dementsprechend ausgefüllt werden
function downloadMapSnapshot($saveLocation) {
	global $arrOutput; //Geocoordinate list
	$url = 'https://maps.googleapis.com/maps/api/staticmap';
	$url .= '?center=51.19487336190002,10.430072483469583';
	$url .= '&zoom=5';
	$counter = 0;
	foreach ($arrOutput as $key => $entry) {
		if ($counter >= WERT_ZUM_AUSSTEIGEN) {
			break; //Exit when all markers are loaded (Max =15)
		}
		$url .= '&markers=color:black%7Clabel:'.$entry["reference_id"].'%7C';
		$url .= $entry["data_geocoordinates"];
		$url .= '&markers=size:tiny%7Ccolor:green%7CDelta+Junction,AK';
		$counter++;
		//set Markers and increment for loop
	}
	$url .= '&size=640x275';
	$url .= '&scale=2';
	$url .= '&key=API_KEY';
	$fixedUrl = str_replace(' ', '', $url); // remove spaces in URL, because Curl wont load with them
	//echo "<pre>"; print_r($fixedUrl); echo "</pre>";exit;
	// Initialize cURL session
	$ch = curl_init($fixedUrl);
	// Set cURL options
	curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
	curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true);
	// Verify SSL certificate
	curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
	// Execute cURL request
	$response = curl_exec($ch);
	//echo "<pre>"; print_r($response); echo "</pre>";exit;
	// Check for cURL errors
	if (curl_errno($ch)) {
		echo 'cURL Error: ' . curl_error($ch);
		curl_close($ch);
		return false;
	}
	// Get HTTP response code
	$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
	// Close cURL session
	curl_close($ch);
	// Check if the request was successful
	if ($httpCode == 200) {
		$uploadDir = $saveLocation;
		// Create upload directory if it doesn't exist
		if (!is_dir($uploadDir)) {
			if (!mkdir($uploadDir, 0755, true)) {
				echo 'Failed to create directories...';
				return false;
			}
		}
		$filePath = $uploadDir . '/map.png';        // Save the image to the specified path
		if (file_put_contents($filePath, $response)) {
			//echo 'Map snapshot saved successfully to ' . $filePath;
			return true;
		} else {
			echo 'Failed to save the map snapshot.';
			return false;
		}
	} else {
		echo 'HTTP Error: ' . $httpCode;
		return false;
	}
}


WEB JS YOUTUBE 
 
Stoppen eines YouTube-Videos beim Schließen einer Modal (15.08.2024)
Wenn ihr beim Schließen einer Modal möchtet, dass euer Youtub-Video stoppt, fügt folgendes JS in eure general mit ein (Natürlich dann mit den richtigen Klassen bzw. IDs)
$('#exampleModal').on('hide.bs.modal', function() {    var memory = $(this).html();    $(this).html(memory);  })
https://stackoverflow.com/questions/22613303/youtube-video-still-playing-when-bootstrap-modal-closes


WEB HTML CSS CODE SUPPORT 
 
HTML Einstieg für Azubis / Praktikanten (09.08.2024)
Auf dieser Seite gibt es tolle Beispiele für den Einstieg in HTML, CSS und Bootstrap. Habe mal ein paar schöne Aufgaben rausgesucht:

https://linz.coderdojo.net/uebungsanleitungen/programmieren/web/html-meine-erste-webseite/
https://linz.coderdojo.net/uebungsanleitungen/programmieren/web/erste-schritte-mit-css/
https://linz.coderdojo.net/uebungsanleitungen/programmieren/web/css-advanced-styles/
https://linz.coderdojo.net/uebungsanleitungen/programmieren/web/html-css-hands-on/
https://linz.coderdojo.net/uebungsanleitungen/programmieren/web/erste-schritte-mit-bootstrap/
https://linz.coderdojo.net/uebungsanleitungen/programmieren/web/


WEB JS ANIMATIONEN 
 
Scrollbare Pfadanimation (10.07.2024)
Es ist möglich via JS einen Pfad zu animieren. Hierzu benötigt man einen Pfad als SVG (mit Viewbox) und das folgende Snippet. Via Scrollverhalten bekommt ihr dann einen animierten Pfad.

Alternativ dazu können wir auch Scripte von GSAP nutzen, die diese Optionen ebenfalls anbieten.
const bodyWidth= $(document).width();const bodyHeight = $(document).height();var svgQuery = document.querySelector('svg');    svgQuery.setAttribute('viewBox', "0 0 "+bodyWidth+" "+bodyHeight);    svgQuery.setAttribute('width',bodyWidth);         const svg = document.getElementById("star-path");    const length = svg.getTotalLength();    // start positioning of svg drawing    svg.style.strokeDasharray = length;        // hide svg before scrolling starts    svg.style.strokeDashoffset = length;        window.addEventListener("scroll", function () {          const scrollpercent = (document.body.scrollTop + document.documentElement.scrollTop) / (document.documentElement.scrollHeight - document.documentElement.clientHeight);   console.log(scrollpercent);      const draw = length * 1.7 * scrollpercent;          // Reverse the drawing when scroll upwards      svg.style.strokeDashoffset = length - draw;    });
https://codepen.io/w3programmings/pen/MMBxMV


WEB TYPO3 HTML TEMPLATING 
 
Title-Tag eines Links per Fluid ausgeben (15.05.2024)
In Fluid kann der Title-Tag der über das Linkmenü gepflegt werden kann ganz einfach ausgegeben werden.
So spart man sich ein extra Textfeld und es muss auch nicht (mehr) über Pseudoklassen getrickst werden.
<f:link.typolink parameter="{image.link}" parts-as="parts" class="mt-4 col-12 col-md-8 offset-md-2 col-lg-4 offset-lg-4 btn btn-link outline text-light arrow">
	<f:if condition="{parts.title}">
		<f:then>
			{parts.title}
		</f:then>
		<f:else>
			Mehr erfahren
		</f:else>
	</f:if>
</f:link.typolink>
https://stackoverflow.com/questions/59428167/how-to-set-the-link-title-as-linktext-with-flink-typolink-viewhelper-in-typo3-9


INTERN 
 
Bußgelder (13.03.2024)
Bußgelder jeder Art (Blitzer, falsch Parken, Kunde verprügeln, usw.) werden nicht von der Firma übernommen werden, da diese vermeidbar sind.


TYPO3 
 
TYPO3 Installation (13.03.2024)
Für eine TYPO3-Installation sind bestimmte Zugänge und Informationen nötig. Für die Anforderungen lässt sich (auch vom Projektmanager) das Tool TYPO3 Helper nutzen. Daraus lässt sich ein Skript generieren, welches bei der Installation genutzt werden kann.

Vom Projektmanager zu organisieren:
- Hosting (Webspace) ink. geeigner PHP- und MySQL Versionen
- Domain (URL)
- SFTP Zugang
- Datenbank Name
- Datenbank Benutzer
- Datenbank Passwort
- benötigte Frontend Sprachen
- Klickdummy (für Mastertemplate)

Vom Entwickler mindestens zu berücksichtigen:
- Basisinstallation (inkl. site package)
- WS-SCSS Kompilierung
- Template-Erweiterung (DCE)
- Mastertemplate
- Backendsprachen (mind. DE und EN)
- Formularerweiterung (TYPO3 oder PowerMail)
- htaccess Schutz für das Frontend (während Entwicklung)

Typo3 Installations Schritte:
Ereitstellung der Zugangsdaten für den Hosting-Dienst zur Einrichtung einer Domain-Weiterleitung und Erstellung einer neuen Datenbank.
Erstellen der FTP/SFTP-Zugangsdaten für die SSH-Verbindung (Domain, Benutzername, Passwort)
Erstellen der Zugangsdaten zur Datenbank (DB-Hostname, DB-Benutzername, DB-Passwort)
Installation externer (z. B. DCE) und interner (Template-Site-Pakete, Site-Pakete) Extentions
Einstellung der Systemsprache als Standardsprache auf Deutsch
Übertragung des Dummy-Templates in Typo3.

https://apps.cybob.com/typo3_helper/


INTERN 
 
Abrechnungen Kunden (09.02.2024)
Nachfolgende Infos gelten für Abrechnungen diverser Kunden (alphabetisch sortiert):

animonda
Zustellung: digital
Adresse: eingangsrechnungen@animonda.de
Anforderungen: Fester Betreff "cybob communication GmbH - RE xxxxx", Ansprechpartner in CC, kein Text in der E-Mail

ARI Armaturen
Zustellung: digital
Adresse: invoice@ari-armaturen.com
Anforderungen: Für getrennte Plattformen und Länder separate Rechnungen erstellen

Beate Hagedorn
Zustellung: digital
Adresse: info@beate-hagedorn.de
Anforderungen: keine

Bopla
Zustellung: digital
Adresse: jochen.limberg@bopla.de

Brillux
Zustellung: digital
Adresse: pdf-invoices@brillux.de
Anforderungen: Rechnung immer unter Angabe der Bestellnummer und nur 1 PDF pro E-Mail, ohne Ansprechpartner in der RE, kein Text in der E-Mail

BvL Landmaschinentechnik
Zustellung: digital
Adresse: pi-atec@bvl-group.de
Anforderungen: keine

BvL Oberflächentechnik
Zustellung: digital
Adresse: einkauf-otec@bvl-group.de
Anforderungen: keine

EMSA
Zustellung: digital
Adresse: finance-emsa@groupeseb.com
Anforderungen: Rechnung immer unter Angabe der PO-Nummer (Bestellung) und ohne Ansprechpartner in der RE, mit 60 Tagen Zahlungsziel

Fördertechnik Kentzler
Zustellung: digital
Adresse: eingangsrechnungen@kentzler-foerdertechnik.de
Anforderungen: keine

Groupe SEB WMF Consumer
Zustellung: digital
Adresse: plgs.083-de-invoice@groupeseb.com
Anforderungen: Rechnung immer unter Angabe der PO-Nummer (Bestellung) und ohne Ansprechpartner in der RE, mit 60 Tagen Zahlungsziel

Hagemeister
Zustellung: digital
Adresse: rechnung@hagemeister.de
Anforderungen: keine

Hotel Höpke
Zustellung: digital
Adresse: rechnungen@hotel-hoepke.de
Anforderungen: ohne Ansprechpartner in der RE

Kindermann
Zustellung: digital
Adresse: marks@kindermann-wellpappen.de
Anforderungen: keine

KRONE Maschinenfabrik
Zustellung: digital
Adresse: rechnungseingang.mbk@krone.de
Anforderungen: Für getrennte Plattformen und Länder separate Rechnungen erstellen

Landhotel Annelie
Zustellung: digital
Adresse: rechnungen@landhotel-annelie.de
Anforderungen: keine

Lippe (Konsequent)
Zustellung: digital
Adresse: sutthoff@konsequent-pr.de
Anforderungen: keine

OSMO
Zustellung: per Post

PTR HARTMAN (Werne):
Zustellung: digital
Adresse: rechnung@ptr-hartmann.com und christina.gennat@ptr-hartmann.com

PTR HARTMAN (Baiersdorf):
Zustellung: digital
Adresse: rechnung@ptr-hartmann.com

R+R Maschinenbau
Zustellung digital
Adresse: einkauf@rr-maschinenbau.de

RK Rose + Krieger
Zustellung: digital
Adresse: bernd.kloepper@rk-online.de
Anforderungen: Für getrennte Plattformen und Länder separate Rechnungen erstellen

Sommer Maschinenbau
Zustellung: digital
Adresse: einkauf@sommer-maschinenbau.de

Thieme
Zustellung: digital
Adresse: info@thieme-stadtmobiliar.com
Anforderungen: keine


INTERN KICKOFF2024 CKI-AWARD 
 
Kickoff 2024 & CKI-Award (06.02.2024)
Hier könnt ihr die PDF-Version der Keynote vom Kickoff am 05.02.2024 einsehen. Diese beinhaltet unsere Strategie für das Jahr 2024 sowie sämtliche Informationen und Rahmenbedingungen zum CKI Award 2024. Für Fragen stehen wir jederzeit gerne zur Verfügung.

/Volumes/creation/10001 cybob/02 projekte/xxxxxx_kick-off-2024


INTERN EMAILS 
 
Autoresponder für E-Mails anlegen (Webmail) (23.01.2024)
Über die neue Mittwald Webmail Oberfläche unter https://webmail.mittwald.de/ können wir nun einen Autoresponder für den Fall unserer Abwesenheit (Urlaub, Krankheit etc.) einrichten: Einstellungen/Autoresponder

Hierfür haben wir einen einheitlichen Text definiert, bitte hinterlegt diesen und aktivieren den Autoresponder nur bei Abwesenheit unter Angabe des entsprechenden Zeitraums. Für die korrekte Einstellung des Autoresponders ist jeder selbst verantwortlich.

Bitte folgenden Standardtext hinterlegen und im Text (DE+EN) nur jeweils das Datum der Rückkehr anpassen. Alles Weitere bitte unverändert lassen, damit wir hier einheitlich auftreten.

Wir verzichten zunächst bewusst auf die Nennung der info@cybob.com (in dringenden Fällen soll der Kunde anrufen) und in der Signatur auf die Nennung der Position und der Durchwahl (da der Autoresponder auch bei Werbemails greift und diese Infos nicht jeder kennen muss).

TEXTVORLAGE:

Sehr geehrte Damen und Herren,

vielen Dank für Ihre E-Mail. Ich bin ab dem 23.01.2024 wieder für Sie erreichbar. Ihre E-Mail wird nicht automatisch weitergeleitet. In dringenden Fällen wenden Sie sich bitte telefonisch an unsere Zentrale: +49 (0) 541 91189 0.


Dear Sir or Madam,

Thank you for your e-mail. I am currently out of office and will be available again on 23 January 2024. Your e-mail will not be forwarded automatically. In urgent cases, please call our office: +49 (0) 541 91189 0.

Viele Grüße / Kind regards,

Jens Bextermüller

+49 (0) 541 91189 0

cybob communication GmbH
Große Hamkenstr. 30, 49074 Osnabrück

www.cybob.com

Amtsgericht Osnabrück, HRB 21041
Geschäftsführung: Robert Heuer, Holger Middelberg, Jens Bextermüller, David Juber

https://webmail.mittwald.de/


INTERN 
 
cybob E-Mails (18.01.2024)
Die cybob E-Mails werden von Mittwald verwaltet:

- E-Mails sind grundsätzlich vorname.nachname@cybob.com
- die Passwörter werden wieterhin zentral vergeben
- die E-Mails können auch über einen Browser eingesehen werden, dazu bitte als User die Mailadresse mit Passwort eingeben: https://webmail.mittwald.de
- über den Webmail Account lassen sich z. B. auch Autoresponder konfigurieren

Bitte darauf achten, dass
- Spam E-Mails regelmäßig gelöscht werden
- der Papierkorb regelmäßig gelscht wird

Die Einrichtung am Mac oder anderen Rechnern ist hier beschrieben:
https://www.mittwald.de/faq/e-mail/grundeinstellungen/e-mail-client-einrichten


WEB CSS DESIGN 
 
Worttrennungen mit Hyphens (11.01.2024)
Es gibt Neuerdings Optionen zur genaueren Definierung von Hyphens. Wenn ihr diese nutzt, kann es sein, dass diese hier und da unschön umbrechen. Damit ist nun Schluss. Mit folgendem Snippet könnt ihr die Umbrüche genauer steuern. Werte können hierbei angepasst werden. Je nach Bedarf.
hyphens: auto;
hyphenate-limit-chars: auto 5;
hyphenate-limit-lines: 2;
-webkit-hyphens: auto;
-webkit-hyphenate-limit-chars: auto 3;
-webkit-hyphenate-limit-lines: -17;
-ms-hyphens: auto;
-ms-hyphenate-limit-chars: auto 3;
-ms-hyphenate-limit-lines: 4;


 
Mit Tabulator getrennte CSV in Numbers öffnen (12.12.2023)
Ganz Apple-like gibt es tatsächlich eine Möglichkeit auch in Numbers eine CSV zu öffnen, die mit Tabulkatoren (Tabs) getrennt ist.
Dazu das Werkzeug „Format“ oben rechts anklicken.
Gfs. eine Zelle anwählen, sodass sich die Kontextfläche unterhalb des Werkzeugs „Format“ ändert.
Dort den Tab „Tabelle“ auswählen.
Ganz unten gibt es nun die Schaltfläche „Einstellungen für den Import anpassen“.
Dort Tab auswählen und da Komma deaktivieren und „Tabelle aktualisieren“ klicken.


WEB PRINT LOGO DATEIFORMATE FARBRäUME 
 
Dateiformate im Bezug auf Einsatzbereiche (26.10.2023)
Hier findet ihr eine kleine Übersicht der gängigsten Dateiformate für unsere Einsätze.

-------------
Digital (RGB)
-------------

.jpg
-> komprimierte Bilddatei, unterstützt keine Transparenzen

.png
-> leicht komprimierte Bilddatei, unterstützt Transparenzen

.gif
-> Bilddatei mit geringer Speichermenge zur Darstellung von pixelhaften / animierten Grafiken

.ai
-> Vektorbasierte Datei (RGB und CMYK Format für eine Weiterverarbeitung in anderen Medien)

.svg
-> Vektorbasierte Datei (optimal für Nutzung von Icons oder Logos in digialen Medien)

.pdf
-> Kann aber auch für Logodaten/Zeichnungen o.ä. eingesetzt werden, da Vektorinformationen und Farbräume mitgespeichert werden. (RGB/CMYK)

-------------------------
Print (CYMK/Sonderfarben)
-------------------------

.psd
-> unkomprimierte Bilddatei (Ursprüngliche Photoshopdatei. Kann von InDesign ebenfalls eingesetzt werden)

.tiff
-> unkomprimierte Bilddatei (Große Bilddaten mit Bildinformationen)

.jpg
-> komprimierte Bilddatei (RGB/CMYK)

.ai
-> Vektorbasierte Datei (RGB und CMYK Format für eine Weiterverarbeitung in anderen Medien. Optimal für die Weiterentwicklung von Logos/Icons.)

.eps
-> Vektorbasierte Datei, komprimiert (RGB und CMYK Format für eine Weiterverarbeitung in anderen Medien. Optimal für Logos/Icons.)

.pdf
-> auch bekannt als Druckdatei (Dann im CYMK-Format, da eine Umwandlung von RGB in CYMK [für den Druck notwendig] Farbveränderungen mit sich bringt). Kann aber auch für Logodaten/Zeichnungen o.ä. eingesetzt werden, da Vektorinformationen und Farbräume mitgespeichert werden. (RGB/CMYK)


AGENTUR CYBOB FLEXTIME REMOTE PAYBACK KRANKHEIT GLEITZEIT ARBEITSZEITEN 
 
Aktualisierte Regelungen: Arbeitszeit, Gleitzeit, FlexTime, Remote, Krankheit, Payback & Co. (bis 28.02.2025) (06.09.2023)
Wie bereits heute mit allen anwesenden Kollegen vor Ort besprochen, haben wir an den Rahmenbedingungen etwas geschraubt. Alle Änderungen gelten ab dem 01.09.2023 und wir werden wie immer auf Sicht fahren und die Neuerungen testen. Anmerkungen oder Fragen immer gerne an David und Jens.

Bürozeiten:
-----------------
Die offiziellen Bürozeiten sind von 8 - 18 Uhr.
In dieser Zeit muss das Telefon besetzt sein, d. h. mindestens ein PM ist anwesend.
Während der offiziellen Bürozeit muss mindestens eine Fachkraft anwesend sein, nicht zur Auszubildende („Azubidienst“)

Kernarbeitszeit:
-----------------
Mo-Do von 10.00 Uhr bis 17.00 Uhr.
Fr von 10.00 Uhr bis 16.00 Uhr.

Die Wochenarbeitszeit beträgt 40 h, das entspricht im Mittel 160 h je Monat.
1 h Mittagspause - entweder um 12.00 oder um 13.00 Uhr.

FlexTime:
-----------------
Neu: Bei Bedarf und nach Absprache kann die Kernarbeitszeit eines Tages um max. 2 Stunden vorschoben werden (in beide Richtungen).
z. B. an einem Dienstag bereits um 15.00 Uhr oder zum Ausgleich an einem Dienstag um 07.00 Uhr. Die FlexTime muss im Vorfeld mit den Kollegen abgestimmt und im Kalender als „FlexTime“ dokumentiert sein. Die „FlexTime" darf nicht an die Mittagspause grenzen und die Flextime somit verlängern.

Die minimale Wochenarbeitszeit beträgt 36 h, die monatliche Arbeitszeit beträgt 160 h.

Neu: Azubi FlexTime:
-----------------
Zunächst einmal im Monat kann der Arbeitsbeginn von 08:30 Uhr auf max 10:00 Uhr oder das Arbeitszeitende von 18:00 auf max. 17:00 Uhr verlegt werden.
Die FlexTime muss im Vorfeld mit dem Ausbilder abgestimmt und im Kalender als „FlexTime“ dokumentiert sein.

Die Zeit muss im gleichen Monat ausgeglichen werden, z. B. nach Absprache um 08:00 Uhr starten oder nach der Schule reinkommen.

Gleitarbeitszeit:
-----------------
Mo-Fr von 8.00 Uhr bis 19.00 Uhr mit Beginn jeweils zur vollen oder halben Stunde
Die Gleitarbeitszeit gilt zunächst nicht für Auszubildende.


Urlaub:
-----------------
Es gibt ganze und halbe Urlaubstage.
Diese sind rechtzeitig zu beantragen und müssen freigegeben werden.
Diese sind mit 4 oder 8 h in der Zeiterfassung einzutragen.
Resturlaub aus dem Vorjahr muss bis zum 31.03. genommen werden, ansonsten verfällt dieser.

Krankheit:
-----------------
Wer krank ist, bitte unbedingt zum Arzt gehen. :)
Krankmeldung bitte umgehend telefonisch mit Holger, Jens oder David besprechen,
da wir ja ggf. Vertretungen usw. organisieren müssen und auch zur Planung wissen müssen, wie lange die Krankheit voraussichtlich dauert.

Wie vertraglich vereinbart, muss eine Krankheit und die Dauer ab dem 1. Tag vom Arzt attestiert werden (gelber Schein).

Arztbesuch:
-----------------
Akute Arztbesuche bitte kurz mit Holger, Jens oder David absprechen.
Andere Arztbesuche sind möglichst außerhalb der Arbeitszeit zu legen (Gleitzeit nutzen)
oder wenn es nur innerhalb der Kernarbeitszeit möglich mit Holger, Jens oder David abzusprechen.

Wie allgemein üblich, sind Arztbesuche auch bei uns keine Arbeitszeit.
Deshalb ist dazu auch kein Eintrag in der Zeiterfassung notwendig.

Aus Datenschutzgründen sollte auch der Kalendereintrag entsprechend allgemein gehalten sein.
Einzige Ausnahme: Schwangere ;-)

Stau / Bus / Wetter / Meteoriten / Deutsche Bahn:
-----------------
Verspätungen, welche die Kernarbeitszeit betreffen, sind schnellstmöglich Holger, Jens oder David mitzuteilen.
Die Arbeitszeit ist innerhalb der Woche (FlexTime: innerhalb des Monats) nachzuholen.


Zeiterfassung:
-----------------
Die Zeiterfassung sollte umgehend erfolgen und einem Kunden zugewiesen werden.
Die Zeiten sollten möglichste präzise dem korrekten Kundenprojekt zugewiesen werden.

Payback:
-----------------
Das Payback-Modell gilt für alle Vollzeit-Mitarbeiter oder nach Vereinbarung anteilig.
Neu: Azubis steigen ab dem 2. Lehrjahr mit 50% Payback ein.

Die Stufen werden regelmäßig der Teamstärke angepasst.

Remote creation und application:
-----------------
Neu: Jeder Mitarbeiter (keine Azubis) kann bis zu 8x im Monat „Remote“ beantragen.
Hierzu muss aus jedem Bereich aber mind. 1 Mitarbeiter vor Ort sein.

Remote communication:
-----------------
Jeder Mitarbeiter (keine Azubis) kann weitehrin zunächst bis zu 4x im Monat „Remote“ beantragen.
Hierzu muss aus jedem Bereich aber mind. 1 Mitarbeiter vor Ort sein.

Hintergrund: Erreichbarkeit in der Agentur für Kunden, Koordination, Verfügbarkeit für interne Absprachen, Besetzung Zentrale etc. bei dem Projektmanagern essentiell, dies liegt in der Verantwortung der communication. Zudem wollen wir die direkte Kommunikation wieder mehr stärken/ausbauen und Projektmeetings durch die communictaion initiieren. Ausnahmen nach Absprache möglich.

Remote-Ausweitung für Azubis weiterhin denkbar und nicht ausgeschlossen. ;)



JS SWIPER 
 
Swiper-Slide in Swiper beim Touchdrag hindern zu verspringen (24.08.2023)
Es gibt die Möglichkeit den Swiper-Slide so einzustellen, dass er bei Klick oder Drag nicht an die „Akvitposition“ springt, sondern direkt das Event auslöst.

Dazu das Snippet enfach in der JS im entsprechenden Breakpoint ergänzen.
a11y: false,


INTERN 
 
Systeme aufgeräumt halten (16.08.2023)
Bitte immer, wenn Dinge auffallen, die nicht mehr benötigt werden, den PM informieren oder löschen.

- „_BAK_“/„_OLD“-Verzeichnisse und -Dateien
- Benutzer von Kunden/Kollegen, die nicht mehr da sind
- Testseiten, die nicht mehr benötigt werden
- Assets (JS/CSS/Bild), die nicht mehr benötigt werden (bspw. wenn die Einbindung im TypoScript entfernt wird)
- Bei Facelifts/Updates/Upgrades können die nicht mehr verwendeten Dateien gelöscht werden
- Virtual Host Einträge, die nicht mehr auf den Server zeigen
- temporäre (Sub)domains
- alte Datensicherungen
- nicht mehr verwendete Datenbanken
- nicht mehr verwendete Webspaces


 
CSS (09.08.2023)





INTERN 
 
Projects: Wochenplan & Workflow (09.08.2023)
"Regelwerk" und Best Practice für die Arbeit mit Projetcs hinsichtlich Arbeitsworkflow. Dieses wird regelmäßig verfeinert und aktualisiert.

Wichtig: Bitte gebt zum Wochenende für Eure bearbeiteten Todos dem jeweiligen PM eine Rückmeldung, falls das Todo noch nicht fertig ist.

A) Wochenplan
Im Wochenplan werden von den PMs die Aufgaben für die Woche vorgeplant (Zeiten, Prios, etc.)
- PMs: es werden keine Zeiten geblockt, d. h. es werden nur Aufgaben geplant, für die Infos vorliegen
- PMs: für jede im Wochenplan vorgesehene Aufgabe wird ein Briefing bzw. Aufgabenbeschreibung eingetragen
- PMs: Dazu werden vorab die Kollegen NICHT mit @ markiert, um unnötige Notifications zu vermeiden


B) Workflow
In den Themen wird die Bearbeitung der Aufgaben entsprechend koordiniert und kommuniziert. Wichtig: Notifications werden durch @ ausgelöst. Bitte unnötige Nofifactions vermeiden.

Ablauf:
1. ein PM oder Kunde legt unter "neu" ein neues Todo an

2. erst nach Freigabe für die Umsetzung schiebt der PM das in "bestätigt"
-> der PM weist den passenden Bearbeiter zu
-> der PM trägt Zeiten im Wochenplan ein
-> der PM setzt ggf. die Prioriät
-> der PM sorgt für eine Aussagekräftige Beschreibung der Aufgabe

3. der Bearbeiter schiebt die Karte auf "in Bearbeitung" sobald er mit der Aufgabe beginnt. So können PMs erkennen, woran gerade gearbeitet wird
-> wenn der Bearbeiter das Todo erledigt hat, schiebt er die Karte auf "Prüfung intern" und setzt den Haken "erledigt". Bitte hier eine Notication (mit @) an den PM
-> wenn der Bearbeiter das Todo abbricht, schiebt er es zurück auf "bestätigt"
-> wenn der Bearbeiter das Todo nicht fertigstellen kann, z. B. bei fehlenden Infos, schiebt er es auf "Info / Hilfe"
-> wenn der Bearbeiter feststellt, dass ein Todo viel mehr Zeit benötigt, informiert er den PM
-> wenn der Bearbeiter feststellt, dass ein Todo aus dem Wochenplan nicht (mehr) bearbeitet werden kann, informiert er den PM

4. der PM prüft das Todo
-> wenn es erledigt ist, schiebt er es auf "Prüfung extern", damit der Kunde das prüfen kann
-> wenn es nach Prüfung nicht erledigt ist, schiebt der PM es zurück auf "besätigt" und weist den Bearbeiter zu

5. der Kunde prüft das Todo
-> wenn es auch vom Kunden als erledigt markiert ist, schiebt der PM es auf „erledigt"


C) Sonstiges
Rückfragen:
Grundsätzlich sollten bei Rückfragen ohne unmittelbares Todo auf intern die Karten auf Info/Hilfe geschoben werden und dem Adressaten zugewiesen werden

Support:
Ungeplante Aufgaben können beim Wochenplan als "support" markiert werden, damit diese entsprechend bearbeitet

Aquise:
Aufgaben ohne Auftrag können als "aquise" markiert werden


WEB BASIC ROBOTS 
 
GPT-Versionen hindern die Website zu durchforsten (09.08.2023)
Es gibt eine Möglichkeitg GPT-Versionen daran zu hindern die eigene Website zu durchsuchen und an ihr zu triainieren. Dazu gebt ihr einfach folgende Zeilen in die robots.txt ein.
User-agent: GPTBot
Disallow: /


 
Autocomplete OFF / Vorschlagsliste bei Browsern verhindern (25.07.2023)
Autocomplete OFF / Vorschlagsliste bei Browsern zu verhindern ist wohl Standard beim Team.
Wohl aber nicht, dass der Edge und wohl auch irgendwelche Chrome-Versionen andere Attribute brauchen.
Ach ja, und für Safari bin ich immer noch nicht fündig geworden - seufz.
aria-autocomplete="none" list="autocompleteOff" autocomplete="off"


COMPOSER SITORIX BASH SH 
 
Composer auf Sitorix Servern installieren (21.07.2023)
PHP ggf. durch absoluten Pfad mit Version (z. B. /usr/bin/php7.4) ersetzen.
COMPOSER_HOME=/home/webXX/htdocs php composer-setup.php


JS 
 
Javascript JS onload wird nur einmal ausgeführt (18.07.2023)

if (document.readyState !== 'loading') {
	console.log('document is already ready, just execute code here');
	setTimeout(() => {
		showCalendarHome();
	}, 1000);
} else {
	document.addEventListener('DOMContentLoaded', function () {
		console.log('document was not ready, place code here');
		setTimeout(() => {
			showCalendarHome();
		}, 1000);
	});
}


SICHERHEIT SECURITY HTACCESS APACHE HEADER 
 
Security-Header über die .htaccess (10.07.2023)
Hier einmal ein guter Ausgangspunkt für die Security-Header am Beispiel einer Goliath-Instanz.
(X-)Content-Security-Policy und Permissions-/Feature-Policy haben in dem meisten Systemen unterschiedliche Werte, je nachdem von wo Ressourcen geladen werden.
Alle anderen Header können im Normalfall 1:1 übernommen werden.

https://www.permissionspolicy.com/ hilft beim Erstellen des Headers.
<IfModule mod_headers.c>
  # Security
  Header set Strict-Transport-Security "max-age=31536000; includeSubDomains"
  Header set X-Frame-Options "SAMEORIGIN"
  Header set X-Content-Type-Options "nosniff"
  Header set Referrer-Policy "strict-origin-when-cross-origin"
  Header set Content-Security-Policy "default-src 'self' https://*.goliathserver.com; script-src 'self' 'unsafe-inline' https://*.goliathserver.com; style-src 'self' 'unsafe-inline' https://*.goliathserver.com"
  Header set X-Content-Security-Policy "default-src 'self' https://*.goliathserver.com; script-src 'self' 'unsafe-inline' https://*.goliathserver.com; style-src 'self' 'unsafe-inline' https://*.goliathserver.com"
  Header set Permissions-Policy "accelerometer=(), ambient-light-sensor=(), autoplay=(self), battery=(), camera=(), cross-origin-isolated=(), display-capture=(), document-domain=(), encrypted-media=(), execution-while-not-rendered=(), execution-while-out-of-viewport=(), fullscreen=(), geolocation=(), gyroscope=(), keyboard-map=(), magnetometer=(), microphone=(), midi=(), navigation-override=(), payment=(), picture-in-picture=(), publickey-credentials-get=(), screen-wake-lock=(), sync-xhr=(), usb=(), web-share=(), xr-spatial-tracking=()"
  Header set Feature-Policy "accelerometer 'none'; ambient-light-sensor 'none'; autoplay 'self'; battery 'none'; camera 'none'; cross-origin-isolated 'none'; display-capture 'none'; document-domain 'none'; encrypted-media 'none'; execution-while-not-rendered 'none'; execution-while-out-of-viewport 'none'; fullscreen 'none'; geolocation 'none'; gyroscope 'none'; keyboard-map 'none'; magnetometer 'none'; microphone 'none'; midi 'none'; navigation-override 'none'; payment 'none'; picture-in-picture 'none'; publickey-credentials-get 'none'; screen-wake-lock 'none'; sync-xhr 'none'; usb 'none'; web-share 'none'; xr-spatial-tracking 'none'"
</IfModule>
https://securityheaders.com/


BASIC SICHERHEIT 
 
Basis-Infos: Security-Header (03.07.2023)
Folgend für den Austausch mit den Kunden einige Basis-Infos zum aktuellen Thema der Security Header.

Generell: Ein Security-Header für eine Website ist wichtig, da er zusätzliche Schutzmaßnahmen bietet, um die Sicherheit und Integrität der Website zu gewährleisten. Durch das Setzen spezifischer Sicherheitsheader können potenzielle Angriffe wie Cross-Site Scripting (XSS), Clickjacking oder Inhaltsinjektion verhindert werden. Ein korrekt konfigurierter Sicherheitsheader kann auch dazu beitragen, sensible Informationen zu schützen und das Vertrauen der Benutzer in die Website zu stärken.

Erklärung zu den verschiedenen Sicherheitsheadern:

- Strict-Transport-Security (HSTS): Dieser Header sorgt dafür, dass die Kommunikation zwischen dem Webbrowser und der Website ausschließlich über eine sichere Verbindung (HTTPS) erfolgt. Dadurch wird das Risiko von Angriffen wie Man-in-the-Middle reduziert.

- X-Frame-Options: Dieser Header legt fest, wie die Website in einem iFrame eingebettet werden kann. Er schützt vor Clickjacking-Angriffen, indem er steuert, ob die Website in einem Frame angezeigt werden darf oder nicht.

- Content-Security-Policy (CSP): Dieser Header definiert, welche Inhalte auf einer Website geladen werden dürfen und woher sie stammen dürfen. Er hilft, Cross-Site Scripting (XSS) und ähnliche Angriffe zu verhindern, indem er die Ausführung unsicherer Skripte oder das Laden von bösartigen Inhalten einschränkt.

- Permissions-Policy: Dieser Header ermöglicht die Kontrolle über verschiedene Berechtigungen, die eine Website auf Geräten oder im Browser des Benutzers haben darf. Dadurch können bestimmte Funktionen, wie zum Beispiel die Kamera oder das Mikrofon, nur mit Zustimmung des Benutzers verwendet werden.

- Referrer-Policy: Dieser Header legt fest, welche Informationen über den Verweis (Referrer) einer Website beim Navigieren auf andere Websites übermittelt werden. Dadurch kann die Privatsphäre des Benutzers geschützt werden, indem sensible Informationen nicht weitergegeben werden.

- X-Content-Type-Options: Dieser Header kontrolliert, wie der Browser mit der Content-Type-Kennzeichnung einer Website umgeht. Er hilft, MIME-Sniffing-Angriffe zu verhindern, indem er sicherstellt, dass der Browser den angegebenen Content-Type akzeptiert und nicht versucht, den Inhalt selbst zu interpretieren.

Weitere Begriffserklärungen:

Clickjacking:

Clickjacking ist eine betrügerische Methode, bei der ein unsichtbares Element oder eine falsche Oberfläche über eine vertrauenswürdige Webseite gelegt wird. Dadurch werden ahnungslose Benutzer dazu verleitet, auf vermeintlich harmlose Elemente zu klicken, die in Wirklichkeit jedoch bösartige Aktionen ausführen. Dies kann dazu führen, dass Benutzer ungewollt persönliche Informationen preisgeben, schädliche Programme herunterladen oder unautorisierte Aktionen durchführen, ohne dass sie es bemerken. Clickjacking zielt darauf ab, die Nutzer zu täuschen und ihre Aktionen auszunutzen, um den Angreifern Vorteile zu verschaffen.betrügerische Methode, bei der ein unsichtbares Element oder eine falsche Oberfläche über eine vertrauenswürdige Webseite gelegt wird.

Cross-Site Scripting (XSS):

Cross-Site Scripting (XSS) ist eine Art von Angriff auf Webanwendungen, bei dem ein Angreifer schädlichen Code in eine Website einschleust, der dann von anderen Benutzern im Browser ausgeführt wird. Dadurch kann der Angreifer die Kontrolle über die betroffene Website erlangen, sensible Daten stehlen oder betrügerische Aktionen im Namen des Benutzers durchführen. XSS-Angriffe sind möglich, wenn eine Website unzureichende Sicherheitsmaßnahmen zum Filtern oder Validieren von Benutzereingaben hat und es dem Angreifer ermöglicht, bösartigen Code einzufügen, der dann von anderen Benutzern ausgeführt wird.

MIME-Sniffing-Angriffe:

MIME-Sniffing-Angriffe beziehen sich auf eine Sicherheitslücke, bei der ein Angreifer den MIME-Typ (Multipurpose Internet Mail Extensions) einer Datei manipuliert, um den Webbrowser dazu zu bringen, sie auf eine unerwartete Weise zu interpretieren. Diese Angriffe nutzen aus, dass einige Webbrowser unsichere MIME-Typ-Überprüfungen durchführen und versuchen, den tatsächlichen Inhalt einer Datei zu erraten, anstatt sich strikt an den vom Server bereitgestellten MIME-Typ zu halten. Dadurch können bösartige Dateien als harmlos interpretiert werden, was zu Sicherheitsrisiken führen kann, z. B. das Ausführen von schädlichem Code oder das Anzeigen gefälschter Inhalte. Durch das korrekte Setzen des X-Content-Type-Options-Headers kann dieses Risiko minimiert werden, indem der Browser angewiesen wird, den angegebenen MIME-Typ zu respektieren und nicht auf eine Interpretation des Inhalts zu spekulieren.


SEO ANALYTICS BASIC 
 
Basis-Einstellungen für Google Analytics 4 (GA 4) (29.06.2023)
Nach der Migration auf GA4 können/sollten folgende Einstellungen für die Property vorgenommen werden:

1. Verwaltung —> Dateneinstellungen —> Datenaufbewahrung: Auf 14 Monate setzen (für Ereignisse, noch zu prüfen: Auskunftspflich unter „Datenschutz“?)

2. Verwaltung —> Datenstream —>Klick auf vorhandenen Stream —> Optimierte Analyse —> Einstellungs-Rädchen —> Alle Analyse optimieren (Manuelle Erweiterungen durch Application für Suche & Videos notwendig)

3. Verwaltung —> Einrichtungsassistent —> Alle 7 Schritte prüfen / als erledigt markieren (Hinweis: Signale lasse ich zunächst aus, hier müssen wir ebenfalls Auswirkungen auf den Datenschutz recherchieren)

Einrichtung weiterer individueller Ereignisse/Conversions sind abhängig von der vorherigen Einstellungen/Anforderungen.

Unter Expl. Datenanalysen können individuelle Analysen erstellt werden. Siehe z. B. Property der thieme-stadtmobiliar.com. Hier gibt es eine expl. Datenanalyse die die Namen der Dateien ausgibt, die aufgerufen wurden.


WEB SEO SEARCHCONSOLE BASIC 
 
Basis-Infos: Core Web Vitals (Google Search Console) (26.06.2023)
Die folgende Auflistung gibt einen kurzen Wissensüberblick über die Core Web Vitals in der Google Search Console. Es gibt immer wieder Kundenanfragen zu diesem Thema, so dass wir hier alle zumindest im Kern aussagekräftig sein sollten. Für die Projektmanager: Hieraus lassen sich gut kleinere SEO-Aufträge für die Prüfung und Optimierung o. auch kleinere Pauschalen generieren. Alle Werte sollten aber immer kritisch hinterfragt werden.

Die Core Web Vitals bilden eine wichtige Metrik in der Google Search Console. Die Core Web Vitals sind eine Reihe von Messwerten, die die Benutzerfreundlichkeit und Leistung Ihrer Website bewerten. Sie geben Ihnen wichtige Einblicke darüber, wie gut Ihre Webseite lädt und wie schnell sie reagiert.

Die Core Web Vitals umfassen drei Hauptmetriken:

1. LCP (Largest Contentful Paint): Dieser Wert misst die Zeit, die Ihre Webseite benötigt, um das größte sichtbare Element für den Nutzer zu laden. Ein gutes Ziel für den LCP ist eine Ladezeit von unter 2,5 Sekunden.

Beispiel: Wenn Sie eine E-Commerce-Website haben und es länger als 2,5 Sekunden dauert, bis das Produktbild auf der Startseite vollständig geladen wird, kann dies potenzielle Kunden abschrecken.

2. FID (First Input Delay): Diese Metrik misst die Zeit, die eine Webseite benötigt, um auf die erste Interaktion des Nutzers zu reagieren, beispielsweise auf einen Klick oder eine Berührung. Ein guter FID-Wert liegt unter 100 Millisekunden. Wenn die Webseite langsam auf Benutzereingaben reagiert, kann dies zu einer negativen Erfahrung führen.

Beispiel: Wenn Sie einen Blog haben und es zu lange dauert, bis ein Leser auf einen Artikel klicken kann, um ihn zu öffnen, kann dies die Nutzerfrustration erhöhen und sie dazu bringen, Ihre Website zu verlassen.

3. CLS (Cumulative Layout Shift): Diese Metrik bewertet, wie stabil die Darstellung einer Webseite ist. Ein hoher CLS-Wert bedeutet, dass sich die Elemente auf der Seite während des Ladens oft verschieben. Ein guter CLS-Wert liegt unter 0,1. Ein unvorhergesehenes Verschieben von Inhalten kann zu unbeabsichtigten Klicks oder zur Verwirrung der Nutzer führen.

Beispiel: Wenn Sie eine Nachrichten-Website haben und sich die Anzeigen plötzlich verschieben, während ein Nutzer gerade einen Artikel liest, kann dies zu ungewollten Klicks auf Anzeigen führen und die Benutzererfahrung beeinträchtigen.

Generell ist es wichtig, die Core Web Vitals zu beobachten und, wenn sinnvoll, einzelne Punkte zu optimieren, da sie sich auch auf das Ranking der Website in den Suchergebnissen von Google auswirken können. Durch die Überprüfung und Verbesserung dieser Metriken können Sie sicherstellen, dass Ihre Webseite eine positive Benutzererfahrung bietet und für Ihre Besucher schnell und benutzerfreundlich ist.


WEBSTORM VERSIONSKONTROLLE BACKUP 
 
Versionskontrolle im WebStorm (24.05.2023)
WebStorm hat im Programm selbst eine kleine Versionskontrolle, die manche Änderungen leicht rückgängig machen lässt.

Aufruf der Versionen:
1. Rechtklick auf die entsprechende Datei
2. Hover auf „Local History“
3. Klick auf „Show History“
4. Vergleich/Durchsicht nach gewünschter Datei
5. Klick auf „Revert“ (Erstes Icon unter dem Closebutton)
https://blog.jetbrains.com/idea/2020/02/local-history-in-intellij-idea-may-save-your-life-code/


WEB CK-EDITOR CODE DESIGN TYPO3 
 
Buttonstyle im CK-Editor (17.05.2023)
Wenn man im CK-Editor einen Button mit mehreren Styles ansteuerbar machen will, ist es hier wichtig in der Config die Styleklassen alphabetisch zu sortieren, da sonst kein Style ausgegeben wird.

Die Setupdatei hierfür liegt im Configurationordner -> RTE -> preset.yaml

Ein Beispiel hierfür findet ihr im Snippet.

Quelle:
https://stackoverflow.com/questions/54213690/typo3-8-ckeditor-stylesset-multiple-classes-start-classname-with-bg-does-not-w


stylesSet:  - { name: "Button", element: "a", attributes: { class: "align-items-center d-flex primary-button" } }
https://stackoverflow.com/questions/54213690/typo3-8-ckeditor-stylesset-multiple-classes-start-classname-with-bg-does-not-w


TYPO3 WEB HTACCESS APACHE SVG SECURITY 
 
SVGs im TYPO3 Frontend sind schwarz (16.05.2023)
Ab Version 11 legt TYPO3 im fileadmin-Verzeichnis eine .htaccess-Datei ab, um die Sicherheit zu erhöhen.
Die verbietet leider auch Inline-Styles bei SVGs, so dass die im Frontend alle schwarz sind.

Idealerweise werden die in einer entsprechenden Extension abgelegt, da das typo3conf-Verzeichnis nicht betroffen ist.
In Systemen ohne Site Package kann man den Inhalt von fileadmin/.htaccess durch den folgenden Snippet ersetzen:
# This file applies Content-Security-Policy (CSP) HTTP headers
# to directories containing (user uploaded) resources like
# /fileadmin/ or /uploads/

<IfModule mod_headers.c>
    # matching requested *.pdf files only (strict rules block Safari showing PDF documents)
    <FilesMatch ".pdf$">
        Header set Content-Security-Policy "default-src 'self' 'unsafe-inline'; script-src 'none'; object-src 'self'; plugin-types application/pdf;"
    </FilesMatch>
    # matching requested *.svg files only (allows using inline styles when serving SVG files)
    <FilesMatch ".svg">
        Header set Content-Security-Policy "default-src 'self'; script-src 'none'; style-src 'unsafe-inline'; object-src 'none';"
    </FilesMatch>
    # matching anything else, using negative lookbehind pattern
    <FilesMatch "(?<!.(?:pdf|svg))$">
        Header set Content-Security-Policy "default-src 'self'; script-src 'none'; style-src 'none'; object-src 'none';"
    </FilesMatch>

    # =================================================================
    # Variations to send CSP header only when it has not be set before.
    # Adjust all `Header set` instructions above
    #     Header set Content-Security-Policy "<directives>"
    # with substitutes shown below
    #
    # -----------------------------------------------------------------
    # a) for Apache 2.4 (having `setifempty`)
    # -----------------------------------------------------------------
    #     Header setifempty Content-Security-Policy "<directives>"
    #
    # -----------------------------------------------------------------
    # b) for Apache 2.2 (using fallbacks)
    # -----------------------------------------------------------------
    #     Header append Content-Security-Policy ""
    #     Header edit Content-Security-Policy "^$" "<directives>"
    #
    # =================================================================
</IfModule>




WEBP PERFORMANCE BILDER FRONTEND FARBRAUM 
 
WebP Bilder mit veränderter Farbe (13.03.2023)
Wenn beim Skalieren von Bildern die generierten WebP Versionen plötzlich eine andere Farbe haben, sollte der Farbraum des Originalbildes mit der Angabe unter $GLOBALS[’TYPO3_CONF_VARS’][‚GFX‘][‚processor_colorspace‘] abgeglichen werden.

Bisher bekannt ist ein Problem von CMYK (Original) zu sRGB (Konfiguration)
https://extensions.typo3.org/extension/webp


SERVER 
 
Eine Textdatei in mehrere Dateien aufteilen (09.03.2023)
Um CSV oder SQl Dateien aufzuteilen und dann einfacher zu importieren, kann man über die Shell das relativ einfach erledigen.
Dafür muss brew und coreutils installiert sein (siehe Link zu SO)
gsplit -l 5000 -d --additional-suffix=.txt $FileName file
https://stackoverflow.com/questions/25249516/split-text-file-into-smaller-multiple-text-file-using-command-line


INTERN MITEINANDER 
 
„Regelwerk" für ein gutes Miteinander in der Agentur (13.02.2023)
Hiermit soll einmal an die aktuellen Absprachen erinnert werden.
Anmerkungen oder Ergänzungen gerne jederzeit zu mir.

1. Küche

- jeder ist für den ordentlichen Abwasch seiner benutzten Sachen selbst verantwortlich, das ist keine Azubi-Aufgabe
- nach Kundenterminen organisiert der jeweilige PM den Abwasch
- Geschirr bitte sofort nach Gebrauch und Tassen nach Arbeitsende spülen
- die Spüle ist keine Sammelstelle für schmutziges Geschirr
- die Mikrowelle bitte nur mit der dafür vorgesehenen Abdeckung benutzen und nach jedem Gebrauch kurz abwischen
- der Besteckkasten ist kein Handgranatenwurfplatz, bitte das Besteck in die dafür vorgesehenen Fächer sortieren
- wenn etwas fehlt, defekt ist oder nachbestellt werden muss, bitte Malin informieren
- die Reinigung der Kaffeemaschine wird von den Auszubildenden übernommen, für das Auffüllen und Entleeren ist jeder selbst verantwortlich
- Müll mit Essensresten bitte nur in den Mülleimer unter der Spüle werfen

2. Toiletten

- bitte die Toilette so verlassen, wie man sie vorfinden möchte (Schulterblick)
- den Papierhandtucheimer auch treffen, wenn man etwas hineinwirft
- Toilettenpapier, Desinfektionsmittel und Seife bitte nachfüllen oder Malin Bescheid geben, wenn etwas fehlt
- leere Rollen gehören in den Mülleimer und sonst nirgendwohin
- die Toilette ist kein Aufenthaltsort und darf gerne schnell wieder verlassen werden

3. Essecke

- nach jeder „Schicht“, d.h. um 13:00 und um 14:00 Uhr bitte die Tische reinigen (Desinfektionsmittel ist vorhanden)
- bitte verhaltet euch so (Lautstärke), dass die Arbeitenden auch arbeiten können

4. Gesprächskultur

- Projektgespräche, die länger als 5-10 Minuten dauern, sollten möglichst im Konferenzraum stattfinden, bitte vorher in den Kalender schauen
- alle sollen Spaß an der Arbeit haben, aber bitte immer kurz nachschauen, ob jemand telefoniert und generell dadurch gestört wird und die Lautstärke entsprechend anpassen

5. Arbeitsplatz

- bitte immer die Arbeitsplätze für das Wochenende aufräumen und alle Kisten in den Schrank stellen, damit die Putzfrau die Arbeitsplätze reinigen kann
- Jacken bitte immer an die Garderobe hängen und nicht über die Stuhllehne
- auch wenn der Bürostuhl die Möglichkeit zum „Rollen“ bietet, sollte damit nicht durch die ganze Agentur gerollt werden.
- jeder prüft bitte nach Feierabend, ob seine Heizung noch an ist, ggf. (im Winter nach Absprache) über Nacht laufen lassen (max. Stufe 3).

6. Konferenzraum

- nach Kundenterminen und internen Besprechungen bitte das benutzte Geschirr (Gläser) sowie leere Flaschen in die Küche bringen bzw. spülen und Flaschen in die Kiste oder (je nach Wetter) in die Küche stellen
- bitte immer kurz prüfen, ob der Tisch einmal kurz abgewischt werden sollte
- nach längeren Terminen bitte ggf. die Maus und die Tastatur laden

7. Leergut

- leere Flaschen bitte selbst in die dafür vorgesehenen Kisten auf die Terrasse bringen (bitte in die richtige Kiste sortieren) und dabei die frische Luft genießen
- bei Dauerregen und Blitzeis können die Flaschen in der Küche geparkt werden, der Azubi-Dienst übernimmt dann den Weg nach draußen
- wenn ein Kasten sichtbar voll ist, bitte einen neuen mit Platz suchen und die Flasche dort abstellen, ggf. auch gerne einen leeren Kasten nach oben und einen vollen nach unten stellen.

Noch einmal zur Übersicht, zu den Aufgaben der Auszubildenden gehören:

- Kaffeemaschine laut Plan reinigen (hängt an der Geschirrschranktür)
- Müll rausbringen (Küche, Schredder, Toiletten, kleiner Mülleimer Damen-WC)
- Blumen gießen (mind. 1x wöchentlich)
- Papierstand des Druckers prüfen, Papier nachlegen
- Beamer für AWP vorbereiten
- Konferenzraum an- und ausschalten (Licht und Technik)
- Bürobedarf einkaufen
- Licht prüfen bzw. ausschalten (der Letzte, der die Agentur verlässt, macht das Licht aus)
- Getränke bestellen/auffüllen
- Kühlschrank morgens ein- und abends ausschalten (Stecker ziehen)

Besonderheiten im Winter:

- Heizung kontrollieren

Besonderheiten im Sommer:

- Sonnenschirm aufspannen
- morgens einmal die Tische auf der Terrasse abwischen
- Klimaanlage ausschalten
- Sitzbezücke auslegen
- Liegestühle auf- und abbauen
- Brunnen an- und ausschalten
- regelmäßig Unkraut jäten


TYPO3 BASIC LOKAISIERUNG REDAKTIONELLEPFLEGE 
 
Auslagerungen in Languagedateien (03.02.2023)
Für Lokalisierungen von mehrsprachigen Elementen:

Tag:
{f:translate(key: 'LLL:EXT:krone_site_package/Resources/Private/Language/locallang.xlf:title.close‘)}

Übersetzungsdatei:
Die Übersetzungsdateien findet ihr meist hier: KUNDE_site_package > Resources > Private > Language > locallang.xlf (zusätzlich die jeweilige Sprache)

in der Datei:

<trans-unit id=„title.close" xml:space="preserve">
         <source>close</source> —> Rootlanguage
	<target>schließen</target> —> Targetlanguage
 </trans-unit>




WEB HTML CSS 
 
ID-Ergänzung Body-Tag (03.02.2023)
Man kann via TS dem Body-Tag eine ID mitgeben, um der jeweiligen Seite eine bestimmte Optik zu verpassen.
[page["uid"] == 1]
page.bodyTag = <body id="home">
[global]


DOCKER DDEV DOCKER-COMPOSE 
 
Kopieren von Dateien auf dem Rechner in Docker/DDEV Container (02.02.2023)
Bis zum Neustart das Containers:
Container Namen finden: docker ps --format "{{.Names}}“
Datei kopieren: docker cp /pfad/zur/quelldatei container_name:/zielpfad/im/container/

Dauerhaft:
Erstellen eines Volumes (am besten mit docker-compose)
https://docs.docker.com/storage/volumes/#use-a-volume-with-docker-compose

docker ps --format "{{.Names}}"
docker cp /pfad/zur/quelldatei container_name:/zielpfad/im/container/
https://docs.docker.com/storage/volumes/


WEB DESIGN 
 
Facebook-Logo Guidelines (31.01.2023)
Hier einmal die Guidelines zu dem Facebook-Logo
https://about.meta.com/de/brand/resources/facebookapp/logo


INTERN PROJECTS 
 
Jobstatus in Projects (27.01.2023)
Für eine transparente Arbeitsweise, besonders auch wenn jemand Remote arbeitet, ist es wichtig, dass bei der Bearbeitung einer Kachel von allen im Team immer der korrekte Job-Status berücksichtigt wird. So weiß jeder (PM, Kunde, Kollege), wer gerade an welcher Kachel arbeitet und muss nicht immer nach dem Status fragen.

Daher bitte:

- sobald ihr mit der Bearbeitung startet, die Kachel auch von „bestätigt“ weiter „in Bearbeitung“ ziehen
- wenn ihr die Arbeit unterbrechen müsst aber die Aufgabe noch nicht abgeschlossen habt (Feierabend, Pause o. anderer Job), bitte die Kachel wieder auf „bestätigt“ zurückschieben
- wenn es Fragen gibt oder ihr ohne Rücksprache nicht weiterkommt, bitte die Kachel „in Prüfung intern“ schieben
- sobald wir etwas an den Kunden kommuniziert haben, schieben wir die Kachel auf „in Prüfung extern“ und bei Bedarf auf „erledigt“ oder zurück auf „bestätigt“



TYPO3 
 
TYPO3 Cache Löschen für Redakteure (17.01.2023)
Mit diesem Zusatz unter Optionen (TSconfig) kann einem Nutzer oder einer Nutzergruppe das Löschen des Fronted- oder Komplett-Cache ermöglicht werden:
options.clearCache.pages = 1
options.clearCache.all = 1
options.clearCache.pages = 1


TYPO3 
 
TYPO3 Formular mit Link zu Datenschutzbestimmungen (16.01.2023)
Das Formular kann man über die Extension form_element_linked_checkbox so erweitern, dass ein verlinkbares Label „Linked checkbox“ ausgewählt werden kann. Damit kann man vor allem die Datenschutz-Bestimmungen verlinken, die in vielen Fällen aktzeptiert werden müssen.
https://github.com/tritum/form_element_linked_checkbox/blob/master/README.md#usage


SERVER 
 
mySQL Snippets (12.01.2023)
verschiedene Snippets / kleine Code-Fragment für mySQL
# search and replace
UPDATE capps_media SET path = REPLACE(path, '/home/www/p632963/websecure/', '/home/www/p632963/files/websecure/');




 
CORS bei Schriften in Chrome (10.01.2023)
Man kann den Header über die htaccess einstellen - und zum Beispiel alles erlauben.
Ob das dann einen Security Check übersteht ist eine andere Frage ;-)
<IfModule mod_headers.c>
  Header set Access-Control-Allow-Origin "*"
</IfModule>


HTML WEB CSS 
 
Kindelemente in Navigationen (Count) (06.01.2023)
Mit diesem Snippet lassen sich Kindelemente einer Navigationsebene zählen und als Klasse ausgeben.
$(this).find('.yamm-content').addClass(function() {
            return 'parents-' + $(this).find("li.yamm-toggle").length;
});


WEB HTML CODE DESIGN 
 
Mouse-Over Simulation via Konsole (06.01.2023)
Zur Prüfung eines Hovers o.ä. kann man mit diesem Snippet eine Simulation über die Konsole auslösen.
$('.shared-partial.uptime-90-days-wrapper svg rect').trigger('mouseover');


SUPPORT 
 
First Level Support (05.01.2023)
Insbesondere bei Anruf eines Kunden (aber auch per Mail) sollen von den PMs oder Vertretung im sogenannten First Level Support folgende Infos abgefragt werden:

1. Um welchen Kunden/System geht es genau? ( Domain, Kunde, Ansprechpartner)

2. Was genau ist das Problem? ( wo und wodurch entsteht der Fehler)

3. Kann der PM das Problem selbst reproduzieren? (z. B. Login testen, auch verschiedene Browser nutzen)

4. Wenn das Problem nicht reproduzierbar ist weitere Infos einholen: Browserversion, Benutzer, etc.
http://www.supportdetails.net/


HTML 
 
Dokumentation HTML (05.01.2023)





BASIC 
 
Dokumentation PHP (05.01.2023)





SERVER 
 
PHP mail bei Mittwald (02.01.2023)
Bei Mittwald muss bei mail für PHP unbedingt der Header mit angegeben werden. Ansonsten wird die E-Mail nicht versendet.
Das tagesaktuelle Mail-Log für den Versand von Mails über die Webumgebung (PHP/sendmail) findet man unter /tmp/mail.log
<?php
    $to      = 'nobody@example.com';
    $subject = 'the subject';
    $message = 'hello';
    $headers = 'From: webmaster@example.com'       . "rn" .
                 'Reply-To: webmaster@example.com' . "rn" .
                 'X-Mailer: PHP/' . phpversion();

    mail($to, $subject, $message, $headers);
?>


 
htaccess security Einstellungen (30.11.2022)
cross site
#https://julia-vicentini.de/blog/http-security-header-fuer-die-htaccess-datei/
#https://htaccessbook.com/important-security-headers/
#https://www.elastic2ls.com/blog/apache-entfernen-x-powered-by-header/
<IfModule mod_headers.c>
  Header set X-XSS-Protection "1; mode=block"
  Header set X-Content-Type-Options: nosniff

  Header set Strict-Transport-Security "max-age=31536000" env=HTTPS
  Header always set X-Frame-Options "SAMEORIGIN"

 Header always unset "X-Powered-By"
 Header unset "X-Powered-By"

  Header set Referrer-Policy: strict-origin-when-cross-origin

  Header always edit Set-Cookie ^(.*)$ $1;HttpOnly;Secure;SameSite=strict

  Header set Content-Security-Policy "default-src 'self';script-src 'self' 'unsafe-inline' https://www.diosna.de https://www.googletagmanager.com https://www.google-analytics.com https://maps.googleapis.com https://*.cookiebot.com;style-src 'self' 'unsafe-inline' https://www.diosna.de https://fonts.googleapis.com;img-src 'self' data: https://www.diosna.de https://www.google-analytics.com https://*.doubleclick.net https://maps.gstatic.com https://*.googleapis.com https://*.ggpht.com;font-src 'self' data: https://www.diosna.de https://fonts.gstatic.com;connect-src 'self' https://www.diosna.de https://www.google-analytics.com https://*.doubleclick.net https://maps.googleapis.com https://*.cookiebot.com;frame-src 'self' https://www.diosna.de https://www.google.de https://www.google.com https://*.youtube.com https://*.youtube-nocookie.com https://*.cookiebot.com;"

  Header set x-content-security-policy "frame-ancestors 'self'; base-uri 'self'; default-src 'none'; form-action 'self'; img-src 'self' https://www.diosna.com data:; font-src 'self' data:; object-src 'none'; script-src 'self' '; style-src 'self';"
  Header set Content-Security-Policy "default-src 'self';script-src 'self' 'unsafe-inline' https://www.diosna.de https://www.googletagmanager.com https://www.google-analytics.com https://maps.googleapis.com https://*.cookiebot.com;style-src 'self' 'unsafe-inline' https://www.diosna.de https://fonts.googleapis.com;img-src 'self' data: https://www.diosna.de https://www.google-analytics.com https://*.doubleclick.net https://maps.gstatic.com https://*.googleapis.com https://*.ggpht.com;font-src 'self' data: https://www.diosna.de https://fonts.gstatic.com;connect-src 'self' https://www.diosna.de https://www.google-analytics.com https://*.doubleclick.net https://maps.googleapis.com https://*.cookiebot.com;frame-src 'self' https://www.diosna.de https://www.google.de https://www.google.com https://*.youtube.com https://*.youtube-nocookie.com https://*.cookiebot.com;"

   Header always set Permissions-Policy "geolocation=(self 'https://www.diosna.com' ), microphone=()"

</IfModule>




 
jquery $ not found - mehrfache document.ready zuweisung (28.11.2022)
jquery $ not found - mehrfache document.ready zuweisung irgenwo auf der Seite


PHP WEB TYPO3 EXTBASE QUERY SQL 
 
Extbase Query mit nicht unterstütztem SQL anreichern (18.11.2022)
Extbase Queries bieten für simple Abfragen bereits viele Möglichkeiten und mappen die Ergebniszeilen zu Objekten.
Hat man komplexere Anforderungen, wie im Beispiel eine Umkreissuche, möchte aber nicht auf das Property-Mapping verzichten,
kann man das Extbase Query Objekt in ein Doctrine QueryBuilder Objekt konvertieren, dem das gewünschte SQL mit allen möglichen QueryBuilder-Methoden hinzufügen und dann dem Extbase Query die Teile des QueryBuilder Objekts hinzufügen.
So wird das SQL-Query weiterhin durch Extbase ausgeführt (inkl. der QuerySettings) und wir erhalten alle Objekte, die der Abfrage entsprechen.
// …
if (!empty($geo) && !empty($geo['latitude']) && !empty($geo['longitude'])) {
  // mit Typo3DbQueryParser Extbase Query Objekt zu Doctrine QueryBuilder konvertieren
  $queryParser = $this->objectManager->get(Typo3DbQueryParser::class);
  $queryBuilder = $queryParser->convertQueryToDoctrineQueryBuilder($query);

  // eigenes SQL dem QueryBuilder hinzufügen
  $queryBuilder->addSelectLiteral($this->getDistanceSelectPart($geo['latitude'], $geo['longitude']) . ' AS distance');

  if (!empty($geo['radius'])) {
    $queryBuilder->having($queryBuilder->expr()->lte('distance', $geo['radius']));
    $queryBuilder->orderBy('distance', 'ASC‘);
  }

  // QueryBuilder SQL und Parameter als Statement des Extbase Query Objekts setzen
  $query->statement($queryBuilder->getSQL(), $queryBuilder->getParameters());
}

return $query->execute();



WEB JS HTML DSGVO GOOGLE MAPS 
 
Google Maps Schriften blockieren (06.10.2022)
Wenn Google Maps nicht DSGVO konform eingebunden werden soll, Schriften aber schon.. leider echte Anforderungen.

Das Maps JS lädt von selbst Fonts nach, was man verhindern kann, indem man den Schnipsel vor jedes andere JS im Bereich einfügt.
<script type="text/javascript">
// prevent google maps from loading roboto font from external
var head = document.getElementsByTagName('head')[0];
var insertBefore = head.insertBefore;

head.insertBefore = function (newElement, referenceElement) {
    if (newElement.href && newElement.href.indexOf('//fonts.googleapis.com/css?family=Roboto') > -1) {
        return;
    }

    insertBefore.call(head, newElement, referenceElement);
};
</script>


 
v=spf1 Einstellungen per E-Mail gegen Spam (07.09.2021)
Alles in EINER Zeile!!!
v=spf1 a mx a:cybob-one.com a:cybob-three.com a:cybob-four.com a:cybob-five.com -all
oder z. B. bei Mittwald
v=spf1 include:agenturserver.de a mx a:cybob-one.com a:cybob-three.com a:cybob-four.coma:cybob-five.com -all


 
NextCloud - Warnhinweise unterdrücken (htaccess) (02.09.2021)
Bei jedem Update überschreibt Nextcloud leider die htaccess.
Nachfolgende Zeilen reduzieren die Warnhinweise
Header set Strict-Transport-Security "max-age=31536000" env=HTTPS

unter <IfModule mod_php7.c>
php_flag output_buffering Off




WEB JS 
 
MIME type is not executable (22.07.2021)
Beim Versuch eine auf dem Server liegende .json Datei in ein Javascript einzubinden kam es zu folgender Fehlermeldung:
"Refused to execute script from 'https://www.hotel-hoepke.de/fileadmin/media/panorama/hoepke-3.json?t=1626946765287' because its MIME type ('application/json') is not executable, and strict MIME type checking is enabled.“

Hier wird eine .htaccess in dem Speicherort der .json benötigt
htaccces:
<FilesMatch ".json$">
	AddType "text/javascript" .json
</FilesMatch>


 
PHP strip_tags / alle HTML-Tags und -Entities löschen (13.07.2021)
$ClearText = preg_replace( "/ns+/", "n", rtrim(html_entity_decode(strip_tags($HTMLText))) );
$ClearText = preg_replace( "/ns+/", "n", rtrim(html_entity_decode(strip_tags($HTMLText))) );


TYPO3 
 
TYPO3 - SQL, um was auf Flexform-Felder / Data-Felder zu selektieren (05.07.2021)
SELECT uid, usergroup, zip, city, country, ExtractValue(tx_capps_data, '/T3FlexForms/data/sheet/language/field[@index="ptr_email_1"]/value') AS ptr_email_1 FROM `fe_users` WHERE disable != 1 AND deleted != 1
UPDATE fe_users SET tx_capps_data = UpdateXml(tx_capps_data,'//T3FlexForms/data/sheet/language/field[@index="ptr_email_1"]/value',CONCAT('', 'ulf.langnickel@ptr-hartmann.com', '' )) WHERE uid = 2577;

Oder hier:
https://gist.github.com/einpraegsam/73821c67177dc1c960ed8a592f093be1

# Read: Show real path in sys_file_storage
select name, uid, ExtractValue(configuration, '//T3FlexForms/data/sheet[@index="sDEF"]/language/field[@index="basePath"]/value') path from sys_file_storage where uid > 0

# Write: Set a new value (in this case a detail pid) in FlexForm of a tt_news plugin
UPDATE tt_content SET pi_flexform = UpdateXML(pi_flexform, '//T3FlexForms/data/sheet[@index="s_misc"]/language/field[@index="PIDitemDisplay"]/value', CONCAT('', 123, '' )) WHERE uid=11107

SELECT uid, usergroup, zip, city, country, ExtractValue(tx_capps_data, '/T3FlexForms/data/sheet/language/field[@index="ptr_email_1"]/value') AS ptr_email_1 FROM `fe_users` WHERE disable != 1 AND deleted != 1

//
UPDATE fe_users SET tx_capps_data = UpdateXml(tx_capps_data,'//T3FlexForms/data/sheet/language/field[@index="ptr_email_1"]/value',CONCAT('<value index="vDEF">', 'ulf.langnickel@ptr-hartmann.com', '</value>' )) WHERE uid = 2577;



https://gist.github.com/einpraegsam/73821c67177dc1c960ed8a592f093be1


COUNTER TICKER HTML JS CODE 
 
Counter (03.05.2021)
Hier ist mal ein Snippet für einen funktionierenden „Counter“, „Ticker“ oder wie sie sonst noch gerne genannt werden.
Dies ist ein leicht abgewandelter Abzug von EnviTec, der ursprünglich für DKE erstellt wurde.

Das Hochzählen wird begonnen, sobald die Wrapper-Klasse (in dem Beispiel „counter“) sichtbar ist.
Hochgezählt wird der Inhalt der Elemente mit der Klasse „count-number“. Der Inhalt der Node ist die Zahl, von der aus das Zählen begonnen werden soll (meist 0).
Die Data-Attribute „data-to“ und „data-speed“ definieren wie hoch und wie lange (bzw. wie schnell) gezählt werden soll. Die Dauer ist per Default im JS auf 6s gesetzt.
<section class="counter">
  <!--
  - text: starting number
  - data-to: number to count to
  - data-speed: count duration in ms
  -->
  <span class="count-number" data-to="60" data-speed="500">0</span>
</section>

<script type="text/javascript">
	/* counter begin */
  if ($('section.counter').length) {
    var animationStarted = false;

    $(document).on('scroll', function() {
      if (
        animationStarted ||
        !isScrolledIntoView($('section.counter'), $(window))
      )
        return;

      animationStarted = true;
      $('section.counter .animation').addClass('animate');

      $('section.counter .count-number').each(function() {
        var $this = $(this);
        var countTo = $this.attr('data-to');
        var duration = $this.attr('data-speed') ? $this.attr('data-speed') : 6000;

        $({
          countNum: $this.text(),
        }).animate(
          {
            countNum: countTo,
          },
          {
            duration: duration,
            easing: 'linear',
            step: function () {
              $this.text(Math.floor(this.countNum));
            },
            complete: function () {
              $this.text(this.countNum);
              $('section.counter .animation').removeClass('animate');
            },
          }
        );
      });
    });

    function isScrolledIntoView($element, $window) {
      var viewportBottom = $window.scrollTop() + $window.height();
      var elementTop = $element.offset().top;

      return viewportBottom > elementTop;
    }
  }
  /* counter end */
</script>




 
PHP Guidelines (29.04.2021)
https://docs.typo3.org/m/typo3/reference-coreapi/master/en-us/CodingGuidelines/Index.html

https://www.php-fig.org


 
Google for Jobs - neue Testing URL (18.02.2021)
Es gibt eine neue Testing URL für Google for Jobs und auch anderen „Rich“ Content
https://search.google.com/test/rich-results?utm_campaign=sdtt&utm_medium=url&id=PSTOW985mnqbk3RM9jEZEA
https://search.google.com/test/rich-results?utm_campaign=sdtt&utm_medium=url&id=PSTOW985mnqbk3RM9jEZEA


 
Google Fonts datenschutzkonform einbinden (16.02.2021)
Da Google bei den Download nur TTF bietet,
kann man das hiermit super umgehen:
https://gwfh.mranftl.com/fonts
https://gwfh.mranftl.com/fonts


JS CSS HTML CLIPBOARD 
 
Text mit JavaScript in die Zwischenablage kopieren (27.01.2021)
Falls mal jemand das Problem hat, dass es nach allen möglichen Anleitungen im Netz bspw. https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/Interact_with_the_clipboard#using_execcommand() nicht funktioniert:

Das Input-Feld darf nicht type=„hidden“, das HTML5-Attribut hidden oder eine CSS-Angabe mit display: none; besitzen.
Dann funktioniert es einfach ohne Rückmeldung nicht.
Daher: Das Feld per CSS aus dem Viewport schieben. ;)
<style>
#copy-text {
    position: fixed;
    top: -100%;
    left: -100%;
}
</style>

<input id="copy-text" value="" type="text" />
https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/Interact_with_the_clipboard#using_execcommand()


WEB 
 
phpMyAdmin Ersatz (adminer) (17.11.2020)
Wenn phpMyAdmin nicht da ist, dann einfach:
https://www.adminer.org
Nur eine PHP-Datei!!!
https://www.adminer.org


TYPO3 FLUID FORTY3 4T3 TEMPLATE TEMPLATING 
 
Parsing-Fehler bei 4T3 Templates vermeiden (07.10.2020)
Mischt man 4T3- und Fluidschreibweise im Template, kann es (besonders bei Textfeldern) zu Parsing-Fehlern kommen.

Nutzt man als Platzhalter die 4T3 Schreibweise und in der Condition Fluid, würden bspw. Anführungszeichen im Text dazu, dass eine Fehlermeldung ausgegeben wird.

...

Grund dafür ist, dass vor dem Auswerten der Fluid-Abfrage der Inhalt des Platzhalters durch 4T3 eingefügt wird.

...

wird damit zu

ipsum

“>…



Deshalb ist es wichtig, darauf zu achten, dass man in der Schreibweise konsistent bleibt.

Entweder Condition und Platzhalter von 4T3 oder Fluid nutzen. (s. Snippet)
<f:if condition="{data.content.4t3_data.bsp}">...</f:if>

oder

<notempty element="element_data_bsp">...</notempty>



TYPOSCRIPT FLUID TYPO3 
 
TYPO3 - Fluid Templates lassen sich nicht überschreiben (06.10.2020)
Für gewöhnlich lassen sich Fluid Template-Pfade per TypoScript einfach überschreiben.

Definiert man den Pfad in den Konstanten, wird er üblicherweise mit Index 1 angelegt.
Überschreibt bspw. eine Extension die Pfade z.B. mit Index 5 und man möchte die Templates dieser Extension überschreiben, reicht es nicht, den unter Index 1 angegebenen Pfad mit einem Index > 5 anzulegen.

Grund dafür ist, dass ein Pfad nur bei einem Index existieren kann.
Deshalb hier ein Workaround-Snippet dafür:

„100 < .1“: Kopieren des Pfades auf einen höheren Index
„1 >“: WICHTIG - Löschen des Pfades auf dem vorherigen Index
plugin.tx_powermail {

	# ensure that cybob templates are used (override other extensions paths)
	view {
		templateRootPaths {
			100 < .1
			1 >
		}

		partialRootPaths {
			100 < .1
			1 >
		}

		layoutRootPaths {
			100 < .1
			1 >
		}
	}
}



SERVER WEB 
 
MX-Einträge (E-Mail) (29.07.2020)
Bei MX-Einträgen unter SchlundTech muss hinter dem Eintrag ein Punkt (.) gesetzt werden. Also z. B. "mx1-kunden.gws.eu." statt "mx1-kunden.gws.eu".

Andernfalls funktioniert der E-Mail-Versand/-Erhalt nicht.



 
DNS-Cache auf Mac löschen (29.07.2020)
Im Terminal folgendes eingeben:
sudo killall -HUP mDNSResponder


SUCHE CODE SHELL SERVER PHP 
 
Rekursives Suchen (20.07.2020)
Dateien inkl. Inhalt rekursiv durchsuchen

Auch ohne SSH-Zugriff per PHP nutzbar (sofern shell_exec() erlaubt ist)

Für mehr Infos:
https://wiki.ubuntuusers.de/grep/

SHELL:
grep -l -r -w "SUCHBEGRIFF" VERZEICHNIS

PHP
<?php

echo shell_exec('grep -l -r -w "cookieconsent" capps');


https://wiki.ubuntuusers.de/grep/


CSS HTML 
 
Background-Image für Outlook Newsletter (28.04.2020)
Das sorgt dafür, dass ein Background-Image auch im Outlook funktioniert, wichtig ist, dass man dem Bild dann feste Größen mitgibt!
<table>
 <tr>
  <td style="background-image: url(background.png);">
   <!--[if gte mso 9]>
    <v:image xmlns:v="urn:schemas-microsoft-com:vml" id="theImage" style='behavior: url(#default#VML); display:inline-block;position:absolute; height:402px; width:600px;top:0;left:0;border:0;z-index:1;' src="background.png"/>
    <v:shape xmlns:v="urn:schemas-microsoft-com:vml" id="theText" style='behavior: url(#default#VML); display:inline-block;position:absolute; height:402px; width:600px;top:-5;left:-10;border:0;z-index:2;'>
    <div>
   <![endif]-->
   <h1>Titel</h1>
   <p>Einiges an Text.</p>
   <!--[if gte mso 9]>
    </div>
    </v:shape>
   <![endif]-->
  </td>
 </tr>
</table>


TYPO3 EID AJAX 
 
eID Skript einbinden - TYPO3 9 (20.04.2020)
In TYPO3 9 sollte man etwas anders vorgehen - im Wesentlichen, wenn man TYPO3 Funktionen nutzen will, ansonsten funktioniert die „alte“ Einbindung auch noch

— für mehrsprachige Ausgaben sollte pageType verwendet werden!
//typo3conf/AdditionalConfiguration.php
$GLOBALS['TYPO3_CONF_VARS']['FE']['eID_include']['###eID-Schlüssel###'] = 'typo3conf/scripts/php/w/e/Skript.php';


//typo3conf/scripts/php/w/e/Skript.php
namespace CYBOB\PackageName\CategoryName;

class SkriptEidBootstrap {

	private $gpVars;
	protected $objectManager;

	const GP_GROUP_PARAMS = 'gpgroupkey';

	public function __construct() {
		$feUserObj = \TYPO3\CMS\Frontend\Utility\EidUtility::initFeUser();
		$pid = (\TYPO3\CMS\Core\Utility\GeneralUtility::_GET('id') ? \TYPO3\CMS\Core\Utility\GeneralUtility::_GET('id') : 1);
		$GLOBALS['TSFE'] = \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance('TYPO3\CMS\Frontend\Controller\TypoScriptFrontendController', NULL, $pid, 0, TRUE);
		$GLOBALS['TSFE']->connectToDB();
		$GLOBALS['TSFE']->fe_user = $feUserObj;
		$GLOBALS['TSFE']->id = $pid;
		$GLOBALS['TSFE']->determineId();

		$GLOBALS['TSFE']->initTemplate();
		$GLOBALS['TSFE']->getConfigArray();

		\TYPO3\CMS\Frontend\Utility\EidUtility::initLanguage();
		$GLOBALS['TSFE']->settingLanguage();
		$GLOBALS['TSFE']->settingLocale();

		$GLOBALS['TSFE']->set_no_cache();
		$GLOBALS['TSFE']->cObj = \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance('TYPO3\CMS\Frontend\ContentObject\ContentObjectRenderer');

			//wird fuer BE Funktionalitaeten benoetigt, beinhaltet auch den aktuell eingeloggten BE User
		$GLOBALS['BE_USER'] = \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance('TYPO3\CMS\Core\Authentication\BackendUserAuthentication');
		$GLOBALS['BE_USER']->start();

		$this->objectManager = GeneralUtility::makeInstance('TYPO3\\CMS\\Extbase\\Object\\ObjectManager');

		$this->gpVars = GeneralUtility::_GP(self::GP_GROUP_PARAMS);
	}


	public function run() {
		if(method_exists($this, $this->gpVars['method']) && $this->gpVars['method'] != 'run'){
			header('Content-Type: application/json');
			echo json_encode($this->{$this->gpVars['method']}());
		}
	}
}

$eID = GeneralUtility::makeInstance('CYBOB\PackageName\CategoryName\Skript');
$eID->run();



WEB 
 
Google for Jobs (29.01.2020)
Ein JobPosting Beispiel:

zur Überprüfung: https://search.google.com/structured-data/testing-tool/
<script type="application/ld+json">
  {
    "@context" : "https://schema.org/",
    "@type" : "JobPosting",
    "datePosted": "<f:format.date format='Y-m-d'> {field.date}</f:format.date>",
    "validThrough": "<f:format.date format='Y-m-d'> {field.validThrough}</f:format.date>",
    "description": "<f:format.htmlentities>{field.text}</f:format.htmlentities>",
    "employmentType": "{field.employmentType}",
    "title": "{field.headline}",
    "hiringOrganization": {
      "@type": "Organization",
      "name": "EnviTec Biogas AG",
      "sameAs":"https://www.envitec-biogas.de/",
      "logo": "https://www.envitec-biogas.de/fileadmin/media/images/_envitec-logos/logo_envitec_google_jobs.jpg"
    },
    "jobLocation": {
      "@type": "Place",
      "address": {
        "@type": "PostalAddress",
        "streetAddress": "Boschstraße 2",
        "addressLocality": "Saerbeck",
        "addressRegion" : "Nordrhein-Westfalen",
        "postalCode": "48369",
        "addressCountry": "DE"
      }
    }
  }

</script> 
https://developers.google.com/search/docs/data-types/job-posting?hl=de


IMAGEMAGICK PHP CODE 
 
ImageMagick - Bildhelligkeit ermitteln (27.01.2020)
Bei den Produktseiten von Osmo wird eine Schrift über die Kopfabbildungen gelegt.
Problem dabei ist die Schriftfarbe, da die Bilder in allen möglichen Farben existieren und der Text direkt darüber liegt.

Hierzu kann man mit folgendem convert-Befehl herausfinden, ob das Bild eher hell oder dunkel ist und den Text entsprechend mit einer anderen CSS-Klasse und Farbe versehen.

Erfahrungsgemäß sind Werte von unter 45000 eher ein dunkleres Bild, darüber eher ein helleres.
if ($imagePath) {
    $imageInfo = shell_exec('convert ' . $imagePath . ' -colorspace Gray -format "%[mean]" info:');

    if ($imageInfo) {
        $textColour = ((int)$imageInfo < 45000 ? 'light' : 'dark') ;
     }
 }
https://www.osmo.de/farbe/farbe-fuer-den-innenbereich/anstriche-fuer-den-fussboden/dekorwachs/


HTACCESS APACHE TYPO3 BACKEND SECURITY CODE WEB 
 
IP Schutz für ein bestimmtes Verzeichnis (z. B. Backend) (22.01.2020)
Hier ein Schnipsel, mit dem man ein bestimmtes Unterverzeichnis per .htaccess IP-schützen kann.

Hier am Beispiel des TYPO3-Backends.
SetEnvIf Request_URI "/typo3(/.*)?$" backend
Order deny,allow
Deny from all
Allow from env=!backend

# Kunde
Allow from IP_KUNDE

# cybob
Allow from 212.95.112.203



TYPO3 
 
TYPO3 Debuggin anschalten / Cache leeren (17.01.2020)
Am besten über dass "Install-Tool“.
Sollte man das Password nicht kennen, jedoch einen FTP-Zugang haben, kann man die „LocalConfiguration.php“ bearbeiten:
BE: debug >= true
FE: debug >= true
SYS: displayErrors = 1

Hinweis: Auch in der php.ini muss das Error-Reporting aktiviert sein.

Ggfs muss man über das Listen-Modul ein Template erstellen, welches im Setup "config.contentObjectExceptionHandler = 0“ beinhaltet.

Je nach TYPO3 Installation / Version wird durch das Blitz-Symbol mehr oder weniger Cache gelöscht. Das kann man auch manuell machen.
Dafür den „typo3temp“ Ordner oder einen Teil daraus z.B. „Cache/Code/cache_core/ext_localconf…“ löschen.


TYPO3 
 
TYPO3 Youtube-iFrame erlauben, inline-CSS erlauben (13.12.2019)
Um iin TYPO3 Youtube-iFrame oder inline-CSS zu erlauben müssen die Header entsprechend angepasst werden:
Content-Security-Policy muss mit den Domain-Namen sowie 'unsafe-inline‘ versehen werden.



TYPO3 
 
TYPO3 Navigation per Fluid mit MenuProcessor (13.12.2019)
Eine kurze aber gute Anleitung zu TYPO3 Navigation per Fliud mit MenuProcessor unter:
https://www.thomaskieslich.de/blog/132-typo3-8-menues-mit-fluid-und-menuprocessor-erstellen/
https://www.thomaskieslich.de/blog/132-typo3-8-menues-mit-fluid-und-menuprocessor-erstellen/


TYPO3 
 
TYPO3: Parameter in Fluid ohne Extension anzupassen (07.11.2019)

#
# z.B. ins +ext Setup im TYPO3 Backend
#
lib.gpvar = COA
lib.gpvar {
  # Schuetzt vor XSS, daher auch ein COA!
  stdWrap.htmlSpecialChars = 1
  10 = TEXT
  10 {
    dataWrap = GP:{current}
    insertData = 1
    wrap3 = {|}
  }
}

#
# im Template dann
#
{f:cObject(typoscriptObjectPath: 'lib.gpvar', data: 'noheader')}

https://blog.teamgeist-medien.de/2016/06/typo3-fluid-get-post-parameter-auslesen.html


TYPO3 RTE IMAGES 
 
TYPO3 8/9 RTE mit Bildern im Text (08.08.2019)
Ab TYPO3 8 ist standardmäßig der rte_ckeditor für die Darstellung der RTE-Felder im Backend zuständig.

Um mit dem neuen Editor Bilder im Text zu nutzen, muss zusätzlich die Extension rte_ckeditor_image installiert werden.

Anschließend eine neue RTE-Konfiguration angelegt und eingebunden werden.
#
# RTE-Konfigurationsdatei anlegen, z.B. unter:
#
# typo3conf/RTE/Default.yaml
#

# typo3conf/RTE/Default.yaml
imports:
 # Import default RTE config (for example)
  - { resource: "EXT:rte_ckeditor/Configuration/RTE/Default.yaml" }
  # Import the image plugin configuration
  - { resource: "EXT:rte_ckeditor_image/Configuration/RTE/Plugin.yaml" }

editor:
  config:
    # RTE default config removes image plugin - restore it:
    removePlugins: null


#
# Konfigurationsdatei einbinden, vorzugsweise in der typo3conf/AdditionalConfiguration.php
# Gibt es sie bereits, den Inhalt einfach hinten anhängen, ansonsten die Datei vorher erstellen.
#

# typo3conf/AdditionalConfiguration.php
<?php

$GLOBALS['TYPO3_CONF_VARS']['RTE']['Presets']['default'] = 'typo3conf/RTE/Default.yaml';
https://extensions.typo3.org/extension/rte_ckeditor_image/


MYSQL EMOJI TYPO3 DATABASE 
 
Emojis in TYPO3 (07.08.2019)
Ab TYPO3 9 werden die tollen Unicode-Emojis unterstützt, die auch in Apple Mail, Whatsapp und Co. verwendet werden.

Einzige Voraussetzung dafür ist, dass die Datenbank das Charset utf8mb4 nutzt, da besagte Emojis jeweils 4-Byte Speicherplatz benötigen und das Standard UTF-8-Charset von MySQL nur 3 Byte reserviert.

Achtung: Das bedeutet, dass für jedes Zeichen in der Datenbank 4-Byte reserviert werden. Dementsprechend sollte es verwendet werden, wo es wirklich notwendig ist oder die Datenbank an sich nicht groß ist. Für Texte bedeutet das nämlich 25% mehr Speicherplatz, der belegt wird.


DATABASE DB CHARSET MYSQL 
 
Datenbank Charset ändern (06.08.2019)
Um das Charset einer bestehenden Datenbank zu ändern, reicht ein ALTER DATABASE oder ALTER TABLE leider nicht aus. Diese Änderung bezieht sich nur auf die neu geschriebenen Daten und übernimmt keine Konvertierung der bestehenden Inhalte.

Für die Konvertierung hat bei mir Folgendes funktioniert:
# DB Exportieren (DBNAME_dump.sql ist gleichzeitig die Sicherung der DB ;) )

mysqldump --opt -Q -h HOSTNAME -u USER -p DBNAME > DBNAME_dump.sql


# Konvertieren der Datei in das gewuenschte Charset
# Mehr Infos zu iconv: https://wiki.ubuntuusers.de/Skripte/Zeichensatzkonvertierung/

iconv -f CHARSET_OLD -t CHARSET_NEW DBNAME_dump.sql > dump-converted.sql

Beispiel: iconv -f iso-8859-1 -t utf8 DBNAME_dump.sql > dump-converted.sql


# DB Importieren
mysql -h HOSTNAME -u USER -p --default-character-set=CHARSET_NEW DBNAME < dump-converted.sql

Beispiel: mysql -h HOSTNAME -u USER -p --default-character-set=utf8 DBNAME < dump-converted.sql


WEB PHP HTACCESS 
 
PHP Version über htaccess einstellen (24.07.2019)
Mit nachfolgender Zeile können zumindest für three, four, five die PHP je Verzeichnis umgestellt werden
FCGIWrapper /home/fcgid/web51/php5.6/php-fcgi .php


TYPO3 BACKEND USERTSCONFIG 
 
IDs im Seitenbaum anzeigen (25.06.2019)
Einfach den Schnipsel in die User TSconfig eintragen.
(Wenn man über das Modul "Backend users" seinen Benutzer bearbeitet, findet man das Feld im Reiter "Options")
options.pageTree.showPageIdWithTitle = 1 
https://docs.typo3.org/m/typo3/reference-tsconfig/master/en-us/UserTsconfig/Options.html#pagetree-showpageidwithtitle


TYPO3 CODE TRANSLATION 
 
Übersetzungen aus Sprachdateien in PHP (21.06.2019)

// use TYPO3\CMS\Extbase\Utility\LocalizationUtility;

$localizedString = LocalizationUtility::translate('individual_key', 'extension_name');


TYPO3 SQL QUERYBUILDER CONNECTION WEB CODE 
 
TYPO3 SQL ohne Escaping (19.06.2019)
Da es durchaus vorkommt, dass man mal MySQL-Funktionen nutzen möchte, die mit TYPO3 QueryBuilder oder Connection so nicht möglich sind, hier mal ein Schnipsel, mit dem man SQL so auf die DB feuern kann.

! Bitte mit Vorsicht genießen, insbesondere bei GP-Parametern oder sonstigen Nutzereingaben !


// some sql that is not supported by query builder
$sql = 'SELECT *
        FROM mytable
        WHERE id IN (1,2,3,4)
        ORDER BY FIELD(id,3,2,1,4);';

$connection = GeneralUtility::makeInstance(ConnectionPool::class)->getConnectionForTable('table_name');
$statement = $connection->query($sql);

while($row = $statement->fetch()) {
	// do something with the row
}

https://www.doctrine-project.org/api/dbal/2.7/Doctrine/DBAL/Connection.html#method_query


TYPO3 EXTENSION 
 
TYPO3 Extension - Feld hinzufügen (18.06.2019)
1.: ext_tables.sql
Hier muss das Datenbankfeld definiert werden.
Bsp: new_field

2. Configuration/TCA/(Overrides/)my_table.php
In dem Array muss unter columns die TCA-Konfiguration für das Feld hinzugefügt werden. Der Schlüssel heißt genau so wie das DB-Feld.
Bsp:
'new_field' => [
'exclude' => 1,
'label' => 'My label',
'config' => [
'type' => 'check',
],
]

Zusätzlich muss new_field noch unter types in einer der showitem-Listen auftauchen.

3. Classes/Domain/Model/MyModel.php
Hier muss das Attribut im CamelCase inkl. get- und set-Methode hinzugefügt werden.
Bsp:

/**
* newField
*
* @var integer
*/
protected $newField = 0;

/**
* Returns the newField
*
* @return integer $newField
*/
public function getNewField() {
return $this->newField;
}

/**
* Sets the newField
*
* @param integer $newField
* @return void
*/
public function setNewField $newField) {
$this->newField = $newField;
}
https://docs.typo3.org/m/typo3/book-extbasefluid/master/en-us/4-FirstExtension/Index.html


WEB TYPO3 TYPOSCRIPT 
 
Ressourcen-Bild TypoScript (18.06.2019)
Wenn man z.B. in Menüs das Bild unter Ressourcen ausgeben möchte ;)
5 = FILES
5 {
	begin = 0
	maxItems = 1
	references {
		table = pages
		fieldName = media
		uid.data = field:uid:id
	}

	renderObj = COA
	renderObj {
		10 = IMG_RESOURCE
		10 {
			file {
				import.data = file:current:publicUrl
			}
			stdWrap.wrap = <img src="|" class="class"
		}

		15 = TEXT
		15.value.data = file:current:title
		15.stdWrap.wrap = title="|"
		15.stdWrap.required = 1

		20 = TEXT
		20.value.data = file:current:alternative
		20.wrap = alt="|" />
	}
}




TYPO3 NAVIGATION TYPOSCRIPT WEB 
 
Minimale Navigation - TypoScript (18.06.2019)
Beispiel-Navigation über 3 Ebenen
(kann natürlich auch für Teaserlisten & Co. genutzt werden ;) )
##############################################
#                                            #
#  TYPO3 Solutions - Programming by          #
#                                            #
#  cybob communication GmbH - www.cybob.com  #
#                                            #
##############################################

lib.mainnavigation = COA
lib.mainnavigation {
	10 = HMENU
	10 {
		special = directory
		special.value = 1

		1 = TMENU
		1 {
			expAll = 1
			wrap = <ul class="level-1">|</ul>

			NO {
				wrapItemAndSub.cObject = COA
				wrapItemAndSub.cObject {
					10 = TEXT
					10.value = <li>|</li>
				}

				ATagParams = class="a-tag-class" data-test="other-attribute"
				ATagTitle.field = subtitle // title
			}

			CUR < .NO
			CUR = 1
			CUR.wrapItemAndSub.cObject.10.value >
			CUR.wrapItemAndSub.cObject.10.value = <li class="cur">|</li>

			ACT < .CUR
			ACT = 1
			ACT.wrapItemAndSub.cObject.10.value >
			ACT.wrapItemAndSub.cObject.10.value = <li class="act">|</li>

			IFSUB < .NO
			IFSUB = 1
			IFSUB.wrapItemAndSub.cObject.10.value >
			IFSUB.wrapItemAndSub.cObject.10.value = <li class="ifsub">|</li>

			CURIFSUB < .IFSUB
			CURIFSUB = 1
			CURIFSUB.wrapItemAndSub.cObject.10.value >
			CURIFSUB.wrapItemAndSub.cObject.10.value = <li class="curifsub">|</li>

			ACTIFSUB < .CURIFSUB
			ACTIFSUB = 1
			ACTIFSUB.wrapItemAndSub.cObject.10.value >
			ACTIFSUB.wrapItemAndSub.cObject.10.value = <li class="actifsub">|</li>
		}

		2 = TMENU
		2 {
			expAll = 1
			wrap = <ul class="level-2">|</ul>

			NO {
				wrapItemAndSub.cObject = COA
				wrapItemAndSub.cObject {
					10 = TEXT
					10.value = <li>|</li>
				}
			}

			CUR < .NO
			CUR = 1
			CUR.wrapItemAndSub.cObject.10.value >
			CUR.wrapItemAndSub.cObject.10.value = <li class="cur">|</li>

			ACT < .CUR
			ACT = 1
			ACT.wrapItemAndSub.cObject.10.value >
			ACT.wrapItemAndSub.cObject.10.value = <li class="act">|</li>

			IFSUB < .NO
			IFSUB = 1
			IFSUB.wrapItemAndSub.cObject.10.value >
			IFSUB.wrapItemAndSub.cObject.10.value = <li class="ifsub">|</li>

			CURIFSUB < .IFSUB
			CURIFSUB = 1
			CURIFSUB.wrapItemAndSub.cObject.10.value >
			CURIFSUB.wrapItemAndSub.cObject.10.value = <li class="curifsub">|</li>

			ACTIFSUB < .CURIFSUB
			ACTIFSUB = 1
			ACTIFSUB.wrapItemAndSub.cObject.10.value >
			ACTIFSUB.wrapItemAndSub.cObject.10.value = <li class="actifsub">|</li>
		}

		3 = TMENU
		3 {
			expAll = 1
			wrap = <ul class="level-3">|</ul>

			NO {
				wrapItemAndSub.cObject = COA
				wrapItemAndSub.cObject {
					10 = TEXT
					10.value = <li>|</li>
				}

				ATagTitle.field = subtitle // title
			}

			CUR < .NO
			CUR = 1
			CUR.wrapItemAndSub.cObject.10.value >
			CUR.wrapItemAndSub.cObject.10.value = <li class="cur">|</li>

			ACT < .CUR
			ACT = 1
			ACT.wrapItemAndSub.cObject.10.value >
			ACT.wrapItemAndSub.cObject.10.value = <li class="act">|</li>
		}
	}

}


 
CSS Sammlung (13.06.2019)

CSS kann mit der Funktion calc() rechnen. (Alle Browser unterstützen diese CSS-Funktion mittlerweile.)

Beispiel:
Eine responsive Webseite nimmt immer 100% der Bildschirmbreite (100vw) ein. Es gibt eine große linke Inhaltsspalte und eine schmalere rechte Spalte. Dabei hat die rechte Spalte eine feste Breite von 280px, die linke große Spalte soll sich entsprechend anpassen. Mit calc() ist es kein Problem die entsprechende Breite für die linke Spalte zu berechnen:

.container-left {
width: calc(100vw - 280px);
}

.container-right {
width: 280px;
}

Addition (+), Substraktion (-), Division (/) und Multiplikation (*) sind möglich.



Neue CSS-Eigenschaften wie „Transitions“ oder „Flexbox“ können nie ohne Einschränkungen direkt angewendet werden. Es benötigt immer eine gewisse Zeit, bis alle Browser die neuen Eigenschaften auch unterstützen und darstellen können. Einige Browser sind damit schneller, Andere brauchen etwas mehr Zeit. Daher müssen neuere CSS-Eigenschaften oft mit Fallback eingesetzt werden. D.h. es muss definiert werden, was passieren soll, wenn ein Browser die neue eingesetzte CSS-Eigenschaft nicht unterstützt.

Dazu kann die Regel @supports verwendet werden. Alle Browser (außer der Internet Explorer) unterstützen diese Regel (Can I use @supports). So wird vor dem Einsatz einer „kritischen“ CSS-Eigenschaft erst abgefragt, ob diese überhaupt unterstützt wird. Ebenso kann auch @supports not eingesetzt werden. Auch umfangreiche Abfragen sind mit „and“ und „or“ möglich.
Durch diese CSS-Regel kann der Einsatz von umfangreichen JavaScript-Bibliotheken wie „Modernizr“ entfallen.

@supports (hyphens: auto) {
body {
hyphens: auto;
}
}

@supports ((transition-property: color) or (animation-name: foo))
and (transform: rotate(10deg)) {
// ...
}



p > a {
// steuert alle Kindelemente (a-Tags) erster Ebene des p-Tags an
}

p + a {
// steuert das direkte Nachbarelement (a-Tag) des p-Tags an
}

p ~ a {
// steuert alle folgenden Geschwisterelemente gleicher Ebene (a-Tags) des p-Tags an
}



input[type="email"] {
// steuert nur E-Mail-Inputfelder an
}

img[title~="clickstorm"] {
// steuert alle img-Tags an, die im title-Attribut die mit Leerzeichen getrennte Zeichenkette "clickstorm" enthalten
}

a[href^="https://"] {
// steuert alle a-Tags an, die zu einer URL beginnend mit "https://" verweisen
}

a[href$=".pdf"] {
// steuert alle a-Tags an, die zu einer URL endend mit ".pdf" verweisen
}

a[href*="clickstorm.de"] {
// steuert alle a-Tags an, die die Zeichenkette "clickstorm.de" enthalten
}



:target

Die Pseudoklasse :target wird gesetzt, wenn ein bestimmter Bereich der Webseite mit einem Ankerlink (z.B. #details) angesprochen wurde. So kann das CSS je nach aufgerufenem Anker anders aufgebaut werden. Das macht z.B. Bilder-Gallerien oder mobile Navigationen ohne JavaScript möglich.

HTML:
<a href="#mobile-nav">Link öffnet mobiles Menü</a>

<div id="mobile-nav">
<!-- Mobiles Menü -->
</div>

CSS:
#mobile-nav {
display: none;
}

#mobile-nav:target {
display: block;
}



Syntax der Pseudoelemente

a::before {
content: "> ";
}


MYSQL WEB DATABASE 
 
MySQL Tabelle kopieren (ohne phpMyAdmin) (13.06.2019)
Da manche Kunden ja kein phpMyAdmin laufen haben und man nicht so schön "kopiere Tabelle nach" nutzen kann, hier ein Snippet, wie man das Ganze per SQL-Statements machen kann.

So werden Struktur, Daten, Indizes, Constraints & Co. vollständig übernommen.
CREATE TABLE new_table LIKE old_table;
INSERT new_table SELECT * FROM old_table;


WEB JS 
 
Ausklappbare Navigation Tablet (05.06.2019)
Bei Verwendung dieses JS Schnipsels ist es wichtig, dass nur die
  • Elementen des 1. Levels der Navigation angesprochen werden (z. B. andere Klasse mitgeben -> level1Li). Sonst sind die
  • Elemente des 2. Levels der Navigation mobil nicht mehr als Link zu öffnen.
    $(document).ready(function () {
      if(jQuery(window).width() > 950) {
        $('li.level1Li').on("touchstart", function (e) {
          "use strict"; //satisfy the code inspectors
          var link = $(this); //preselect the link
          if (link.hasClass('hover')) {
            return true;
          } else {
            link.addClass("hover");
            $('li.level1Li').not(this).removeClass("hover");
            e.preventDefault();
            return false; //extra, and to make sure the function has consistent return points
          }
        });
      }
    });
    https://my-agrirouter.com/


  •  
    Test (05.06.2019)



     
    Ausklappbare Navigation Tablet (05.06.2019)



     
    Ausklappbare Navigation Tablet (05.06.2019)



     
    Ausklappbare Navigation Tablet (05.06.2019)



    BASH WEB 
     
    Onlinestellung - Trick (21.05.2019)
    Bei Umstellung der Domain auf einen anderen Server (Ändern des A-Record) kann es bekanntermaßen durch DNS-Caches dazu kommen, dass wir das System über die neue Domain noch nicht erreichen können, der Kunde und andere Leute allerdings schon.
    Wir können also nur entsprechend spät reagieren, sollte noch irgendwo die Domain nicht richtig eingestellt sein (TypoScript, Backend, realUrl o.Ä.).

    Vor dem Umstellen der Domain können wir diese mit neuer IP auf unserem Rechner in die hosts-Datei eintragen.
    So können wir die Seite mit der neuen Domain testen, bevor diese überhaupt auf das System zeigt.
    sudo nano /etc/hosts
    # alternativ auch mit vi oder sonstigem Editor
    sudo vi /etc/hosts
    
    # anschliessend oeffnet sich der Editor
    # nach dem Vorbild der bestehenden Eintraege
    # einfach darunter die IP Adresse des Systems
    # und die neue Domain eintragen
    192.168.0.1    neue-domain.tld
    
    
    


    MYSQL 
     
    mysql FIND_IN_SET mit mehr als einem Suchbegriff (10.04.2019)
    scheint ganz gut zu funktionieren
    // https://pritomkumar.blogspot.com/2018/06/mysql-findinset-sith-multiple-search.html
    // https://stackoverflow.com/questions/5015403/mysql-find-in-set-with-multiple-search-string
    $sql .= ' AND ( ( CONCAT(",", sys_file_metadata.fe_groups, ",") REGEXP ",('.implode("|",$arrGroups).')," ) ';
    https://stackoverflow.com/questions/5015403/mysql-find-in-set-with-multiple-search-string


     
    max Upload Size: php.ini Alternative Einstellung in .user.ini (10.04.2019)
    Wenn man die maximale Upload Größe verändern will und die php.ini nicht greift oder man da nicht dran kommt kann man ggfs. auch eine ".user.ini" in das Verzeichnis des PHP-Skripts (z.B. index.php) legen und dort das Limit erhöhen. Das greift sofort. (check mit: echo ini_get("upload_max_filesize"))
    upload_max_filesize = 150M
    post_max_size = 150M


    XML SITEMAP CRAWLER 
     
    XML Sitemap Crawler (09.04.2019)
    Wenn es nötig ist eine umfangreich Seitenstruktur abzubilden (z. B. Fremdsystem zur Angebotserstellung) und dies nicht manuell durchgeführt werden soll, kann auch ein crawling helfen: https://www.xml-sitemaps.com/


     
    mysql: Suchen & ersetzen (28.03.2019)
    mal schnell in phpMyAdmin
    UPDATE sys_file_metadata SET title = REPLACE(title, "DEV_SAP_", "")


     
    mysql: Umlaut-Sortierung falsch (27.03.2019)
    Es kann vorkommen, dass eine Suche mit Umlauten in mysql zu vermeintlich falschen Ergebnissen führt. So könnte eine Suche nach "Münster" ggfs. "Munster" (mit U) ausgeben. Dann ist die COLLATION der Grund.
    z.B. latin1_german2_ci gibt dann nur "Münster" aus
    Ähnliches soll auch bei utf8 zu beobachten sein.
    latin1_german2_ci


    TYPO3 APPLICATION 
     
    TYPO3 "Oops an error occured" deaktivieren (19.03.2019)
    Um eine Fehlermeldung zu bekommen, die einem weiterhilft, einfach im Install Tool unter "Configuration Presets" die Debug-Settings aktivieren und im TypoScript (z.B: fileadmin/template/global/ts/system/config.ts) config.contentObjectExceptionHandler = 0 setzen.
    config.contentObjectExceptionHandler = 0
    https://docs.typo3.org/typo3cms/TyposcriptReference/Setup/Config/Index.html#contentobjectexceptionhandler


    WEB HTML 
     
    PHP HTTP_REFERER (11.03.2019)
    wenn man von HTTPS auf HTTP verlinkt verliert man den HTTP_REFERER
    möchte man dies doch, so kann man nachfolgenden Meta-Tag einsetzen
    (funktioniert NICHT bei allen Browsern)
    PS: an die PMs - kann man nicht ändern, ist halt so!
    <meta name="referrer" content="always">
    http://smerity.com/articles/2013/where_did_all_the_http_referrers_go.html


     
    Bei möglichen Timestamp-Problemen (s. Ehrlich Brother App) (07.03.2019)



    WEB APP 
     
    Bei möglichen Timestamp-Problemen (s. Ehrlich Brother App) (07.03.2019)
    date_default_timezone_set('Europe/Berlin');

    $event_date_start_time = mktime (strftime ("%H", $show['begin']), strftime ("%M", $show['begin']), 0, 01, 01, 1970);
    $event_date_start_date = mktime (0, 0, 0, strftime ("%m", $show['date']), strftime ("%d", $show['date']), strftime ("%y", $show['date']));
    $event_date_start = $event_date_start_time + $event_date_start_date;

    date_default_timezone_set('UTC');

    -> wichtig ist hier, den Timestamp für die Zeit und das Datum einzeln zu erstellen und dann zu addieren!


    WEB JS 
     
    JS Events mit Delay (05.03.2019)
    JavaScript Eventhandler nach Verzögerung ausführen
    $('#search').keyup(delay(function (e) {
    	//Code hier
    }, 200));	//delay in ms
    
    function delay(callback, ms) {
      let timer = 0
      return function () {
        const context = this, args = arguments
        clearTimeout(timer);
        timer = setTimeout(function () {
          callback.apply(context, args);
        }, ms || 0)
      }
    }
    


    TYPO3 CSS 
     
    TYPO3 - CSS wird nicht dargestellt (05.03.2019)
    In TYPO3 muss man min 3x die eigentliche URL pflegen:
    1. in der Administration
    2. in der constants.ts (fileadmin/template/global/ts)
    3. irgenwo für realurl


     
    Debug-Ausgaben für Entwickler (05.03.2019)
    1. Install-Tool anmelden
    Configuration presets / Debug aktivieren

    2.fileadmin/ template/ global / system / ts / config.ts
    config.contentObjectExceptionHandler = 0
    config.contentObjectExceptionHandler = 0


    TYPO3 WEB CODE FLUID PHP 
     
    TYPO3 - Fluid rendern ohne Controller (13.02.2019)

    $templateSource = '<f:if condition="TRUE"><f:then>true</f:then><f:else>false</f:else></f:if>';
    
    $objectManager = GeneralUtility::makeInstance('TYPO3\\CMS\\Extbase\\Object\\ObjectManager');
    $standaloneView = $objectManager->get('TYPO3\\CMS\\Fluid\\View\\StandaloneView');
    
    $standaloneView->setTemplateSource($templateSource);
    $content = $standaloneView->render();
    https://api.typo3.org/typo3cms/8/html/class_t_y_p_o3_1_1_c_m_s_1_1_fluid_1_1_view_1_1_standalone_view.html


    WEB CSS JS 
     
    object-fit for IE11 (07.02.2019)
    Da der IE11 nicht so viel kann, ist es mit dem Snippet möglich ein object-fit zu simulieren.
    --------------
    HTML
    --------------
    
    <div class="object-fit">
    	<img class="backgroundSwap" src="yourimage" width="no-matter" height="no-matter" alt="no-matter">
    </div>
    
    
    --------------
    SCSS
    --------------
    
    detect {
      display: none;
    }
    @supports (object-fit: cover) {
      detect {
        display: block;
      }
    }
    .object-fit {
      width: 300px;
      height: 300px;
      display: inline-block;
      margin: 1%;
      border: 1px solid #000;
      position: relative;
      overflow: hidden;
    }
    .object-fit img {
      position: absolute;
      top: 50%;
      left: 50%;
      height: auto;
      width: auto;
      min-width: 100%;
      min-height: 100%;
      transform: translate(-50%, -50%);
    }
    @supports (object-fit: cover) {
      .object-fit img {
        position: static;
        height: 100%;
        width: 100%;
        transform: none;
        object-fit: cover;
      }
    }
    /* this class added by js */
    img.modifiedImg {
      background-repeat: none;
      background-position: 50% 50%;
      background-size: cover;
      position: static;
      height: 100%;
      width: 100%;
      transform: none;
    }
    
    --------------
    JS
    --------------
    
    (function(d) {
      "use strict";
      var notSupported = false;
      function detect() {
        var newEl = document.createElement("detect");
        document.body.appendChild(newEl);
        if (getComputedStyle(newEl).getPropertyValue("display") === "none") {
          notSupported = true;
        }
        //newEl.remove(); not supported in IE11
        // Create Element.remove() function if not exist
        if (!("remove" in Element.prototype)) {
          Element.prototype.remove = function() {
            if (this.parentNode) {
              this.parentNode.removeChild(this);
            }
          };
        }
        // Call remove()
        newEl.remove();
      }
      detect();
    
      if (notSupported) {
        if ("querySelector" in document && "addEventListener" in window) {
          var theImages = d.querySelectorAll(".backgroundSwap");
          for (var i = 0, len = theImages.length; i < len; i++) {
            var imageUrl = theImages[i].src;
            theImages[i].src =
              "data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7";
            theImages[i].classList.add("modifiedImg");
            theImages[i].style.backgroundImage = "url(" + imageUrl + ")";
          }
        }
      }
    })(document);
    
    


     
    Fix for "object-fit" in ie11 (07.02.2019)



    TYPO3 FLUID 
     
    TYPO3 Übersetzungen mit Fluid HTML Tags und Platzhalter (04.02.2019)
    Mit Fluid geht alles, wenn man weiß wie es geht:
    Mit CDATA in der Übersetzungsdatei XLF werden HTML Tag wie usw. nicht herausgeparst.
    Damit das dann aber angezeigt wird muss der Fluid-Translate-Tag noch mit dem Format-Raw-Tag ummantelt werden.
    <f:format.raw><f:translate key="result_foundforsearch_documents" arguments="{0: '{hits}'}" /></f:format.raw>
    
    <!-- .xlf -->
    <trans-unit id="result_foundforsearch_document">
    	<source><![CDATA[<strong>%s document</strong> is found for your search]]></source>
    	<target><![CDATA[Zu Ihrer Suche konnte <strong>%s Dokument</strong> gefunden werden.]]></target>
    </trans-unit>
    


    INTERN 
     
    Ordneretiketten Buchhaltung (04.02.2019)
    Bank (Jahreszahl)
    Kasse (Jahreszahl)
    Kreditoren I (Jahreszahl)
    Kreditoren II (Jahreszahl)
    Kreditoren III (Jahreszahl)
    Debitoren I (Jahreszahl)
    Debitoren II (Jahreszahl)
    Debitoren III (Jahreszahl)


    SERVER 
     
    per Shell Verzeichnisgröße bestimmen, Verzeichnisse löschen, Dateien löschen (29.01.2019)

    
    //
    // Verzeichnisse löschen
    //
    find /home/web8/html/accounts/wiltmann/log/ -name "2017-12*" -exec rm -r {} \;
    
    // Beispiel
    find -type d -name a -exec rmdir {} \;
    
    
    
    
    
    //
    // Dateien löschen
    //
    
    // testing (ohne löschen) - älter als 200 Tage
    find /home/web8/html/accounts/awigo/cache/ -mtime +200 -type f
    
    // löschen
    find /home/web8/html/accounts/awigo/cache/ -mtime +200 -type f -delete
    
    // Beispiele
    find . -name "*.bak" -type f
    find ./my_dir -mtime +10 -type f -delete
    
    
    //
    // Größe von Verzeichnis per Shell
    //
    du -a -h --max-depth=1 | sort -hr


     
    Language Code in HTML (09.01.2019)
    Findet man hier:
    https://www.w3schools.com/tags/ref_country_codes.asp
    und
    https://www.w3schools.com/tags/ref_language_codes.asp

    Achtung, die sind nicht immer gleich z.B. en-GB oder cs-CZ oder sv-SE
    https://www.w3schools.com/tags/ref_country_codes.asp


     
    Sprache in TYPO3 (09.01.2019)
    Um mehrsprachige Seiten in TYPO3 anzeigen zu lassen, muss man einiges konfigurieren:
    In der "fileadmin > templates > global > ts > system > config.ts" muss man das wie folgt anpassen.

    Hinwies: Die Seite muss natürlich auch in der entsprechenden Seite übersetzt sein, sonst wird die Standardsprache aus als ID verwendet!

    Beim Übersezuungswizard wird der "Ursprungstext" nicht gesetzt, das muss man dann im Element noch mal manuell machen.
    //"fileadmin > templates > global > ts > system > config.ts
    [globalVar = GP:L = 1]
      config.sys_language_uid = 1
      config.language = en
      config.htmlTag_langKey = en
      config.locale_all = en_GB
      plugin.tx_indexedsearch._DEFAULT_PI_VARS.lang = 1
      config.defaultGetVars.L  = 1
      config.htmlTag_setParams = xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-GB"
    [global]


     
    Sicherheit (09.01.2019)
    https://karriere.piepenbrock.de/site/suchergebnis/&search=clickhere%22onfocus=prompt%28/OPENBUGBOUNTY/%29+autofocus=x+bad=--%3E%3C/title%3E%3C/script%3E%3Cimg+src=x+onerror=prompt%28/OPENBUGBOUNTY/%29%3E&abschicken.x=0&abschicken.y=0
    https://karriere.piepenbrock.de/site/suchergebnis/&search=clickhere%22onfocus=prompt%28/OPENBUGBOUNTY/%29+autofocus=x+bad=--%3E%3C/title%3E%3C/script%3E%3Cimg+src=x+onerror=prompt%28/OPENBUGBOUNTY/%29%3E&abschicken.x=0&abschicken.y=0
    https://karriere.piepenbrock.de/site/suchergebnis/&search=clickhere%22onfocus=prompt%28/OPENBUGBOUNTY/%29+autofocus=x+bad=--%3E%3C/title%3E%3C/script%3E%3Cimg+src=x+onerror=prompt%28/OPENBUGBOUNTY/%29%3E&abschicken.x=0&abschicken.y=0


    TYPO3 
     
    Cron-Job Mailversand (08.01.2019)
    Falls per Cron-Job Mails versendet werden sollen und es zu diesem Typo3 Error kommt: PHP Warning: proc_open() has been disabled for security reason
    Als Cron-Job Befehl: /home/web1/htdocs/osmo_typo3/cronjob.sh
    Anschließend im cronjob.sh:
    #!/bin/bash
    /usr/local/php7.0/bin/php -c /home/web1/conf/php-7.0/php.ini -f /home/web1/htdocs/osmo_typo3/typo3/sysext/core/bin/typo3 scheduler:run


    APP 
     
    iOS:Welche Auswirkungen hat ein Revoke eines Distribution Certificate (07.01.2019)
    Revoke eines Distribution Certificate für AppStore Apps ist unkritisch.
    Bei Revoke eines Distribution Certificate für Business Apps sind alle installierten Apps dann nicht mehr lauffähig!!!


    SWIFT XCODE 
     
    SourceSansPro Schrift funktioniert in Swift/XCode UIWebView nicht (10.12.2018)
    Wenn eine Schrift in einer UIWebView nicht funktioniert, dann ist die CSS-Zuweisung nicht korrekt.
    Es muss der richtige Family-Name angegeben und der richte font-weight definiert sein.
    font-family: "Source Sans Pro", SourceSansPro-Light, Arial, Arial, Helvetica, sans-serif;
        font-size: 12px;
        color: #999999;
        font-weight:300;


     
    Apple Mail zeigt den Inhalt einer E-Mail nicht (mehr) an (05.12.2018)
    Manchmal zeigt Apple Mail den Inhalt einer E-Mail nicht mehr an.
    Dann am besten direkt im Mail-Verzeichnis von Mail suchen.
    Dazu ins Verzeichnis "Nutzername > Library > Mail" wechseln und dort eine Suche starten. Das Suchergebnis besteht leider nur aus dem Absender-Namen, aber immerhin. Die gesuchte E-Mail markieren & kopieren & in ein neues Verzeichnis einfügen. Diese kopierten E-Mails können in Mail geöffnet und angesehen und gedruckt werden.
    Umständlich, aber es scheint zu funktionieren.


     
    Mac OS X - Versteckte Dateien anzeigen! (22.11.2018)
    Mit CMD + SHIFT + . kann man versteckte Dateien anzeigen lassen.


     
    goliath Cookie Hinweis (17.11.2018)
    Ab goliath 4.1 kann ein Cookie Hinweis automatisch eingeblendet werden. Unter „Module einstellen“ im Reiter „Inhalte“ kann man verschiedene Optionen einstellen. Natürlich nicht alle, die ein PM will ;-)
    Dann muss man sein eigenes Script einbinden. Dazu kann natürlich der Standard als Grundlage dienen.
    Ergänzung: Wenn man nur den Text ändern möchte benötigt die Text eine LID (SprachID) zu begin. z. B. "1:Das ist mein deutscher Hinweis"


    TYPO3 
     
    TYPO3 Querybuilder: Ausgabe des generierten SQL-Statements (15.11.2018)
    Wie alles in TYPO3 etwas kompliziert.
    Aber man kommt dran.
    debug($queryBuilder->getSql());
    debug($queryBuilder->getParameters());


    TYPO3 
     
    TYPO3 Objekt will nicht updaten ( in Datenbank speichern ) (15.11.2018)
    Wenn man auf ein Repository ein update() ausführt, sollte eigentlich der Datenbankeintrag aktualisiert werden.
    In TYPO3 ist das natürlich nicht immer so ;-)
    Deshalb einfach danach den Vorschlaghammer rausholen und persistAll() aufrufen
    # Den Vorschlaghammer instanzieren / aus der Kiste kramen
    $persistenceManager = $this->objectManager->get("TYPO3\\CMS\\Extbase\\Persistence\\Generic\\PersistenceManager");
    
    # Mit dem Vorschlaghammer in die Datenbank speichern / Nägel mit Köpfen machen
    $persistenceManager->persistAll();
    https://blog.teamgeist-medien.de/2014/09/extbase-repository-update-persistiert-nicht-nimm-den-vorschlaghammer.html


    CACHE 
     
    Löschen des Symfony-Caches in Produktiv-Umgebung (06.11.2018)
    Damit der Cache für eine Symfony-Seite, die auf die Produktiv-Umgebung umgestellt wurde, gelöscht wird, muss der folgende Befehl über die Console ausgeführt werden:
    php bin/console cache:clear --env=prod --no-debug
    https://symfony.com/doc/current/deployment.html


    TYPO3 4T3 
     
    4T3 Sections (05.11.2018)
    Beispielvorlage für 4T3 Sections
    // ========= LIST TEMPLATE ID 27 =========
    <list classkey="section_elements" template_id="28" flexfield="data_slide" />
    
    // ==== Easy Admin ====
    section_start|Carousel|Slide|data_slide
    //data_headline|Headline|textfield|1
    //data_text|Text|editor
    //data_buttontext|Buttontext|input
    //data_link|Verlinkung|sourcelink
    //data_picture|Abbildung|sourcelink
    section_end
    
    
    // ======== ELEMENT TEMPLATE ID 28 ========
    <div class="item">
      <div class="col-md-5 col-sm-5 col-xs-12 fright">
        <img src="###element_data_picture###" alt="###element_data_headline###" />
      </div>
      <div class="col-md-7 col-sm-7 col-xs-12">
        <h3>###element_data_headline###</h3>
        ###element_data_text###<br clear="both" />
        <a class="button col-md-6 col-sm-12 col-xs-12" href="###element_data_link###" style="padding-top: 8px;" {f:if(condition: '###element_data_link_target### != \'\'', then: 'target=\'###element_data_link_target###\'')}>###element_data_buttontext###</a>
      </div>
    </div>


    PHP TYPO3 CODE EID 
     
    eID-Skript einbinden (05.11.2018)
    Aufruf: domain.tld/index.php?eID=###eID-Schlüssel###&L=###language_id###
    Parameter: &gpgroupkey[test]=1&gpgroupkey[test2]=2
    //typo3conf/AdditionalConfiguration.php
    $GLOBALS['TYPO3_CONF_VARS']['FE']['eID_include']['###eID-Schlüssel###'] = 'typo3conf/scripts/php/w/e/Skript.php';
    
    
    //typo3conf/scripts/php/w/e/Skript.php
    namespace CYBOB\PackageName\CategoryName;
    
    class SkriptEidBootstrap {
    
    	private $gpVars;
    	protected $objectManager;
    
    	const GP_GROUP_PARAMS = 'gpgroupkey';
    
    	public function __construct() {
    		$feUserObj = \TYPO3\CMS\Frontend\Utility\EidUtility::initFeUser();
    		$pid = (\TYPO3\CMS\Core\Utility\GeneralUtility::_GET('id') ? \TYPO3\CMS\Core\Utility\GeneralUtility::_GET('id') : 1);
    		$GLOBALS['TSFE'] = \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance('TYPO3\CMS\Frontend\Controller\TypoScriptFrontendController', NULL, $pid, 0, TRUE);
    		$GLOBALS['TSFE']->connectToDB();
    		$GLOBALS['TSFE']->fe_user = $feUserObj;
    		$GLOBALS['TSFE']->id = $pid;
    		$GLOBALS['TSFE']->determineId();
    
    		$GLOBALS['TSFE']->initTemplate();
    		$GLOBALS['TSFE']->getConfigArray();
    
    		\TYPO3\CMS\Frontend\Utility\EidUtility::initLanguage();
    		$GLOBALS['TSFE']->settingLanguage();
    		$GLOBALS['TSFE']->settingLocale();
    
    		$GLOBALS['TSFE']->set_no_cache();
    		$GLOBALS['TSFE']->cObj = \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance('TYPO3\CMS\Frontend\ContentObject\ContentObjectRenderer');
    
    			//wird fuer BE Funktionalitaeten benoetigt, beinhaltet auch den aktuell eingeloggten BE User
    		$GLOBALS['BE_USER'] = \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance('TYPO3\CMS\Core\Authentication\BackendUserAuthentication');
    		$GLOBALS['BE_USER']->start();
    
    		$this->objectManager = GeneralUtility::makeInstance('TYPO3\\CMS\\Extbase\\Object\\ObjectManager');
    
    		$this->gpVars = GeneralUtility::_GP(self::GP_GROUP_PARAMS);
    	}
    
    
    	public function run() {
    		if(method_exists($this, $this->gpVars['method']) && $this->gpVars['method'] != 'run'){
    			header('Content-Type: application/json');
    			echo json_encode($this->{$this->gpVars['method']}());
    		}
    	}
    }
    
    $eID = GeneralUtility::makeInstance('CYBOB\PackageName\CategoryName\Skript');
    $eID->run();
    


     
    test (02.11.2018)



    TYPO3 
     
    Domain Multilanguage (01.11.2018)



     
    a (21.09.2018)

    <structure>
    	<!-- MARK: DASHBOARD -->
    	<element>
    		<id><![CDATA[main2]]></id>
    		<type><![CDATA[configuration_main]]></type>
    		<name><![CDATA[Start]]></name>
    		<header_title><![CDATA[Main]]></header_title>
    		<nextviewtype><![CDATA[PrivateBrowserStartView]]></nextviewtype>
    		<tabbar_icon><![CDATA[home]]></tabbar_icon>
    		<picture><![CDATA[so_background.png]]></picture>
    	</element>
    
    
    	<element>
    		<id><![CDATA[wiki_main]]></id>
    		<parent_id><![CDATA[main]]></parent_id>
    		<name><![CDATA[Wiki-Bereich]]></name>
    		<type><![CDATA[button1]]></type>
    		<header_title><![CDATA[Wiki]]></header_title>
    		<nextviewtype><![CDATA[CBListView]]></nextviewtype>
    	</element>
    
         <element>
         <id><![CDATA[wiki_main]]></id>
         <parent_id><![CDATA[main]]></parent_id>
         <name><![CDATA[Browser]]></name>
         <type><![CDATA[button2]]></type>
         <header_title><![CDATA[Wiki]]></header_title>
         <nextviewtype><![CDATA[PrivateBrowserView]]></nextviewtype>
         </element>
    
         <element>
         <id><![CDATA[wiki_main]]></id>
         <parent_id><![CDATA[main]]></parent_id>
         <name><![CDATA[Projekte]]></name>
         <type><![CDATA[button3]]></type>
         <header_title><![CDATA[Project]]></header_title>
         <nextviewtype><![CDATA[PrivateProjectView]]></nextviewtype>
         </element>
    
    </structure>
    


     
    DEMO js (21.09.2018)
    ein JS Beispiel
    $('[data-role="popover"]').popover();
    
    


    WEB 
     
    DEMO html (21.09.2018)

    <script>
    $('[data-role="popover"]').popover();
    
    </script>
    
    pre[class*="language-"] {
    	background: #F3F3F3;
    	font-size: 12px;
    }
    
    <div class="navbar navbar-default navbar-fixed-top" role="navigation">
    		<div class="navbar-inner">
    			<div class="container-fluid">
    


     
    DEMO css (21.09.2018)
    Ein CSS Beispiel
    pre[class*="language-"] {
    	background: #F3F3F3;
    	font-size: 12px;
    }
    


    WEB APP 
     
    DEMO php (21.09.2018)
    Ein PHP Beispiel
    <?php
    echo "Hello World!";
    // oder so
    // oder so nicht
    
    echo "yepp";
    ?>
    
    
    http://www.cybob.com