[TYPO3-german] Keywordsmenu: Verknüpfung mit "und" statt "oder"

Carsten Wegner Carsten.Wegner at gmx.com
Mon Jan 29 16:19:34 CET 2007


Hallo zusammen,

ich möchte die Extension Keywordsmenu nutzen, um einzelne Rubriken mit 
Seiten zu füllen. Das läuft auch ganz gut, allerdings scheinen die 
Keywords ODER-verknüpft zu sein. Was ich brauche, ist eine 
UND-Verknüpfung der relevanten Keywords.

Fiktives Beispiel: Die Seite "Obst" hat die Unterseiten "Spanien", 
"Türkei" etc. Unter "Spanien" sollen per Keywordsmenu alle Seiten 
aufgelistet werden, die unter anderem die Keywords "Obst" UND "Spanien" 
enthalten.

Das Problem: Keywordsmenu stellt alle Seiten zusammen, die mindestens 
"Obst" ODER "Spanien" enthalten. Das führt dazu, dass auch "Gemüse" 
aufgelistet wird, das in Spanien wächst. Oder irgendein anderer Text, 
der sich zwar um Spanien dreht, aber nicht das Geringste mit Obst zu tun 
hat (sorry für das blöde Beispiel).

Ich kann mir vorstellen, dass es recht einfach ist, dies im PHP-Code der 
Extension zu ändern. Jedoch reicht mein Wissen über PHP noch nicht aus, 
um den gesamten Code zu verstehen und an den richtigen Schrauben zu 
drehen. Werde mich auf absehbare Zeit auch nicht im nötigen Umfang 
einarbeiten können. Deshalb wende ich mich an euch, in der Hoffnung, 
dass mir jemand ohne großen Aufwand helfen kann.

Vielen Dank im Voraus
und beste Grüße
Carsten

Menü-Typ: Based on keywords
Layout-Typ: All pages with these keywords
Typo3-Version 4.0.4
Keywordsmenu 0.0.3
PHP 5.2.0
Apache 2.0.59
(derzeit noch lokale Testumgebung unter Windows)

-----

