Magento 新闻模块开发教程 (三) 创建前后端控制器

javaweb新闻中心模块开发指导 javaweb开发 立即下载

之前创建了骨架目录并且激活了新模块,现在要为模块创建前台和后台的控制器。

1. 首先在app/code/local/Voodoo/News/controllers/ 中创建一个名为IndexController.php的前端控制器:

class Voodoo_News_IndexController extends Mage_Core_Controller_Front_Action{
	
    public function indexAction()
    {
	    $resource = Mage::getSingleton('core/resource');
	    $read = $resource->getConnection('core_read');
	    $newsTable = $resource->getTableName('news');
	    $select = $read->select()->from($newsTable, array('news_id', 'title', 'filename','content', 'status'))->where('status', 1)->order('created_time DESC');
	    $news = $read->fetchAll($select);
	    Mage::register('list', $news);
	    $this->loadLayout();
	    $this->renderLayout();
    }
    
	public function viewAction()
	{
	    $news_id = $this->getRequest()->getParam('id');
	    if ($news_id != null && $news_id != '') {
	        $news = Mage::getModel('news/news')->load($news_id)->getData();
	    } else {
	        $news = null;
	    }
	    /**
	    * If no param we load a the last created item
	    */
	    if ($news == null) {
		    $resource = Mage::getSingleton('core/resource');
		    $read = $resource->getConnection('core_read');
		    $newsTable = $resource->getTableName('news');
		    $select = $read->select()->from($newsTable, array('news_id', 'filename', 'title','content', 'status', 'update_time'))->where('status', 1)->order('created_time DESC');
		    $news = $read->fetchRow($select);
	    }
	    Mage::register('news', $news);
	    $this->loadLayout();
	    $this->renderLayout();
	}
}



这个controller是前端控制器,主要负责加载和显示文章列表和内容,index 控制器负责现实文章列表,当用户点击指定文章时,跳转到view动作,显示指定文章的详细信息,magento中访问数据库需要创建一个core_resource对象,这个对象可以用来执行sql语句。


接下来创建一个后台控制器NewsController.php,放在app/code/local/Voodoo/News/controllers/Adminhtml/目录下:


class Voodoo_News_Adminhtml_NewsController extends Mage_Adminhtml_Controller_action
{
	protected function _initAction()
	{
		$this->loadLayout()->_setActiveMenu('news/items')->_addBreadcrumb(Mage::helper('adminhtml')->__('Items Manager'), Mage::helper('adminhtml')->__('Item Manager'));
		return $this;
	}
	
	public function indexAction()
	{
		$this->_initAction();
		$this->_addContent($this->getLayout()->createBlock('news/adminhtml_news'));
		$this->renderLayout();
	}
	
	public function editAction()
	{
		$id = $this->getRequest()->getParam('id');
		$model = Mage::getModel('news/news')->load($id);
		if ($model->getId() || $id == 0) {
			$data = Mage::getSingleton('adminhtml/session')->getFormData(true);
			if (!empty($data)) {
			$model->setData($data);
			}
			Mage::register('news_data', $model);
			$this->loadLayout();
			$this->_setActiveMenu('news/items');
			$this->_addBreadcrumb(Mage::helper('adminhtml')->__('Item Manager'), Mage::helper('adminhtml')->__('News Item Manager'));
			$this->_addBreadcrumb(Mage::helper('adminhtml')->__('Item News'), Mage::helper('adminhtml')->__('Item News'));
			$this->getLayout()->getBlock('head')->setCanLoadExtJs(true);
			$this->_addContent($this->getLayout()->createBlock('news/adminhtml_news_edit'))->_addLeft($this->getLayout()->createBlock('news/adminhtml_news_edit_tabs'));
			$this->renderLayout();
		} else {
			Mage::getSingleton('adminhtml/session')->addError(Mage::helper('news')->__('Item does not exist'));
			$this->_redirect('*/*/');
		}
	}
	
	public function newAction()
	{
		$this->_forward('edit');
	}
	
