Category Archives: Webentwicklung

MySQL: Insert or Update?

Oft weiß man nicht, ob es einen Datensatz bereits gibt, wenn man ihn einfügen möchte. Sollte er  schon vorhanden sein, dann man möchte ihn updaten. Gerade in einer Multiuser-Umgebung ist das aber krititsch, weil der Client nicht wissen kann ob mittlerweile der Datensatz angelegt wurde.

MySQL erlaubt einem mit einem Befehl das Problem zu lösen:

INSERT INTO MyTable (id,a,b) VALUES (1,'description',17)
  ON DUPLICATE KEY UPDATE a='description',b=17;

Cheers
Ralf

Typo3: PHP Error „Allowed memory size exhausted“

Wenn man eine speicherintensive Extension verwendet, kann obige Fehlermeldung kommen. Grund ist, dass Typo3 (oder generell PHP) mit einer maximaler Speichergrenze ausgestattet ist, um dem Server vor einem schadhaften Skript zu schützen. Anderenfalls könnte es passieren, dass der Server an Speicherknappheit leidet.

Man kann diese Grenze etwas erhöhen, sollte dies aber immer mit Verstand machen, weil eben dieser Schutz dadurch reduziert wird.

Man kann diese Grenze beeinflussen indem man folgende Zeile in /typoconf/localconf.php einfügt:

$TYPO3_CONF_VARS['SYS']['setMemoryLimit'] = '64';

Die Grenze wird in MB angegeben.

Cheers,
Ralf

Typo3: Extensions sollen kein JQuery nachladen

Wenn man z.B. im Typo-Skript selbst eine neue JQuery-Version laden möchte, dann will man vermeiden, dass eine Extension eine ältere Version von JQuery nachlädt. Man kann in fast allen Extensions das Laden von JQuery beeinflussen.

Bei „IndexedSearch_Autocomplete“ geht das beispielsweise im Konstanteneditor des Root-Templates (Links im Baum erst Templates, dann  die Startseite auswählen und in der Auswahlbox den „Constant Editor“ auswählen):

Konstanteneditor

Bei dieser Extension heißt der Parameter: „Set to true if jQuery is loaded outside of this extension (page global)“. Einfach auf true stellen und die Extension verwendet die neuere JQuery-Version. Man muss natürlich testen, ob die Extension mit dem neueren Framework noch ordentlich zusammenspielt.

Cheers,
Ralf

 

XTC: Transparente Artikelbilder

XTC kann automatisch Vorschaubilder der Artikelbilder erstellen. Diese Bilder werden automatisch mit der PHP-Datei „image_manipulator_GD2.php“ erstellt. Leider kann die Klasse in xt:Commerce v3.0.4 SP2.1 keine Transparenz in den Bilder erzeugen.

Ich habe via Google eine sehr gute Version der Klasse entdeckt, die mit Transparenzen arbeiten kann:
http://vamensvn.googlecode.com/svn/trunk/admin/includes/classes/image_manipulator_GD2.php
Da die Varante für „VaM Shop“ entwickelt wurde, müsste man Zeile 23 entfernen, um es in Gambio oder „normalen“ XTC einzusetzen:

defined( '_VALID_VAM' ) or die( 'Direct Access to this location is not 
allowed.' );

Cheers,
Ralf

HTML: CSS Einführung (Teil 1)

CSS in HTML verwenden

Will man in HTML Dateien CSS-Definitionen einsetzen, muss man in der HTML-Datei nur zwei Schritte durchführen:

1. Schritt
Im <Head> der HTML-Seite werden die verwendeten CSS-Datei(en) verlinken:

<link rel="stylesheet" type="text/css" href="theme1.css" media="all"/>

2. Schritt
Elemente entweder mit:

id=“NameDesElements“

oder

class=“Klassenname1 Klassenname2 Klassenname3 …“

bezeichnen.

IDs sollten immer innerhalb einer Seite (bzw. eines Form-Tags) eindeutig sein.

Da die Klassen mit Leerzeichen getrennt werden, darf kein Leerzeichen im Klassennamen sein.

 

CSS Grundlagen

Kommentare

/* 
Alles innerhalb von Slash-Stern und Stern-Slash wird ignoriert. 
Hier kann man also Bemerkungen eintragen, 
die vom Browser ignoriert werden... 
*/

Elemente via Tagtypen ansprechen

a {
   font-size : 12px;
}

/* alle <a> Tags haben eine 12er Schriftgröße */

Elemente via ID ansprechen

#NameDesElements {
   font-size : 15px;
}

