PDA

Zobacz pełną wersję : Wybór templatki i utrzymanie jej w każdej pozycji menu



CrowPL
24-12-2010, 13:16
Witam wszystkich. Do tej pory nie miałem większych problemów, a jeśli wystąpiły rozwiązywałem je bardzo szybko. Ostatnio zachciało mi się wprowadzić użytkownikom możliwość zmiany skórki strony jednak nie działa to jak należy. Opiszę po kolei z czego korzystałem i jakie były tego efekty. Poniżej zrzut z projektanta menu:

http://img51.imageshack.us/img51/2096/zrzutekranu20101224godz.png

i korzystam z modułu Maxi Menu CK (nie wiem czy to ma jakiekolwiek znaczenie...).

Opcja wyboru templatki znajduje się w bocznym panelu strony i jest widoczna w każdej pozycji menu. Strona "startuje" zawsze z newsów.

Template selector (http://extensions.joomla.org/extensions/style-a-design/templating/7466)
Działa rewelacyjnie, "trzyma" wybraną skórkę we wszystkich pozycjach menu, ale po wyłączeniu przeglądarki, ponownym włączeniu i wejściu na stronę "wskakuje" domyślna skórka. Jeżeli strona była otwarta w zakładce, która została zamknięta, ale przeglądarka nie została zamknięta i ponownie wejdziemy na stronę wybrana skórka jest pamiętana.


Template chooser (http://extensions.joomla.org/extensions/style-a-design/templating/2401)
Tu jest coś co mnie interesuje - ciasteczka. Dzięki czemu po wyłączeniu przeglądarki, włączeniu i ponownym wejściu na stronę ładuje się wybrana uprzednio skórka. Mod trzyma wybraną templatkę na każdej pozycji menu, dopóki ktoś nie wpadnie na pomysł jej zmiany w pozycjach [2-5] lub [11-15]. Wtedy [1,6,7,8,9,10,16], [2-5] i [11-15] są taktowane jako 3 "grupy", w których mogę mieć grupowo inną skórkę.

Czyli będąc w jednej z pozycji z grupy [1,6,7,8,9,10,16] wybrałem sobie skórkę A, wtedy cała grupa ją pamięta, będąc w [2-5] wybrałem B - cała grupa ją zapamiętuje i w kocu [11-15] wybrałem C - także cała grupa ją zapamiętuje. Łącznie mogę mieć 3 różne skórki. Jeśli jestem w pozycji menu jednej grupy i przechodzę do pozycji należącej do innej grupy zmienia się skórka.

Dziwne prawda? I strasznie mnie to denerwuje...

Jeżeli wyłączę obsługę ciasteczek Template chooser zachowuje się jak Template selector, czyli "trzyma" wszędzie skórkę niezależnie, gdzie ją zmienię ale nie pamięta jej jeśli zamknę przeglądarkę.

Mam nadzieję, że zrozumieliście mój opis ;). Jeśli macie jakiś pomysł na rozwiązanie w postaci innego dodatku czy cokolwiek prosiłbym o pomoc, bo ja już wysiadam. 3 dni męczę już ten temat i nie mogę przez niego zmrużyć oka... Nie chciałbym ponownie wracać do jednej templatki.

Pozdrawiam i Wesołych Świąt!

P.S. Jeżeli menu nie miałoby submenu wszystko byłoby OK, ale to rozwiązanie którego chcę uniknąć.

stone
24-12-2010, 13:32
Opisane dosyć szczegółowo ale czy możesz dać link do stronki? Nie ma to jak własnoręcznie sprawdzić :)

