搜尋
首頁資料庫mysql教程sencha architect 2 官方实例 第一个实例

汽车列表实例是一个说明数据绑定的好例子。应用可以 让用户选择列表中的一辆车来查看细节,包括一张汽车的照片,教程结束后,你应该理解如何创建和设置视图,创建model数据层,如何把数据绑定到视图中。 准备步骤 在开始课程前,请先做一下几步: 1 准备好ar

汽车列表实例是一个说明数据绑定的好例子。应用可以 让用户选择列表中的一辆车来查看细节,包括一张汽车的照片,教程结束后,你应该理解如何创建和设置视图,创建model数据层,如何把数据绑定到视图中。

sencha architect 2 官方实例 第一个实例

准备步骤

在开始课程前,请先做一下几步:

1 准备好architect软件 设置服务器 把项目部署到服务器上以便生成后查看(译者注:装个apache或nodejs即可,随便一个服务器,把生成的项目部署到public文件夹下 很简单 不赘述)

2 起码了解些extjs组件 后面课程要用到

3 下载本项目源码(地址为git :点这里)(多说一句 压缩包里面的.sda文件是architect的原文件,而文件夹中的是生成文件,把文件夹整个拷贝到服务器可以看效果)


设置初始页面

1 在工具箱中搜索 panel 通过拖放Panel组件到画布的中心来增加一个Panel组件

sencha architect 2 官方实例 第一个实例

2 Initial View的概念: 创建Panel后,在右边的inspector树中将列出这个panel,名字叫MyPanel,它的右边会有一个“Initial View 检测器”出现;鼠标放上去,architect将显示一条“这个组件是你的Initial View”,这意味着在程序开始运行时,这个Panel将第一个呈现出来。一个项目只能有一个Initial View。

sencha architect 2 官方实例 第一个实例

3 保存项目,选择保存路径 如:/Users//Sites/, C:\Inetpub\wwwroot\, C:\wamp\www\ or /var/www/. 取名为CarListings.

就是这样~

sencha architect 2 官方实例 第一个实例

点击 预览 按钮 出现对话框 填写服务器地址 如:http://localhost/CarListings/ 这取决于你的项目放在哪儿了和你的服务器环境

sencha architect 2 官方实例 第一个实例

装载data到一个表格

增加并设置表格视图

1 在Panel的title上双击,更改它为 Car Listing.

sencha architect 2 官方实例 第一个实例

2 在属性面板(Config panel)中点选属性 frame为true

sencha architect 2 官方实例 第一个实例

3 选择Panel 出现一个在右上方的小齿轮样子的浮动按钮,设置布局为 vbox,这样panel里面的子组件将竖直摆放

sencha architect 2 官方实例 第一个实例

4 拖一个 Grid Panel 到 我们的Panel容器中

5 选择 grid 在属性面板中找到 title 属性设置项 叉叉掉它,这样就去掉了grid的 title bar

sencha architect 2 官方实例 第一个实例

6 更改最顶层的Panel的 userClassName 属性,由原先的MyPanel改为CarListings,这将改变它在inspector面板的名字,也将改变它在Ext.define中生成的js类的名字。

如果你安装以上步骤做的 你应该得到像这样的一个东东:

sencha architect 2 官方实例 第一个实例

注意:我们用了vbox布局因为我们计划用竖直的方式来放更多的panels,以上的这个单独例子不设置vbox,仅仅通过设置frame为true就能达到同样效果,特别注意除非必要 否则不要嵌套容器,嵌套多层在大型项目中很有可能会有性能问题出现。

Models与Stores

如果你现在预览,你会发现grid是空的,有四个column headers --String, Number, Date, and Boolean.这是因为我们没有把我们的grid与一个data Store绑定起来。让我们来为grid绑定一个新的Store,装载一些运动型汽车的资料吧。

上面提供的压缩包文件 请大家解压缩 文件夹结构如下图:

