CMS-Jack
Blog
Blog - 
Jürgen Furrer

Wer hat sich als erfahrener Typo3-Entwickler/Redakteur nicht schon über die Tooltips aufgeregt, die nach 200ms in den Fordergrund treten und direkt unter der Maus erscheinen, just wenn man Klcken will?

Früher konnten diese mittels PageTS entfernt werden, leider kann das in den neusten Versionen von Typo3 nicht mehr gemacht werden, da diese Option aus dem Backend entfernt wurde.

Nach einiger Suche im Code, habe ich eine Möglichkeit entdeckt, mit der man diese Hilfen trotzdem entfernen kann.

1. Klasse anlegen

Im fileadmin wird die Datei class.user_removehelp.php angelegt mit folgendem Inhalt:

<?php
class user_removehelp
{
    function init() {
        $GLOBALS['TCA_DESCR'] = array();
    }
}

2. Hook in der localconf registrieren

Damit diese Methode auch zur richtigen Zeit ausgeführt wird, muss folgender HOOK in der Datei typo3conf/localconf.php eingefügt werden:

$TYPO3_CONF_VARS['SC_OPTIONS']['t3lib/class.t3lib_befunc.php']['postProcessValue']['local'] = 'fileadmin/class.user_removehelp.php:user_removehelp->init';

 

Leider werden nun die Hilfen für alle Benutzer deaktiviert.

Man könnte aber ein Plugin erstellen, mit dem man das dann mittels PageTS / UserTS steuern könnte.

Aufrufe:941
Jürgen Furrer

Man sieht den Unterschied zwar nicht, aber ich habe nun t3blog abgeschworen und benutze den seit kurzem im TER befindlchen typo3_blog.

Das Konzept ist einfach:
Mit Typo3-Boardmitteln einen Blog erstellen.

Alle anderen Blogs verwenden eigene Datentypen um eine Seite aufzubauen was die Programmierung und die Wartung der Erweiterung recht schwierig und aufwendig macht.


Vorteile durch Pages

Da ein Blog-Beitrag eine normale Typo3-Seite ist, kann man damit ganz tolle Dinge machen:

  1. Seiten verlinken (man kann im RTE einfach einen Link auf einen Blog-Beitrag setzen)
  2. Man kann ein eigenes Menü mit TS erstellen in denen bestimmte Blogseiten angezeigt werden
  3. Jeden Content-Typen im Beitrag kann verwendet werden (auch Plugins)
  4. Benötigt kein Backend-Modul zur Bearbeitung
  5. Preview eines Blogs der noch in Bearbeitung ist

und vieles mehr

So macht Bloggen unter Typo3 spass!

Aufrufe:726
Jürgen Furrer

Zum Highlighten von Source-Code verwendete ich bis Dato das beautyofcode Plugin und war bis anhin sehr zufrieden.

Als ich jedoch angefangen habe zu Blogen, hatte ich damit mehr und mehr Aufwand, da gerade für Linux-Beitrage sehr viele einzeiler eingesetzt werden mussten.

Das ergab dann beim schreiben immer einen Baustein Text, einen Baustein beautyofcode, ein Baustein Text usw.

Das zweite Problem ist, dass die Brushes (Source-Code Type, z.B.: Php, Bash, Sql etc.) via Javascript nachgelden werden, das gibt einen unschönen Effekt, da es sehr lange dauert, bis das jQuery-Plugin den Code umwandelt.

Also suchte ich einen Weg, das anders einzubinden:

1. JS erstellen

Man ladet sich das Plugin beautyofcode herunter (installiert werden muss es nicht)

Man erstellt nun eine neue Datei im fileadmin z.B.:

fileadmin/syntaxhighlighter/jquery.beautyofcode.min.js

In diese Datei müssen nun in der richtigen Reihenfolge die Dateien Minimiert kopiert werden:

EXT:beautyofcode/res/jquery/jquery.beautyOfCode.js
EXT:beautyofcode/res/syntax_highlighter/v2/src/shCore.js
EXT:beautyofcode/res/syntax_highlighter/v2/src/shLegacy.js

Dann alle verwendeten Brushes, hier einige Beispiele:

EXT:beautyofcode/res/syntax_highlighter/v2/scripts/shBrushBash.js
EXT:beautyofcode/res/syntax_highlighter/v2/scripts/shBrushCss.js
...

Um das script zu minimieren, verwende ich jscompress.com, einfach das zu minimierende File im Editor öffnen, den Inhalt kopieren und im Textfeld von jscompress.com einfügen. Dann den Knopf "COMPRESS JAVASCRIPT" betätigen und den minimierten Code in die neue Datei einfügen.

Die Datei die daraus entsteht sieht dann etwa so aus:
jquery.beautyOfCode.js

2. Dateien in den fileadmin kopieren

Für das richtige funktionieren von beautyofcode benötigt man noch einige CSS Dateien, diese befinden sich ebenfalls im beautyofcode EXT-Ordner.

Wir kopieren also den gesamten Inhalt von

EXT:beautyofcode/res/syntax_highlighter/v2/styles

In den Ordner

filadmin/syntaxhighlighter/styles

3. Dateien einbinden

Die Dateien können nun im TS-Setup eingebunden werden

Das JS:

page.includeJS {
  beautyofcode1 = fileadmin/syntaxhighlighter/jquery.beautyOfCode.js
}

Die CSS-Dateien:

page.includeCSS {
  beautyofcode1 = fileadmin/syntaxhighlighter/styles/shCore.css
  beautyofcode1.media = all
  beautyofcode2 = fileadmin/syntaxhighlighter/styles/shThemeDefault.css
  beautyofcode2.media = all
}

4. Javascript ausgeben

Das Javascript geben wir immer aus, wenn kein Source-Code vorhanden ist, dann wird nichts umgewandelt...

page.headerData {
  502 = TEXT
  502 {
    value (
/*<![CDATA[*/
<!--
jQuery(document).ready(function(){
  jQuery.beautyOfCode.init({
    autoLoad: false,
    baseUrl: "fileadmin/syntaxhighlighter/",
    scripts: "scripts/",
    styles: "styles/",
    theme: "Default",
    defaults: {"tab-size": 4,"gutter": 1,"collapse": 0,"wrap-lines": 1,"toolbar": 1},
    brushes: ["Plain","Xml","JScript","CSharp","Plain","Php","Typoscript"]
  });
});
// -->
/*]]>*/
)
    wrap = <script type="text/javascript">|</script>
  }
}

5. RTE konfigurieren

Jetzt kommt der RTE dran um die Magie zu verwenden habe ich mich an ein Script von Michiel Roos gehalten, er hat das "RTE-Feature" bereits in Forge vorgeschlagen, leider wurde es bis Dato nicht umgesetzt.

Wir erstellen zuerst eine neue PHP-Datei:

fileadmin/class.user_rtecodehighlighter.php

Mit folgendem Inhalt:

<?php
/***************************************************************
 *  Copyright notice
 *
 *  (c) 2010 Michiel Roos <extenstions@typofree.org>
 *  All rights reserved
 *
 *  This script is part of the TYPO3 project. The TYPO3 project is
 *  free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation; either version 2 of the License, or
 *  (at your option) any later version.
 *
 *  The GNU General Public License can be found at
 *  http://www.gnu.org/copyleft/gpl.html.
 *
 *  This script is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
 *  GNU General Public License for more details.
 *
 *  This copyright notice MUST APPEAR in all copies of the script!
 ***************************************************************/

/**
 * RTE code highlighter
 *
 * @package TYPO3
 * @subpackage rtecodehighlighter
 * @version $Id:$
 * @license http://opensource.org/licenses/gpl-license.php GNU Public License, version 2
 */
class user_rtecodehighlighter
{
    function highlight($content, $conf) {
        // some configuration is taken from attributes of the tag
        $parameters = $this->cObj->parameters;
        $class = ($parameters['class']) ? 'class="' . $parameters['class'] . '"' : '';
        $content = preg_replace('#<br />#', '&#x000A;', $content);
        $result = '<pre ' . $class . '>' . $content . '</pre>';
        return $this->cObj->stdWrap($result, $this->conf['stdWrap.']);
    }
}
?>

Auf der root-Page muss folgendes Script in die Page-Config:

RTE.default {
  disableEnterParagraphs = 1
  userElements.10 = Syntax Highlighting tags
  userElements.10 {
    6 = Bash Code
    6.description = Code-Tag Bash
    6.mode = wrap
    6.content = <pre class="code"><code class="bash">|</code></pre>

    7 = C# Code
    7.description = Code-Tag C#
    7.mode = wrap
    7.content = <pre class="code"><code class="csharp">|</code></pre>

    8 = CSS Code
    8.description = Code-Tag CSS
    8.mode = wrap
    8.content = <pre class="code"><code class="css">|</code></pre>

    9 = JavaScript Code
    9.description = Code-Tag JavaScript
    9.mode = wrap
    9.content = <pre class="code"><code class="js">|</code></pre>

    10 = PHP Code
    10.description = Code-Tag PHP
    10.mode = wrap
    10.content = <pre class="code"><code class="php">|</code></pre>

    11 = Plain Code
    11.description = Code-Tag Plain
    11.mode = wrap
    11.content = <pre class="code"><code class="plain">|</code></pre>

    12 = SQL Code
    12.description = Code-Tag SQL
    12.mode = wrap
    12.content = <pre class="code"><code class="sql">|</code></pre>

    13 = TypoScript Code
    13.description = Code-Tag TypoScript
    13.mode = wrap
    13.content = <pre class="code"><code class="ts">|</code></pre>

    14 = XML Code
    14.description = Code-Tag XML
    14.mode = wrap
    14.content = <pre class="code"><code class="xml">|</code></pre>
  }
}
RTE.default {
  showButtons := addToList(user)
  removeTags := removeFromList(user)
  proc.HTMLparser_rte.allowTags < RTE.default.proc.allowTags
  proc.HTMLparser_db.allowTags < RTE.default.proc.allowTags
  proc.entryHTMLparser_db.allowTags < RTE.default.proc.allowTags
}

Und im Template muss folgende parseFunc_RTE eingefügt werden:

includeLibs.rtecodehighlighter = fileadmin/class.user_rtecodehighlighter.php
lib.parseFunc_RTE {
  tags {
    pre = TEXT
    pre {
      current = 1
      postUserFunc = user_rtecodehighlighter->highlight
    }
  }
}

6. Das i-Tüpfelchen

Nun kann man im RTE mit dem userfunction-Button den Selektierten Text in den benötigten Markup umwandeln:

<pre class="code"><code class="...">Selektierter Text</code></pre>

Man sieht aber im Backen nicht wirklich, welcher Text nun ein Code darstellt.

Also heben wir diesen Text etwas hervor, indem wir ein eigenes CSS im Backend für den RTE einbinden.

Wir kopieren den Inhalt des Ordners

typo3/typo3/sysext/rtehtmlarea/res/contentcss

in den Ordner

fileadmin/contentcss

Wir erweitern das neue CSS mit folgender CSS-Rule:

/* Code */
pre.code {
    margin-left: 20px;
    padding: 5px;
    border: 1px solid #ddd;
    background: #eee;
    color: blue;
}

Nun muss unser neues CSS nur noch in den RTE eingebunden werden. Also wieder die root-Page bearbeiten und im page-Setup folgendes eintragen:

RTE.default {
  contentCSS = fileadmin/contentcss/default.css
}

Ab jetzt sollte dem fröhlichen Inline-Syntax-Highlighten nichts mehr im Wege stehen...

Ergebnis

Aufrufe:673
Jürgen Furrer

Da mein Server unter SuExec läuft, werden CGI-Scripts nur ausgefährt, wenn diese unterhalb des Webverzeichnis liegen.

Leider werden bei einer normalen Installation von Nagios die CGI-Scripte aber im Ordner /usr/ abgelegt und somit können diese nicht von Apache ausgeführt werden (HTTP 500)

Damit Nagios auch in so einer Umgebung läuft, muss Nagios selbst konfiguriert werden.

Zuerst müssen die plugins installiert werden, diese können getrost von der distribution installiert werden:

apt-get install nagios-plugins

Danach muss Nagios herunter gelden und entpackt werden:

mkdir /root/download
cd /root/download
wget http://prdownloads.sourceforge.net/sourceforge/nagios/nagios-3.3.1.tar.gz
tar xvfz nagios-3.3.1.tar.gz