/* 
CSS-Definitionen für einzelne Elemente mit Nummernzeichen.
Nur das Element mit id="NameDesElements" bekommt eine 15er Schriftgröße 
*/

Elemente via Class ansprechen

.Klasse1 {
   background-color : red;
}
.Klasse2 {
   color : black;
}

/* CSS-Definitionen für Klassen mit Punkt */

 

CSS Kombinationen

a.Klasse1{
/*
  alle Elemente, die <a> UND Klasse1 sind 
*/
}

div.Klasse1.Klasse2{
/*
  alle Elemente, die <div> UND Klasse1 UND Klasse2 sind 
*/
}
.Klasse1.Klasse2{
/*
  alle Elemente, die Klasse1 UND Klasse2 sind 
*/
}

#ID1, #ID2, #ID3{
/*
Aufzählung: Betrifft sowohl ID1, ID2 und ID3
*/
}

 

CSS Pfade (Child Selektors)

Man kann in CSS bestimmte Elemente ansprechen, die in einer bestimmten hierarchischen Struktur vorliegen. Das ist nötig, um z.B. Links innerhalb des Content-Bereichs ein anderes Aussehen zu verleihen als im Footer-Bereich. Auch beim Design eines Multilevel-Popup-Menüs wird diese Vorgehensweise verwendet.

HTML:

<body>
  <div id="oma">
    <div id="block1" class="block">ABCD</div>
    <div id="mutter">
      <div id="block2" class="block">EFGH</div>
    </div>
  </div>
  <div id="block3" class="block">IJKL</div>
</body>

CSS:

#oma .block{
  font-size : 17px;
} /* Das selektiert block1 und block2 */

Hier ist das Leerzeichen zwischen #mutter und .block wichtig! Es bedeutet, dass wir Kinder und Kindeskinder vom Element mit der ID=“oma“ ansprechen. In diesem Fall: alle Element mit class=“block“, d.h. „block1“ und „block2“. Das Element mit ID=“block3″ wird nicht beeinflusst, da es nicht innerhalb von „oma“ sitzt.

Würde man das Leerzeichen vergessen, hätte die CSS-Definition nur Einfluss auf ein Element  mit id=“oma“ und class=“block“. Das haben wir in diesem Beispiel nicht.

CSS:

#oma > .block{
  font-size : 17px;
} /* Das selektiert nur block1 */

Hier ist das Größerzeichen zwischen #mutter und .block wichtig! Es bedeutet, dass wir nur Kinder vom Element mit der ID=“mutter“ ansprechen. In diesem Fall: direktes Kind mit class=“block“, d.h. „block1“. Die Elemente mit id=“block2″ und id=“block3″werden nicht beeinflusst, da sie nicht direkt innerhalb von „oma“ sitzen.

Teil 2

Jetzt fehlen noch CSS-Zustände (:hover, :link, :active, :focus, :visited), der Attribut- und der Sibling-Selektor. Das machen wir im zweiten Teil.

Cheers,
Ralf

Typo3: Ältere Version einer Extension installieren

Wenn man eine ältere Version einer Extension installieren muss, dann geht man im Extensionmanager (links unter Adminwerkzeuge–>Erweiterungen) auf „Import Extension“ (Erweiterung importieren). Dort sucht man zunächst über das Suchfeld die Extension.

Wenn man jetzt nicht auf das erste Symbol mit dem orangenen Pfeil klickt, sondern auf den Titel der Extension, dann kommt man zu einem Dialog, der die Version auswählen lässt.

Hier ein englischer Artikel, der mir dabei geholfen hat:
http://sankartypo3.wordpress.com/2012/05/19/how-to-get-the-old-version-of-a-typo3-extension/

Cheers,
Ralf

XTC: Nervige Abfrage entfernen

