首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >仅在处理响应性布局的k2项视图上显示模块位置

仅在处理响应性布局的k2项视图上显示模块位置
EN

Stack Overflow用户
提问于 2013-09-07 11:28:40
回答 1查看 828关注 0票数 0

Joomla的Zt新闻4模板上,我试图在除K2项目页页面之外的所有k2页面(如本节页)上显示模块位置。

没关系,但有一个问题让我抓狂;K2项目页从顶级页面(如类别页)继承“内容容器”的类,因此在Item视图上,我的模块位置比类别视图小,内容容器将无法填充足够的宽度。除项目视图外,我使用此片段在每个k2页面上显示模块位置:

代码语言:javascript
复制
<?php   
    $com = JRequest::getCmd('option');
    $view  = JRequest::getCmd('view');
    if(!($com =='com_k2' && $view!=='item')) : ?>
        <jdoc:include type="modules" name="position-5" style="xhtml" />
<?php endif ?>

正如预期的那样,pistion-5代码并不存在于项目视图的HTML源代码中,但内容容器仍然使用属于3列页的"span6“类。(实际上,项目页面上的内容容器需要"span9“类)。ُ通过以下函数选择这些类:

代码语言:javascript
复制
 public function isContent ()
   {
      $modLeft  = $this->theme->countModules('position-7');
      $modItem  = $this->theme->countModules('position-custom');
      $modRight = $this->theme->countModules('position-5');

  switch(true) {
     case (!$modLeft && !$modItem && !$modRight):
        return "span12";
     case (!$modLeft && !$modRight && $modItem):
        return "span9";
     case (!$modRight):
        return "span9";
     case (!$modLeft):
        return "span9";
     case (!$modItem):
        return "span9";
     default:
        return "span6";
  }
}

并以这种方式分配给容器:

代码语言:javascript
复制
<div class="<?php echo $function->isContent();?>">
   <jdoc:include type="component" />
</div>

请把我从这种困境中拯救出来

EN

回答 1

Stack Overflow用户

发布于 2013-09-07 20:42:32

有几个可能的解决方案,虽然我不认为我的任何建议是最佳的。

备选案文1

您可以创建一个函数来确定目标视图,这样您就不会重复。

我不确定网格宽度的确切条件是什么,或者position-custom何时起作用,但是如果我正确地理解了您,主要关注的是在禁用该模块位置时将$modRight设置为0

代码语言:javascript
复制
public function isK2NonItem() {
    $com = JRequest::getCmd('option');
    $view  = JRequest::getCmd('view');
    return $com =='com_k2' && $view !== 'item';
}

public function isContent()
{
    $modLeft  = $this->theme->countModules('position-7');
    $modRight = $this->theme->countModules('position-5');

    if($this->isK2NonItem()) {
        $modRight = 0;
    }

    switch(true) {
        case (!$modLeft && !$modRight):
            return "span12";
        case (!$modRight):
            return "span9";
        case (!$modLeft):
            return "span9";
        default:
            return "span6";
    }
}

如果必要的话,你可以根据自己的情况来调整它。从模板中移除模块位置的部分如下:

代码语言:javascript
复制
<?php
    if(!$function->isK2NonItem() : ?>
        <jdoc:include type="modules" name="position-5" style="xhtml" />
<?php endif; ?>

这段代码基于上一段节选中的$function变量。我不知道它是否或如何被确定包含位置-5的jdoc标签的部分访问。

选项2

另一种选择是通过更改目标位置,以编程方式从该位置空出一些模块。我不确定这是否实现这一目标的最干净的方式。

要只删除某些模块,您可以拥有一个带有它们的标题或其他属性的数组,并执行以下操作:

代码语言:javascript
复制
$mods = JModuleHelper::getModules('position-5'); //gets all of the modules from the specified position

$remove_titles = array('Mod1', 'Mod2');

for($i = 0; $i < count($mods); ++$i) {
    //you can alo target other module properties, such as id, module or name.
    //skip the condition to clear the position completely
    if(array_search($mods[$i]->title, $remove_titles) {
        $mods[$i]->position = 'nonExistentPosition';
    }
}

为了完全清除模块位置,可以使用以下代码:

代码语言:javascript
复制
$mods = JModuleHelper::getModules('position-5');

for($i = 0; $i < count($mods); ++$i) {
    $mods[$i]->position = 'nonExistentPosition';
}

JModuleHelper::getModules返回一个具有position属性与所提供的条件相匹配的对象的数组(在本例中为'position-5')。必须在任何依赖于该位置内容计数的代码之前清空该职位。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18672832

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档