PDA

Zobacz pełną wersję : [Joomla 2.5] Sufiks klasy modułu



qbas-s
17-07-2012, 12:47
potrzebuję w pewnym pliku templatki(znajduje się on bezpośrednio w katalogu templatki) wywołać zmienną zawierającą sufiks modułu - $moduleclass_sfx.
Jak poprawnie tą zmienną wywołać? $params->get( 'moduleclass_sfx') nie działa i wyrzuca błąd:
Call to a member function get() on a non-object in <ścieżka do templatki>

bogdanbojarski
17-07-2012, 13:08
Dokladniej, po co?

qbas-s
17-07-2012, 13:17
chciałem sobie trochę skrócić pracę i użyłem artisteera. Jedna na pewnym etapie pracy zobaczyłem, że artiteeer tak zrobił mi templatkę, że nie mogę nadać indywidualnych stylów dla określonych boxów mimo nadanie w ustawieniach modułu sufikus klasy. Dzieje się tak ponieważ sufiks ten jest wywoływany zbyt "głęboko" w divach i mogę indywidualne style nadać wyłącznie dla contentu modułu. Wywołanie
$moduleclass_sfx w pewnym pliku templatki rozwiązałoby mój problem

bogdanbojarski
17-07-2012, 13:37
dziwne przecież styl jest definiowany w parametrach modułu w pliki temlpatki powinienieś mieć <jdoc:include type="modules" name="pozycjamodułu" style="xhtml" />
Pmijam style="...." definiowane przez różne złożone szablony.

qbas-s
17-07-2012, 13:56
u mnie aktualna struktura modułu wygląda tak:



<div class="art-box art-block">
<div class="art-box-body art-block-body ">
<div class="art-bar art-blockheader">
<h3 class="t">Lorem Ipsum</h3>
</div>
<div class="art-box art-blockcontent">
<div class="art-box-body art-blockcontent-body">
<div class="custom_MOJ_SUFIX" >
Content modułu
<div class="cleared"></div>
</div>
</div>
<div class="cleared"></div>
</div>
</div>


Tak wygląda struktura każdego modułu oczywiści pomijając MOJ_SUFIX który mogę sobie w parametrach modułu dodać albo nie.
Zależy mi aby sufiks który na cele przykładu nazwałem MOJ_SUFIX znalazł się w <div class="art-box-body art-block-body "> i aby to wyglądało np <div class="art-box-body art-block-body MOJ_SUFIX">

Sprawę by załatwiło zamienienie w pewnym pliku templatki <div class="art-box-body art-block-body "> na
<div class="art-box-body art-block-body <?php echo
$moduleclass_sfx
?> ">. Jednak w takiej postaci zmienna
$moduleclass_sfx jest pusta bo nie wiem jak ją prawidłowo wywołać aby zawierała sufix przyrostek klasy modułu


oczywiście mógłbym sobie w stylach ustawić to co chcę np dla <div class="art-box art-block"> ale wtedy style by się zastosowały do wszystkich boxów a ja chciałbym np do jednego czy dwóch. Właśnie po to chcę w innym miejscu wywołać ten przyrostek klasy modułu :) Mam nadzieję, że dobrze wytłumaczyłem :)

bogdanbojarski
17-07-2012, 14:16
Ale co to jest? Z jaiego pliku?
Jeśli już koniecznie chcesz wprowadzać własny styl to w pliku /templates/ststem/html/modules.php masz strukturę takiego stylu. Nadpisując style umieszczasz taki plik w /szablon/html/

zwiastun
17-07-2012, 14:48
@bogdanbojarski: kolega @qbas-s chce pewno za pomocą JavaScriptu dołączyć tzw. przyrostek klasy stylu albo po prostu dodatkowy atrybut klasy stylu. To nie dotyczy atrybutu stylu w instrukcji wywołującej moduł.
Zapewne masz rację, ze problem można rozwiązać, tworząc dodatkowy styl modułu. Ale czy Artister tak działa? Tego nie wiem, bo nie używam.

qbas-s
17-07-2012, 14:58
artisteer w katalogu głównym templatki tworzy plik który nazywa się function.php
i właśnie w nim jest zdefiniowana struktura modułu.