CrowPL
24-12-2010, 13:39
Proszę bardzo: www.mylenium.pl (http://www.mylenium.pl)

stone
24-12-2010, 21:10
Faktycznie dla pozycji w submenu są tworzone nowe ciasteczka. I sądzę że jeżeli nie ma opcji za to odpowiadającej w ustawieniach modułu to tylko edycja kodu modułu może tu pomóc. Tak na oko nie powinna to być zbyt skomplikowana sprawa.

CrowPL
25-12-2010, 13:43
template chooser składa się z mod i plg. Niestety ja ni w ząb php... więc nie pozostaje mi nic innego jak prosić o pomoc.

Część odpowiedzialna za zmianę templatki w module, którą znalazłem:


if (isset( $_POST["mod_change_template_".$chooserID])) {
modTemplateChooserHelper::setTemplate($_POST["mod_change_template_".$chooserID], $keep_cookie);
} else {
if (($keep_cookie == 1)&&(isset($_COOKIE["joomla_template"]))&&
($cur_template != $_COOKIE["joomla_template"])) {
$cookietemplate = $_COOKIE["joomla_template"];
modTemplateChooserHelper::setTemplate($cookietempl ate, $keep_cookie);
}
}

tlewap
25-12-2010, 21:52
wrzuć całą zawartość plugina

stone
26-12-2010, 08:35
Tu raczej jest wszystko ok, zmian wymaga funkcja setTemplate
Tak jak napisał tlewap, wrzuc cały moduł albo przynajmniej helper, będzie łatwiej się rozeznać.

CrowPL
26-12-2010, 10:43
mod_templatechooser:

- mod_templatechooser.php

<?php
/**
* Template Chooser Module Entry Point
*
* @package Joomla
* @subpackage Modules
* @link http://templates.linkster.be/
* @license GNU/GPL, see LICENSE.php
* mod_templatechooser is free software. This version may have been modified pursuant
* to the GNU General Public License, and as distributed it includes or
* is derivative of works licensed under the GNU General Public License or
* other free or open source software licenses.
*/


// no direct access
defined( '_JEXEC' ) or die( 'Restricted access' );

global $mainframe;
$cur_template = $mainframe->getTemplate();

// Include the syndicate functions only once
require_once( dirname(__FILE__).DS.'helper.php' );


$chooserID = $module->id? $module->id : '0';

$titlelength = $params->get( 'title_length', 20 );
$preview_height = $params->get( 'preview_height', 90 );
$preview_width = $params->get( 'preview_width', 140 );
$show_preview = $params->get( 'show_preview', 0 );
$keep_cookie = $params->get( 'keep_cookie', 0 );
$moduleclass_sfx = $params->get('moduleclass_sfx')?$params->get('moduleclass_sfx'):'' ;


if (isset( $_POST["mod_change_template_".$chooserID])) {
modTemplateChooserHelper::setTemplate($_POST["mod_change_template_".$chooserID], $keep_cookie);
} else {
if (($keep_cookie == 1)&&(isset($_COOKIE["joomla_template"]))&&
($cur_template != $_COOKIE["joomla_template"])) {
$cookietemplate = $_COOKIE["joomla_template"];
modTemplateChooserHelper::setTemplate($cookietempl ate, $keep_cookie);
}
}

$darray = modTemplateChooserHelper::getTemplates($params);


require( JModuleHelper::getLayoutPath( 'mod_templatechooser' ) );
?>



- helper.php

<?php
/**
* Helper class for Template Chooser module
*
* @package mod_templatechooser
* @subpackage Modules
* @link http://templates.linkster.be/
* @license GNU/GPL, see LICENSE.php
* mod_templatechooseris free software. This version may have been modified pursuant
* to the GNU General Public License, and as distributed it includes or
* is derivative of works licensed under the GNU General Public License or
* other free or open source software licenses.
*/


class modTemplateChooserHelper
{

function setTemplate($newTemplate, $keepcookie)
{
global $mainframe;


// Initialize some variables
$_SESSION['template'] = $newTemplate;
// store in cookie if needed
if ($keepcookie == 1) {
setcookie("joomla_template", $newTemplate, time()+ (86400 * 365));
}
$uri =& JURI::getInstance();
$url = $uri->current();
$url .= '?';
$paramarray = $uri->getQuery(true);
foreach ($paramarray as $paramname => $paramvalue) {
if ($paramname != 'template') {
$url .= $paramname;
$url .= '=';
$url .= $paramvalue;
$url .= '&&';
}
}
$url .= 'template=';
$url .= $newTemplate;
$mainframe->redirect($url);
}

function getTemplates(&$params) {

// titlelength can be set in module params
$titlelength = $params->get( 'title_length', 20 );
$preview_height = $params->get( 'preview_height', 90 );
$preview_width = $params->get( 'preview_width', 140 );
$keep_cookie = $params->get( 'keep_cookie', 0 );

$show_preview = $params->get( 'show_preview', 0 );

// Read files from template directory
$template_path = "templates";
$templatefolder = @dir( $template_path );
$darray = array();

if ($templatefolder) {
while ($templatefile = $templatefolder->read()) {
if ($templatefile != "." && $templatefile != ".."&& $templatefile != "_system"&& $templatefile != "system" && $templatefile != ".svn" && $templatefile != "css" && is_dir( "$template_path/$templatefile" ) ) {
if ($params->get($templatefile, 1) == 1 ) {
$templatefile_new = $params->get($templatefile."_name") ? $params->get($templatefile."_name") : $templatefile;
if(strlen($templatefile_new) > $titlelength) {
$templatename = substr( $templatefile_new, 0, $titlelength-3 );
$templatename .= "...";
} else {
$templatename = $templatefile_new;
}
$darray[] = JHTML::_('select.option', $templatefile, $templatename );
}
}
}
$templatefolder->close();
}

sort( $darray );
return $darray;
}
}


plg_templatechooser

-templatechooser.php

<?php
defined( '_JEXEC' ) or die( 'Restricted access' );
jimport('joomla.event.plugin');

class plgSystemTemplateChooser extends JPlugin
{
function plgSystemTemplateChooser(&$subject, $config)
{
parent::__construct($subject,$config);
}

function onAfterInitialise()
{
global $mainframe;
if ($mainframe->isAdmin()) {
return;
}
if (isset($_SESSION['template'])&&($_SESSION['template']!='')) {
$mainframe->setTemplate($_SESSION['template']);
return true;
}
}
}

?>


Gdyby czegoś Wam brakowało to pliki leżą na serwerze: http://www.mylenium.pl/template_chooser.zip

Autor modułu twierdzi, że aby działał prawidłowo plg też musi być zainstalowany. Ja go wyłączyłem dziś dla testów i nie widzę różnicy.

Innych modułów umożliwiających ręczną zmianę templatki w "locie" przez odwiedzającego stronę w bazie extensions.joomla.org oprócz dwóch wymienionych w 1 poście nie znalazłem... Dziwią mnie też super oceny tych modułów. Najwidoczniej ci co z nich korzystają nie mają submenu i nie wymagają zapamiętywania wybranej skórki po wyłączeniu przeglądarki ;). Wtedy faktycznie sprawdzą się idealnie.

