几周前,我偶然发现了A List Apart文章,标题为“管理内容管理系统” 。 它提供了有关如何在内容管理系统(CMS)后端中限制和调整用户自由的建议,以使其尽可能易于使用。
阅读这些建议,并将其与当前CMS领域主要参与者的技术可能性进行比较,我看到了很多限制。 这些CMS中的大多数根本不具备这些功能,并且无法提供理想地自定义后端用户界面的选项级别。 但是,与ProcessWire一起工作了几年,我想我已经找到了那些确实希望这样做的开发者和用户庇护所。
![ProcessWire网站的屏幕截图](https://i-blog.csdnimg.cn/blog_migrate/6acfe337c267c9a4963c6fe67a57b8db.png)
ProcessWire是一个新兴的,免费的开源 PHP CMS和内容管理框架(CMF)。 它的本质是基于一些简单的概念,并且提供了超级易用且功能强大的工具。 在本概述文章中,我想向您介绍其中一些工具和概念。 这是选择ProcessWire作为下一个CMS的四个原因。
1.它基于三个简单的核心概念:页面,字段和模板
数据的输入和输出仅基于三个核心概念,仅此而已。 这意味着,一旦您理解了这些概念,便基本了解了有关ProcessWire的所有知识及其背后的原理 。 很酷吧? 因此,让我向您介绍页面 , 字段和模板 。
页数
在ProcessWire安装的起始页面上,您会看到一个单独的分层页面树:
![ProcessWire安装](https://i-blog.csdnimg.cn/blog_migrate/629d23af81800ebd23498a67dfaeee26.png)
您在树中看到的链接称为页面 。 后端中的页面通常反映在前端中看到的页面。 例如,可以通过打开your-domain.com/about/
在前端访问屏幕快照中的“关于”页面。
但是页面不必在前端有对应的页面。 它们也可以简单地存在于后端中,并用作其他页面的数据容器。 让您刚刚读过的句子陷入:仅后端中可用的页面的概念非常强大,因为它为如何构建网站以及与输入数据进行交互提供了无限可能。
您可以并且应该将页面用于几乎所有内容。 例如,您可以有一个隐藏的设置页,您可以在其中保存诸如主导航之类的内容或诸如网站名称,标语,版权声明等一般文本。 另一个示例是博客文章的标签和类别(相当于WordPress中的分类法)。 您只需为博客文章的每个标签或类别创建页面。 让我引用Joss Sanglier关于ProcessWire中的页面的信息:
ProcessWire中的页面用于各种事物。 它们可以用作页面列表中的标记。 它们可以用作其他页面的组父。 它们可以用作类别,标签或列表或用户。 它们甚至可以用于简单的下拉选择-仅提供标签和值。
让我们打开并编辑上述“关于”页面。
![关于页面](https://i-blog.csdnimg.cn/blog_migrate/5847f4f3e7751a2427c1e7d8fae5725c.png)
现在,您正在研究ProcessWire的下一个核心概念:字段。
领域
页面包含字段 。 但是必须从两个不同的角度看待领域。 从表面上看,它们是页面的一部分,因为当您打开页面时,会看到可以使用的字段。 从技术上讲,这些字段是页面模板的一部分。 稍后我将描述模板的概念; 让我们先了解一下领域。
ProcessWire中的字段是您用来放置数据或从中选择数据的容器,例如文本,文本区域,数字,电子邮件,文件上传,其他页面等。这完全取决于您页面中包含多少个字段。 它只能有一个(例如,页面标题的字段),也可以没有任何字段(不太方便),也可以有50或100个以上的字段。
ProcessWire不像WordPress那样具有自定义字段的概念,因为ProcessWire中的每个字段都是一个自定义字段 。 您创建一个字段并确定所需的类型(请参见下面的屏幕截图)。 而已!
![ProcessWire字段](https://cms-assets.tutsplus.com/uploads/users/1166/posts/25062/image/processwire-new-field.png)
可以为字段提供标签,描述和一些注释,以显示字段下方的其他信息。 每种字段类型都有自己的设置。 让我们看一下三种字段类型和一些可以进行设置的设置:
- Textarea字段类型:您可以决定将其呈现为纯文本区域还是富文本格式的编辑器(默认为CKEditor)。 您可以决定哪些按钮应出现在CKEditor工具栏中,甚至可以直接在管理GUI中输入自定义配置选项。
- 页面字段类型:您可以将一个页面链接到另一页面,从而在它们之间创建关系。 您可以链接一个页面(一对一关系)或多个页面(一对多关系)。 您甚至可以允许从页面字段中创建新页面。
- 图像字段类型:您可以指定可以上传的图像类型(扩展名)。 您可以指定上传必须具备的最小或最大高度和宽度。
底线是:您创建的每个字段都是高度可定制的,以完全满足您的需求以及下面创建和编辑内容的人员的需求。
但是页面如何知道页面本身具有哪些字段? 因此,让我们看一下模板。
范本
创建新页面时,必须选择一个模板 。 该模板包含页面需要了解的有关其内容的所有信息(页面具有哪些字段,如何呈现这些字段以及它们的行为)。
在下面,您可以看到模板basic-page
的字段。
![ProcessWrite模板](https://i-blog.csdnimg.cn/blog_migrate/714080b34ad30ef6dae31406689c1093.png)
单击一个字段将打开一个模式窗口,您可以在其中精确地为该模板修改该字段的设置。
![ProcessWire临时属性](https://i-blog.csdnimg.cn/blog_migrate/5ecae1d3559ef353f7c9a0d28aff8581.png)
模板可以具有与之关联的同名物理PHP文件。 这些模板文件位于/site/templates/
。 在这样的文件中,您编写PHP代码和HTML标记,最终输出页面内容并呈现访问者在您的网站页面上看到的元素。
如果模板没有这样的对应文件,则与其关联的页面将无法独立呈现在前端。 这并不意味着您无法获取该页面的数据并将其输出到其他地方-您可以通过使用另一页面的现有模板文件来做到这一点。
让我们总结一下页面,字段和模板之间的技术关系:在模板中添加字段,并在创建新页面时选择模板。 编辑页面时看到的字段是您添加到所选模板的字段。
2.它有一个可以爱上的API
在你的模板文件中的代码将主要由一些基本的PHP构造像分配给变量, if
条件foreach
循环和HTML标记,一方面,并与工作ProcessWire的API ,另一方面。
您可以将API视为PHP的jQuery。 它提供方法,选择器,链接(流利接口)和遍历功能。
对于ProcessWire,API可能是令我最惊奇的一件事:它易于使用,易于理解,富有表现力且功能强大。 但是最重要的是,它使您能够以快速,简单的方式进行开发,并且与它进行交互确实很有趣 。 这很有意义。
API备忘单是一个很好的参考。 它显示了您可以使用的所有可用方法。
![ProcessWire API](https://i-blog.csdnimg.cn/blog_migrate/ad86e93342c45096d0156395646f12ce.png)
现在,让我向您介绍在模板开发期间将要处理的两个API变量: $page
和$pages
。
$ page变量
$page
变量包含特定于正在查看的页面的所有字段。 这包括所有页面共有的内置字段,以及仅此一页独有的字段。
但是如何访问页面的字段? 让我们通过一些简单的例子来深入研究。
输出名为title
的文本字段的内容:
echo $page->get("title");
// or
echo $page->title;
显示页面模板的名称:
echo "This page is using the template: " . $page->template->name;
// or
echo "This page is using the template: {$page->template->name}";
生成面包屑导航:
echo "<ul>";
foreach ($page->parents as $parent)
echo "<li><a href='{$parent->url}'>{$parent->title}</a></li>";
echo "</ul>";
从2.5.27版本开始,您还可以编写以下内容:
echo "<ul>";
echo $page->parents->each("<li><a href='{url}'>{title}</a></li>");
echo "</ul>";
仅在实际上传图像时输出图像:
if ($page->image) echo "<img src='{$page->image->url}'>";
注意:您必须将“图像”字段设置为仅包含一张图像,此功能才能起作用。
以下是将图像字段设置为包含多个图像时的一些示例。
抓取并输出第一个图像:
$image = $page->images->first();
if ($image) echo "<img src='{$image->url}'>";
抓取并输出随机图像:
$image = $page->images->getRandom();
if ($image) echo "<img src='{$image->url}'>";
循环浏览所有图像,创建具有比例高度的500像素宽度的大图像,以及具有特定质量和裁剪设置的100×100的缩略图,然后将缩略图链接到大型版本:
$options = array(
"quality" => 90,
"cropping" => "southeast"
);
foreach ($page->images as $image) {
$large = $image->width(500);
$thumb = $image->size(100, 100, $options);
echo "<a href='{$large->url}'><img src='{$thumb->url}'></a>";
}
注意:ProcessWire会即时创建任意大小的图像,然后对其进行缓存。
$ pages变量
$pages
变量是站点中所有页面的引用。 这样,您可以从任何位置访问网站的所有内容和页面。
对于下一个示例,我将参考ProcessWire的标准演示站点 ,该站点提供了美国摩天大楼的集合。
获取特定页面并输出其标题:
echo $pages->get("/cities/chicago/sears-tower/")->title;
注意: /cities/chicago/sears-tower/
是指向ProcessWire页面树层次结构中的Sears Tower页面的完整路径。
查找所有高度大于500英尺且小于或等于1,000英尺的摩天大楼:
$skyscrapers = $pages->find("template=skyscraper, height>500, height<=1000");
注意: height
是包含在skyscraper
模板中的字段。
查找1950年之前建造的所有摩天大楼,其中有10层以上的楼层,按年份降序排列,然后按楼层降序排列:
$skyscrapers = $pages->find("template=skyscraper, year<1950, floors>=10, sort=-year, sort=-floors");
注意: year
和floors
是模板skyscraper
内包含的字段。
查找芝加哥拥有60层以上的所有摩天大楼,并按楼层升序排列:
$skyscrapers = $pages->get("/cities/chicago/")->find("floors>=60, sort=floors");
找到建筑师David Childs或Renzo Piano的所有摩天大楼,然后按高度降序排序:
$david = $pages->get("/architects/david-childs/");
$renzo = $pages->get("/architects/renzo-piano/");
$skyscrapers = $pages->find("template=skyscraper, architects=$david|$renzo, sort=-height");
注意: architects
是包含在skyscraper
的字段。
3.它基于模块化且易于扩展的体系结构构建
ProcessWire本身由一个小的核心框架(将此视为具有基本功能的ProcessWire的本质)和一组预包装的模块组成,每个安装都随附这些模块。 默认情况下,其中一些核心模块已安装,而其他一些则已卸载。 将ProcessWire模块视为WordPress插件:它们扩展并自定义系统。
ProcessWire的模块化性质具有一些不错的优点:
- 该代码库更易于维护,因为核心功能与系统的其他部分隔离开并分离了,这也大大提高了总体安全性 。
- 新功能的开发正在简化,并且可以更轻松,更快速地定位和修复错误。
- 升级到较新版本的ProcessWire或单个模块通常是一件容易的事,并且您不必担心升级后一切都会中断。
安装模块
安装模块就像将模块的文件拖到/site/modules/
目录,然后在管理GUI中单击“ 安装 ”一样简单。 但是实际上,还有更多的方法可以从modules目录中安装模块 。
例如,您可以安装Modules Manager ,使您可以直接在管理GUI中浏览,下载,安装和更新模块。
模块数量:质量胜于数量
在撰写本文时,ProcessWire存在大约370个模块。 现在,您可以将这个数字与大约40,500个WordPress插件进行比较,并且这种比较确实很有趣,同时也可以揭示出来。 在此之后,您可以得出一些结论,思考一下ProcessWire及其模块的一般性质,以及它们如何与其他CMS的插件进行比较:
- ProcessWire 并不像WordPress,Joomla,Drupal等流行和广泛。
- ProcessWire模块通常具有很高的代码质量。 他们做一件事,并且做得很好。
- ProcessWire内核本身是如此强大和灵活,以至于根本不需要添加大量附加模块来对其进行扩展。 例如,您不需要创建画廊幻灯片的模块,不需要获取第一个子对象的模块,不需要生成缩略图的模块等。ProcessWire的基本功能已经涵盖了所有(以及更多)内容。
钩子
尽管挂钩是一个相当高级的主题,但它是值得注意的,它表明ProcessWire的功能非常易于更改和扩展。 ProcessWire包含数百种您可能会钩住的方法 ,以修改方法的行为。
假设我们已经使用API或Form Builder构建了一个简单的联系表单,并且某些字段被标记为后端所需。 我们要实现的是,还为必需的表单字段添加适当HTML5前端标记。 ProcessWire使这一过程变得非常容易。 我们只需简单地插入输入字段的render方法并定义我们要自定义的内容:询问是否需要该字段,添加所需的前端属性,并在输入标签的末尾添加一个星号。
$forms->addHookBefore("Inputfield::render", function ($event) {
$field = $event->object;
if ($field->required) {
$field->attr("required", "required");
$field->label .= "*";
}
});
4.它不会妨碍您,它提供工具来创建量身定制的,用户友好的界面
人们喜欢ProcessWire的主要事情之一: 不会妨碍您。 它以您想要的方式运行,并适应您开发网站的风格。
例如,您可以完全控制标记的输出,而不必强迫您采用特定的方式在文件系统上开发模板。 如果您熟悉WordPress开发风格,则可以像以前一样继续进行。 或者,如果您想创建更复杂的体系结构,则可以使用MVC启发的方法,它也将同样有效。
如前所述,页面没有一组必填字段,以便ProcessWire理解页面的结构。 (至少不可见。一些内置字段,例如对页面父级的引用或页面子级的数量等。)如果需要,您可以在页面上放置100个字段,以任何方式对其进行排序您可以根据需要指定哪些是必需的,哪些不是必需的,可以将它们放在不同的字段集或标签中,以获得更好的UI体验。
人们喜欢ProcessWire的另一个主要方面: 它自然提供了创建定制的,用户友好的界面的工具。 我在上一段中对您有所了解。 模板的自定义级别令人赞叹。 亲身经历了这一点之后,您将理解为什么ProcessWire更像是CMF而不是CMS。
例如:每个字段都附加有模板特定的上下文。 这意味着您可以指定一个模板在一个模板中具有相同的标签,描述和行为,而在另一个模板中具有完全不同的标签,描述和行为。
另一个示例是inputfield依赖项 :它们使您可以指定显示或要求页面编辑器中特定字段的条件。
另一个示例是PageTableExtended模块:它允许用户以直观直观的方式查看,编辑和修改网站页面的不同部分(由开发人员定义)。
对我而言,这就是优雅和深厚的力量的定义。
结论
本文仅能概述您可以使用ProcessWire及其所提供的内容。 简单地说,主要功能列表太长了,将超出本文的范围。 让我瞥见其中一些:
您使用ProcessWire的次数越多,对核心概念,API及其模块化体系结构的内化程度就越高,则使用它的乐趣就越大。 您将认识到ProcessWire的工具和工作流程实际上是多么强大。 可以说,限制您使用ProcessWire实现某个目标的唯一原因是您自己的想象力。
最后,我引用 ProcessWire的创建者Ryan Cramer:
有关ProcessWire的有用链接和工具:
翻译自: https://code.tutsplus.com/articles/4-reasons-to-choose-processwire-as-your-next-cms--cms-25062