	public function saveAction()
	{
		if ($data = $this->getRequest()->getPost()) {
			if (isset($_FILES['filename']['name']) && $_FILES['filename']['name'] != '') {
				try {
				/* Starting upload */
				$uploader = new Varien_File_Uploader('filename');
				// Any extention would work
				$uploader->setAllowedExtensions(array('jpg', 'jpeg','gif', 'png'));
				$uploader->setAllowRenameFiles(false);
				$uploader->setFilesDispersion(false);
				// We set media as the upload dir
				$path = Mage::getBaseDir('media') . DS . 'news' . DS;
				$uploader->save($path, $_FILES['filename']['name']);
				} catch (Exception $e) {
				}
				//this way the name is saved in DB
				$data['filename'] = $_FILES['filename']['name'];
			}
			$model = Mage::getModel('news/news');
			$model->setData($data)->setId($this->getRequest()->getParam('id'));
			try {
				if ($model->getCreatedTime == NULL || $model->getUpdateTime() == NULL) {
					$model->setCreatedTime(now())->setUpdateTime(now());
				} else {
				$model->setUpdateTime(now());
				}
				$model->save();
				Mage::getSingleton('adminhtml/session')->addSuccess(Mage::helper('news')->__('Item was successfully saved'));
				Mage::getSingleton('adminhtml/session')->setFormData(false);
				if ($this->getRequest()->getParam('back')) {
					$this->_redirect('*/*/edit', array('id' => $model->getId()));
				return;
				}
				$this->_redirect('*/*/');
				return;
			} catch (Exception $e) {
				Mage::getSingleton('adminhtml/session')->addError($e->getMessage());
				Mage::getSingleton('adminhtml/session')->setFormData($data);
				$this->_redirect('*/*/edit', array('id' => $this->getRequest()->getParam('id')));
				return;
			}
		}
		Mage::getSingleton('adminhtml/session')->addError(Mage::helper('news')->__('Unable to find item to save'));
		$this->_redirect('*/*/');
		}


	public function deleteAction(){
		if ($this->getRequest()->getParam('id') > 0) {
			try {
				$model = Mage::getModel('news/news');
				$model->setId($this->getRequest()->getParam('id'))->delete();
				Mage::getSingleton('adminhtml/session')->addSuccess(Mage::helper('adminhtml')->__('Item was successfully deleted'));
				$this->_redirect('*/*/');
			} catch (Exception $e) {
				Mage::getSingleton('adminhtml/session')->addError($e->getMessage());
				$this->_redirect('*/*/edit', array('id' => $this->getRequest()->getParam('id')));
			}
		}
		$this->_redirect('*/*/');
	}


	public function massDeleteAction(){
		$newsIds = $this->getRequest()->getParam('news');
		if (!is_array($newsIds)) {
			Mage::getSingleton('adminhtml/session')->addError(Mage::helper('adminhtml')->__('Please select item(s)'));
		} else {
		try {
			foreach ($newsIds as $newsId) {
			$news = Mage::getModel('news/news')->load($newsId);
			$news->delete();
			}
			Mage::getSingleton('adminhtml/session')->addSuccess(Mage::helper('adminhtml')->__('Total of %d record(s) were successfully deleted',count($newsIds)));
		} catch (Exception $e) {
			Mage::getSingleton('adminhtml/session')->addError($e->getMessage());
		}
		}
		$this->_redirect('*/*/index');
	}


	public function massStatusAction(){
		$newsIds = $this->getRequest()->getParam('news');
		if (!is_array($newsIds)) {
			Mage::getSingleton('adminhtml/session')->addError($this->__('Please select item(s)'));
		} else {
		try {
				foreach ($newsIds as $newsId) {
					$news = Mage::getSingleton('news/news')->load($newsId)->setStatus($this->getRequest()->getParam('status'))->setIsMassupdate(true)->save();
				}
				$this->_getSession()->addSuccess($this->__('Total of %d record(s) were successfully updated', count($newsIds)));
			} catch (Exception $e) {
				$this->_getSession()->addError($e->getMessage());
			}
		}
		$this->_redirect('*/*/index');
	}

	public function exportCsvAction()
	{
		$fileName = 'news.csv';
		$content = $this->getLayout()->createBlock('news/adminhtml')->getCsv();
		$this->_sendUploadResponse($fileName, $content);
	}
	
	 
	public function exportXmlAction()
	{
		$fileName = 'news.xml';
		$content = $this->getLayout()->createBlock('news/adminhtml_news_grid')->getXml();
		$this->_sendUploadResponse($fileName, $content);
	}
	
	protected function _sendUploadResponse($fileName, $content,$contentType='application/octet-stream')
	{
		$response = $this->getResponse();
		$response->setHeader('HTTP/1.1 200 OK', '');
		$response->setHeader('Pragma', 'public', true);
		$response->setHeader('Cache-Control', 'must-revalidate, postcheck=0, pre-check=0', true);
		$response->setHeader('Content-Disposition', 'attachment;filename=' . $fileName);
		$response->setHeader('Last-Modified', date('r'));
		$response->setHeader('Accept-Ranges', 'bytes');
		$response->setHeader('Content-Length', strlen($content));
		$response->setHeader('Content-type', $contentType);
		$response->setBody($content);
		$response->sendResponse();
		die;
	}
}

