Startseite
  • » Home
  • » Handbuch & FAQ
  • » Forum
  • » Übersetzungsserver
  • » Suche
Startseite › Forum › Drupalcenter.de › Module › Modul-Entwicklung ›

[gelöst] Tabelle importiert (Latin1), gibt es da bessere Möglichkeiten?

Eingetragen von fh (153)
am 26.11.2009 - 08:42 Uhr in
  • Modul-Entwicklung
  • Drupal 6.x

Hallo zusammen,

ich habe an dieser Stelle eine Frage, zum Import von einer Tabelle die auch noch im charset ISO-8859-1 vorliegt. Gibt es eine Möglichkeit diese Tabelle mit diesem charset sauber zu importieren, oder wäre meine Lösung auch einigermassen in Ordnung??

Das meiste habe ich auch richtig hinbekommen. So kann ich z.B. die Rechte setzen, was auch gut funktioniert. Da es sich nur um eine Ausgabe einer Tabelle handelt (mit Wahlmöglichkeit einzelner Einträge), brauche ich nur den Zugriff für das "View"-Recht.

Wie ich das nun nachgelesen habe, auch hier im Forum keine passenden Antworten fand, dachte ich dass ich vielleicht eine Erklärung bekommen könnte.

Gibt es hier einfachere, bzw. sichere/bessere Lösungen, als den Code den ich hier erstellt habe? Wegen dem Charset kann ich die Tabelle nicht einfach importieren, es geht in der zweiten Tabelle dann um fast 1MB nur Text...

Vielen Dank für die Hilfe

fh

(Es handelt sich hier um ein kleines CSS-Manual mit 73 Einträgen, das PHP-Manual besteht aus fast 400 Einträgen mit jeweils etwa 1500 Zeichen...)

Meine cssmanual.install Datei, um das Schema bekannt zu machen und zur Deinstallation:

<?php

/**
* Implementation of hook_install()
*/
function cssmanual_install() {
 
drupal_install_schema('cssmanual');
}

/**
* Implementation of hook_uninstall()
*/
function cssmanual_uninstall() {
 
drupal_uninstall_schema('cssmanual');
}

/**
* implementation of hook_schema()
*/
function cssmanual_schema() {
 
$schema['cssman'] = array(
   
'description' => t('TODO: please describe this table!'),
   
'fields' => array(
     
'id' => array(
       
'description' => t('TODO: please describe this field!'),
       
'type' => 'serial',
       
'unsigned' => TRUE,
       
'not null' => TRUE,
      ),
     
'titel' => array(
       
'description' => t('TODO: please describe this field!'),
       
'type' => 'varchar',
       
'length' => '200',
       
'not null' => TRUE,
       
'default' => '',
      ),
     
'beschreibung' => array(
       
'description' => t('TODO: please describe this field!'),
       
'type' => 'text',
       
'not null' => TRUE,
      ),
     
'beschreibung2' => array(
       
'description' => t('TODO: please describe this field!'),
       
'type' => 'text',
       
'not null' => FALSE,
      ),
     
'spez1' => array(
       
'description' => t('TODO: please describe this field!'),
       
'type' => 'text',
       
'not null' => FALSE,
      ),
     
'autor' => array(
       
'description' => t('TODO: please describe this field!'),
       
'type' => 'varchar',
       
'length' => '50',
       
'not null' => TRUE,
       
'default' => '',
      ),
     
'datum' => array(
       
'description' => t('TODO: please describe this field!'),
       
'type' => 'varchar',
       
'length' => '10',
       
'not null' => TRUE,
       
'default' => '00.00.0000',
      ),
    ),
   
'primary key' => array('id'),
  );
  return
$schema;
}


?>

Und hier die Moduldatei cssmanual.module:

<?php
// $Id$

/**
* @file
* Wir brauchen einen Menüpunkt für unsere Datenbankausgabe des CSS-Mauals
*/

/**
* Implementation of hook_perm()
*/
function cssmanual_perm() {
  return array('view cssmanual');
}

/**
* Implementation of hook_access()
*/
function cssmanual_access($op) {
  return user_access('view cssmanual');
}

