Suchfunktion im Backend (korrigiert)

Post custom hacks and enhancements for phpwcms here only. Maybe some of these things will be included in official release later.
Post Reply
User avatar
habi
Posts: 166
Joined: Sun 15. Feb 2004, 13:39
Location: Rutschwil, Switzerland
Contact:

Suchfunktion im Backend (korrigiert)

Post 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;}
Last edited by habi on Fri 28. Aug 2009, 09:18, edited 4 times in total.
User avatar
Oliver Georgi
Site Admin
Posts: 9888
Joined: Fri 3. Oct 2003, 22:22
Contact:

Re: Suchfunktion im Backend

Post 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!
Oliver Georgi | phpwcms Developer | GitHub | LinkedIn | Систрон
User avatar
habi
Posts: 166
Joined: Sun 15. Feb 2004, 13:39
Location: Rutschwil, Switzerland
Contact:

Re: Suchfunktion im Backend

Post 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
User avatar
Oliver Georgi
Site Admin
Posts: 9888
Joined: Fri 3. Oct 2003, 22:22
Contact:

Re: Suchfunktion im Backend (korrigiert)

Post 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.
Oliver Georgi | phpwcms Developer | GitHub | LinkedIn | Систрон
phalancs
Posts: 793
Joined: Thu 19. Feb 2004, 05:09
Location: Germany

Re: Suchfunktion im Backend (korrigiert)

Post 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;
}

?>
2008
novallis
Posts: 121
Joined: Tue 7. Dec 2004, 11:23
Location: Hassloch, Germany

Re: Suchfunktion im Backend (korrigiert)

Post 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)
phalancs
Posts: 793
Joined: Thu 19. Feb 2004, 05:09
Location: Germany

Re: Suchfunktion im Backend (korrigiert)

Post by phalancs »

Tatsächlich geht's mir genauso. Bei komplexen Seiten wird's müßig. Und so eine Backendsuche kann doch sehr praktisch werden!
2008
User avatar
Oliver Georgi
Site Admin
Posts: 9888
Joined: Fri 3. Oct 2003, 22:22
Contact:

Re: Suchfunktion im Backend (korrigiert)

Post by Oliver Georgi »

Zeit, Zeit…
Oliver Georgi | phpwcms Developer | GitHub | LinkedIn | Систрон
Post Reply