Page 1 of 1

Suchfunktion im Backend (korrigiert)

Posted: Wed 26. Aug 2009, 16:53
by habi
Hallo

Wir brauchten eine Suchfunktion im Backend, da mehrere Personen an der Inhaltpflege beteiligt sind, diese aber nicht immer wissen, wo was abgelegt wurde.

Zu diesem Zweck habe ich habe ich mal eine Suchfunktion eingebaut. In dieser kann man nach ID's oder Textfragmenten suchen. Die Umsetzung ist vielleicht nicht bis ins Letzte ausgefeilt, sollte aber für die meisten Fälle genügen.

Bei der Umsetzung ging es leider nicht ganz ohne Eingriff ins phpwcms.php

Installation
in phpwcms.php:
Im oberen Bereich (bei den require_once Befehlen folgende Zeile einfügen:

Code: Select all

require_once (PHPWCMS_ROOT.'/backendsearch.php');
Nach folgendem Text suchen:

Code: Select all

//Subnav Wrap Text Tabelle
Innerhalb der folgenden if Anweisung am Ende diese Code-Zeile einfügen:

Code: Select all

$subnav .= $backendsearchform;
Nach folgendem Text suchen:

Code: Select all

switch($do)
Davor diese Code-Zeile einfügen:

Code: Select all

echo $backendsearchresult;
Dann im CMS Root ein neues Dokument erstellen mit Namen
backendsearch.php
Dort folgenden Code einfügen und sichern:

Code: Select all

<?php
		$searchhtml		= '';
		$searchString	= '';
		if ($_POST['backendsearch']) {
		$searchString = $_POST['backendsearchstring'];
		if (is_numeric($searchString)) {
			// search for contentpart-id or article-id
			$searchString = mysql_real_escape_string($searchString);
			$sql = '
				SELECT 
					cp.acontent_id, cp.acontent_aid, cp.acontent_text, a.article_title 
				FROM 
					cms_phpwcms_articlecontent as cp, cms_phpwcms_article as a 
				WHERE 
					cp.acontent_id = "' . $searchString . '" AND cp.acontent_aid = a.article_id OR 
					a.article_id = "' . $searchString . '" AND cp.acontent_aid = a.article_id
			';
						
		} else {
			// search in title, subtitle, summary or text
			$searchString = mysql_real_escape_string($searchString);
			$sql = '
				SELECT 
					cp.acontent_id, cp.acontent_aid, cp.acontent_text, a.article_title, a.article_subtitle, a.article_summary
				FROM 
					cms_phpwcms_articlecontent as cp INNER JOIN cms_phpwcms_article as a 
				ON
					cp.acontent_id = a.article_id
				WHERE 
					a.article_title LIKE "%' . $searchString . '%" OR
					a.article_subtitle LIKE "%' . $searchString . '%" OR
					a.article_summary LIKE "%' . $searchString . '%" OR
					cp.acontent_text LIKE "%' . $searchString . '%"
			';
		}			
			if($result = mysql_query($sql, $db)) {
				$searchhtml .= '
					<p><b>Gefundene Artikel oder Content Parts:</b>
				';
				while($row = mysql_fetch_assoc($result)) {
				$searchhtml .= '
					<dl class="backendsearchresult">
				';
					if (strlen(strip_tags($row['article_subtitle'])) > 1) {
						$articleSubtitle = '<dd>' . str_ireplace($searchString, '<em>' . $searchString . '</em>',$row['article_subtitle']) . '</dd>';
					} else {
						$articleSubtitle = '<dd>--</dd>';
					}
					if (strlen(strip_tags($row['article_summary'])) > 6) {
						$articleSummary = '<dd>' . str_ireplace($searchString, '<em>' . $searchString . '</em>',$row['article_summary']) . '"</dd>';
					} else {
						$articleSummary = '<dd>--</dd>';
					}
	
					$searchhtml .= '
						<dt>Title</dt><dd><b><a href="' . PHPWCMS_ROOT . '/phpwcms.php?do=articles&p=2&s=1&aktion=2&id=' . $row['acontent_aid'] . '&acid=' . $row['acontent_id'] . '">' . str_ireplace($searchString, '<em>' . $searchString . '</em>', $row['article_title']) . '</a></b> <span style="color: #727889;">Article-ID: ' . str_replace($searchString, '<em>' . $searchString . '</em>',$row['acontent_aid']) . ' / Contentpart_ID: ' . str_replace($searchString, '<em>' . $searchString . '</em>',$row['acontent_id']) . '</span></dd>
						<dt>Subtitle</dt>' . $articleSubtitle . '
						<dt>Summary</dt>' . $articleSummary . '
						<dt>Text</dt><dd>' . str_ireplace($searchString, '<em>' . $searchString . '</em>',$row['acontent_text']) . '</dd>
						
					';
					$searchhtml .= '
						</dl>
					';
				}
				$searchhtml .= '</p>';
			}
		
	}
	$backendsearchform		= makeInputForm($searchString);
	$backendsearchresult	= $searchhtml;


function makeInputForm($searchString) {
	$searchhtml = '';
	$searchhtml .= '
		<form action="' . $_SERVER['REQUEST_URI'] . '" method="post" name="backendsearch" id="backendsearch">
			<fieldset style="border:none; border-top: 1px solid #92a1af">
				<legend>Suche</legend>
				<input type="text" name="backendsearchstring" value="' . $searchString . '"/>
				<input type="hidden" name="backendsearch" value="1"/>
				<input type="submit" name="submit" value="Senden"/>
				<p>Eingabe einer ID (Artikel-ID oder ContentPart-ID) oder eines Textfragments</p>
			</fieldset>
		</form>
	';
	
	return $searchhtml;
}

?>

CSS Ergänzungen:
Im File include / inc_css / additional.css habe ich noch folgende css Ergänzungen vorgenommen:

Code: Select all

dl.backendsearchresult em {color: red;}
dl.backendsearchresult {margin-bottom: 16px;}
dl.backendsearchresult dt {font-weight: bold; float: left; width: 70px; }
dl.backendsearchresult dd {margin-left: 70px;}

Re: Suchfunktion im Backend

Posted: Wed 26. Aug 2009, 18:37
by Oliver Georgi
Sorry, eigentlich sollte Euch diese Suche um die Ohren fliegen, da der komplette Seitengenerierungscode von phpwcms.php dort nochmals eingefügt wird.

Prüfe also bitte mal, ob dort nicht beim Eintragen des Codes etwas durcheinandergeraten ist.

Für den Moment rate ich dringend davon ab, dies so zu benutzen!

Re: Suchfunktion im Backend

Posted: Wed 26. Aug 2009, 22:55
by habi
schusselig wie ich bin, hatte ich den code vom falschen file oben reinkopiert. habs nun korrigiert.

hier noch ein screenshot der suchfunktion inkl. ergebnis:
Image

Re: Suchfunktion im Backend (korrigiert)

Posted: Thu 27. Aug 2009, 07:03
by Oliver Georgi
Warum seid Ihr Euch einfach noch immer nicht bewusst, was SQL Injections sind? Ich verstehe es nicht. Traue keiner Eingabe von außen. Es ist doch wirklich nicht so schwer.

Desweiteren sollte ein solches Script, welches direkt aufgerufen werden könnte, auch noch mal gegen genau dagegen gesichert werden. Also lädt wirklich das phpwcms Backend das Script.

Ansonsten ist die Idee OK.

Re: Suchfunktion im Backend (korrigiert)

Posted: Sun 25. Oct 2009, 04:00
by phalancs
Danke für das Skript.

Ich finde dies ist eine sehr praktische Sache, allerdings war sie irgendwie buggy. Ich habe mich einfach mal daran gesetzt das ganze ein bischen zu optimieren. Hier mein Ergebnis. Die Installation ist identisch, nur die backendsearch.php ist etwas anders:
  • Keine Suche mehr in gelöschten CPs/ gelöschten Artikeln
  • Kein Direktaufruf der backendsearch.php mehr möglich - Standardprüfung auf phpwcms Konstante
  • Suche + Button in einer Zeile untergebracht
  • Suchstring im POST wird bereinigt
  • Tabellenpräfix durch die DB_PREPEND Konstante ersetzt, damit die Mysql Abfrage auch funzt
  • Kein Bug mehr bei der Suche nach Strings (inner join war seltsam)
Hier die neue backendsearch.php:

Code: Select all

<?php

/*
PHPWCMS - Backendsearch v2.0 - October 2009
Original by habi - Updated version by phalancs
Use at your own risc!

More Info:
http://forum.phpwcms.org/viewtopic.php?f=8&t=19240
*/

// ----------------------------------------------------------------
// obligate check for phpwcms constants
if (!defined('PHPWCMS_ROOT')) {
   die("You Cannot Access This Script Directly, Have a Nice Day.");
}
// ----------------------------------------------------------------


      $searchhtml      = '';
      $searchString   = '';
      
      if ($_POST['backendsearch']) {
      
      //$searchString = $_POST['backendsearchstring'];
      $searchString = clean_slweg(remove_unsecure_rptags($_POST['backendsearchstring']));
      
      
      if (is_numeric($searchString)) {
         // search for contentpart-id or article-id
         $searchString = mysql_real_escape_string($searchString);
         $sql = '
            SELECT 
               cp.acontent_id, cp.acontent_aid, cp.acontent_text, a.article_title 
            FROM 
               '.DB_PREPEND.'phpwcms_articlecontent as cp, '.DB_PREPEND.'phpwcms_article as a 
            WHERE 
               (cp.acontent_id = "' . $searchString . '" AND cp.acontent_aid = a.article_id) OR 
               (a.article_id = "' . $searchString . '" AND cp.acontent_aid = a.article_id) AND
               a.article_deleted != 9 AND
               cp.acontent_trash != 9

               
         ';
           
                  
      } else {
      
               // search in title, subtitle, summary or text
         $searchString = mysql_real_escape_string($searchString);
         $sql = '
            SELECT 
               cp.acontent_id, cp.acontent_aid, cp.acontent_text, a.article_id, a.article_title, a.article_subtitle, a.article_summary
            FROM 
               '.DB_PREPEND.'phpwcms_articlecontent as cp INNER JOIN '.DB_PREPEND.'phpwcms_article as a 
            
            ON 
               cp.acontent_aid = a.article_id   
               
            WHERE 
               (a.article_title LIKE "%' . $searchString . '%" OR
               a.article_subtitle LIKE "%' . $searchString . '%" OR
               a.article_summary LIKE "%' . $searchString . '%" OR
               cp.acontent_text LIKE "%' . $searchString . '%") AND
               a.article_deleted != 9 AND
               cp.acontent_trash != 9
               
               ';
      
      }         
      
      
         if($result = mysql_query($sql, $db)) {
            $searchhtml .= '
               <p><b>Gefundene Artikel oder Content Parts:</b>
            ';
            while($row = mysql_fetch_assoc($result)) {
            $searchhtml .= '
               <dl class="backendsearchresult">
            ';
               if (strlen(strip_tags($row['article_subtitle'])) > 1) {
                  $articleSubtitle = '<dd>' . str_ireplace($searchString, '<em>' . $searchString . '</em>',$row['article_subtitle']) . '</dd>';
               } else {
                  $articleSubtitle = '<dd>--</dd>';
               }
               if (strlen(strip_tags($row['article_summary'])) > 6) {
                  $articleSummary = '<dd>' . str_ireplace($searchString, '<em>' . $searchString . '</em>',$row['article_summary']) . '"</dd>';
               } else {
                  $articleSummary = '<dd>--</dd>';
               }
   
               $searchhtml .= '
                  <dt>Title</dt><dd><b><a href="' . PHPWCMS_URL . 'phpwcms.php?do=articles&p=2&s=1&aktion=2&id=' . $row['acontent_aid'] . '&acid=' . $row['acontent_id'] . '">' . str_ireplace($searchString, '<em>' . $searchString . '</em>', $row['article_title']) . '</a></b> <span style="color: #727889;">Article-ID: ' . str_replace($searchString, '<em>' . $searchString . '</em>',$row['acontent_aid']) . ' / Contentpart_ID: ' . str_replace($searchString, '<em>' . $searchString . '</em>',$row['acontent_id']) . '</span></dd>
                  <dt>Subtitle</dt>' . $articleSubtitle . '
                  <dt>Summary</dt>' . $articleSummary . '
                  <dt>Text</dt><dd>' . str_ireplace($searchString, '<em>' . $searchString . '</em>',$row['acontent_text']) . '</dd>
                  
               ';
               $searchhtml .= '
                  </dl>
               ';
            }
            $searchhtml .= '</p>';
         } else {
         
         $searchhtml .= 'error<br /> ' . mysql_error() . '<hr />';
         
         }
      
   }
   $backendsearchform      = makeInputForm($searchString);
   $backendsearchresult   = $searchhtml;

function makeInputForm($searchString) {
   $searchhtml = '';
   $searchhtml .= '
   
      <form action="' . $_SERVER['REQUEST_URI'] . '" method="post" name="backendsearch" id="backendsearch">
         <fieldset style="border:none;">
            
            <input style="width:100px;" type="text" name="backendsearchstring" value="' . $searchString . '"/>&nbsp;<input type="submit" class="button10" name="submit" size="1" value="Suche"/>
            <input type="hidden" name="backendsearch" value="1"/>
            
         </fieldset>
      </form>
   ';
   
   return $searchhtml;
}

?>

Re: Suchfunktion im Backend (korrigiert)

Posted: Mon 8. Oct 2012, 11:10
by novallis
Ich wärme diesen Thread mal auf:

Zuerst mal danke habi und phalancs für die Lösung!

Wäre es möglich, die Artikel-Suche als Modul zu programmieren und eine "erweiterte Suche" anzubieten, die beispielsweise nach Schlagworten/Tags Artikel listet:

Hintergrund.
Mit dem Teaser-Contentpart nutze ich intensiv die Tag-Funktion bei Artikeln.
Manchmal will ich aber die Tags wieder löschen und da wäre es eine ganz große Erleichterung, wenn ich über eine Suchen-Funktion alle Artikel ausgegeben bekäme, die bestimmte Tags/Schlagworte beinhalten.

Lieber OG:
Ganz toll wäre es, wenn eine Suchfunktion in die Artikel-Zentrale fest eingebunden wäre.

Danke für Euer Feedback.

Freundliche Grüße,
Ralf (novallis)

Re: Suchfunktion im Backend (korrigiert)

Posted: Mon 8. Oct 2012, 11:15
by phalancs
Tatsächlich geht's mir genauso. Bei komplexen Seiten wird's müßig. Und so eine Backendsuche kann doch sehr praktisch werden!

Re: Suchfunktion im Backend (korrigiert)

Posted: Mon 8. Oct 2012, 12:22
by Oliver Georgi
Zeit, Zeit…