/**
* Implementation of hook_init()
*/
function cssmanual_init() {
  drupal_add_css(drupal_get_path('module', 'cssmanual') . '/css/cssmanual.css');
}


/**
* Implementation of hook_menu()
*/
function cssmanual_menu() {
  $items['cssmanual'] = array(
    'title' => 'Ubersicht aller CSS Formatanweisungen!',
    'page callback' => 'cssmanual_dist',
    'access callback' => 'user_access',
    'access arguments' => array('view cssmanual'),
    'type' => MENU_NORMAL_ITEM,
  );
  $items['article'] = array(
    'title' => 'Aktueller Eintrag!',
    'page callback' => 'cssmanual_art',
    'access callback' => 'user_access',
    'access arguments' => array('view cssmanual'),
    'type' => MENU_CALLBACK,
  );
  return $items;
}

/**
* callback function cssmanual_distribute()
*/
function cssmanual_dist() {
  $sql = "SELECT * from {cssman} s ORDER BY s.titel ASC";
  $count = db_result(db_query("SELECT COUNT(id) from {cssman}"));
    $mylist = "<h3>Vorhandene Eintr&auml;ge: $count</h3><br />";
  $result = db_query($sql);
  while ($data = db_fetch_object($result)) {
    $titel = $data->titel;
    $id = $data->id;
    $mylist .= '<h4><a class="cssmanual" href="' . $base_path . 'article/?id=' . $id . '" title="Link zum Eintrag">' . $titel . '</a>';
  };
  return $mylist;
}


/**
* callback function cssmanual_article()
*/
function cssmanual_art() {
  $id = intval(trim(htmlentities($_GET['id'])));

    if  (count($id) < 6) {
      $lang = strlen($id);
      if  ($lang == 1) {
        $id = "00000$id";
      } else if ($lang == 2) {
        $id = "0000$id";
      } else if ($lang == 3) {
        $id = "000$id";
      } else {
        echo "</body></html>";
        exit("Abbruch des Skriptes, es wurde ein Fehler erzeugt.");
      }
    } else {
      // muss nicht ausgeführt werden $id ist schon $id.
    }
   
  $result = db_query("SELECT * from {cssman} WHERE id = %d", $id);
  $data = db_fetch_object($result);
    $mylist = "<h3 id='arttitel'>$data->titel</h3>";
    $mylist .= "<p id='beschreibung'>$data->beschreibung</p>";
    $mylist .= "<pre id='cssdaten'>$data->beschreibung2</pre>";
    $mylist .= "<p>$data->spez1</p>";
    $mylist .= '<a id="retour" href="javascript:history.back()">Zur Liste</a>';

  return $mylist;
}

‹ Wie nennt man .......??? Template im Modul verwenden ›
  • Anmelden oder Registrieren um Kommentare zu schreiben

latin1 -> utf8

Eingetragen von stBorchert (6003)
am 26.11.2009 - 10:01 Uhr

fh schrieb
ich habe an dieser Stelle eine Frage, zum Import von einer Tabelle die auch noch im charset ISO-8859-1 vorliegt. Gibt es eine Möglichkeit diese Tabelle mit diesem charset sauber zu importieren?

Du kannst die Daten mittels iconv nach UTF-8 konvertieren und dann importieren.

iconv -f iso-8859-1 -t utf8 dump_iso88591.sql > dump_utf8.sql

Alternativ kannst Du auch die in diesem Artikel beschriebene Lösung verwenden.

Mal noch ein paar kleine Hinweise zum Code:

<?php
function cssmanual_schema() {
 
$schema['cssman'] = array(
     
'titel' => array(
       
// ...
     
),
     
'beschreibung' => array(
       
// ...
     
),
    ),
}
?>

Standardsprache in Drupal ist Englisch (oben zitierter Code ist nur ein Beispiel; das bezieht sich auf sämtliche Texte Deines Moduls). Ich weiss, Du hast das Modul nur für Deine Zwecke entwickelt, jedoch macht es Sinn, von vornherein die Standards und auch die Coding standards zu befolgen. So muss man sich später nicht extra umgewöhnen, falls man doch mal etwas für Andere schreibt.

<?php
function cssmanual_access($op) {
  return
user_access('view cssmanual');
}
?>