<code><span>CarListings</span><span>/</span><span>|</span><span>____app</span><span>/</span><span>|</span><span>|</span><span>____view</span><span>/</span><span>|</span><span>|</span><span>|</span><span>____CarListings</span><span>.</span><span>js
</span><span>|</span><span>|</span><span>|</span><span>____Viewport</span><span>.</span><span>js
</span><span>|</span><span>____app</span><span>.</span><span>html
</span><span>|</span><span>____app</span><span>.</span><span>js
</span><span>|</span><span>____data</span><span>/</span><span>|</span><span>|</span><span>____2004_Porsche_911_Carrera_type_997</span><span>.</span><span>jpg
</span><span>|</span><span>|</span><span>____250px</span><span>-</span><span>2007</span><span>_Audi_TT_Coupe</span><span>.</span><span>jpg
</span><span>|</span><span>|</span><span>____250px</span><span>-</span><span>Audi_S5</span><span>.</span><span>jpg
</span><span>|</span><span>|</span><span>____250px</span><span>-</span><span>BMW_M3_E92</span><span>.</span><span>jpg
</span><span>|</span><span>|</span><span>____250px</span><span>-</span><span>Nissan_GT</span><span>-</span><span>R</span><span>.</span><span>jpg
</span><span>|</span><span>|</span><span>____cars</span><span>.</span><span>json
</span><span>|</span><span>____metadata</span><span>/</span><span>|</span><span>|</span><span>____Application
</span><span>|</span><span>|</span><span>____resource</span><span>/</span><span>|</span><span>|</span><span>|</span><span>____Library
</span><span>|</span><span>|</span><span>____view</span><span>/</span><span>|</span><span>|</span><span>|</span><span>____CarListings
</span><span>|</span><span>CarListings</span><span>.</span><span>xds</span></code>
其中 cars.json就是我们想要的数据啦,现在列举其中一个实体对象 如 保时捷 911,我们将创建一个Model来代表这个data

<code><span>{</span><span>"img"</span><span>:</span><span>"2004_Porsche_911_Carrera_type_997.jpg"</span><span>,</span><span>"manufacturer"</span><span>:</span><span>"Porsche"</span><span>,</span><span>"model"</span><span>:</span><span>"911"</span><span>,</span><span>"price"</span><span>:</span><span>135000</span><span>,</span><span>"wiki"</span><span>:</span><span>"http://en.wikipedia.org/wiki/Porsche_997"</span><span>,</span><span>"quality"</span><span>:</span><span>[{</span><span>"name"</span><span>:</span><span>"overall"</span><span>,</span><span>"rating"</span><span>:</span><span>1</span><span>},{</span><span>"name"</span><span>:</span><span>"mechanical"</span><span>,</span><span>"rating"</span><span>:</span><span>4</span><span>},{</span><span>"name"</span><span>:</span><span>"powertrain"</span><span>,</span><span>"rating"</span><span>:</span><span>2</span><span>},{</span><span>"name"</span><span>:</span><span>"body"</span><span>,</span><span>"rating"</span><span>:</span><span>4</span><span>},{</span><span>"name"</span><span>:</span><span>"interior"</span><span>,</span><span>"rating"</span><span>:</span><span>3</span><span>},{</span><span>"name"</span><span>:</span><span>"accessories"</span><span>,</span><span>"rating"</span><span>:</span><span>2</span><span>}]</span><span>}</span></code>
注意如果你用的IIS服务器,手动设置  JSON MIME 类型,这样能够传输json文件(译者注:谁会用iis呢?哈哈 当然不排除.net程序员。。。)

创建Model

让我们来为我们想要的汽车实例创建一个合适的键

1 在Inspector右上方 点击(“+”)号,然后选择Model。一个名字为MyModel的新Model将被创建在Models节点位置

sencha architect 2 官方实例 第一个实例

2 选择这个新的被创建的Model 设置它的 userClassName 属性为 CarData

3 增加字段:manufacturer, model, price, wiki, img and quality。在属性面板中查询 fields属性,点击(“+”)号,在里面填写字段 以逗号分割,点击Finish或回车

sencha architect 2 官方实例 第一个实例

如果你安装以上步骤做的 你应该得到像这样的一个东东:

sencha architect 2 官方实例 第一个实例

创建Store