Es gibt im Backend an vielen Stellen unnötigerweise eine Sicherheitsabfrage „Änderungen speichern?“. Dazu muss man im „admin“-Ordner einfach nach „return confirm“ suchen. Dort findet man solche Vorkommnisse:

onClick="return confirm('<?php echo SAVE_ENTRY; ?>')"

Nach der Änderung sieht es so dann aus:

onClick=""

Das sollte man natürlich nicht überall machen. Manchmal sind solche Fallnetze auch nicht schlecht :-) Beim Anlegen von Kategorien (new_category.php) ist es jedenfalls unnötig nervig.

Cheers,
Ralf

Typo3: Große Bilder im Content einfügen

Gestern kam das Problem auf, dass eine Begrenzung im Rich-Text-Editor (RTE) von Typo3 das Einfügen größerer Bilder verweigerte. Diese Funktion ist durchaus sinnvoll, wenn man verhindern möchte, dass ein Redakteur das Layout zerschießt. In unserem Fall aber störend, wenn man weiß was man tut. Im Einfüge-Dialog steht unten:

Im „Normal“-Modus können nur Web-Grafikformate (JPG, GIF und PNG) bis zu einer Auflösung von 300×680 Pixeln verwendet werden. Dieser Modus ist zur Verwendung bereits für das Web optimierter Grafiken vorgesehen.

Um die Begrenzung aufzubohren, sollte man nach dieser Anleitung vorgehen:
http://blog.exites.de/2011/09/bildgrose-fur-eingefugte-bilder-uber-den-typo3-rte-htmlarea/ 

Wenn es nicht greift (was bei uns leider der Fall war), gibt es immer noch die Möglichkeit die „typical“-Einstellungen des RTE-Plugins zu verändern.

Dafür muss man in der Datei:

/typo3/sysext/rtehtmlarea/res/typical/pageTSConfig.txt

einfach in Zeile 231 (vor der Zeile mit der geschweiften Klammer) etwas hinzufügen. Original Block:

	buttons.bold.hotKey = b
	buttons.italic.hotKey = i
}

Nach der Änderung:

	buttons.italic.hotKey = i

	buttons.image.options.magic.maxWidth = 1000
	buttons.image.options.plain.maxWidth = 1000
}

Man könnte aber auch weniger faul sein und herausfinden, warum der Artikel bei einem nicht funktioniert :-)

Cheers,
Ralf

Report Viewer: Währungsausgabe mit FormatCurrency()

Bei der Währungsausgabe gibt es ein Problem über das vermutlich jeder, der Software für Unternehmen außerhalb von USA entwickelt, stößt.

In der Beschreibung von FormatCurrency z.B. im Expression-Dialog steht:

Returns an expression formatted as a currency value using the currency symbol defined in the system control panel. 

Das stimmt aber nicht! Einstellen kann man das Format in Eigenschaft Language des Report-Elements. Stellt man den Wert auf „de-DE“, dann sieht man auch Euro-Angaben mit Komma-Zahlen.

Cheers,
Ralf

Typo3: Backend HTML Editor „aufbohren“

Standardmäßig erlaubt der Texteditor im TYPO3-Backend keine Textfarbe zu ändern. Es gibt sehr viele Möglichkeiten die Konfiguration des Editors zu ändern, aber „wenn’s mal wieder schnell gehen soll“, dann kann man auch einfach die „typische“ Einstellung ändern. Dafür muss man in der Datei:

/typo3/sysext/rtehtmlarea/res/typical/pageTSConfig.txt

einfach die Zeile 118 (könnte sich bei einer späteren Installation verschieben) etwas hinzufügen.
Original Block:

showButtons (
 class, blockstylelabel, blockstyle, textstylelabel, textstyle,
 formatblock, bold, italic, subscript, superscript,
 ...

Nach der Änderung:

showButtons (
 class, blockstylelabel, blockstyle, textstylelabel, textstyle,
 formatblock, bold, italic, subscript, superscript,
 textcolor, bgcolor, fontsize,
 ...

Die deutlich elegantere Variante ist natürlich die Anpassung im TSConfig der Page. Meine Methode hat den Charme, dass man sich eine Standardinstallation mit seinen „typical“ Einstellungen machen kann.

Cheers,
Ralf