hook_access implementierst Du nur, wenn Du den Zugriff auf einen im Modul definierten Inhaltstypen regeln möchtest.
Da Du keinen Inhaltstypen definierst, kannst Du diese Funktion auch getrost weglassen.

<?php
function cssmanual_init() {
 
drupal_add_css(drupal_get_path('module', 'cssmanual') . '/css/cssmanual.css');
}
?>

Das würde ich nicht im hook_init hinzufügen, sondern ein der Funktion die die entsprechende Seite erstellt (also cssman_dist und cssman_art). Ansonsten wird die CSS auf jeder Seite Deiner Installation geladen (auch wenn sie eigentlich gar nicht benötigt wird).

<?php
/**
* callback function cssmanual_distribute()
*/
function cssmanual_dist() {
 
// ...
 
$mylist = "<h3>Vorhandene Eintr&auml;ge: $count</h3><br />";
 
// ...
}
?>

HTML-Quelltext direkt in einem Modul ist nicht wirklich schön. Schau Dir mal Creating Drupal 6.x modules und dort insbesondere Using the theme layer an.
Dort ist erklärt, wie Du theme-Funktionen definierst und verwendest. Das erleichtert Dir (nicht sofort, jedoch später mal) Deine Arbeit. Speziell, wenn Du irgendwann man ein anderes Theme verwendest und die Ergebnisse dort anders darstellen möchtest.

<?php
function cssmanual_art() {
 
$id = intval(trim(htmlentities($_GET['id'])));
?>

Verwende besser filter_xss_admin und is_numeric.

hth,

 Stefan

--
Sei nett zu Deinem Themer!

  • Anmelden oder Registrieren um Kommentare zu schreiben

Danke für die Antwort

Eingetragen von fh (153)
am 26.11.2009 - 10:40 Uhr

Hallo Stefan,

Danke vielmals für die Lösung. Das meiste leuchtet mir ein was du sagst, aber das mit den Rechten kann ich nicht nachvollziehen.
Auch wenn ich hier keinen Inhaltstypen habe, kann ich trotzdem das Recht "view ..." vergeben, d.h. wenn ich es z.B. dem nicht angemeldeten Nutzer entziehe, so wird auch nichts ausgegeben. Wahrscheinlich habe ich das falsch verstanden und jetzt wird einfach die ganze Ausgabe (also das Modul) unterdrückt?!? In der Rechtetabelle geht das jedenfalls klaglos.

Das mit der CSS-Datei Einbindung verschiebe ich in die callback-Funktionen, da hast du völlig recht.

Das mit dem HTML ist wirklich nicht optimal, deshalb auch meine Nachfrage hier. Ich hätte gerne alles Drupal konform gemacht, da muss ich mal deine Links durchlesen...

So wie ich das jetzt verstanden habe gibt es zwei Möglichkeiten.

1. Entweder ich gebe die Daten wie gehabt aus und verbessere noch was ich verbessern kann.
2. Oder ich mache einen Import und wandle die Tabellen um. Da stellt sich mir die Frage, ob ich dann nicht Probleme mit den und Ausgaben bekomme, da sind auch Einrückungen und im PHP-Manual viele Codebeispiele drin.

Du hast mir jedenfalls sehr viel weiter geholfen. Vor allem für die Zeit die du für die Antwort brauchtest, bedanke ich mich nochmal :-)

Gruss

Fredi

P.S. bei den Komentaren und der Variablenbenennung in englisch muss ich mehr acht geben. Dann halt in english und mit der t()-Funktion...wo es um Ausgaben geht.

  • Anmelden oder Registrieren um Kommentare zu schreiben

Erklärung

Eingetragen von stBorchert (6003)
am 26.11.2009 - 10:50 Uhr
fh schrieb

Auch wenn ich hier keinen Inhaltstypen habe, kann ich trotzdem das Recht "view ..." vergeben,

Ja. Das machst Du jedoch über hook_perm, nicht über hook_access.

fh schrieb

2. Oder ich mache einen Import und wandle die Tabellen um. Da stellt sich mir die Frage, ob ich dann nicht Probleme mit den und Ausgaben bekomme, da sind auch Einrückungen und im PHP-Manual viele Codebeispiele drin.

