[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