Wracając do tematu przewodniego: chciałbym w pliku function.php wywołać zmienną
$moduleclass_sfx którą normalnie można wywołać tak: $params->get( 'moduleclass_sfx') ale w tym przypadku wyrzuca błąd: Call to a member function get() on a non-object in <ścieżka do templatki> :) Zapewne dlatego że wcześniej nie utworzyłem obiektu $params. Tylko nie wiem jak dokładnie go utworzyć tzn. $params = new <i tu coś tam>

bogdanbojarski
17-07-2012, 15:02
Hm, to nie pomogę, bo też nie używam, z reguły szablony od podstaw robię ręcznie.

nikszal
17-07-2012, 16:01
Zapewniam Cię @qbas-s, że przyrostkiem klasy modułu i zmianami wprowadzonymi w css moża dokumentnie przebudować wygląd wybranego modułu, poczynając od zmiany tła na czcionce kończąc. Wielokrotnie to robiłem w szablonach z Atisteera. Nie wymyślaj prochu kombinując w pliku function.php. Wprowadź kilka modyfikacji w css i w zależności od potrzeb stosuj wraz z nimi przyrostki modułów. Ten sposób działa na 100%.

qbas-s
17-07-2012, 16:12
nadałem jednemu modułowi sufiks i następnie w css ustawiłem dla testu aby tło było czerwone
efekt:
5640

jak widać efekt nie jest poprawny gdyż sufix jest za głęboko w strukturze divów umieszczony. Chciałbym aby np cały blok był na czerwono

nikszal
17-07-2012, 16:21
Słyszałeś o..., znasz moduły z własnym kodem html?
Przy dobrej znajomości css cuda można robić. Każda linia tekstu może mieć inny kolor tła.
Jako obowiązkową lekturę polecam którąś z tych (http://helion.pl/kategorie/webmasterstwo/css) pozycji o css.
Nastaw się raczej na css3.

qbas-s
17-07-2012, 16:29
tekst na czerwonym polu jest własnym kodem html. Czerwone pole jest definiowane w stylach:) obecnie nie mogę ustawić efektu np: 20 boksów całych szarych a jeden cały czerwony.... nie wiem jak mam to lepiej wytłumaczyć. I nadal nie znam odpowiedzi jak wyświetlić nazwę sufiksa modułu:)


np w module ustawia sobie przedrostek na "_test"

potem w kodzie mam <div class="custom_test"> treść modułu z własnym </html>

potem w css: .custom_test{background:red}

Efekt: http://forum.joomla.pl/attachment.php?attachmentid=5640

bogdanbojarski
17-07-2012, 16:35
Chyba jestem głupi, bo nie rozumiem problemu.

zwiastun
17-07-2012, 16:47
<div class="art-box-body art-block-body <?php echo
$moduleclass_sfx
?> ">. Jednak w takiej postaci zmienna
$moduleclass_sfx jest pusta bo nie wiem jak ją prawidłowo wywołać aby zawierała sufix przyrostek klasy modułu

A gdzie Ty to chcesz "wywoływać"?
Bo w plikach szablonu, np. w modules.php wywołuje się za pomocą prostej instrukcji

