PDA

Zobacz pełną wersję : sh404SEF plugin do własnego modułu.



vego007
30-09-2008, 10:32
Witam

Od wczoraj zacząłem "bawić" się prostymi adresami jednak nie mam pojęcia jak przekształcić linki, aby miały postać taką jaka jest mi potrzebna. W chwili obecnej wygląda on tak:
component/option,com_jb2/CategoryID,1/ProducentID,1/SectionID,1/lang,pl/script,materials/view,category/

Są to linki, które tworzą mi się w module, który napisałem do katalogu produktów

Chciałbym zamienić to na:
com_jb2/Producent/Sekcja1/Kategoria1/

Jeżeli ktoś mógłby nakierować mnie na rozwiązanie, będę wdzięczny. Napisałem to w dziale programowanie bo podejrzewam, że przyjdzie mi coś napisać :)
Używam komponentu jak w tytule :)

crazyluki
30-09-2008, 18:06
sh404SEF:
widziales przykłady plugin do sh404 sef jaką ma budowe?
generalnie budowanie pluginu do sh404 sef nie jest takie najtrudniejsze. w katalogu z pluginami do sh404 sef poszukaj example plugin czy jakoś tak - jest tam to świetnie wytłumaczone (sory że pisze wytłuszczonymi)

vego007
02-10-2008, 12:14
Męczę się już trzeci dzień z tym pluginem. Próbowałem już na różne sposoby. W chwili obecnej mój "plugin" wygląda tak



<?php
/**
* sh404SEF support for com_XXXXX component.
* Author :
* contact :
*
* {shSourceVersionTag: Version x - 2007-09-20}
*
* This is a sample sh404SEF native plugin file
*
*/
defined( '_JEXEC' ) or die( 'Direct Access to this location is not allowed.' );

// ------------------ standard plugin initialize function - don't change ---------------------------
global $sh_LANG, $sefConfig;
$shLangName = '';
$shLangIso = '';
$title = array();
$shItemidString = '';
$dosef = shInitializePlugin( $lang, $shLangName, $shLangIso, $option);
if ($dosef == false) return;
// ------------------ standard plugin initialize function - don't change ---------------------------

// ------------------ load language file - adjust as needed ----------------------------------------
//$shLangIso = shLoadPluginLanguage( 'com_XXXXX', $shLangIso, '_SEF_SAMPLE_TEXT_STRING');
// ------------------ load language file - adjust as needed ----------------------------------------

// remove common URL from GET vars list, so that they don't show up as query string in the URL
shRemoveFromGETVarsList('option');
shRemoveFromGETVarsList('lang');

if (!empty($Itemid))
shRemoveFromGETVarsList('Itemid');
if (!empty($limit))
shRemoveFromGETVarsList('limit');
if (isset($limitstart))
shRemoveFromGETVarsList('limitstart'); // limitstart can be zero


// start by inserting the menu element title (just an idea, this is not required at all)
$task = isset($task) ? @$task : null;
$Itemid = isset($Itemid) ? @$Itemid : null;
$shSampleName = shGetComponentPrefix($option);
$shSampleName = empty($shSampleName) ?
getMenuTitle($option, $task, $Itemid, null, $shLangName) : $shSampleName;
$shSampleName = (empty($shSampleName) || $shSampleName == '/') ? 'SampleCom':$shSampleName;

//print_r($_GET);

$id1 = JRequest::getVar('ProducentID');
$id2 = JRequest::getVar('PostID');

if(isset($id1) && !empty($id1))
{
$q = 'SELECT pr.ProducentID, pr.ProducentName,c.CategoryID, c.CategoryName, p.PostID, p.Title FROM jos_jb_posts p INNER JOIN
jos_jb_producent pr ON p.ProducentID = pr.ProducentID INNER JOIN jos_jb_postcategories pc ON
pc.PostID = p.PostID INNER JOIN jos_jb_categories c ON c.CategoryID = pc.CategoryID
WHERE pr.ProducentID = '.$id1;
$database->setQuery($q);
$obj = $database->loadObject();

$title[] = $obj->ProducentName;
$title[] = $obj->CategoryName;
$title[] = $obj->Title;
}
elseif(isset($id2))
{
$q = 'SELECT pr.ProducentID, pr.ProducentName,c.CategoryID, c.CategoryName, p.PostID, p.Title FROM jos_jb_posts p INNER JOIN
jos_jb_producent pr ON p.ProducentID = pr.ProducentID INNER JOIN jos_jb_postcategories pc ON
pc.PostID = p.PostID INNER JOIN jos_jb_categories c ON c.CategoryID = pc.CategoryID
WHERE p.PostID = '.$id2;

$database->setQuery($q);

$obj = $database->loadObject();

$title[] = $obj->ProducentName;
$title[] = $obj->CategoryName;
$title[] = $obj->Title;

}
else $title[] = 'Producent';
//shRemoveFromGETVarsList('task');