现在我们有了Model来代表数据结构,现在我们来创建一个Store来用the CarData Model

1 还是点击inspector的(“+”)号 选择Store下的子菜单,选择Json Store。一个名为“MyJsonStore”将被创建,位于Stores节点之下,注意:一个JsonStore自动增加一个JsonReader并假定我们用json格式装载数据。其他格式如XML或数组也同样支持。

sencha architect 2 官方实例 第一个实例

2 在新创建的Store中出现一个警告图标,暗示Stores设置有个问题,点击图标察看问题所在

sencha architect 2 官方实例 第一个实例

sencha architect 2 官方实例 第一个实例

3 选择inspector中的Store 设置Model属性为CarData,警告消失

4 设置其userClassName为CarDataStore,在inspector中Store的名字将同步更改

5 选择CarDataStore下面的AjaxProxy,设置它的URL为data/cars.json,注意这个URL为相对路径

6 右键CarDataStore 选择Load Data,装载数据后你将看到一只眼睛 就像这样

sencha architect 2 官方实例 第一个实例

注意:当设置了代理的url配置或Store的数据配置,Load Data菜单项才可用

7 鼠标放在眼睛上能显示一些信息,现在只有一条记录被加载

sencha architect 2 官方实例 第一个实例

8 点击眼睛可以看到回传数据,一个data数组将实体数据分开,这也是为什么只有一条记录被装载的原因,选择JsonReader 设置它的root属性为data,Store设置完毕

sencha architect 2 官方实例 第一个实例

9 右键CarDataStore再次选择Load Data,因为我们更改了影响数据装载的stores属性,architect已经清除了数据缓存

10 最后 Store中 设置 autoLoad 属性为 true,这样我们不用编程加载它了

为Store绑定grid

下一步  grid是被绑定到Store的,任何时候Store中数据变了 那么grid自动改变其映射的值。任何Store中的记录添加或删除了,也会反映在grid中。

1 在inspector中选择Grid Panel,设置它的 store 属性为 CarDataStore,注意到所有的数据都消失了 那是因为我们的映射还没有建立。

2 在inspector中右键Grid Panel 选择 Auto Columns ,它将自动的将表格列与Model或Store的字段一对一匹配

 sencha architect 2 官方实例 第一个实例

如果你安装以上步骤做的 你应该得到像这样的一个东东:

sencha architect 2 官方实例 第一个实例

保存 编译 预览,看看效果吧

一个detail panel(细节面板)和grid的关联

下一步,我们做一个细节面板显示grid的每条记录的额外信息 当用户点击单条记录时 将显示细节在这里

添加细节面板

1 选择最外层的CarListing面板,通过拖动右下角让它变大 留出细节面板的位置

sencha architect 2 官方实例 第一个实例

2 还是在CarListing面板选择下,在工具箱中寻找到 panel,双击 Panel 增加一个新Panel 同时inspector中也选中了它们, 这是一个快速便捷的方式来添加组件 不用托拽了

sencha architect 2 官方实例 第一个实例

3 选择新增加的Panel,在属性栏中搜索 tpl ,然后点击 Add 按钮(“+”)。所有的组件都有tpl属性,可以接受XTemplate。

sencha architect 2 官方实例 第一个实例

一旦tpl属性被添加,点击向前箭头 打开代码编辑器 粘贴如下代码

<code><span><img  src="/static/imghwm/default1.png" data-src="/inc/test.jsp?url=http%3A%2F%2Fdocs.sencha.com%2Farchitect%2F2%2Fguides%2Ffirst_desktop_app%2FendAddDetailPanel.png&refer=http%3A%2F%2Fblog.csdn.net%2Frailsbug%2Farticle%2Fdetails%2F9002594" class="lazy" alt="sencha architect 2 官方实例 第一个实例" ><span>src</span><span>=</span><span>"data/{img}"</span><span>style</span><span>=</span><span>"</span><span>float</span><span>:</span><span> right</span><span>"</span><span>/></span><span>
  Manufacturer: {manufacturer}</span><span><br></span><span>
  Model: </span><span><a><span>href</span><span>=</span><span>"{wiki}"</span><span>target</span><span>=</span><span>"_blank"</span><span>></span><span>{model}</span><span></span></a><br></span><span>
  Price: {price:usMoney}</span><span><br></span></span></code>