<?php echo ($params->get('moduleclass_sfx') ?>

qbas-s
17-07-2012, 16:59
bezpośrednio w folderze templatki mam plik functions.php (artisteer sobie taki robi). W nim jest funkcja:



function artxBlock($caption, $content, $classes = '') {
$hasCaption = ($GLOBALS['artx_settings']['block']['has_header'] && null !== $caption && strlen(trim($caption)) > 0);
$hasContent = (null !== $content && strlen(trim($content)) > 0);
if (!$hasCaption && !$hasContent) return '';
ob_start(); ?>

<?php ob_start(); ?>
<div class="art-box art-block">
<div class="art-box-body art-block-body ">
<?php echo str_replace('class="art-box art-block">', 'class="art-box art-block' . $classes . '">', ob_get_clean()); ?>
<?php if ($hasCaption): ?>

<div class="art-bar art-blockheader">
<h3 class="t">
<?php echo $caption; ?>
</h3>
</div>
<?php endif; ?>
<?php if ($hasContent): ?>
<div class="art-box art-blockcontent">
<div class="art-box-body art-blockcontent-body">
<?php echo artxPostprocessBlockContent($content); ?>

<div class="cleared"></div>
</div>
</div>
<?php endif; ?>
<div class="cleared">
</div>
</div>
</div>

<?php
return ob_get_clean();
}



chciałbym linię <div class="art-box-body art-blockcontent-body">
zastąpić
<div class="art-box-body art-blockcontent-body <?php echo ($params->get('moduleclass_sfx'))?>">


rozwiązanie(tak jak pisałem w pierwszym poście)
<?php echo ($params->get('moduleclass_sfx')) ?>

nie działa bo wyrzuca błąd:
Call to a member function get() on a non-object in <ścieżka do templatki>

zwiastun
17-07-2012, 17:13
Nie mam, jak pisałem, Artistera, więc nie podpowiem. Błąd jest zrozumiały, bo Artister "przetwarza" instrukcje i zmienne Joomla! na swoje (obsługuje różne systemy). I na pewno gdzieś w kodzie można odnaleźć, jakieś przypisanie sufiksu klasy modułu, bo sufiksy w Artisterze działają. Może to się kryje pod zmienną $classes?
Sugeruję po prostu pójść za tokiem myślenia @Nikszala.

qbas-s
17-07-2012, 17:29
Artisteer korzysta do wypełnienia modułu contentem domyślnego pliku który jest w katalog_główny_joomy\modules\mod_custo\tmpl\defa ult.php
zawartość pliku:



defined('_JEXEC') or die;?>
<div class="custom<?php echo $moduleclass_sfx ?>" <?php if ($params->get('backgroundimage')): ?> style="background-image:url(<?php echo $params->get('backgroundimage');?>)"<?php endif;?> > <?php echo $module->content;?></div>

i tu jest to moje $moduleclass_sfx które chce przenieść do "wyższego diva" ale nie mogę bo po wyrzuca mi błąd :)

qbas-s
17-07-2012, 23:05
problem rozwiązałem(działa tylko dla templatek artisteera). W katalogu templatki edytujemy plik html\modules.php

tam mamy funkcję odpowiedzialną za wyświetlanie boksów:

function modChrome_artblock($module, &$params, &$attribs)
{
if (!empty ($module->content))
echo artxBlock(($module->showtitle != 0) ? $module->title : '', $module->content);
}

zamieniamy ją na(dodając $params->get('moduleclass_sfx')) :
function modChrome_artblock($module, &$params, &$attribs)
{
if (!empty ($module->content))
echo artxBlock(($module->showtitle != 0) ? $module->title : '', $module->content,
$params->get('artx-module-classes'),$params->get('moduleclass_sfx'));
}



potem w katalogu temlatki edytujemy plik function.php i zamieniamy
function artxBlock($caption, $content, $classes = '')

na

function artxBlock($caption, $content, $classes = '',$sufix = '')

i mamy dostęp do nazwy sufiksu.

jeszcze wystarczy tylko w pliku: katalog_strony/modules/mod_custom/default.php
zamienić
<div class="custom<?php echo $moduleclass_sfx ?>" <?php if ($params->get('backgroundimage')): ?> style="background-image:url(<?php echo $params->get('backgroundimage');?>)"<?php endif;?> >
<?php echo $module->content;?>
</div>

na

<div class="custom<?php //echo $moduleclass_sfx ?>" <?php if ($params->get('backgroundimage')): ?> style="background-image:url(<?php echo $params->get('backgroundimage');?>)"<?php endif;?> >
<?php echo $module->content;?>
</div>

i mamy ładny efekt w postaci jednego boksa z jasnobłękitnym tłem(oczywiście po wcześniejszym zdefiniowaniu styli dla sufiksa i określeniu go w ustawieniach modułu):
http://s6.ifotos.pl/img/blokJPG_rawpqwx.JPG

:)

Sylwek691
01-11-2012, 15:40
Też miałem podobny problem
nie mogłem pobrać parametru
straciłem na tym kilka godzin
i teraz już wiem gdzie popełniłem błąd
zrobiłem sobie funkcję którą wywoływałem
a w niej próbowałem pobrać parametry
ale, że zwykle programuję w c# lub c++
to nie wiedziałem albo zapomniałem
że w PHP we funkcji nie ma dostępu
do zewnętrznego obiektu i trzeba go do
funkcji przekazywać w postaci adresu parametru