Musst Du einfach mal probieren. Eigentlich sollte es dabei keine Probleme geben.

 Stefan

--
Sei nett zu Deinem Themer!

  • Anmelden oder Registrieren um Kommentare zu schreiben

Hallo

Eingetragen von fh (153)
am 26.11.2009 - 12:06 Uhr

Hallo Stefan,

Dankeschön,
wieder was gelernt

Gruss

Fredi

EDIT/Info: das mit dem hook_theme() muss ich noch nachlesen, habe ja das Entwicklerhandbuch extra mal angeschafft. Hoffe dass ich das richtig verstanden habe:
ein hook_theme() angeben und dann die richtige *.tpl.php Datei bearbeiten. Alle anderen Sachen die du sagtest, konnte ich auch schon anpassen (hook_access wegnehmen usw.)
Also muss ich "nur" auf die richtige Bereitstellung aller Daten achten. Das Theming selber ist dann wieder leichter für mich.

Den Rest habe ich jetzt geändert, die Texte sind alle in t()-Funktionen und über "Oberfläche übersetzen" dann in Deutsch angepasst. Kommentare auch in englisch und das HTML sollte ich dann in der tpl.php einpflegen können ...

  • Anmelden oder Registrieren um Kommentare zu schreiben

meine Lösung

Eingetragen von fh (153)
am 27.11.2009 - 19:55 Uhr

Hallo,

ich wollte hier noch den jetzigen Code veröffentlichen. Für falsche englische Sätze übernehme ich keine Verantwortung - leider. :-)
Das mit den Templates konnte ich schliesslich (nach langer Suche) doch noch zufriedenstellend lösen. Da ich keine Nodes zur Verfügung hatte, bot Drupal mir zwei page-example.tpl.php Dateien an, also für jeden Callback eine.

Das Problem war ja, dass ich ohne Import Der Beiträge die Datensätze nicht als Node behandeln konnte. Also fehlte mir auch jede Möglichkeit für ein theme(...) und auch den hook_theme() brachte ich nicht zum laufen.
Die Anmeldung des Moduls, hat mir dann wenigstens die Ausgabe über genannte page... Template Dateien ermöglicht.

Ein etwas "komisches" Modul, aber ich brauchte hier auch nicht mehr Anforderungen, weil die Tabelle nur für die Ausgabe gedacht ist und war.

Die Tipps haben mir immens geholfen und ich konnte einiges beherzigen. Mein nächstes Modul wird dann auch Operationen und "theme()" beinhalten... (Gästebuch?!).

Gruss

<?php
// $Id$

/**
* @file
* We need a menupoint for the CSS-manual list
*/

/**
* Implementation of hook_node_info()
*/
function cssmanual_node_info() {
  return array(
    cssmanual => array(
      'name' => t('CSS-manual'),
      'module' => 'cssmanual',
      'description' => t('this Node-type can not have new Articles.'),
      'has_title' => FALSE,
      'has_body' => FALSE,
      'locked' => TRUE,
    )
  );
}

/**
* Implementation of hook_perm()
*/
function cssmanual_perm() {
  return array('view cssmanual');
}

/**
* Implementation of hook_menu()
*/
function cssmanual_menu() {
  $items['cssmanual'] = array(
    'title' => t('All CSS entries!'),
    'page callback' => 'cssmanual_dist',
    'access callback' => 'user_access',
    'access arguments' => array('view cssmanual'),
    'type' => MENU_NORMAL_ITEM,
  );
  $items['article'] = array(
    'title' => t('Current entry!'),
    'page callback' => 'cssmanual_art',
    'access callback' => 'user_access',
    'access arguments' => array('view cssmanual'),
    'type' => MENU_CALLBACK,
  );
  return $items;
}

/**
* callback function cssmanual_distribute()
*/
function cssmanual_dist() {
  drupal_add_css(drupal_get_path('module', 'cssmanual') . '/css/cssmanual.css');
  $sql = "SELECT * from {cssman} s ORDER BY s.titel ASC";
  $count = db_result(db_query("SELECT COUNT(id) from {cssman}"));
  $output['allart'] = t("All articles") . ' ' . $count;
  $result = db_query($sql);
  $a = 1;
  while ($data = db_fetch_object($result)) {
    $output['titel'][$a] = $data->titel;
    $output['myid'][$a] = $data->id;
    $output['basepath'][$a] = $base_path;
    $a++;
  };
  return $output;
}