像这样

sencha architect 2 官方实例 第一个实例

注意 当容器的布局为vbox或hbox时,他们的新添加子组件自动设置他们的flex为1,但如果你在设置布局之前添加子组件 你需要手动设置每个子组件的flex为1

更新细节面板

让我们来为这两个面板增加事件绑定,当一个用户点击表格中某一行,我们希望实例细节以Xtemplate的方式体现在下面的细节模板中

1 选择细节模板,设置属性 itemId -> detailPanel,这是为了在CarListings类中轻松检索出这个模板

2 在inspector中选择grid 面板,寻找 Event Binding选项,点击在右边的加号,选择 select事件 点击 finish或回车

sencha architect 2 官方实例 第一个实例

3 architect自动生成了方法,如果你想更改,用 fn 选项

3 双击inspector中的事件绑定 可以显示出代码编辑器,注意我们只需要写方法体。Function参数已经为我们定义好了

sencha architect 2 官方实例 第一个实例

5 粘贴如下代码到事件体中

<code><span>// grab a reference to the detailPanel via itemId</span><span>// the # in front of the id indicates that we would like to grab a reference by</span><span>var</span><span> detailPanel </span><span>=</span><span>this</span><span>.</span><span>child</span><span>(</span><span>'#detailPanel'</span><span>);</span><span>// update the detailPanel with data</span><span>// this will trigger the tpl to become updates</span><span>
 detailPanel</span><span>.</span><span>update</span><span>(</span><span>record</span><span>.</span><span>data</span><span>);</span></code>
注意 this 代表的是最外层panel

注意 在一些极其稀少的情况下,this不是最外层类,如 当为工程中的容器添加一个组件,组件增加一个initialize或painted事件,this指向的是Sencha Touch框架

特别注意 我们用itemId而没有用id属性。itemId属性必须是某一容器中独一无二的,但是不针对整个全局空间。id属性必须是全局唯一的,如果你用了id,那么在任何时间你只能有一个此组件的可见实例。architect鼓励代码重用,多个组件实例同时应用请参考 Linked Instances。

增加一个图表

图表数据建模

1 通过inspector建立第二个Model。设置属性 userClassName ->CarChart

2 查看quality字段的内容 如下所示。我们已经从cars.json中装在quality字段到CarStore了现在我们为图表创建一个额外的Model

<code><span>"quality"</span><span>:</span><span>[{</span><span>"name"</span><span>:</span><span>"overall"</span><span>,</span><span>"rating"</span><span>:</span><span>1</span><span>},{</span><span>"name"</span><span>:</span><span>"mechanical"</span><span>,</span><span>"rating"</span><span>:</span><span>4</span><span>},{</span><span>"name"</span><span>:</span><span>"powertrain"</span><span>,</span><span>"rating"</span><span>:</span><span>2</span><span>},{</span><span>"name"</span><span>:</span><span>"body"</span><span>,</span><span>"rating"</span><span>:</span><span>4</span><span>},{</span><span>"name"</span><span>:</span><span>"interior"</span><span>,</span><span>"rating"</span><span>:</span><span>3</span><span>},{</span><span>"name"</span><span>:</span><span>"accessories"</span><span>,</span><span>"rating"</span><span>:</span><span>2</span><span>}]</span></code>
在配置面板中 增加两个字段到CarChart Model name和rating,这都是quality字段里的键,这些字段将直接映射到cars.json

4 创建一个Store,设置属性 userClassName -> CarChartStore。不选择子菜单 直接点选Store,创建一个没有代理和reader的空白Store。

sencha architect 2 官方实例 第一个实例

5 设置Store属性 model -> CarChart Model 建立CarChartStore与CarChart的关联

增加图表

1 如果你感觉没有地方了 拖拽CarListings面板使面积增大

2 再拽一个panel到CarListings面板,拽到目标面板的title上或inspector的views节点上都行,也可以双击工具箱上图标