Programmcode der class.tx_keywordsmenu_pi1.php (mit Update aus dem 
Thread http://www.typo24.com/26953.html):

-----

<?php
require_once(PATH_tslib."class.tslib_pibase.php");

class tx_keywordsmenu_pi1 extends tslib_pibase {
var $prefixId = "tx_keywordsmenu_pi1";		// Same as class name
var $scriptRelPath = "pi1/class.tx_keywordsmenu_pi1.php";	// Path to 
this script relative to the extension dir.
var $extKey = "keywordsmenu";	// The extension key.


/**
* Main function
* In TypoScript, the HMENU_obj property should be a HMENU content 
object. The special value should be set to a user function, either 
"hmenu_userfunction".
*/
function main($content,$conf)	{
$this->conf = $conf;
if ($this->conf["cObj"])	{
$this->conf["CMD"] = $this->cObj->data["tx_keywordsmenu_type"];

// Find all keyword uids from tt_content field:
$result = $this->getKeywordIdsForContentElement($this->cObj->data["uid"]);
$this->conf["keyword_uidList"] = implode(",",$result[1]);

// Get the PID from which to make the menu.
// If a page is set as reference in the 'Startingpoint' field, use that
// Otherwise use the page's id-number from TSFE
$this->conf["startPid"] = 
intval($this->cObj->data["pages"]?$this->cObj->data["pages"]:$GLOBALS["TSFE"]->id);

$this->conf["depth"] = 0;
}
$GLOBALS["TSFE"]->applicationData["tx_keywordsmenu_pi1"]=$this->conf;

switch((string)$this->conf["CMD"])	{
case 1:
case "categories":
// Displays each keyword separately:
$out="";
$keywordArray = explode(",",$this->conf["keyword_uidList"]);
reset($keywordArray);
while(list(,$kId)=each($keywordArray))	{
$kRec = $this->pi_getRecord("tx_keywordsmenu_keywords",$kId);
if (is_array($kRec))	{
$this->cObj->setCurrentVal($kRec["keyword"]);	// Setting the
$GLOBALS["TSFE"]->applicationData["tx_keywordsmenu_pi1"]["keyword_uidList"]=$kRec["uid"];

$out.= 
$this->cObj->cObjGetSingle($this->conf["CAT_header"],$this->conf["CAT_header."]);
$out.= 
$this->cObj->cObjGetSingle($this->conf["HMENU_obj"],$this->conf["HMENU_obj."]);
}
}
return $out;
break;
default:
return 
$this->cObj->cObjGetSingle($this->conf["HMENU_obj"],$this->conf["HMENU_obj."]);
break;
}
$GLOBALS["TSFE"]->applicationData["tx_keywordsmenu_pi1"]=array();
}

/**
* Should return an array with page records for the "userfunction" 
special type of HMENU's
* Use this function if you wish to set all properties from TypoScript 
and not from fields in tt_content records.
*/
function hmenu_userfunction($content,$conf)	{
$this->conf = $GLOBALS["TSFE"]->applicationData["tx_keywordsmenu_pi1"];

$uidList = 
implode(",",t3lib_div::intExplode(",",$this->conf["keyword_uidList"]));
$menuPid = 
intval($this->conf["startPid"])?intval($this->conf["startPid"]):$GLOBALS["TSFE"]->config["rootLine"][0]["uid"];
$depth = intval($this->conf["depth"])?intval($this->conf["depth"]):99;

return 
$this->makeMenu($uidList,$menuPid,$depth,$this->conf["_altSortField"]);
}

/**
* Common method for making the menu.
*/
function makeMenu($uidList,$menuPid,$depth,$orderField)	{
$page_id_list = 
$this->cObj->getTreeList(intval($menuPid),$depth).intval($menuPid);
$addWhere=" AND pages.uid IN (".$page_id_list.")";
return 
$this->getPageRecordsByKeywords($uidList,$addWhere,$orderField=="sorting"?"title":$orderField);
}

/**
* Returns the content element id's selected for the tt_content record.
*/
function getKeywordIdsForContentElement($uid)	{
/**OLD-VERSION 3.5.0:
$query = $this->cObj->mm_query_uidList(
"tx_keywordsmenu_keywords.*",
intval($uid),
"tt_content_tx_keywordsmenu_selected_keywords_mm",
"tx_keywordsmenu_keywords",
" ORDER BY tt_content_tx_keywordsmenu_selected_keywords_mm.sorting"
);
*/

//Changed Version:
$query= "SELECT tx_keywordsmenu_keywords.* FROM 
tt_content_tx_keywordsmenu_selected_keywords_mm,tx_keywordsmenu_keywords 
WHERE tt_content_tx_keywordsmenu_selected_keywords_mm.uid_local IN 
(".intval($uid).") AND 
tx_keywordsmenu_keywords.uid=tt_content_tx_keywordsmenu_selected_keywords_mm.uid_foreign 
ORDER BY tt_content_tx_keywordsmenu_selected_keywords_mm.sorting";
//Changed Version end


$res = mysql(TYPO3_db,$query);
echo mysql_error();
$outRec=array();
$outUids=array();
while($row=mysql_fetch_assoc($res))	{
$outRec[]=$row;
$outUids[]=$row["uid"];
}
return array($outRec,$outUids);
}

/**
* Returns the page records which has keywords from uidList (uid's of 
keyword records). The list of pagerecord is unique (no duplicates).
*/
function 
getPageRecordsByKeywords($uidList,$addWhere="",$orderField="title")	{
/**OLD-VERSION 3.5.0:
$query = $this->cObj->mm_query(
"pages.*",
"pages",
"pages_tx_keywordsmenu_keywords_mm",
"",
"AND pages_tx_keywordsmenu_keywords_mm.uid_foreign IN 
(".implode(",",t3lib_div::intExplode(",",$uidList)).") ".$addWhere
).
" GROUP BY pages.uid".
(trim($orderField)?" ORDER BY pages.".trim($orderField):"");
*/

//Changed Version:
$query= "SELECT pages.* FROM pages,pages_tx_keywordsmenu_keywords_mm 
WHERE pages.uid=pages_tx_keywordsmenu_keywords_mm.uid_local AND 
pages_tx_keywordsmenu_keywords_mm.uid_foreign IN 
(".implode(",",t3lib_div::intExplode(",",$uidList)).") ".$addWhere. " 
GROUP BY pages.uid ORDER BY pages.title";
//Changed Version end

$res = mysql(TYPO3_db,$query);
while($row=mysql_fetch_assoc($res))	{
$outRec[]=$row;
}
return $outRec;
}
}



if (defined("TYPO3_MODE") && 
$TYPO3_CONF_VARS[TYPO3_MODE]["XCLASS"]["ext/keywordsmenu/pi1/class.tx_keywordsmenu_pi1.php"]) 
{
include_once($TYPO3_CONF_VARS[TYPO3_MODE]["XCLASS"]["ext/keywordsmenu/pi1/class.tx_keywordsmenu_pi1.php"]);
}

?>



More information about the TYPO3-german mailing list