自定义 Magento 模块
Posted
技术标签:
【中文标题】自定义 Magento 模块【英文标题】:Custom Magento Module 【发布时间】:2012-11-17 15:36:07 【问题描述】:所以我在后端创建了一个模块,我创建了一个 shell 模块(管理顶部菜单中的项目和一个要访问的页面。)基本上我想要一个输入字段,管理员可以输入一个数字然后单击按钮“添加”,这将在数据库中的现有表中插入一行。
$connection = Mage::getSingleton('core/resource')->getConnection('core_write');
$connection->beginTransaction();
$fields = array();
$fields['name']= 'andy';
$connection->insert('test', $fields);
$connection->commit();
我的数据库中有一个名为“test”的表。如果我将上面的代码放入我的控制器文件中,当我访问管理页面时,它会成功地向数据库添加一行。但我需要允许用户输入插入的数据。
我是否必须将该代码移动到模型中,并以某种方式将输入数据发送到模型并让它完成工作?或不。如果这是正确的,有人可以指出我研究将数据发送到模型的好地方吗? (如果可能的话)
iv 尝试了很多教程,但它们对于我需要的东西来说都很大,我不需要显示任何东西,我只需要一个输入框和一个保存按钮。
编辑
我创建了一个文件块/Adminhtml/Form/Edit/Form.php,其中包含以下内容。 . .
class AndyBram_Presbo_Block_Adminhtml_Form_Edit_Form extends Mage_Adminhtml_Block_Widget_Form
protected function _prepareForm()
$form = new Varien_Data_Form(
array(
'id' => 'edit_form',
'action' => $this->getUrl('*/*/test'),
'method' => 'post',
)
);
$form->setUseContainer(true);
$this->setForm($form);
$fieldset = $form->addFieldset('display', array(
'legend' => 'Display Settings',
'class' => 'fieldset-wide'
));
$fieldset->addField('label', 'text', array(
'name' => 'label',
'label' => 'Label',
));
if (Mage::registry('andybram_presbo'))
$form->setValues(Mage::registry('andybram_presbo')->getData());
return parent::_prepareForm();
然后在我的控制器中,我有 2 个功能,如下所示。 . .
public function indexAction()
$this->loadLayout();
$this->_addContent($this->getLayout()->createBlock('presbo/adminhtml_form_edit_form'));
public function testAction()
echo 'form data here';
$this->loadLayout();
$this->renderLayout();
表单显示成功,但没有发送按钮或说“执行操作”
进一步编辑
我已成功向表单添加了一个提交按钮,该按钮成功进入 testAction 并回显“此处的表单数据”。
然后我如何访问数据,
iv 添加了以下行
$postData = $this->getRequest()->getPost();
现在如果我回显 $postData,它只会放入“数组”
如果我回显 $postData[0] 它不会放任何东西,只是一个空白页
有什么想法或建议吗?
【问题讨论】:
您是否已经创建了管理表单? 我会修改我上面的帖子,它不适合评论。 $this->getRequest()->getParam('param_name'); 当您在 getParam 中使用 'param_name' 时,这是表单中字段的名称吗? 它工作!!!!蒂姆,你是我的救星,我已经尝试了好几天才能让它工作,谢谢你的帮助。 :) 【参考方案1】:Magento 是作为MVC framework 构建的,因此您是对的——您需要将数据从控制器传递到模型,并且不要直接在控制器的代码中进行任何数据库更新。示例的最佳来源是自己的 Magento 代码 - 您可以采取任何控制器操作,将数据保存到 DB 以查看它是如何完成的。例如。检查app/code/core/Mage/Adminhtml/controllers/NotificationController.php
方法markAsReadAction()
。
你可以看到:
通过调用从请求中检索数据$this->getRequest()->getParam('id')
- 其实这就是答案
关于问题,如何获取提交的数据
数据设置为模型,然后通过调用$model->setIsRead(1)->save()
保存到数据库中
强烈建议采用与模型相同的方法。这使得代码更好,更容易支持。
请注意,Magento 中“MVC”架构的“M”字母由两层表示:模型和资源模型。
型号:
包含实体的业务逻辑。例如。将十个项目添加到一个 购物车模型触发折扣规则 由通用名称为<Your_Module>_Model_<Model_Name>
的类表示
如果需要使用 DB,则扩展 Mage_Core_Model_Abstract
并拥有一个资源
Model,负责 DB 通信
不需要实现基本的保存/加载方法,作为祖先
Mage_Core_Model_Abstract
已经准备好使用所有例程
通过调用Mage::getModel('<your_module>/<model_name>')
创建
资源模型:
作为数据库抽象层,从而从数据库保存/加载数据,执行 其他数据库查询 扩展Mage_Core_Model_Resource_Db_Abstract
以便与 DB 通信
由具有通用名称的类表示
<Your_Module>_Model_Resource_<Model_Name>
由对应模型自动创建,当需要与 DB 通信时
因此,在控制器中,您只关心创建模型。资源模型由模型自动创建。
而且,根据上面所说的,你的控制器应该是这样的:
public function testAction()
$model = Mage::getModel('your_module/your_model');
$model->setName('andy');
$model->save();
您可以下载所需内容的完整示例here。
根据您的具体情况,所提供的代码可能有多种变体。但它代表了实现您想要的东西的一般方法。
【讨论】:
哇,感谢您的知情回复,我有几个问题,我查看了示例代码,在 testController 的第 7 行,调用了 $model->setName('' );但我在任何地方都找不到 setName(''); 的函数描述符;这个例子也不在前端吗?在配置文件中使用 ?? 抱歉只重读了你评论的最后两行,可以改成管理区,再次感谢你,我会用这种方法玩一下:) 好的,很好,您使用管理员操作控制器解决了问题。关于setName()
- 您可以在模型对象上调用 set/get 。这会在该模型的$_data
数组中设置/获取“any_field”条目,然后在调用save()
方法时将其保存到数据库中。这些方法调用由魔术方法__call()
处理,该方法在Varien_Object
类中声明,是大多数Magento 模型(以及许多其他实体)的祖先。您可以在lib/Varien/Object.php
中找到源代码。我推荐你安装 XDebug,它会帮助你追踪 Magento 的细节。
嗨,Andrey,我正在查看您为我创建的更改模块名称和命名空间名称的示例,在 config.xml 中有一个标签位于 your_module_resource 下,该标签看起来像 getTable('your_module/AAAAA')
将返回 'BBBBB';以上是关于自定义 Magento 模块的主要内容,如果未能解决你的问题,请参考以下文章