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。 对于对象关系映射。此外,我在此处附加了实体数据关系映射。 立即下载

相关推荐

用Multisim复刻经典收音机:从零搭建超外差中波调幅接收机(附仿真源文件)

本文详细介绍了如何使用Multisim软件从零搭建超外差中波调幅接收机,复刻经典收音机的设计过程。通过模块化搭建、稳定性优化和增益分配等实战指南,帮助读者掌握超外差架构的核心技术,并附赠仿真源文件供实践参考。

weixin_28744423的博客 475

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

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

2301_78010628的博客 559

项目管理-(补充)七种基本质量工具

七种基本质量工具,用于PDCA循环的架构内 解决与质量相关的问题,分为老七工具和新七工具。 1)老七种:刘英只点劣质茶(流程图、因果图、直方图、散点图、帕累托图、控制图、核查表)2)新七种:锯树联亲测动优(矩阵图、树形图、关联图、亲和图、过程决策程序图、活动网络图、优先矩阵)

weixin_42081167的博客 4604

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

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

飘痕 2590

PHM算法与智能分析技术

PHM概述

柳杰的博客 1万+

大疆控制算法笔试复习指南:从PID到MPC核心考点解析

控制算法是无人机、机器人等智能装备实现自主运行的核心技术。从经典控制到现代控制,PID控制算法、LQR控制算法、预测控制算法(MPC)以及Stanley控制算法等,构成了工程实践中不可或缺的方法体系。理解其数学原理、适用条件与调参逻辑,是评估系统稳定性、动态响应与抗扰能力的基础。在无人机飞控、云台增稳、车载路径跟踪等典型场景中,这些算法直接决定了设备的实际性能表现。大疆等企业相关岗位的笔试,正是围绕上述核心知识点,考查候选人对控制系统本质的理解、数学推导能力以及工程实现素养。本文整理了一套覆盖理论基石、高频

weixin_33178839的博客 359

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

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

u013583814的博客 592

【Unity实战篇 】| Unity实现 文本框可以自适应大小,到达最大宽度之后再缩小字体

Unity实现 Text文本框可以自适应大小,到达最大宽度之后再缩小字体 需求:在文本框可以自适应大小拉伸的前提下,增加一个最大限制宽度,使其到达最大宽度后 再启用 Best Fit 实现自适应改变文字大小以适应文本框的大小。 在Unity中经常会用到文本组件的自适应大小功能,一般使用HorizontalLayoutGroup和ContentSizeFitter组件配合即可实现文本自适应的效果。

努力前行,总会成为自己心中的那道光 3万+

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

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

enlyhua的专栏 745

【Tessy】集成测试小白入门指导

本文详细介绍了如何进行集成测试的小白入门指导,从新建工程到设计用例,实现集成测试的过程详细步骤

qq_37282365的博客 1193

物联网系列③——基于ESP8266与点灯科技平台的温湿度计设计(接入小爱同学)

物联网系列③——基于ESP8266与点灯科技平台的温湿度计设计(接入小爱同学)一、设计目标二、电路展示三、存在的问题四、代码五、需要注意的问题 一、设计目标       前一阵子偶然接触到点灯科技平台,产生了制作一块ESP8266电路板,拥有以下功能: 使用CH340对ESP8266进行程序下载 使用DHT11进行温湿度数据读取 使用点灯科技平台接入物联网,可通过手机APP获得室内温湿度 接入小爱同学,通过语音获取室内温湿度信息 Mico US

weixin_43278295的博客 8853

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

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

u010603616的专栏 413

180.在 Vue3 中使用 OpenLayers 实现多个多边形的绘制、编辑、删除与清空

【摘要】本文介绍如何在Vue3+TypeScript环境下使用OpenLayers实现多边形地图交互功能。通过Composition API封装核心逻辑,实现了多边形绘制、编辑、删除及清空等操作。关键技术包括:使用VectorLayer管理图形数据,Draw/Modify/Select交互控制,以及通过ref()管理交互状态。文中提供了完整代码示例,并解决了交互对象叠加问题,为开发GIS应用提供了基础模块。该方案支持扩展为数据库存储、后端交互等高级功能。

小彭的博客 770

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

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

magento新闻模块开发(二)

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

chuoban7047的博客 154

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

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

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

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

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

怎么在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、付费专栏及课程。

余额充值