View Issue Details

IDProjectCategoryView StatusLast Update
0005023OXID eShop (all versions)2.3. Extensions (modules, themes)public2013-04-17 16:48
Reportersaulius.stasiukaitis 
PrioritynormalSeveritymajorReproducibilityalways
Status resolvedResolutionfixed 
Product Version 
Target VersionFixed in Version4.7.5 / 5.0.5 
Summary0005023: Active theme id is not accessible from template.
DescriptionThere is cases when you need theme id in your templates. For example when you write module and you have different templates, CSS, JavaScript for different themes.

Now one must extend oxViewConfig to get full path to your CSS and JavaScript files. Like it is done there:
https://github.com/DSB/Oxid-oTranCe-Connector/blob/master/modules/otrance-connector/core/otc_otcViewConfig_oxViewConfig.php
    /**
     * Get active theme name
     *
     * @return string
     */
    protected function getThemeName()
    {
        if ($this->themeName !== null) {
            return $this->themeName;
        }

        $this->themeName = oxRegistry::getConfig()->getConfigParam('sTheme');

        return $this->themeName;
    }
TagsNo tags attached.
ThemeBoth
BrowserAll
PHP Versionany
MySQL Versionany

Relationships

related to 0005042 assignedflorian.auer metadata-blocks doesn't support multiple themes 

Activities

saulius.stasiukaitis

2013-03-27 17:03

reporter   ~0008540

Hi Saulius,

 >So I'd propose to do it this way: $oTheme = oxNew('oxTheme'); $oTheme->getActiveThemeId();

Good point! Thanks for your proposal. I already committed this change to my repo. And this is exactly what I expect from a dev list: to discuss technical approaches and make code better. *thumbsUp*

 >Also it is possible to use such a solution in template:
[{assign var="oConfig" value=$oView->getConfig()}] [{$oConfig->getConfigParam('sTheme')}]

While I'm a big fan of KISS I don't want to carry complexity to templates. I'd rather go with getter methods that clearly communicate their purpose via their method name and additionally capsules functionality at one point.
I've seen templates where many, many object instances are assigned and this sometimes makes the template harder to understand than the PHP code in the controller. So I try to avoid it whenever it is possible.

I don't know how other developers want to deal with this, but for a general, longtime solution I'd like to have methods like:

$oWhatEver->getModuleCssUrl('module-id', '[subFolder]/myCss.css') $oWhatEver->getModuleJsUrl('module-id', '[subFolder]/myJs.js') $oWhatEver->getModuleImageUrl('module-id', '[subFolder]/myModuleImage.png')

These methods could have a fallback; if the requested file isn't present in the actual theme sub folder it could fall back to a general folder (just like with the lang.php files). This way theme maintainers could (but are not forced to) style the appearance of a module component by copying relevant files to modules/module-id/out/theMaintainerTheme/...

Best regards,

Daniel Schlichtholz

Am 27.03.2013 13:30, schrieb Saulius Stasiukaitis:

> Hi Daniel,
>
> Thanks for this notice! I also think that the shop could have a better option to access an active theme from a template file, hope we can resolve this issue in one of the next releases.
>
> Just a short note to your solution:
> There is a slightly better, more generic way to do so. Of course your solution would work for you but one shall have in mind that a theme might depend on another one. In case that there is a parent - child relation between the themes, the child theme ID is stored in "sCustomTheme" instead of "sTheme". So I'd propose to do it this way:
> $oTheme = oxNew('oxTheme');
> $oTheme->getActiveThemeId();
>
> Also it is possible to use such a solution in template:
> [{assign var="oConfig" value=$oView->getConfig()}]
> [{$oConfig->getConfigParam('sTheme')}]
>
> For sure, it's a bit dirty, but as a workaround it will do what expected.
>
> Saulius Stasiukaitis
> OXID Developer
>
> -----Original Message-----
> From: [email protected]
> [mailto:[email protected]] On Behalf Of Daniel
> Schlichtholz
> Sent: Tuesday, March 26, 2013 1:18 PM
> To: [email protected]
> Subject: Re: [oxid-dev-general] Images, Javascript and CSS files in
> modules
>
> Hi Saulius,
>
> that's the way I did it. All module files should be encapsulated in the module folder, like you suggested. But additionally it has to respect the active theme in order to be able to style frontend components according to the theme.
> Meanwhile I found a working solution. As you can see here
> https://github.com/DSB/Oxid-oTranCe-Connector/blob/master/modules/otra
> nce-connector/core/otc_otcViewConfig_oxViewConfig.php
> I created some getters for my module.
>
> But regarding the fact that each module needs to be able to fetch its
> own css/js/image files, my solution feels dirty. When I think of a
> shop with 20 modules and each implements an own way to get files from
> within its own folder .. no, I don't want to think of that. ;)
>
> Are there any ready-to-use getters I haven't found? If not, I'd suggest to add something like that to the OXID core.
>
> Best regards,
>
> Daniel Schlichtholz
>
> Am 26.03.2013 10:16, schrieb Saulius Stasiukaitis:
>
>> Hi,
>>
>> There is no strong requirement where to store JS and CSS files. My suggestion would be to keep them inside your module directory. Create out/src/js/ and out/src/css/ directories so it fit Shop structure and would be easier to debug for other people. You can use something like this to include your scripts in to templates:
>> [{oxscript include=$oViewConf->getModuleUrl("{moduleID}",
>> "out/src/js/{js_fle_name}.js")}]
>>
>> Saulius Stasiukaitis
>> OXID Developer
>>
>> -----Original Message-----
>> From: [email protected]
>> [mailto:[email protected]] On Behalf Of Daniel
>> Schlichtholz
>> Sent: Wednesday, March 20, 2013 3:41 PM
>> To: Oxid Dev-List
>> Subject: [oxid-dev-general] Images, Javascript and CSS files in
>> modules
>>
>> Hi list,
>>
>> I want to create a module in Oxid 4.7.x that needs to add its own
>> CSS-,
>> Javascript- and Image-Files.
>> What is the best practise to do that?
>>
> _______________________________________________
> dev-general mailing list
> [email protected]
> http://dir.gmane.org/gmane.comp.php.oxid.general
> _______________________________________________
> dev-general mailing list
> [email protected]
> http://dir.gmane.org/gmane.comp.php.oxid.general

_______________________________________________
dev-general mailing list
[email protected]
http://dir.gmane.org/gmane.comp.php.oxid.general

saulius.stasiukaitis

2013-03-27 17:08

reporter   ~0008541

Need to think what additional methods to add:

$oWhatEver->getModuleCssUrl('module-id', '[subFolder]/myCss.css') $oWhatEver->getModuleJsUrl('module-id', '[subFolder]/myJs.js') $oWhatEver->getModuleImageUrl('module-id', '[subFolder]/myModuleImage.png')

mantas.vaitkunas

2013-04-17 16:48

administrator   ~0008626

Added getActiveTheme() function to oxViewConfig class.