这个控制器主要负责后台的一些动作,比如增删查改。在_initAction()里面,我们做了三件事:加载布局,在后台设置活动菜单,

,还有添加面包屑的文本

Index action则创建一个news/adminhtml_news block和加载对应布局。其他action则不一一熬述。

调用edit操作时,用户点击编辑链接在新闻列表下新闻项目管理一节。相关新闻的编号是从ID参数和传递的消息模型中抓取,以获取具体的新闻。如果给定的新闻I产生的结果,它传递的新闻形式的数据来填充与形式给定的数据。新闻编辑表单提交后,数据的saveaction传递与更新的消息ID。还有一些其他的任务,已
实现这个方法,如装载布局,建立活动的菜单,加入面包屑的文本等等。

newAction()用于跳转到edit动作

saveActon()则用于与模型层交互,保存输入的信息

deleteAction()用于删除指定的文章

massDeleteAction()则是批量删除

massStatusAction()为批量状态修改

exportCsvAction()用于到处cvs文件

exportXmlAction()则用于导入xml文件

_sendUploadResponse则是当导出xml文件时设置http报头


Magento的控制器其实和zend framework的控制器工作原理一样,控制器必须在MVC模式下工作,它操纵模型,决定哪些视图来显示用户的要求和其他因素的基础上传递数据,查看每个用户响应,或完全关闭控制并跳转到另一个控制器。他总是保持一个控制器尽量瘦小,业务逻辑则尽量交给model来处理,skinny controller and fat model !

NewspaperBlogProject:在这个项目中,我将使用模型视图控制器设计创建一个 NewsPaperBlog。我将演示将管理员、作者和成员的所有技能分开。此外,用户可以添加 İmage 并自动 ImageResizer 将在我们需要的地方以及我们需要的地方裁剪图像 在这个项目中,我创建了一个用于新闻的 NewsPaper 博客。我用 MVC 设计模式设计了这个项目。我在这个项目中使用了 Entity Framework 6.4.4。 对于对象关系映射。此外,我在此处附加了实体数据关系映射。 立即下载

相关推荐

QT/C++实现健壮HTTP POST客户端:从基础到异常处理与性能优化

HTTP协议作为客户端与服务器通信的基石,其POST方法在数据提交、API交互等场景中扮演着核心角色。其工作原理基于请求-响应模型,通过封装TCP连接与协议细节,为应用层提供了简洁的数据传输接口。在C++桌面与嵌入式开发中,直接使用底层Socket实现HTTP不仅复杂且易出错,而利用框架进行高级封装能显著提升开发效率与代码健壮性。QT框架的`QNetworkAccessManager`等组件正是为此设计,它通过信号槽机制提供异步网络编程模型,有效管理连接与协议解析。一个健壮的HTTP客户端需要妥善处理网络波

weixin_29176179的博客 384

Magento2 创建第一个模块(极简单,即写即现即可用,不需要手动清理复杂的缓存)

新建目录Packge新建目录Packge/Fastmodule新建目录Packge/Fastmodule/etc说明:1 name:Packge_Fastmodule,要求与我们规划的名字一致;到这里,模块建完了,但是在magento里查看不到模块Packge/Fastmodule的。查看方法(以下执行命令的方法一样)是:1 进入magento的根目录,比如(/www/wwwroot/magento,每个网站的不一样,以你的为准)查看不到,如下图:说明。

2301_78010628的博客 559

保姆级教程:用Protege 5.5.0从零构建你的第一个知识图谱(附实战案例文件)

本文提供了一份详细的Protege 5.5.0使用指南,从零开始构建知识图谱。通过'中国古代文人关系网'实战案例,涵盖软件安装、本体创建、属性定义、实例填充到高级功能应用的全流程,帮助初学者快速掌握知识建模的核心技能。

weixin_26808205的博客 234

Magento多文件上传代码功能实现

不知你在使用Magento扩展开发过程中是否有曾遇到过需要上传多个文件的情况,如果是,本文恰好为你而准备,帮你寻找解决思路。 Magento后台使用的是Flex Uploader的Flash组件实现多文件上传功能;本文最后还讨论单页面多uploader组件异常问题解决。

飘痕 2590

告别纸上谈兵:在Xilinx Artix-7 FPGA上实测RGMII接口,从ILA抓包到PC Ping通全流程记录