/**
* callback function cssmanual_article()
*/
function cssmanual_art() {
  drupal_add_css(drupal_get_path('module', 'cssmanual') . '/css/cssmanual.css');
  $id = $_GET['id'];
  if (filter_xss($id) && is_numeric($id)) {
    // validation is ok.
  } else if (!filter_xss($id) || !is_numeric($id)) {
    // validation is not ok.
    return t('Error in GET');
  }
  $result = db_query("SELECT * from {cssman} WHERE id = %d", $id);
  $data = db_fetch_object($result);
    $output['myid'] = $data->titel;
    $output['descr'] = $data->beschreibung;
    $output['descr2'] = $data->beschreibung2;
    $output['spez1'] = $data->spez1;
  return $output;
}

  • Anmelden oder Registrieren um Kommentare zu schreiben

Benutzeranmeldung

  • Registrieren
  • Neues Passwort anfordern

Aktive Forenthemen

  • für drupal11 ein Slider Modul
  • [gelöst] W3CSS Paragraphs Views
  • Drupal 11 neu aufsetzen und Bereiche aus 10 importieren
  • Wie erlaubt man neuen Benutzern auf die Resetseite zugreifen zu dürfen.
  • [gelöst] Anzeigeformat Text mit Bild in einem Artikel, Drupal 11
  • Social Media Buttons um Insteragram erweitern
  • Nach Installation der neuesten D10-Version kein Zugriff auf Website
  • Composer nach Umzug
  • [gelöst] Taxonomie Begriffe zeigt nicht alle Nodes an
  • Drupal 11 + Experience Builder (Canvas) + Layout Builder
  • Welche KI verwendet ihr?
  • Update Manger läst sich nicht Installieren
Weiter

Neue Kommentare

  • melde mich mal wieder, da ich
    vor 2 Wochen 1 Tag
  • Hey danke
    vor 2 Wochen 2 Tagen
  • Update: jetzt gibt's ein
    vor 2 Wochen 2 Tagen
  • Hallo, im Prinzip habe ich
    vor 3 Wochen 7 Stunden
  • Da scheint die Terminologie
    vor 3 Wochen 10 Stunden
  • Kannst doch auch alles direkt
    vor 3 Wochen 4 Tagen
  • In der entsprechenden View
    vor 3 Wochen 4 Tagen
  • Dazu müsstest Du vermutlich
    vor 3 Wochen 4 Tagen
  • gelöst
    vor 6 Wochen 1 Tag
  • Ja natürlich. Dass ist etwas,
    vor 6 Wochen 2 Tagen

Statistik

Beiträge im Forum: 250233
Registrierte User: 20452

Neue User:

  • ByteScrapers
  • Mroppoofpaync
  • 4aficiona2

» Alle User anzeigen

User nach Punkten sortiert:
wla9461
stBorchert6003
quiptime4972
Tobias Bähr4019
bv3924
ronald3857
md3717
Thoor3678
Alexander Langer3416
Exterior2903
» User nach Punkten
Zur Zeit sind 0 User und 27 Gäste online.

Hauptmenü

  • » Home
  • » Handbuch & FAQ
  • » Forum
  • » Übersetzungsserver
  • » Suche

Quicklinks I

  • Infos
  • Drupal Showcase
  • Installation
  • Update
  • Forum
  • Team
  • Verhaltensregeln

Quicklinks II

  • Drupal Jobs
  • FAQ
  • Drupal-Kochbuch
  • Best Practice - Drupal Sites - Guidelines
  • Drupal How To's

Quicklinks III

  • Tipps & Tricks
  • Drupal Theme System
  • Theme Handbuch
  • Leitfaden zur Entwicklung von Modulen

RSS & Twitter

  • Drupal Planet deutsch
  • RSS Feed News
  • RSS Feed Planet
  • Twitter Drupalcenter
Drupalcenter Team | Impressum & Datenschutz | Kontakt
Angetrieben von Drupal | Drupal is a registered trademark of Dries Buytaert.
Drupal Initiative - Drupal Association