Drupal
-
Drupal: CSS Aggregation im Private Mode
Verfasst von jan am Mo, 12/13/2010 - 15:10Hat man keine Kapazitätsprobleme, kann man mit diesem Kleinen Modul die CSS optimieren, vereinigen und Cachen. Leider ist dies ansonsten in Drupal 6 Core nicht möglich. Ich weiss, der Cache braucht relativ viel Platz in der DB, aber dies ist in meinem Fall kein Problem. Das Modul erstellt für jede Seite, welche eine andere CSS Dateien Konstellation hat, ein eigener Cache-Eintrag. Die Geschwindigkeit zum Laden der Seite ist bei mir extrem gestiegen (> 33%). Anregungen bitte im Kommentar posten!
- // die Folgenden Konstanten anpassen
- function minicss_menu() {
- 'title' => 'minicss css',
- 'page callback' => 'minicss_minify',
- 'access callback' => true,
- 'type' => MENU_CALLBACK,
- );
- return $items;
- }
- /**
- * Implementation of hook_preprocess_page()
- */
- function minicss_preprocess_page(&$variables) {
- $variables['styles'] = '<link type="text/css" '.
- 'rel="stylesheet" media="all" '.
- 'href="/minicss/css/'.
- }
- }
- function minicss_minify($files,$type) {
- // The Checksum identifies the unique css-File-Package
- // Recive Cached CSS-Package
- $cache = cache_get('minicss_'.$checksum);
- // If Package does not exist, create it and output
- if (!$cache) {
- $output = '';
- foreach ($files as $file) {
- // remove comments
- //$content = str_replace("\t", ' ', $content); // Removing Tabs somehow creates problems...
- // Remove special chars
- // urls sind relativ zum CSS file und müssen dementsprechend relativ zum miniCSS angepasst werden
- $output .= $content;
- }
- // Write new created Package into Cache for next time
- if (MINICSSCACHE) cache_set('minicss_'.$checksum,$output);
- print $output;
- }
- else {
- // If Cache-package already exists, output cache, also add Information about version
- $output = '/* Retrieved from Cache; Version: '.date('Y.m.d H:i',$cache->created).' */'."\n\n".$cache->data;
- print($output);
- }
- }
Evtl. muss man in der Datenbank Tabelle "System" das Modul-weight noch an den Schluss setzen.
-
Apache/PHP: Sendmail funktioniert nicht
Verfasst von jan am Sa, 11/20/2010 - 16:36Wenn man auf Debian LAMP selber installiert, dann habe ich bemerkt, dass Email in PHP versenden nicht automatisch funktioniert. Zuerst sollte man nicht vergessen, in der php.ini den Pfad zu sendmail anzugeben. Doch das alleine funktioniert noch nicht, da sendmail so eingestellt ist, dass es nur Server intern Mails versenden kann. Sämtliche Mails nach aussen werden geblockt. Mit folgendem Befehl kann man diese Einstellung ändern:
dpkg-reconfigure exim4-config
Man kommt in ein Konfigurationsmenü. Hier wählt man die Option "internet site; mail is sent and received directly using SMTP" und schaltet damit "local delivery only; not on a network" aus. Die weiteren Einträgen kann man lassen, bei mir habe ich noch jeweils den Host geändert. Sonst habe ich nichts verändert. Nun funktioniert der Email Versand von Drupal wieder ordentlich!
-
Subdomain weiterleiten mit Conf bzw. htaccess
Verfasst von jan am Fr, 11/19/2010 - 17:23Weiterleitung einer Subdomain auf die Hauptdomain kann man direkt über das conf-File bzw über eine .htaccess Datei. Das geht folgendermassen:
# Allen Traffic der supbdomain www.example.com und xyz.example.com weiterleiten nach example.com
RewriteEngine on
RewriteCond %{HTTP_HOST} ^www\.example\.com$ [NC,OR]
RewriteCond %{HTTP_HOST} ^xyz\.example\.com$ [NC]
RewriteRule ^(.*)$ http://example.com$1 [R=301]Kann man vor allem brauchen, wenn man zwar verschiedene Subdomain anbieten möchte, jedoch nur eine Domain "promoten" möchte. Bei uns war es so, dass wir früher die Drupal Seite über eine Subdomain erreichten, jetzt direkt über die Domain. Die Leute sollen immer noch über die Subdomain draufkommen. Eine Zeit lang benutzten wir einfach einen ServerAlias. Die birgt jedoch gefahren, zB wenn man auf der Seite absolute Verweise hat. So werden nun per sofort alle Subdomain anfragen weitergeleitet.
subdomain2domain, www2domain, www2root
-
Drupal: vCard Export
Verfasst von jan am Mi, 10/06/2010 - 21:26Ich weiss, es gäbe ein Modul um Drupal Kontakte als vCard zu exportieren. Für diese einfache Aufgabe war mir dieses aber einfach viel zu schwerlastig. Also habe ich wieder einmal selber Hand angelegt und der Grössenunterschied des Modules ist beachtlich (ca 1:100!), ist nicht auf die Externe PEAR Lib angewiesen und kann mit Umlauten umgehen. vCard mit Umlauten war unter anderem der Grund, wie ich überhaupt dazu kam, es selber zu machen. Hier mein mini-Modul:
- function uvcard_menu() {
- 'title' => t('vcard'),
- 'type' => MENU_CALLBACK,
- 'page callback' => 'uvcard_fetch',
- );
- return $items;
- }
- /**
- * VCard for direct download
- */
- function uvcard_fetch($uid) {
- $dev = false;
- $eol = "\r\n";
- $vcard = 'BEGIN:VCARD'.$eol.'VERSION:2.1'.$eol;
- $vcard .= 'N:'.$u->profile_nachname.';'.$u->profile_vorname.';;;'.$eol;
- $vcard .= 'FN;CHARSET=ISO-8859-8:'.$u->profile_vorname.' '.$u->profile_nachname.$eol;
- $vcard .= 'TEL;PREF;WORK;VOICE;:'.$u->profile_telefon.$eol;
- $vcard .= 'TEL;WORK;CELL;:'.$u->profile_telefon.$eol;
- $vcard .= 'TEL;WORK;FAX;:'.$u->profile_fax.$eol;
- $vcard .= 'EMAIL;INTERNET:'.$u->mail.$eol;
- $vcard .= 'ADR;DOM;WORK:;;'.$u->profile_strasse.';'.$u->profile_ort.';;'.$u->profile_plz.';'.$eol;
- $vcard .= 'END:VCARD';
- // Set headers
- print $vcard;
- exit;
- }
Wenn man die Variable $def nach true umstellt, bekommt man die erzeugte vCard ausgeprintet und zusätzlich das gesamte Benutzerprofil, dmait man sich die oberen Zeilen gemäss seinen eigenen Wünschen anpassen kann.
Die vCard Spezifikationen habe ich mir von http://en.wikipedia.org/wiki/VCard geholt.
Um die Seite aufzurufen, muss man dann nur noch irgendwo ein Link darauf machen (zB in einer View-Spalte). -
Drupal: Problem mit language files de_*.js
Verfasst von jan am Di, 09/14/2010 - 14:41Lange habe ich nach einer Lösung gesucht für das Problem mit dem Language js File im Private File Moduls von Drupal. Ich hatte immer wieder das Problem, dass Drupal ein Systempath zurückgab anstatt einer URL. Das sah etwa so aus:
http://var/www/vhosts/test.com/httpdocs/files/languages/de_56080f4d0d05e...
Patches und Extra-Module wie hier oder hier beschrieben haben nicht funktioniert.
Kurzerhand habe ich ein Hack gemacht, für alle die, welche mit der oben verlinkten Hilfe auch nicht weiterkommen:
1. modules/locale/locale.module in Funktion locale_update_js_files() $dir überschrieben mit $dir = 'sites/default/files/languages';
2. dann habe ich ein cron eingerichtet der einmal pro Stunde die js Datei in den Ordner kopiert:
25 * * * * cp /pfad/httpdocs/files/languages/*.js /pfad/httpdocs/sites/default/files/languages/
Der Hack funktioniert und die Seite wird nicht mehr durch das nicht-Aufinden der js Datei ausgebremst. -
Drupal: fid2nid, nid von fid
Verfasst von jan am Mo, 09/13/2010 - 13:25Für ein Modul musste ich aus einer fid die zugehörige nid herausfinden. Bis anhin habe ich noch keine Funktion in der API gefunden, welche dies erledigt. Hier mein Vorschlag:
- /**
- * Get's the $nid from a File of a CCK File-Field $fid
- */
- function fid2nid($fid) {
- // Get all the CCK-File-Fields
- $sql = "SELECT field_name FROM {content_node_field} WHERE type LIKE 'filefield';";
- $result = db_query($sql);
- while ($r = db_fetch_array($result)) {
- $fields[] = $r['field_name'];
- }
- $found = false;
- foreach ($fields as $field) {
- // Checks if the table exists
- $sql = "SHOW TABLES LIKE 'content_".$field."'";
- $result = db_query($sql);
- $i = false;
- while ($r = db_fetch_array($result)) { $i = true; }
- // If it does, see if fid is in this table
- if ($i) {
- $sql = "SELECT content_".$field.".nid FROM files
- LEFT JOIN content_".$field."
- ON (files.fid = content_".$field.".".$field."_fid)
- WHERE ".$field."_fid = '%d'";
- $result = db_query($sql, $fid);
- while ($r = db_fetch_array($result)) {
- $nid = $r['nid'];
- }
- }
- }
- return $nid;
- }
-
Eclipse vs. Netbeans für Drupal und PHP
Verfasst von jan am Mi, 08/25/2010 - 08:37Seit 2 Jahren benutze ich nun auch Eclipse zum entwickeln von Drupal Modulen in PHP. Richtig überzeugen konnte mich Eclipse jedoch nie. Ich fand das Programm einfach zu schwerlastig um PHP-Code damit zu erstellen. So habe ich nun seit einer Woche Netbeans im Einsatz. Der erste Eindruck scheint gelungen. Das ganze Programm kommt viel schlanker daher. Die Installation geht schnell und PHP kann man direkt als fertige Distribution herunterladen (ähnlich wie PHPEclipse).
Hier meine positiven Punkte:
- schneller Start des Programmes
- übersichtliche Oberfläche
- Projekt-Wizard sehr gut
- Projekte, welche auf einem entfernten Server getestet werden (via FTP) können als solche verknüpft werden, es ist also kein zusätzliches FTP Programm nötig
- bereits nach einem Tag kenne ich mehr Funktionen des Programmes als nach 2 Jahren Eclipse
- Plugin für Drupal
Negatives:- bisher noch nichts zu bemängeln
Achtung: Das Plugin für Drupal ist nicht aktuell. Auf der offiziellen Seite gibt es keine aktuelle Version. Ich habe aber für NetBeans 9.1 das Drupal Plugin hier gefunden -> http://hollyit.net/files/org-netbeans-modules-php-drupal-module.nbm . Es hat auch funktioniert. -
Drupal: XSend bzw mod_xsendfile auf Debian installieren
Verfasst von jan am Sa, 08/14/2010 - 13:00Für Apache gibt es ein super Modul, welches den Dateitransfer massiv verschnellert, bzw die Ladezeit bis zum Dateitransfer. Das Modul heisst mod_xsendfile. Ich hatte einige Probleme das Ding auf meinem Debian zum laufen zu bringen. So habe ich es gemacht:
- Wechseln zum Ordner für Apache Module (/usr/lib/apache2/modules; wenn anders dann kann man den modules Ordner suchen: find / -name 'modules')
- Source herunterladen mit Link (Link Datei; Link Seite)
- apxs2 -cia mod_xsendfile.c (Achtung, bei mir musste ich eine 2 an das apxs anhängen, ist nicht so auf Homepage beschrieben!)
- Bei mir kam dann am Schluss folgende Fehlermeldung:
-
- apxs:Error: Activation failed for custom /etc/apache2/httpd.conf file..
apxs:Error: At least one `LoadModule' directive already has to exist..
- apxs:Error: Activation failed for custom /etc/apache2/httpd.conf file..
- Lösen kann man das Problem mit folgendem Trick:
- nano /etc/apache2/httpd.conf
- Die folgenden zwei Zeilen untereinander eintragen
- #LoadModule directive to aid module installations
#LoadModule dummy_module /usr/lib/apache2/modules/mod_dummy.so - Wieder zumachen und speichern
- Apache neu starten (invoke-rc.d apache2 restart)
- Ich bin nicht ein Fan von Core-Patches, jedoch ziehe ich in diesem Fall ein solcher vor. Anstelle des xfile Modules von Drupal reicht es (für meinen Fall) in der includes/file.inc die Funktion file_transfer mit der Zeile "$headers[] = 'X-Sendfile: '.$source;" gerade nach dem ersten if {} Konstrukt einzufügen. Das Drupal modul xfiles ist so überflüssig.
function file_transfer($source, $headers) {if (ob_get_level()) {ob_end_clean();}$headers[] = 'X-Sendfile: '.$source;foreach ($headers as $header) {.. -
Drupal: PDF Vorschau als jpg, pdf2jpg, PDF Thumbnails
Verfasst von jan am Mo, 07/12/2010 - 14:39Immer schon wollte ich auf Webseiten pdf's als Bilder darstellen. Sinnvolle Hilfe dazu zu finden ist meiner Meinung nach eher schwierig. Für eine aktuelle Drupal-Installation wollte ich nun endlich mal einen Schritt weitergehen und meine Wünsche in etwas Handfestes umwandeln. Im Drupal CMS sollten sämtliche PDFs auch als jpg/png automatisch zur Verfügung stehen. Dazu habe ich ein neues Modul geschrieben, ich habs Preview genannt. Ich stellte mir vor, dass es in Zukunft verschiedene Dateitypen als Preview erstellen sollte, nicht nur PDFs. Zurzeit bin ich dran, das Modul so umzugestalten, damit ich es auf drupal.org contributen kann. Auf meiner vorhanden Drupalinstallation läuft es aber breits wie geschmiert. Ich werde bei Gelegnheit mehr Details dazu posten (wird auch vom Interesse von Euch abhängen...).Mein Fazit bis jetzt: Es ist alles was ich mir je gewünscht habe. Gerade grosse PDFs (bei uns handelt es sich um Baupläne, >90MB pro Seite) müssen so nicht heruntergeladen werden sondern werden innert Kürze in der "Vorschau" angezeigt.
screenshoots:
-
Drupal: Auf fremde/zweit Datenbank zugreifen
Verfasst von jan am Sa, 06/26/2010 - 12:38Problem: Auf der vorhanden Drupal Installation will ich auf Daten einer anderen Datenbank zugreifen. Drupal hat dafür bereits einen Weg vorgesehen. Dazu geht man in die sites/default/settings.php Datei. Folgende Zeile definiert die Standard Datenbank:
$db_url = 'mysql://drupal:drupal@localhost/drupal';
Wandelt man $db_url in ein Array um, kann man beliebig viele Datenbank definieren.:
$db_url['default'] ='mysql://drupal:drupal@localhost/drupal';
$db_url['mydb'] = 'mysql://user:pwd@localhost/anotherdb';
$db_url['db3'] ='mysql://user:pwd@localhost/yetanotherdb';Im Modul, wo man dann auf die Daten zugreifen will mach man das folderndermassen:
db_set_active('mydb');
db_query('SELECT * FROM table_in_anotherdb');
//...
db_set_active('default');Default ist die Standard-Datenbank. Sie ist erforderlich. In dieser Datenbank ist Drupal installiert. Man muss aufpassen, dass man nach dem Sprung in die andere Datenbank die default Datenbank wieder auf aktiv stellt.
Quelle: http://drupal.org/node/18429