[gelöst]Datenbankabfrage
am 24.02.2014 - 09:31 Uhr in
Hallo Community,
ich habe einen View mit mehreren "Exposed Filter". Die Filter beziehen sich auf "Field"-Daten und die "Numeric Fields" stelle ich mit dem jQuery Slider von BEF(Better Exposed Filters) dar. Aktuell muss ich dafür immer ein Minumun und Maximun angeben. Viel praktischer wäre es aber, dass die Min/Max automatisch aus der Datenbank abgerufen werden. Also dass immer der aktuell höchste Wert eines Feldes in der Datenbank das Maximun des Slider darstellt und analog für Min.
Wie ich aus diesem Issue erfahre, ist das auch möglich.
Nur leider fehlen mir die Programmierkenntnisse für eine Datenbankabfrage. Gibt es vielleicht ein Muster für eine solche DB-Abfrage?
VG Thomas
- Anmelden oder Registrieren um Kommentare zu schreiben
Angenommen, Du hast die
am 24.02.2014 - 12:52 Uhr
Angenommen, Du hast die latest dev release von BEF installiert, steht die dieser hook zur Verfügung.
Zur Integration steht dir deine template.php zur Seite.
Also site/all/themes/"dein Theme"/ tempalte.php öffnen. Copy-paste des angegebenen Codes aus deinem Verweis.
Dann noch anpassen der DB Tabellen. Dafür nimmst du dir das Devel Modul, schmeisst es an und suchst die entsprechenden Tabellen raus. Suche dafür die Felder, die hinten das bef_slider_min bzw bef_slider_max enthalten.
Kopiere diesen Pfad in die Vorgabe.
Ach so: da Du in views bist kannst Du Dir die Felder auch in der info anschauen, da wo gethemed wird.
Danach musst Du noch den cache clearen. Und dann kannst Du mal schauen...
Beim ersten Mal ist sowas schwierig, da wirst Du wohl ne Stunde brauchen. Nachher machst Du sowas in 20-30 Minuten.
Danke Dir für die Antwort.
am 24.02.2014 - 15:53 Uhr
Danke Dir für die Antwort. Schon mal gut zu wissen, dass ich das hinbekommen kann. Vielleicht kannst du mir noch mit zwei Fragen helfen, bevor ich mich da ran mache:
Copy-paste des angegebenen Codes aus deinem Verweis.
Ist es egal wo ich diesen Code in der template.php platziere? Z. B. einfach am Ende?
Dann noch anpassen der DB Tabellen. Dafür nimmst du dir das Devel Modul, schmeisst es an und suchst die entsprechenden Tabellen raus. Suche dafür die Felder, die hinten das bef_slider_min bzw bef_slider_max enthalten.
Kopiere diesen Pfad in die Vorgabe.
Ich kann mir den Code, wie er schlußendlich aussehen soll, nicht so richtig vorstellen. Kannst du mir hier vielleicht mit einem fiktiven Beispiel helfen? Ich denke, dann kann ich mich besser einarbeiten und weiß nach was ich in den Tabellen suchen muss.
Der Code kann am Ende der
am 24.02.2014 - 16:05 Uhr
Der Code kann am Ende der Datei stehen. Es handelt sich dabei allerdings um eine Funktion "hook_better_exposed_filters_settings_alter". Du mußt dann das Wort hook durch den system-internen Namen Deines Themes ersetzen. Sieh Dir an, wie die anderen fünktionen in dieser Datei heißen, dann siehst Du, was ich meine (z.B. meintheme_better_exposed_filters_settings_alter).
Alles klar, danke Werner. Ich
am 24.02.2014 - 16:33 Uhr
Alles klar, danke Werner. Ich denke das bekomme ich hin. Schwieriger wird's dann wohl mit der Anpassung der DB-Tabellen.
1. Zuerst suche ich (wie von maen beschrieben) die Felder, die hinten das bef_slider_min bzw bef_slider_max enthalten, in der "Info". Hier ist eine Info-Datei gemeint, oder?
2. Dann kopiere ich, wie beschrieben, den Pfad in die Vorgabe. Welche Vorgabe ist hier gemeint? Der Wert im Code hinter dem "="-Zeichen?
Sorry für meine offensichtliche Unwissenheit. Ich habe das vorher noch nie gemacht.
Hat mir vielleicht doch noch
am 26.02.2014 - 08:01 Uhr
Hat mir vielleicht doch noch jemand einen Rat zu den zwei Fragen?
Datenbankabfrage
am 05.05.2014 - 16:27 Uhr
Ich bin gerade dabei, die Datenbankabfrage wie oben beschrieben vorzunehmen. Das erste Problem habe ich allerdings schon beim Auffinden der template.php. Ich nutze ein Subtheme von Bartik. Gehe ich richtig in der Annahme, dass ich diese template.php unter C:\xampp\htdocs\drupal722\themes\bartik verwenden muss?
Oben wird beschrieben, dass ich das Wort "hook" ändern muss in den systeminternen Namen des Themes. Ich habe in der template.php unter dem angegebenen Pfad geschaut und nichts vergleichbares gefunden. Daher bin ich mir nicht sicher, ob ich die richtige template.php habe. Kann mir vielleicht jemand sagen, ob das die richtige ist? Der Inhalt der Datei ist wie folgt:
<?php
/**
* Add body classes if certain regions have content.
*/
function bartik_preprocess_html(&$variables) {
if (!empty($variables['page']['featured'])) {
$variables['classes_array'][] = 'featured';
}
if (!empty($variables['page']['triptych_first'])
|| !empty($variables['page']['triptych_middle'])
|| !empty($variables['page']['triptych_last'])) {
$variables['classes_array'][] = 'triptych';
}
if (!empty($variables['page']['footer_firstcolumn'])
|| !empty($variables['page']['footer_secondcolumn'])
|| !empty($variables['page']['footer_thirdcolumn'])
|| !empty($variables['page']['footer_fourthcolumn'])) {
$variables['classes_array'][] = 'footer-columns';
}
// Add conditional stylesheets for IE
drupal_add_css(path_to_theme() . '/css/ie.css', array('group' => CSS_THEME, 'browsers' => array('IE' => 'lte IE 7', '!IE' => FALSE), 'preprocess' => FALSE));
drupal_add_css(path_to_theme() . '/css/ie6.css', array('group' => CSS_THEME, 'browsers' => array('IE' => 'IE 6', '!IE' => FALSE), 'preprocess' => FALSE));
}
/**
* Override or insert variables into the page template for HTML output.
*/
function bartik_process_html(&$variables) {
// Hook into color.module.
if (module_exists('color')) {
_color_html_alter($variables);
}
}
/**
* Override or insert variables into the page template.
*/
function bartik_process_page(&$variables) {
// Hook into color.module.
if (module_exists('color')) {
_color_page_alter($variables);
}
// Always print the site name and slogan, but if they are toggled off, we'll
// just hide them visually.
$variables['hide_site_name'] = theme_get_setting('toggle_name') ? FALSE : TRUE;
$variables['hide_site_slogan'] = theme_get_setting('toggle_slogan') ? FALSE : TRUE;
if ($variables['hide_site_name']) {
// If toggle_name is FALSE, the site_name will be empty, so we rebuild it.
$variables['site_name'] = filter_xss_admin(variable_get('site_name', 'Drupal'));
}
if ($variables['hide_site_slogan']) {
// If toggle_site_slogan is FALSE, the site_slogan will be empty, so we rebuild it.
$variables['site_slogan'] = filter_xss_admin(variable_get('site_slogan', ''));
}
// Since the title and the shortcut link are both block level elements,
// positioning them next to each other is much simpler with a wrapper div.
if (!empty($variables['title_suffix']['add_or_remove_shortcut']) && $variables['title']) {
// Add a wrapper div using the title_prefix and title_suffix render elements.
$variables['title_prefix']['shortcut_wrapper'] = array(
'#markup' => '<div class="shortcut-wrapper clearfix">',
'#weight' => 100,
);
$variables['title_suffix']['shortcut_wrapper'] = array(
'#markup' => '</div>',
'#weight' => -99,
);
// Make sure the shortcut link is the first item in title_suffix.
$variables['title_suffix']['add_or_remove_shortcut']['#weight'] = -100;
}
}
/**
* Implements hook_preprocess_maintenance_page().
*/
function bartik_preprocess_maintenance_page(&$variables) {
// By default, site_name is set to Drupal if no db connection is available
// or during site installation. Setting site_name to an empty string makes
// the site and update pages look cleaner.
// @see template_preprocess_maintenance_page
if (!$variables['db_is_active']) {
$variables['site_name'] = '';
}
drupal_add_css(drupal_get_path('theme', 'bartik') . '/css/maintenance-page.css');
}
/**
* Override or insert variables into the maintenance page template.
*/
function bartik_process_maintenance_page(&$variables) {
// Always print the site name and slogan, but if they are toggled off, we'll
// just hide them visually.
$variables['hide_site_name'] = theme_get_setting('toggle_name') ? FALSE : TRUE;
$variables['hide_site_slogan'] = theme_get_setting('toggle_slogan') ? FALSE : TRUE;
if ($variables['hide_site_name']) {
// If toggle_name is FALSE, the site_name will be empty, so we rebuild it.
$variables['site_name'] = filter_xss_admin(variable_get('site_name', 'Drupal'));
}
if ($variables['hide_site_slogan']) {
// If toggle_site_slogan is FALSE, the site_slogan will be empty, so we rebuild it.
$variables['site_slogan'] = filter_xss_admin(variable_get('site_slogan', ''));
}
}
/**
* Override or insert variables into the node template.
*/
function bartik_preprocess_node(&$variables) {
if ($variables['view_mode'] == 'full' && node_is_page($variables['node'])) {
$variables['classes_array'][] = 'node-full';
}
}
/**
* Override or insert variables into the block template.
*/
function bartik_preprocess_block(&$variables) {
// In the header region visually hide block titles.
if ($variables['block']->region == 'header') {
$variables['title_attributes_array']['class'][] = 'element-invisible';
}
}
/**
* Implements theme_menu_tree().
*/
function bartik_menu_tree($variables) {
return '<ul class="menu clearfix">' . $variables['tree'] . '</ul>';
}
/**
* Implements theme_field__field_type().
*/
function bartik_field__taxonomy_term_reference($variables) {
$output = '';
// Render the label, if it's not hidden.
if (!$variables['label_hidden']) {
$output .= '<h3 class="field-label">' . $variables['label'] . ': </h3>';
}
// Render the items.
$output .= ($variables['element']['#label_display'] == 'inline') ? '<ul class="links inline">' : '<ul class="links">';
foreach ($variables['items'] as $delta => $item) {
$output .= '<li class="taxonomy-term-reference-' . $delta . '"' . $variables['item_attributes'][$delta] . '>' . drupal_render($item) . '</li>';
}
$output .= '</ul>';
// Render the top-level DIV.
$output = '<div class="' . $variables['classes'] . (!in_array('clearfix', $variables['classes_array']) ? ' clearfix' : '') . '"' . $variables['attributes'] .'>' . $output . '</div>';
return $output;
}
Gewöhnlich sind sibtheme
am 05.05.2014 - 21:25 Uhr
Gewöhnlich sind sibtheme unter sites/all/themes zu finden. Darin enthalten die jeweilige template.php
hmm...da habe ich natürlich
am 06.05.2014 - 13:03 Uhr
hmm...da habe ich natürlich zuerst geschaut, so wie du es mir oben schon beschrieben hattest. Komischerweise habe ich unter sites/all/themes/meinsubtheme keine template.php. Ich habe dort nur die .info-Datei, den CSS-Folder sowie einen Image-Folder. Das Subtheme habe ich mit dieser Anleitung erstellt. Dort wird nichts von einer template.php beschrieben, die in dem Subtheme-Ordner sein sollte.
Wenn ich den Alter-Hook Code in die oben dargestellte template-php einsetzte, kommt sofort ein Fehler. Daher wird das wohl nicht die richtige sein. Hat vielleicht noch jemand eine Idee, wie ich die richtige Datei finde? Die muss irgendwo sein, schließlich läuft die Webseite in meiner Entwicklerumgebung?
Wenn das Original-Theme eine
am 06.05.2014 - 13:09 Uhr
Wenn das Original-Theme eine template.php enthält, kannst Du die in Dein Theme überkopieren. Dabei müssen aber die Namen aller Funktionen auf den Namen Deines Subthemes geändert werden, sonst bekommst Du eine weiße Seite (WSOD) wegen des PHP-Fehlers: Doppelter Funktionsname. Sieh Dir die Anleitung im Zen-Theme an, die beschreibt, wie dort ein Subtheme anzulegen ist. Dort wird auch auf die template.php eingegangen.
ah ok, danke! Wenn ich die
am 07.05.2014 - 13:36 Uhr
ah ok, danke! Wenn ich die template.php aus dem Original-Theme ins mein Theme-Ordner kopiere, wird diese dann automatisch erkannt oder muss ich noch irgendwo einen Befehl geben, dass diese template.php verwendet wird und nicht die originale? Danke und Gruß!
Nur das übliche "Clear Cache"
am 07.05.2014 - 13:43 Uhr
Nur das übliche "Clear Cache" wie bei allen Änderungen am Theme.
Ich habe nun die template.php
am 05.06.2014 - 19:24 Uhr
Ich habe nun die template.php in meinen Subtheme-Ordner kopiert und den Code wie folgt am Ende der template.php angehängt:
<?php
function newb_better_exposed_filters_settings_alter(&$settings) {
$settings['field_groesse_value']['slider_options']['bef_slider_min'] = 200;
$settings['field_groesse_value']['slider_options']['bef_slider_max'] = 250000;
// Or use a DB query to determine the current min/max values or...
}
?>
In allen Funktionen habe ich "bartik" gegen "newb" (so heißt mein Subtheme) ausgetauscht. Außerdem habe ich ein bestehendes Field "groesse" anstelle des beispielhaften "field_price_value" eingefügt (habe es auch ohne das Wort "_value" am Ende probiert). Die Werte nach dem = habe ich fiktiv gewählt um zu sehen, ob das min und max übernommen werden. Es erscheint aber immer diese Meldung:
Parse error: syntax error, unexpected '<' in C:\xampp\htdocs\drupal722\sites\all\themes\newb\template.php on line 158
Habe ich hier irgendwo einen Fehler drin?
Grüße
Thomas
Du hast hoffentlich um das
am 05.06.2014 - 21:25 Uhr
Du hast hoffentlich um das Stück Code nicht die
<?php ... ?>
Klammer gesetzt. Lediglich am Anfang der template.php sollte<?php
stehen. Auch das schließende?>
am Ende der Datei sollte nicht vorhanden sein.Ich habe keine PHP-Kenntnisse
am 05.06.2014 - 21:56 Uhr
Ich habe keine PHP-Kenntnisse und die "Klammern" eingefügt...ups :). Wenn ich diese entferne, dann verschwinder zwar die Fehlermeldung aber die min/max-Werte werden nicht angenommen.
Kennst du Better Exposed Filter? Dort kann man exposierte Zahlenfelder als Slider-Filter darstellen. Also wie ein typischer Preis-Slider in einem Onlineshop (z.B.). In den Einstellungen muss man das Minimum und Maximun angeben (Pflichtfelder). Müsste diese Hook-Funktion die Einstellungen überschreiben? Oder kann es sein, dass die Einstellungen verhindern, dass meine eingefügte Funktion in der template.php funktioniert?
Oder woran könnte es sonst noch liegen?
oder habe ich vielleicht
am 10.06.2014 - 14:24 Uhr
oder habe ich vielleicht einen falschen Namen des Feldes genommen? Ich habe nach dem "maschinenlesbaren Namen" des Feldes "Größe" gesucht und das beispielhafte Feld im Code gegen "field_groesse" ausgetaucht. Ist das richtig so?
Kann mir hier niemand mehr
am 13.06.2014 - 14:04 Uhr
Kann mir hier niemand mehr weiterhelfen?
Hallo Thule
am 13.06.2014 - 15:45 Uhr
doch, könnten wir. Aber das ergibt keinen Sinn so. Wenn Du magst sende ich Dir ein Buch über drupal, darin enthalten wie php/drupal funktioniert.
Wenn man so lange damit Probleme hat (4 Monate), dann fehlen definitv Grundlagen.
Sieht nicht so aus als hätte jemand Lust hier Nachhilfe zu geben.
Schick mir eine Nachricht wenn Du willst mit email.
BG,
maen
php Buch
am 13.06.2014 - 19:12 Uhr
re: Buch über drupal, darin enthalten wie php/drupal funktioniert.
@maen
kannst du bitte schreiben, welches Buch du da empfiehlst? interessiert sicher auch andere. Gibt immer wieder Leute, die bisher mit php noch nichts zu tun hatten.
danke
Gelöst in diesem Threat.
am 28.08.2014 - 10:09 Uhr
Gelöst in diesem Threat.