Als nächstes muss ein vhost angelegt werden mit dem Benutzer "nagios". Danach kann Nagios konfiguriert werden und die Installation vorgenommen werden:

cd /root/download/nagios
./configure --prefix=/var/www/nagios/libs/nagios --with-cgiurl=/nagios/cgi-bin --with-nagios-user=nagios --with-nagios-grp=nagios
sed -i 's:for file in includes/rss/\*;:for file in includes/rss/\*.\*;:g' ./html/Makefile
sed -i 's:for file in includes/rss/extlib/\*;:for file in includes/rss/extlib/\*.\*;:g' ./html/Makefile
make all
make install
make install-init
make install-config
make install-commandmode
make install-webconf

Jetzt müssen die Rechte angepasst werden, da wir die Installation mit dem Benutzer root gemacht haben:

chown -R nagios:nagios /var/www/nagios/libs
find /var/www/nagios/libs -type d -exec chmod 750 {} +
find /var/www/nagios/libs -type f -exec chmod 640 {} +
chmod 700 /var/www/nagios/libs/nagios/sbin/*
chmod 700 /var/www/nagios/libs/nagios/bin/*

Und zu guter Letzt müssen die Verknüpfungen erstellt werden:

cd /var/www/nagios/htdocs/public/
ln -s ../../libs/nagios/share/ nagios
rmdir /var/www/nagios/libs/nagios/libexec
ln -s /usr/lib/nagios/plugins/ libexec

Nun bleibt nichts mehr zu tun, als Nagios zu konfigurieren und Nagios neu zu starten:

/etc/init.d/nagios restart
Aufrufe:810
Jürgen Furrer

Neu läuft meine Webseite auf einem vServer bei Hetzner, um meinen Apache einzurichten, habe ich mich an den Beitrag von debianroot.de gehalten.

  1. Apache2 Worker mit PHP und fcgid (FastCGI) SuExec auf Debian Lenny
  2. Benchmark Apache2 mit PHP via mod_fcgid und SuExec

Dabei habe ich im laufe der Zeit einige Verbesserungen vorgenommen

Bei der Ordner-Struktur habe ich zusätzlich folgende Ordner angelegt:

mkdir -p /var/www/vh-example/libs
mkdir -p /var/www/vh-example/htdocs/data

In der vhost Datei wird fcgi.conf nicht mehr geladen da es bereits durch den Apache global geladen wird und einige Einstellungen kann man sowiso nicht im vhost vornehmen.

Zusätzlich musste DirectoryMatch verwendet werden, da der Apache auch im Libs-Ordner arbeiten muss.

<VirtualHost *:80>
    ServerName example.de
    ServerAdmin admin@example.de

    DocumentRoot /var/www/vh-example/htdocs/public
    SuexecUserGroup vh-example vh-example

    <DirectoryMatch (/var/www/vh-example/htdocs|/var/www/vh-example/libs)>
        FCGIWrapper /var/www/vh-example/conf/fcgid .php
        <FilesMatch \.php$>
            SetHandler fcgid-script
        </FilesMatch>
        Options +ExecCGI -Indexes
        Order allow,deny
        allow from all
        AllowOverride All
    </DirectoryMatch>

    LogLevel warn
    ErrorLog /var/www/vh-example/logs/error_log
    CustomLog "| /usr/sbin/rotatelogs /var/www/vh-example/logs/access_log.%Y.%m.%d 86400" combined
</VirtualHost>

Die fcgi Datei habe ich noch etwas erweitert (zwecks Benchmark-Optimierung)

#!/bin/sh
export PHPRC="/var/www/vida-aktiv/conf/"
PHP_FCGI_MAX_REQUESTS=10000
export PHP_FCGI_MAX_REQUESTS
exec /usr/bin/php5-cgi

Die Datei /etc/apache2/mods-available/fcgid.conf wurde mit folgendem Inhalt versehen (für den Benchmar

<IfModule mod_fcgid.c>
  AddHandler    fcgid-script .fcgi
  FcgidConnectTimeout 20
  FcgidMaxRequestLen 52428800
  SpawnScoreUpLimit 150
  SpawnScore 1
  TerminationScore 1
  MaxProcessCount 500
  MaxRequestsPerProcess 10000
</IfModule>
Aufrufe:760