3 拽一个Column Chart到第三个面板(你刚刚增加的这个)

sencha architect 2 官方实例 第一个实例

4 在inspector上选择上新创建的这个panel,点击齿轮图标,设置布局为 fit。这是让图表在两个方向上伸展以适应父容器

sencha architect 2 官方实例 第一个实例


5 叉叉掉panel的title属性

sencha architect 2 官方实例 第一个实例

6 增加中间和底部panel的margin。选择中间面板 detailPanel 设置属性:margins -> 5000,注意是Ext.layout.VBoxLayout的margin而不是Ext.Abstract.Component的margin,底部panel也同样方法设置。

7 在Canvas中 点击齿轮 选择CarChartStore用JSON Store绑定Chart组件,

注意 这样设置后图表会消失,这是正常的,我们只关心用户点击数据后它的展现情况

8 选择inspector总的图表下面的Category Axis 编辑图表的x轴 这个轴展现汽车质量的分类,做以下修改:

title -> Quality

fields -> 从x到name name字段为x轴提供数值

sencha architect 2 官方实例 第一个实例

9 同样的 Numeric Axis是y轴 体现每辆车的质量分数,做一下修改

title -> Score

fields ->从y到rating

maximum -> 5

minimum ->0

majorTickSteps -> 4

10 选择MyColumnSeries,在属性面板中 label ->

<code><span>{</span><span>
      display</span><span>:</span><span>'insideEnd'</span><span>,</span><span>
      field</span><span>:</span><span>'rating'</span><span>,</span><span>
      color</span><span>:</span><span>'#333'</span><span>,</span><span>`text-anchor`</span><span>:</span><span>'middle'</span><span>}</span></code>
注意 我们必须把text-anchor括起来因为它中间有“-”

11 在MyColumnSeries中再更改属性

xField -> name

yField -> rating

12 更改chart的属性 itemId -> qualityChart

13 增加事件 onGridPanelSelect 这样用户选择时就会更新图表Store

<code><span>// grab a reference to the qualityChart, notice we use down here instead of child</span><span>// because down will go down the container hierarchy at any depth and child</span><span>// only retrieves direct children</span><span>var</span><span> chart </span><span>=</span><span>this</span><span>.</span><span>down</span><span>(</span><span>'#qualityChart'</span><span>);</span><span>// get the quality field out of this record</span><span>var</span><span> qualityData </span><span>=</span><span> record</span><span>.</span><span>get</span><span>(</span><span>'quality'</span><span>);</span><span>
  chart</span><span>.</span><span>store</span><span>.</span><span>loadData</span><span>(</span><span>qualityData</span><span>);</span></code>
好了 课程完毕了~ 

整体效果如图

sencha architect 2 官方实例 第一个实例

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
Python中的SVM实例Python中的SVM实例Jun 11, 2023 pm 08:42 PM

Python中的支持向量机(SupportVectorMachine,SVM)是一个强大的有监督学习算法,可以用来解决分类和回归问题。SVM在处理高维度数据和非线性问题的时候表现出色,被广泛地应用于数据挖掘、图像分类、文本分类、生物信息学等领域。在本文中,我们将介绍在Python中使用SVM进行分类的实例。我们将使用scikit-learn库中的SVM模

VUE3入门实例:制作一个简单的视频播放器VUE3入门实例:制作一个简单的视频播放器Jun 15, 2023 pm 09:42 PM

随着新一代前端框架的不断涌现,VUE3作为一个快速、灵活、易上手的前端框架备受热爱。接下来,我们就来一起学习VUE3的基础知识,制作一个简单的视频播放器。一、安装VUE3首先,我们需要在本地安装VUE3。打开命令行工具,执行以下命令:npminstallvue@next接着,新建一个HTML文件,引入VUE3:&lt;!doctypehtml&gt;

Gin框架中的验证码使用实例Gin框架中的验证码使用实例Jun 23, 2023 am 08:10 AM

