Magento:从管理模块加载模板文件

时间:2010-11-25 12:06:14

标签: php magento

我一直在关注在管理部分创建模块的教程。我正在尝试使用magento模块和twitter API。这是教程http://t.wits.sg/2009/03/31/howto-repackageable-custom-extension-development-in-magento/

我到第二页,我在管理中有一个模块菜单,调用我的AdminController的indexAction,如下所示:

<?php
class Optimise_Twits_AdminController extends Mage_Adminhtml_Controller_Action
{
  public function indexAction()
  {
    $this->loadLayout();
    $this->getLayout()->getBlock('content')->append($this->getLayout()->
      createBlock('twits/helloWorld'));
    $this->renderLayout();
  }
}

这样就显示了block / HelloWorld.php块:

<?php
class Optimise_Twits_Block_HelloWorld extends Mage_Core_Block_Template
{
  protected function _toHtml()
  {
    return 'Hello world';
  }
}
?>

这一切都很好,我可以导航到我的管理菜单点击菜单项,我看到'HelloWorld'。我想要做的是在这里加载模板文件,而不是通过类显示文本。

我有一个我要显示的表单,它会查找所有产品并显示它们。然后,我可以选择一个产品并写入标签,当我单击表单上的提交按钮时,它会格式化数据并将其作为状态更新发送到Twitter。

我是不是错了? (我不应该在这里使用模板吗?)如果没有,有人可以帮我解决我的模板放置位置以及如何调用它们。

这就是我希望的phtml文件:

  <div class="simple_contact">
  <h1 class="cms">'Tweet up' Your Products</h1>
  <form id="twitter-feed" name="twitter-feed" action="[action_here]" 
     method="post">
  <table><tr>
  <?php
  $model = Mage::getModel("optimise_twits/products");
  $products = $model->getProducts();
  $i = 0;
  foreach ($products as $product)
  {
   // var_dump($product);
    echo '<tr>';
    echo '<td>';
    echo '<label for="'. $product .'">' . $product . '</label>';
    echo '<input type="hidden" name="tweet['.$i.'][product]" value="'. 
      $product .'">';
    echo '<br />';
    echo '<input type="text" class="hashtag" name="'.
      'tweet['.$i.'][tags]" id="tags" value="#enter, #product, #hastag"';
    echo '</td>';
    echo '<td>';
    echo '<input type="checkbox" name="tweet['.$i.'][chk]" id="'. 
       $product .'"></td>';
    echo '</tr>';
    $i++;
  }
?>
<tr>
   <td colspan="2"><input type="submit" name="submit" value="tweet"></td>
</tr>
</table>
</form>
</div>

非常感谢!

Jonesy

2 个答案:

答案 0 :(得分:2)

您可以通过调用setTemplate()方法在块上设置模板。但不要。

如果您使用下降的Mage_Adminhtml_Block_Widget_Grid它将为您创建表,您只需提供一个集合类并描述一些列。但是也不要这样做。

而是使用module creator。它将为您创建必要的网格小部件(和容器),并节省数小时/天的工作量。至少直到你有足够的经验来自己做好。

答案 1 :(得分:2)

是的,你做对了。虽然Magento有一个用于自动创建表单小部件的类层次结构,但它们遇到了与所有紧密绑定的OO UI组件相同的“问题”:如果您想要完全执行应用程序中其他位置所做的操作,那就太棒了。如果您想要/需要大量定制功能,则会耗费大量时间。值得了解它们是如何工作的,但是你没有理由不像使用更简单的PHP MVC系统那样使用Magento。

值得了解Magento中的每个系统是如何工作的,但跳入网格整体可能会让你比起初时更加困惑。

转到您的具体问题,从Mage_Core_Block_Template继承的每个Block都有一个“setTemplate”方法。这个方法如果用来告诉Magento你想要一个块使用哪个phtml模板。所以,在你的Block的构造函数中,类似

class Optimise_Twits_Block_HelloWorld extends Mage_Core_Block_Template
{
    protected function __construct()
    {
        $this->setTemplate('path/to/my/template.phtml');
    }   
}

您还会注意到我们已删除了_toHtml方法。基类(_toHtml)中的Mage_Core_Block_Template是加载模板的内容。因此,如果您覆盖它,您的块将不再加载并呈现模板。

模板路径开始包括主题的基本模板文件夹。所以,如果你使用的是现代主题

/app/design/frontend/default/modern/template

您将模板放在

/app/design/frontend/default/modern/template/path/to/my/template.phtml

(这稍微简化了一下,但是再次,过于纠结于主题路径如何工作可能只会妨碍此时。在Mage_Core_Block_Abstract::renderView开始追踪“真相”)

这应该足以让你入门。如果您遇到其他问题,请在此处提出另一个具体问题,并且有人应该能够提供帮助。通过Knowledge Base进行工作是了解更多有关所有这些工作方式的好方法,以及go beyond the knowledge base的文章(免责声明:我是两者的作者)