stone
26-12-2010, 18:23
Spróbuj tak, poniżej funkcja do podmiany w pliku helper.php (dopisałem 4 znaki, ale dla pewności podaję całą funkcję ;) )


function setTemplate($newTemplate, $keepcookie)
{
global $mainframe;


// Initialize some variables
$_SESSION['template'] = $newTemplate;
// store in cookie if needed
if ($keepcookie == 1) {
setcookie("joomla_template", $newTemplate, time()+ (86400 * 365), "/");
}
$uri =& JURI::getInstance();
$url = $uri->current();
$url .= '?';
$paramarray = $uri->getQuery(true);
foreach ($paramarray as $paramname => $paramvalue) {
if ($paramname != 'template') {
$url .= $paramname;
$url .= '=';
$url .= $paramvalue;
$url .= '&&';
}
}
$url .= 'template=';
$url .= $newTemplate;
$mainframe->redirect($url);
}

CrowPL
26-12-2010, 19:05
Rewelacja. Wygląda na to, że gdziekolwiek wybrany jest skin, jest utrzymywany w każdej pozycji menu/submenu. Nawet po wznowieniu sesji z submenu wszystko działa. Zmiana jest już na stronie.

Na razie nie dziękuję jeszcze, żeby nie zapeszyć ;).

Powyższa zmiana dotyczy wielu poziomów menu?

stone
26-12-2010, 19:11
Zmiana była tylko w tej linijce

setcookie("joomla_template", $newTemplate, time()+ (86400 * 365), "/");

w oryginale

setcookie("joomla_template", $newTemplate, time()+ (86400 * 365));

Chodzi o to aby parametr ciasteczka odnośnie ścieżki zawsze odnosił się do strony głównej. Jeżeli się go nie poda to ciasteczko z automatu wczytuje podkatalog np /dyskografia/ . Osoby które nie mają włączonego SEF pewno tego problemu wogole nie mają.

CrowPL
28-12-2010, 09:27
OK wszystko działa jak należy. Dzięki serdeczne za pomoc.