随着互联网的普及,验证码已经成为了登录、注册、找回密码等操作的必要流程。在Gin框架中,实现验证码功能也变得异常简单。本文将介绍如何在Gin框架中使用第三方库实现验证码功能,并提供示例代码供读者参考。一、安装依赖库在使用验证码之前,我们需要安装一个第三方库goCaptcha。安装goCaptcha可以使用goget命令:$goget-ugithub

Python中的VAE算法实例Python中的VAE算法实例Jun 11, 2023 pm 07:58 PM

VAE是一种生成模型,全称是VariationalAutoencoder,中文译作变分自编码器。它是一种无监督的学习算法,可以用来生成新的数据,比如图像、音频、文本等。与普通的自编码器相比,VAE更加灵活和强大,能够生成更加复杂和真实的数据。Python是目前使用最广泛的编程语言之一,也是深度学习的主要工具之一。在Python中,有许多优秀的机器学习和深度

Python中的GAN算法实例Python中的GAN算法实例Jun 10, 2023 am 09:53 AM

生成对抗网络(GAN,GenerativeAdversarialNetworks)是一种深度学习算法,它通过两个神经网络互相竞争的方式来生成新的数据。GAN被广泛用于图像、音频、文字等领域的生成任务。在本文中,我们将使用Python编写一个GAN算法实例,用于生成手写数字图像。数据集准备我们将使用MNIST数据集作为我们的训练数据集。MNIST数据集包含

PHP 简单网络爬虫开发实例PHP 简单网络爬虫开发实例Jun 13, 2023 pm 06:54 PM

随着互联网的迅速发展,数据已成为了当今信息时代最为重要的资源之一。而网络爬虫作为一种自动化获取和处理网络数据的技术,正越来越受到人们的关注和应用。本文将介绍如何使用PHP开发一个简单的网络爬虫,并实现自动化获取网络数据的功能。一、网络爬虫概述网络爬虫是一种自动化获取和处理网络资源的技术,其主要工作过程是模拟浏览器行为,自动访问指定的URL地址并提取所

快速上手Django框架:详细教程和实例快速上手Django框架:详细教程和实例Sep 28, 2023 pm 03:05 PM

快速上手Django框架:详细教程和实例引言:Django是一款高效灵活的PythonWeb开发框架,由MTV(Model-Template-View)架构驱动。它拥有简单明了的语法和强大的功能,能够帮助开发者快速构建可靠且易于维护的Web应用程序。本文将详细介绍Django的使用方法,并提供具体实例和代码示例,帮助读者快速上手Django框架。一、安装D

VUE3初学者必备的开发技巧与实例VUE3初学者必备的开发技巧与实例Jun 16, 2023 am 09:00 AM

VUE3作为目前前端框架中使用率日益增长的框架之一,越来越多的开发者也开始尝试学习和使用它。尤其是在国内,VUE3的应用已经覆盖了很多领域,无论是移动端还是PC端都有广泛的应用。因此,本文将为初学者提供一些VUE3开发的必备技巧和实例,以帮助他们更加快速高效的开发。使用VUE3脚手架快速创建项目在学习VUE3的过程中,很多人可能会一步一步地搭建项目,这样会花

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
2 週前By尊渡假赌尊渡假赌尊渡假赌
倉庫:如何復興隊友
4 週前By尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒險:如何獲得巨型種子
4 週前By尊渡假赌尊渡假赌尊渡假赌

熱工具

DVWA

DVWA

Damn Vulnerable Web App (DVWA) 是一個PHP/MySQL的Web應用程序,非常容易受到攻擊。它的主要目標是成為安全專業人員在合法環境中測試自己的技能和工具的輔助工具,幫助Web開發人員更好地理解保護網路應用程式的過程,並幫助教師/學生在課堂環境中教授/學習Web應用程式安全性。 DVWA的目標是透過簡單直接的介面練習一些最常見的Web漏洞,難度各不相同。請注意,該軟體中

PhpStorm Mac 版本

PhpStorm Mac 版本

最新(2018.2.1 )專業的PHP整合開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

MinGW - Minimalist GNU for Windows

MinGW - Minimalist GNU for Windows

這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

強大的PHP整合開發環境