0

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

没关系,但是有一个问题让我发疯;K2 项目页面从顶级页面(例如类别页面)继承“内容容器”的类因此,虽然在项目视图上我的模块位置比类别视图少 1 个,但内容容器不会填充足够的宽度。我使用此代码段在每个 k2 页面上显示模块位置,项目视图除外:

<?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”类)。ُ这些类是通过以下函数选择的:

 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";
  }
}

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

<div class="<?php echo $function->isContent();?>">
   <jdoc:include type="component" />
</div>

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

4

1 回答 1

0

对此有几种可能的解决方案,尽管我认为我的任何建议都不是最佳的。

选项1

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

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

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";
    }
}

如有必要,您可以调整它以使用您自己的条件。从模板中移除模块位置的部分变为:

<?php
    if(!$function->isK2NonItem() : ?>
        <jdoc:include type="modules" name="position-5" style="xhtml" />
<?php endif; ?>

这段代码基于$function您上次摘录中的变量。我不知道确定包含位置 5jdoc标记的部分是否或如何访问它。

选项 2

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

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

$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';
    }
}

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

$mods = JModuleHelper::getModules('position-5');

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

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

于 2013-09-07T20:42:32.323 回答