本文详细记录了在Xilinx Artix-7 FPGA平台上实现RGMII接口的全过程,包括硬件配置、Vivado工程设置、双沿数据转换代码实现以及ILA波形分析。通过实测数据包捕获和PC端Ping测试,验证了千兆以太网通信的稳定性和可靠性,为工业通信网关等应用提供了实用参考。

weixin_33701251的博客 287

大模型推理中Prefill与Decode、KV Cache三者说明

Prefill 阶段对输入 Prompt 并行编码,一次性构建KV Cache,属于计算密集型任务。Decode 阶段逐 token 迭代生成,复用KV Cache避免重复计算,属于显存带宽密集型任务。KV Cache是自回归推理的核心基石,用显存换时间,实现两阶段衔接与高效生成。PD 分离通过任务解耦、异构硬件、异步调度、独立批处理,解决传统一体化推理的资源冲突与利用率低下问题,是当前云端大模型推理服务的主流工程优化方向。

a486259的博客 1490

magento模块实例开发,前后台开发,表单提交案例

http://www.hellokeykey.com/magento-module-tutorial-2-counter/ 表单提交案例 http://blog.chinaunix.net/uid/30278095/abstract/1.html 模块开发实例

u013583814的博客 592

1.4 你绝对不能错过的天气查询工具:MCP 标准化接入实战

本文介绍了如何构建一个符合MCP标准的天气查询服务。通过FastMCP框架集成OpenWeatherMap API,实现实时天气、天气预报和历史天气查询功能。文章详细展示了从环境准备、插件设计到控制器实现的完整流程,包括如何定义工具函数、配置路由和中间件。同时讲解了如何将MCP服务封装为LangChain工具并与DeepSeek等大模型集成,还涵盖了缓存、限流等高级特性。该示例演示了如何将任意API标准化为MCP服务,为Agent应用提供统一接口。

yonggeit的博客 3047

20. Magento 创建新闻模块(1)