// ------------------ standard plugin finalize function - don't change ---------------------------
if ($dosef){
$string = shFinalizePlugin( $string, $title, $shAppendString, $shItemidString,
(isset($limit) ? @$limit : null), (isset($limitstart) ? @$limitstart : null),
(isset($shLangName) ? @$shLangName : null));
}
// ------------------ standard plugin finalize function - don't change ---------------------------

?>
W momencie gdy klikam w link ma on taką postać:
localhost/joomla/index.php/Producent.html?CategoryID=2&ProducentID=2&SectionID=2&task=producent&view=category (http://localhost/joomla/index.php/Producent.html?CategoryID=2&ProducentID=2&SectionID=2&task=producent&view=category)

Mi potrzebny jest w przeglądarce tak jak pisałem
localhost/joomla/index.php/com_component/Nazwa_producenta/Nazwa_sekcji/Nazwa_kategorii/ (http://localhost/joomla/index.php/com_component/Nazwa_producenta/Nazwa_sekcji/Nazwa_kategorii/)

Nie mam pojęcia jak zrobić z tego linka, skoro linki są w module i w momencie klikania na link nie mam jeszcze zainicjowanych zmiennych, takich jak np ProducentID.
Z góry dziękuję za pomoc.

Finarfin
02-10-2008, 16:20
Jeżeli te wszystkie dane trzymasz w bazie danych, to spróbuj w pętli zbierającej wyniki or sth(nie wiem jak tu działa Twój plugin) zrobić:
$result[index]->href = 'localhost/joomla/index.php/com_component/ (http://localhost/joomla/index.php/com_component/Nazwa_producenta/Nazwa_sekcji/Nazwa_kategorii/)'.$row->producent_name.'/'.$row->section_name.'/'.$row->category_name.;

Gdzie oczywiście w zapytaniu do bazy ustawisz te zmienne.

vego007
02-10-2008, 18:03
Wybacz ale nie za bardzo rozumiem. Problem polega na tym, że w momencie gdy wchodzę na localhost/joomla/index.php (http://localhost/joomla/index.php/Producent.html?CategoryID=2&ProducentID=2&SectionID=2&task=producent&view=category) nie mam zainicjowanych zmiennych. Moduł tworzy mi w pętli for url'e. Komponent wymaga id do odczytywania danych z bazy i wyświetlania kategorii produktów. Mógłbym w pętli tworzącej linki wpisać np nazwe producenta, ale bez jego id i tak nic mi to nie da.
Jeśli nie o tym mówisz mógłbyś mi to trochę dokładniej wyjaśnić? I dzięki za zainteresowanie :)

Finarfin
02-10-2008, 19:32
Hmm...właściwie to wpierw musiałbyś wyjaśnić po co Ci dokładnie inny adres do tego wszystkiego? Piszesz wyszukiwarkę po produktach(lub coś w tym stylu), czy to jest jeszcze coś innego? Bo jeżeli szukajkę to to nie będzie aż tak wielki problem, wystarczy jedynie lekko to dorobić(np. wzoruj się na tym co jest napisane w plugins->search->contacts - to wyszukuje linki w dość dobry sposób).

Jak to lepiej zobrazujesz to może będę w stanie pomóc, chyba, że moja podpowiedź Cię nakieruje.

vego007
02-10-2008, 21:21
To jest katalog produktów. Problem miałem z modułem rozwijanego menu do tego. Chyba już sobie z tym poradziłem. Jak to wszystko potestuje to opisze dokładniej problem i rozwiązanie. Może ktoś wymyśli coś lepszego niż ja :)

Finarfin
03-10-2008, 14:55
Dobrze wiedzieć, że się udało ;)

Oczywiście liczymy na opis rozwiazania coby potomności się przydało ;)

vego007
03-10-2008, 16:18
Jak zrobię żeby wszystko śmigało to opiszę co i jak. Póki co sam nie za bardzo wiem co robię. :) Tworzenie tego plugina to czyste kombinowanie.

Póki co doszedłem do tego, że jak wygeneruję link w takiej postaci



$x = $rows2[$j]->SectionID;
$y = $rows[$i]->ProducentID;
$z = $rows3[$a]->CategoryID;
$x2 = $rows2[$j]->SectionName;
$y2 = $rows[$i]->ProducentName;
$z2 = $rows3[$a]->CategoryName;
$link = 'index.php?option=' . $option . '/'.$x2.'/'.$y2.'/'.$z2.'&view=category&SectionID='.$x. '&ProducentID='.$y. '&task=producent&CategoryID='.$z;
$linkk = JRoute::_($link);
echo "<a href='".$linkk."'>".$rows3[$a]->CategoryName."</a>";


A następnie wyrzucę w pluginie za pomocą shRemoveFromGETVarsList() te elementy, które mi są niepotrzebne w urlu to generuje mi takiego linka jakiego oczekuję. Co prawda, rozwiązanie takie nie wydaje mi się być troche przekombinowane i nawet nie wiem czy zgodne z ogólnie przyjętymi standardami (technikami) ale póki co nie mam innego pomysłu.