news 表的结构为news( news_id, // 新闻ID title, // 新闻标题 content, // 新闻内容 created_at, // 创建时间 updated_at, // 更新时间 is_active // 是否显示 )1.添加模块文件和配置文件 2.添加前端路由 3 添加Model<global> <models> <

enlyhua的专栏 745

WinCC 7.5 读取 SQL server2016 中的表格数据

环境 win10 SQL Server 2016 WinCC V7.5 SP2 1 安装SQL Server 2016 2 选择服务器名称 .\WINCC 3 建数据库

skr? 7141

【OpenFOAM】-olaFlow-算例6- waveFloatingObject

波浪作用下的浮体的刚体运动,属于流固耦合(FSI)问题

ou_no的博客 3539

Magento开发文档(三):Magento控制器

提到模型-视图-控制器这种MVC架构,要追溯到Smalltalk编程语言和Xerox Parc。从那个时候开始,就有许多系统将自己描述为MVC架构。这些系统虽然在某些地方有细微差别,但都实现了数据层,逻辑层和前段表现代码的分离。 大部分的PHP MVC框架都拥有以下基本特征, 所有的URL请求会被前端控制器解析 前端控制器会检查请求的URL路径,并从中获取一个控制器和动作名(这个过程叫做路由) 实例化从URL中获取的控制器 该控制器中,与从URL里获取的动作名一致的方法会被调用 根据请求的变量,

u010603616的专栏 413

Windows 镜像包大全(附百度云下载链接)

插入U盘,找到下载好的两个驱动软件,并安装,先打开驱动人生万能网卡版,安装好网卡驱动,可以接入wifi或者网线了,然后打开驱动精灵,按照提示,安装所有的驱动(中间要是让你重启,就先选择稍后再说,如果有的驱动安装好之后非要你重启,关不掉的那种,那你就重启吧),等全部安装好了,重启电脑。如果你有显卡,这里以英伟达举例,我是GTX960的,当你的驱动都安装好后,右键桌面,会出现一个英伟达控制面板。安装软碟通,下载之后,一直下一步就ok,啥也不用配置,到了最后一项点击“继续试用”即可。(下载里面的网卡版即可),

悦分享 7364

magento创建模块

1. 禁用magento缓存 Admin → System → Cache Management → select all cache types 禁用它们。 2. 设置为开发者模式 php bin/magento deploy:mode:set developer 3. 模块主要文件夹在/app/code。 a 首先需要确定命名空间和模块名称。 即需要创建如下文件夹 /app/code/命名...

weixin_45627802的博客 431

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

magento新闻模块开发(二)

Magento提供了强大的Grid Widget使我们能够方便的创建数据表格,现在我们为新闻模块创建后台数据表格。 修改config.xml配置文件,添加admin路由 <config> <admin> <routers> ...

chuoban7047的博客 154

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Magento模块 -- Magento模块学习教程

Magento模块 -- Magento模块学习教程转载请注明出处(http://blog.youkuaiyun.com/xinhaozheng) Magento模块 模块(module)是Magento的核心。站点上的任何一个动作(action),无论是在前台和还是在后台的每一个操作都是通过模块来实现的。模块是可以视为一个容

magento网站建设,magento模板开发,magento支付模块 4425

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

怎么在Magento 2中创建控制器controller

请到magento技术学习网站: 控制器是模块开发系列和PHP MVC框架的重要组成部分。该功能就是接收到的请求、处理和呈现页面。 如果浏览不顺畅请到原文章出处:https://www.sky8g.com/technology/971/ 请注意可能会提示风险,这是优快云网站设置的问题,如果文章内的链接不是他们的网址,都会对用户提示有风险,请点击继续访问,本网站全部文章为免费技术分享,请...

jimbooks的博客 840

Magento2创建自定义模块步骤/教程

Magento2模块开发是magento开发人员必备的技能,此片文章中我们将一步一步教您在Magento2中创建一个HelloWorld模块, 基本要求 在Magento 2中启动模块开发过程之前,请确保满足以下要求: 安装最新版本的Magento 2,即2.1(如果您使用的是旧版本)。 如果您不想在每次更改编码时从Web存储中删除缓存,则应禁用Magento缓存。这将节省您的时间并加快您的模块开...

lemonminer的博客 1154

magento php 所需模块,Magento2创建自定义模块步骤/教程

Magento2模块开发是magento开发人员必备的技能,此片文章中我们将一步一步教您在Magento2中创建一个HelloWorld模块,基本要求在Magento 2中启动模块开发过程之前,请确保满足以下要求:安装最新版本的Magento 2,即2.1(如果您使用的是旧版本)。如果您不想在每次更改编码时从Web存储中删除缓存,则应禁用Magento缓存。这将节省您的时间并加快您的模块开发过程。...

weixin_36139240的博客 610

magento新闻模块开发(三)

修改Grid Block 在/app/code/local/Xinson/News/Block/Adminhtml/News/Grid.php中添加_prepareMassaction()函数 <?php classXinson_News_Block_Adminhtml_News...

chuoban7047的博客 156

Magento2创建一个自定义模块

在magento2中创建一个简单的helloworld自定义模块显示到前端页面

weixin_43169845的博客 955

magento php 所需模块,magento博客 - Magento2 创建基本模块

我们将在Magento 2中创建一个简单的模块,完成后,模块将在自定义前端路由的内容中显示“Hello world!”。先决条件毋庸置疑,您需要最新的Magento 2版本在我们开始Magento 2模块开发之前,有两件事是人们经常忘记的,我们建议你们去做:1.禁用Magento缓存在开发期间禁用Magento缓存将节省您一些时间,因为每次更改代码时都不需要手动刷新缓存。禁用缓存的最简单方法是转到...

weixin_42138703的博客 319

magento新闻模块开发(一)

Magento模块开发的简单示例 开发模式下开启日志记录,方便调试。 System->Developer magento/var 要开启777权限,/var/log目录下能看到(exception.log,system.log)。 模块文件 (Xinson为Packag...

chuoban7047的博客 174

php magento 开发,Magento二次开发:一个简单的Magento模块示例

电商二次开发,Magento的市场份额一定是不容忽视的,但是magento的学习难度想对较大,很多都在学习的路上迷失了。作为入门级文章,刚开始上手,不知道Magento模块到底该怎么写,也许你熟悉ThinkPHP,YII框架,它是直接将控制器Controller中的所取得相关数据直接传递到视图层View的方法,而Magento虽然也是MVC三层,但是在中间多了布局对象Layout与区块Block之...

weixin_34521351的博客 933

Magento 新闻模块开发教程 (九) 建立Block

前面八章中我们已经先后建立了文件骨架,激活文件,前后端控制器,配置文件,辅助类,模型,SQL,模板,新闻模块开发的最后一步是创建block在app\code\local\Voodoo\News\Block中创建News.php文件:<?php class Voodoo_News_

YIP 2058
上一篇: Magento 新闻模块开发教程 (二) 激活你的模块
下一篇: Magento 新闻模块开发教程 (四) 创建模块的xml配置文件
ddjohn
博客等级 码龄17年 36粉丝 135原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值