├── images ├── pic-1-1.png ├── pic-1-2.png ├── pic-1-3.png ├── pic-1-4.png ├── pic-2-1.png ├── pic-2-2.png ├── pic-2-3.png ├── pic-2-4.png ├── pic-2-5.png ├── pic-2-6.png ├── pic-2-7.png ├── pic-2-8.png ├── pic-2-9.png ├── pic-3-1.png ├── pic-3-2.png ├── pic-3-3.png ├── pic-3-4.png ├── pic-3-5.png ├── pic-3-6.png ├── pic-3-7.png ├── pic-3-8.png ├── pic-3-9.png ├── pic-4-1.png ├── pic-4-2.png ├── pic-4-3.png ├── pic-4-4.png ├── pic-4-5.png ├── pic-4-6.png ├── pic-4-7.png ├── pic-4-8.png ├── pic-4-9.png ├── pic-5-1.png ├── pic-5-2.png ├── pic-5-3.png ├── pic-5-4.png ├── pic-5-5.png ├── pic-5-6.png ├── pic-5-7.png ├── pic-5-8.png ├── pic-5-9.png ├── pic-6-1.jpg ├── pic-6-2.jpg ├── pic-6-3.jpg ├── pic-6-4.jpg ├── pic-6-5.jpg ├── pic-6-6.jpg ├── pic-6-7.jpg ├── pic-6-8.jpg ├── pic-6-9.jpg ├── pic-7-1.png ├── pic-7-2.png ├── pic-7-3.png ├── pic-7-4.png ├── pic-7-5.png ├── pic-7-6.png ├── pic-7-7.png ├── pic-7-8.png ├── pic-8-1.png ├── pic-8-2.png ├── pic-8-3.png ├── pic-8-4.png ├── pic-8-5.png ├── pic-8-6.png ├── pic-8-7.png ├── pic-8-8.png ├── pic-9-1.png ├── pic-9-2.png ├── pic-9-3.png ├── pic-9-4.png ├── pic-9-5.png ├── pic-9-6.png ├── pic-9-7.png ├── pic-9-8.png ├── pic-9-9.png ├── pic-a-1.jpg ├── pic-a-2.jpg ├── pic-a-3.jpg ├── pic-a-4.jpg ├── pic-a-5.jpg ├── pic-a-6.jpg ├── pic-10-1.png ├── pic-10-2.png ├── pic-10-3.png ├── pic-10-4.png ├── pic-10-5.png ├── pic-10-6.png ├── pic-10-7.png ├── pic-11-1.png ├── pic-11-10.png ├── pic-11-2.png ├── pic-11-3.png ├── pic-11-4.png ├── pic-11-5.png ├── pic-11-6.png ├── pic-11-7.png ├── pic-11-8.png ├── pic-11-9.png ├── pic-12-1.png ├── pic-12-2.png ├── pic-13-1.png ├── pic-13-10.png ├── pic-13-11.png ├── pic-13-12.png ├── pic-13-2.png ├── pic-13-3.png ├── pic-13-4.png ├── pic-13-5.png ├── pic-13-6.png ├── pic-13-7.png ├── pic-13-8.png ├── pic-13-9.png ├── pic-14-1.png ├── pic-14-10.png ├── pic-14-11.png ├── pic-14-12.png ├── pic-14-13.png ├── pic-14-2.png ├── pic-14-3.png ├── pic-14-4.png ├── pic-14-5.png ├── pic-14-6.png ├── pic-14-7.png ├── pic-14-8.png ├── pic-14-9.png ├── pic-16-1.png ├── pic-17-1.png ├── pic-18-1.png ├── pic-18-2.png ├── pic-18-3.png ├── pic-18-4.png ├── pic-18-5.png ├── pic-19-1.png ├── pic-19-2.png ├── pic-19-3.png ├── pic-19-4.png ├── pic-19-5.png ├── pic-19-6.png ├── pic-2-10.png ├── pic-2-11.png ├── pic-2-12.png ├── pic-2-13.png ├── pic-2-14.png ├── pic-2-15.png ├── pic-2-16.png ├── pic-2-17.png ├── pic-2-18.png ├── pic-2-19.png ├── pic-20-1.png ├── pic-20-10.png ├── pic-20-11.png ├── pic-20-12.png ├── pic-20-13.png ├── pic-20-14.png ├── pic-20-15.png ├── pic-20-16.png ├── pic-20-17.png ├── pic-20-18.png ├── pic-20-2.png ├── pic-20-3.png ├── pic-20-4.png ├── pic-20-5.png ├── pic-20-6.png ├── pic-20-7.png ├── pic-20-8.png ├── pic-20-9.png ├── pic-21-1.png ├── pic-21-2.png ├── pic-21-3.png ├── pic-21-4.png ├── pic-21-5.png ├── pic-21-6.png ├── pic-22-1.png ├── pic-22-10.png ├── pic-22-11.png ├── pic-22-12.png ├── pic-22-13.png ├── pic-22-14.png ├── pic-22-15.png ├── pic-22-16.png ├── pic-22-17.png ├── pic-22-18.png ├── pic-22-19.png ├── pic-22-2.png ├── pic-22-20.png ├── pic-22-21.png ├── pic-22-22.png ├── pic-22-23.png ├── pic-22-24.png ├── pic-22-3.png ├── pic-22-4.png ├── pic-22-5.png ├── pic-22-6.png ├── pic-22-7.png ├── pic-22-8.png ├── pic-22-9.png ├── pic-4-10.png ├── pic-4-11.png ├── pic-4-12.png ├── pic-4-13.png ├── pic-5-10.png ├── pic-5-11.png ├── pic-5-12.png ├── pic-5-13.png ├── pic-5-14.png ├── pic-5-15.png ├── pic-5-16.png ├── pic-5-17.png ├── pic-5-18.png ├── pic-5-19.png ├── pic-5-20.png ├── pic-5-21.png ├── pic-5-22.png ├── pic-5-23.png ├── pic-5-24.png ├── pic-5-25.png ├── pic-5-26.png ├── pic-5-27.png ├── pic-5-28.png ├── pic-5-29.png ├── pic-5-30.png ├── pic-5-31.png ├── pic-5-32.png ├── pic-9-10.png ├── pic-9-11.png └── pic-About_the_Author.png ├── README.md ├── SUMMARY.md └── chapters ├── introduction.md ├── appendix-B.md ├── chapter-07.md ├── chapter-08.md ├── chapter-13.md ├── chapter-01.md ├── chapter-06.md ├── chapter-21.md ├── chapter-12.md ├── chapter-17.md ├── chapter-19.md ├── appendix-A.md ├── chapter-18.md ├── chapter-03.md ├── chapter-10.md ├── chapter-04.md ├── chapter-15.md ├── chapter-16.md ├── chapter-02.md ├── chapter-14.md ├── chapter-11.md ├── chapter-09.md └── chapter-22.md /images/pic-1-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drupalchina/beginningd8cn/HEAD/images/pic-1-1.png -------------------------------------------------------------------------------- /images/pic-1-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drupalchina/beginningd8cn/HEAD/images/pic-1-2.png -------------------------------------------------------------------------------- /images/pic-1-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drupalchina/beginningd8cn/HEAD/images/pic-1-3.png -------------------------------------------------------------------------------- /images/pic-1-4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drupalchina/beginningd8cn/HEAD/images/pic-1-4.png -------------------------------------------------------------------------------- /images/pic-2-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drupalchina/beginningd8cn/HEAD/images/pic-2-1.png -------------------------------------------------------------------------------- /images/pic-2-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drupalchina/beginningd8cn/HEAD/images/pic-2-2.png -------------------------------------------------------------------------------- /images/pic-2-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drupalchina/beginningd8cn/HEAD/images/pic-2-3.png -------------------------------------------------------------------------------- /images/pic-2-4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drupalchina/beginningd8cn/HEAD/images/pic-2-4.png -------------------------------------------------------------------------------- /images/pic-2-5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drupalchina/beginningd8cn/HEAD/images/pic-2-5.png -------------------------------------------------------------------------------- /images/pic-2-6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drupalchina/beginningd8cn/HEAD/images/pic-2-6.png -------------------------------------------------------------------------------- /images/pic-2-7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drupalchina/beginningd8cn/HEAD/images/pic-2-7.png -------------------------------------------------------------------------------- /images/pic-2-8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drupalchina/beginningd8cn/HEAD/images/pic-2-8.png -------------------------------------------------------------------------------- /images/pic-2-9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drupalchina/beginningd8cn/HEAD/images/pic-2-9.png -------------------------------------------------------------------------------- /images/pic-3-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drupalchina/beginningd8cn/HEAD/images/pic-3-1.png -------------------------------------------------------------------------------- /images/pic-3-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drupalchina/beginningd8cn/HEAD/images/pic-3-2.png -------------------------------------------------------------------------------- /images/pic-3-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drupalchina/beginningd8cn/HEAD/images/pic-3-3.png -------------------------------------------------------------------------------- /images/pic-3-4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drupalchina/beginningd8cn/HEAD/images/pic-3-4.png -------------------------------------------------------------------------------- /images/pic-3-5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drupalchina/beginningd8cn/HEAD/images/pic-3-5.png -------------------------------------------------------------------------------- /images/pic-3-6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drupalchina/beginningd8cn/HEAD/images/pic-3-6.png -------------------------------------------------------------------------------- /images/pic-3-7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drupalchina/beginningd8cn/HEAD/images/pic-3-7.png -------------------------------------------------------------------------------- /images/pic-3-8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drupalchina/beginningd8cn/HEAD/images/pic-3-8.png -------------------------------------------------------------------------------- /images/pic-3-9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drupalchina/beginningd8cn/HEAD/images/pic-3-9.png -------------------------------------------------------------------------------- /images/pic-4-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drupalchina/beginningd8cn/HEAD/images/pic-4-1.png -------------------------------------------------------------------------------- /images/pic-4-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drupalchina/beginningd8cn/HEAD/images/pic-4-2.png -------------------------------------------------------------------------------- /images/pic-4-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drupalchina/beginningd8cn/HEAD/images/pic-4-3.png -------------------------------------------------------------------------------- /images/pic-4-4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drupalchina/beginningd8cn/HEAD/images/pic-4-4.png -------------------------------------------------------------------------------- /images/pic-4-5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drupalchina/beginningd8cn/HEAD/images/pic-4-5.png -------------------------------------------------------------------------------- /images/pic-4-6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drupalchina/beginningd8cn/HEAD/images/pic-4-6.png -------------------------------------------------------------------------------- /images/pic-4-7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drupalchina/beginningd8cn/HEAD/images/pic-4-7.png -------------------------------------------------------------------------------- /images/pic-4-8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drupalchina/beginningd8cn/HEAD/images/pic-4-8.png -------------------------------------------------------------------------------- /images/pic-4-9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drupalchina/beginningd8cn/HEAD/images/pic-4-9.png -------------------------------------------------------------------------------- /images/pic-5-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drupalchina/beginningd8cn/HEAD/images/pic-5-1.png -------------------------------------------------------------------------------- /images/pic-5-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drupalchina/beginningd8cn/HEAD/images/pic-5-2.png -------------------------------------------------------------------------------- /images/pic-5-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drupalchina/beginningd8cn/HEAD/images/pic-5-3.png -------------------------------------------------------------------------------- /images/pic-5-4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drupalchina/beginningd8cn/HEAD/images/pic-5-4.png -------------------------------------------------------------------------------- /images/pic-5-5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drupalchina/beginningd8cn/HEAD/images/pic-5-5.png -------------------------------------------------------------------------------- /images/pic-5-6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drupalchina/beginningd8cn/HEAD/images/pic-5-6.png -------------------------------------------------------------------------------- /images/pic-5-7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drupalchina/beginningd8cn/HEAD/images/pic-5-7.png -------------------------------------------------------------------------------- /images/pic-5-8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drupalchina/beginningd8cn/HEAD/images/pic-5-8.png -------------------------------------------------------------------------------- /images/pic-5-9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drupalchina/beginningd8cn/HEAD/images/pic-5-9.png -------------------------------------------------------------------------------- /images/pic-6-1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drupalchina/beginningd8cn/HEAD/images/pic-6-1.jpg -------------------------------------------------------------------------------- /images/pic-6-2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drupalchina/beginningd8cn/HEAD/images/pic-6-2.jpg -------------------------------------------------------------------------------- /images/pic-6-3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drupalchina/beginningd8cn/HEAD/images/pic-6-3.jpg -------------------------------------------------------------------------------- /images/pic-6-4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drupalchina/beginningd8cn/HEAD/images/pic-6-4.jpg -------------------------------------------------------------------------------- /images/pic-6-5.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drupalchina/beginningd8cn/HEAD/images/pic-6-5.jpg -------------------------------------------------------------------------------- /images/pic-6-6.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drupalchina/beginningd8cn/HEAD/images/pic-6-6.jpg -------------------------------------------------------------------------------- /images/pic-6-7.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drupalchina/beginningd8cn/HEAD/images/pic-6-7.jpg -------------------------------------------------------------------------------- /images/pic-6-8.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drupalchina/beginningd8cn/HEAD/images/pic-6-8.jpg -------------------------------------------------------------------------------- /images/pic-6-9.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drupalchina/beginningd8cn/HEAD/images/pic-6-9.jpg -------------------------------------------------------------------------------- /images/pic-7-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drupalchina/beginningd8cn/HEAD/images/pic-7-1.png -------------------------------------------------------------------------------- /images/pic-7-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drupalchina/beginningd8cn/HEAD/images/pic-7-2.png -------------------------------------------------------------------------------- /images/pic-7-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drupalchina/beginningd8cn/HEAD/images/pic-7-3.png -------------------------------------------------------------------------------- /images/pic-7-4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drupalchina/beginningd8cn/HEAD/images/pic-7-4.png -------------------------------------------------------------------------------- /images/pic-7-5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drupalchina/beginningd8cn/HEAD/images/pic-7-5.png -------------------------------------------------------------------------------- /images/pic-7-6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drupalchina/beginningd8cn/HEAD/images/pic-7-6.png -------------------------------------------------------------------------------- /images/pic-7-7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drupalchina/beginningd8cn/HEAD/images/pic-7-7.png -------------------------------------------------------------------------------- /images/pic-7-8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drupalchina/beginningd8cn/HEAD/images/pic-7-8.png -------------------------------------------------------------------------------- /images/pic-8-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drupalchina/beginningd8cn/HEAD/images/pic-8-1.png -------------------------------------------------------------------------------- /images/pic-8-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drupalchina/beginningd8cn/HEAD/images/pic-8-2.png -------------------------------------------------------------------------------- /images/pic-8-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drupalchina/beginningd8cn/HEAD/images/pic-8-3.png -------------------------------------------------------------------------------- /images/pic-8-4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drupalchina/beginningd8cn/HEAD/images/pic-8-4.png -------------------------------------------------------------------------------- /images/pic-8-5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drupalchina/beginningd8cn/HEAD/images/pic-8-5.png -------------------------------------------------------------------------------- /images/pic-8-6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drupalchina/beginningd8cn/HEAD/images/pic-8-6.png -------------------------------------------------------------------------------- /images/pic-8-7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drupalchina/beginningd8cn/HEAD/images/pic-8-7.png -------------------------------------------------------------------------------- /images/pic-8-8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drupalchina/beginningd8cn/HEAD/images/pic-8-8.png -------------------------------------------------------------------------------- /images/pic-9-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drupalchina/beginningd8cn/HEAD/images/pic-9-1.png -------------------------------------------------------------------------------- /images/pic-9-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drupalchina/beginningd8cn/HEAD/images/pic-9-2.png -------------------------------------------------------------------------------- /images/pic-9-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drupalchina/beginningd8cn/HEAD/images/pic-9-3.png -------------------------------------------------------------------------------- /images/pic-9-4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drupalchina/beginningd8cn/HEAD/images/pic-9-4.png -------------------------------------------------------------------------------- /images/pic-9-5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drupalchina/beginningd8cn/HEAD/images/pic-9-5.png -------------------------------------------------------------------------------- /images/pic-9-6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drupalchina/beginningd8cn/HEAD/images/pic-9-6.png -------------------------------------------------------------------------------- /images/pic-9-7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drupalchina/beginningd8cn/HEAD/images/pic-9-7.png -------------------------------------------------------------------------------- /images/pic-9-8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drupalchina/beginningd8cn/HEAD/images/pic-9-8.png -------------------------------------------------------------------------------- /images/pic-9-9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drupalchina/beginningd8cn/HEAD/images/pic-9-9.png -------------------------------------------------------------------------------- /images/pic-a-1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drupalchina/beginningd8cn/HEAD/images/pic-a-1.jpg -------------------------------------------------------------------------------- /images/pic-a-2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drupalchina/beginningd8cn/HEAD/images/pic-a-2.jpg -------------------------------------------------------------------------------- /images/pic-a-3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drupalchina/beginningd8cn/HEAD/images/pic-a-3.jpg -------------------------------------------------------------------------------- /images/pic-a-4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drupalchina/beginningd8cn/HEAD/images/pic-a-4.jpg -------------------------------------------------------------------------------- /images/pic-a-5.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drupalchina/beginningd8cn/HEAD/images/pic-a-5.jpg -------------------------------------------------------------------------------- /images/pic-a-6.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drupalchina/beginningd8cn/HEAD/images/pic-a-6.jpg -------------------------------------------------------------------------------- /images/pic-10-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drupalchina/beginningd8cn/HEAD/images/pic-10-1.png -------------------------------------------------------------------------------- /images/pic-10-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drupalchina/beginningd8cn/HEAD/images/pic-10-2.png -------------------------------------------------------------------------------- /images/pic-10-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drupalchina/beginningd8cn/HEAD/images/pic-10-3.png -------------------------------------------------------------------------------- /images/pic-10-4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drupalchina/beginningd8cn/HEAD/images/pic-10-4.png -------------------------------------------------------------------------------- /images/pic-10-5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drupalchina/beginningd8cn/HEAD/images/pic-10-5.png -------------------------------------------------------------------------------- /images/pic-10-6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drupalchina/beginningd8cn/HEAD/images/pic-10-6.png -------------------------------------------------------------------------------- /images/pic-10-7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drupalchina/beginningd8cn/HEAD/images/pic-10-7.png -------------------------------------------------------------------------------- /images/pic-11-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drupalchina/beginningd8cn/HEAD/images/pic-11-1.png -------------------------------------------------------------------------------- /images/pic-11-10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drupalchina/beginningd8cn/HEAD/images/pic-11-10.png -------------------------------------------------------------------------------- /images/pic-11-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drupalchina/beginningd8cn/HEAD/images/pic-11-2.png -------------------------------------------------------------------------------- /images/pic-11-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drupalchina/beginningd8cn/HEAD/images/pic-11-3.png -------------------------------------------------------------------------------- /images/pic-11-4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drupalchina/beginningd8cn/HEAD/images/pic-11-4.png -------------------------------------------------------------------------------- /images/pic-11-5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drupalchina/beginningd8cn/HEAD/images/pic-11-5.png -------------------------------------------------------------------------------- /images/pic-11-6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drupalchina/beginningd8cn/HEAD/images/pic-11-6.png -------------------------------------------------------------------------------- /images/pic-11-7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drupalchina/beginningd8cn/HEAD/images/pic-11-7.png -------------------------------------------------------------------------------- /images/pic-11-8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drupalchina/beginningd8cn/HEAD/images/pic-11-8.png -------------------------------------------------------------------------------- /images/pic-11-9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drupalchina/beginningd8cn/HEAD/images/pic-11-9.png -------------------------------------------------------------------------------- /images/pic-12-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drupalchina/beginningd8cn/HEAD/images/pic-12-1.png -------------------------------------------------------------------------------- /images/pic-12-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drupalchina/beginningd8cn/HEAD/images/pic-12-2.png -------------------------------------------------------------------------------- /images/pic-13-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drupalchina/beginningd8cn/HEAD/images/pic-13-1.png -------------------------------------------------------------------------------- /images/pic-13-10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drupalchina/beginningd8cn/HEAD/images/pic-13-10.png -------------------------------------------------------------------------------- /images/pic-13-11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drupalchina/beginningd8cn/HEAD/images/pic-13-11.png -------------------------------------------------------------------------------- /images/pic-13-12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drupalchina/beginningd8cn/HEAD/images/pic-13-12.png -------------------------------------------------------------------------------- /images/pic-13-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drupalchina/beginningd8cn/HEAD/images/pic-13-2.png -------------------------------------------------------------------------------- /images/pic-13-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drupalchina/beginningd8cn/HEAD/images/pic-13-3.png -------------------------------------------------------------------------------- /images/pic-13-4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drupalchina/beginningd8cn/HEAD/images/pic-13-4.png -------------------------------------------------------------------------------- /images/pic-13-5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drupalchina/beginningd8cn/HEAD/images/pic-13-5.png -------------------------------------------------------------------------------- /images/pic-13-6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drupalchina/beginningd8cn/HEAD/images/pic-13-6.png -------------------------------------------------------------------------------- /images/pic-13-7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drupalchina/beginningd8cn/HEAD/images/pic-13-7.png -------------------------------------------------------------------------------- /images/pic-13-8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drupalchina/beginningd8cn/HEAD/images/pic-13-8.png -------------------------------------------------------------------------------- /images/pic-13-9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drupalchina/beginningd8cn/HEAD/images/pic-13-9.png -------------------------------------------------------------------------------- /images/pic-14-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drupalchina/beginningd8cn/HEAD/images/pic-14-1.png -------------------------------------------------------------------------------- /images/pic-14-10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drupalchina/beginningd8cn/HEAD/images/pic-14-10.png -------------------------------------------------------------------------------- /images/pic-14-11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drupalchina/beginningd8cn/HEAD/images/pic-14-11.png -------------------------------------------------------------------------------- /images/pic-14-12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drupalchina/beginningd8cn/HEAD/images/pic-14-12.png -------------------------------------------------------------------------------- /images/pic-14-13.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drupalchina/beginningd8cn/HEAD/images/pic-14-13.png -------------------------------------------------------------------------------- /images/pic-14-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drupalchina/beginningd8cn/HEAD/images/pic-14-2.png -------------------------------------------------------------------------------- /images/pic-14-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drupalchina/beginningd8cn/HEAD/images/pic-14-3.png -------------------------------------------------------------------------------- /images/pic-14-4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drupalchina/beginningd8cn/HEAD/images/pic-14-4.png -------------------------------------------------------------------------------- /images/pic-14-5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drupalchina/beginningd8cn/HEAD/images/pic-14-5.png -------------------------------------------------------------------------------- /images/pic-14-6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drupalchina/beginningd8cn/HEAD/images/pic-14-6.png -------------------------------------------------------------------------------- /images/pic-14-7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drupalchina/beginningd8cn/HEAD/images/pic-14-7.png -------------------------------------------------------------------------------- /images/pic-14-8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drupalchina/beginningd8cn/HEAD/images/pic-14-8.png -------------------------------------------------------------------------------- /images/pic-14-9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drupalchina/beginningd8cn/HEAD/images/pic-14-9.png -------------------------------------------------------------------------------- /images/pic-16-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drupalchina/beginningd8cn/HEAD/images/pic-16-1.png -------------------------------------------------------------------------------- /images/pic-17-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drupalchina/beginningd8cn/HEAD/images/pic-17-1.png -------------------------------------------------------------------------------- /images/pic-18-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drupalchina/beginningd8cn/HEAD/images/pic-18-1.png -------------------------------------------------------------------------------- /images/pic-18-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drupalchina/beginningd8cn/HEAD/images/pic-18-2.png -------------------------------------------------------------------------------- /images/pic-18-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drupalchina/beginningd8cn/HEAD/images/pic-18-3.png -------------------------------------------------------------------------------- /images/pic-18-4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drupalchina/beginningd8cn/HEAD/images/pic-18-4.png -------------------------------------------------------------------------------- /images/pic-18-5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drupalchina/beginningd8cn/HEAD/images/pic-18-5.png -------------------------------------------------------------------------------- /images/pic-19-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drupalchina/beginningd8cn/HEAD/images/pic-19-1.png -------------------------------------------------------------------------------- /images/pic-19-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drupalchina/beginningd8cn/HEAD/images/pic-19-2.png -------------------------------------------------------------------------------- /images/pic-19-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drupalchina/beginningd8cn/HEAD/images/pic-19-3.png -------------------------------------------------------------------------------- /images/pic-19-4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drupalchina/beginningd8cn/HEAD/images/pic-19-4.png -------------------------------------------------------------------------------- /images/pic-19-5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drupalchina/beginningd8cn/HEAD/images/pic-19-5.png -------------------------------------------------------------------------------- /images/pic-19-6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drupalchina/beginningd8cn/HEAD/images/pic-19-6.png -------------------------------------------------------------------------------- /images/pic-2-10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drupalchina/beginningd8cn/HEAD/images/pic-2-10.png -------------------------------------------------------------------------------- /images/pic-2-11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drupalchina/beginningd8cn/HEAD/images/pic-2-11.png -------------------------------------------------------------------------------- /images/pic-2-12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drupalchina/beginningd8cn/HEAD/images/pic-2-12.png -------------------------------------------------------------------------------- /images/pic-2-13.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drupalchina/beginningd8cn/HEAD/images/pic-2-13.png -------------------------------------------------------------------------------- /images/pic-2-14.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drupalchina/beginningd8cn/HEAD/images/pic-2-14.png -------------------------------------------------------------------------------- /images/pic-2-15.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drupalchina/beginningd8cn/HEAD/images/pic-2-15.png -------------------------------------------------------------------------------- /images/pic-2-16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drupalchina/beginningd8cn/HEAD/images/pic-2-16.png -------------------------------------------------------------------------------- /images/pic-2-17.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drupalchina/beginningd8cn/HEAD/images/pic-2-17.png -------------------------------------------------------------------------------- /images/pic-2-18.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drupalchina/beginningd8cn/HEAD/images/pic-2-18.png -------------------------------------------------------------------------------- /images/pic-2-19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drupalchina/beginningd8cn/HEAD/images/pic-2-19.png -------------------------------------------------------------------------------- /images/pic-20-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drupalchina/beginningd8cn/HEAD/images/pic-20-1.png -------------------------------------------------------------------------------- /images/pic-20-10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drupalchina/beginningd8cn/HEAD/images/pic-20-10.png -------------------------------------------------------------------------------- /images/pic-20-11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drupalchina/beginningd8cn/HEAD/images/pic-20-11.png -------------------------------------------------------------------------------- /images/pic-20-12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drupalchina/beginningd8cn/HEAD/images/pic-20-12.png -------------------------------------------------------------------------------- /images/pic-20-13.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drupalchina/beginningd8cn/HEAD/images/pic-20-13.png -------------------------------------------------------------------------------- /images/pic-20-14.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drupalchina/beginningd8cn/HEAD/images/pic-20-14.png -------------------------------------------------------------------------------- /images/pic-20-15.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drupalchina/beginningd8cn/HEAD/images/pic-20-15.png -------------------------------------------------------------------------------- /images/pic-20-16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drupalchina/beginningd8cn/HEAD/images/pic-20-16.png -------------------------------------------------------------------------------- /images/pic-20-17.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drupalchina/beginningd8cn/HEAD/images/pic-20-17.png -------------------------------------------------------------------------------- /images/pic-20-18.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drupalchina/beginningd8cn/HEAD/images/pic-20-18.png -------------------------------------------------------------------------------- /images/pic-20-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drupalchina/beginningd8cn/HEAD/images/pic-20-2.png -------------------------------------------------------------------------------- /images/pic-20-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drupalchina/beginningd8cn/HEAD/images/pic-20-3.png -------------------------------------------------------------------------------- /images/pic-20-4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drupalchina/beginningd8cn/HEAD/images/pic-20-4.png -------------------------------------------------------------------------------- /images/pic-20-5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drupalchina/beginningd8cn/HEAD/images/pic-20-5.png -------------------------------------------------------------------------------- /images/pic-20-6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drupalchina/beginningd8cn/HEAD/images/pic-20-6.png -------------------------------------------------------------------------------- /images/pic-20-7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drupalchina/beginningd8cn/HEAD/images/pic-20-7.png -------------------------------------------------------------------------------- /images/pic-20-8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drupalchina/beginningd8cn/HEAD/images/pic-20-8.png -------------------------------------------------------------------------------- /images/pic-20-9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drupalchina/beginningd8cn/HEAD/images/pic-20-9.png -------------------------------------------------------------------------------- /images/pic-21-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drupalchina/beginningd8cn/HEAD/images/pic-21-1.png -------------------------------------------------------------------------------- /images/pic-21-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drupalchina/beginningd8cn/HEAD/images/pic-21-2.png -------------------------------------------------------------------------------- /images/pic-21-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drupalchina/beginningd8cn/HEAD/images/pic-21-3.png -------------------------------------------------------------------------------- /images/pic-21-4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drupalchina/beginningd8cn/HEAD/images/pic-21-4.png -------------------------------------------------------------------------------- /images/pic-21-5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drupalchina/beginningd8cn/HEAD/images/pic-21-5.png -------------------------------------------------------------------------------- /images/pic-21-6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drupalchina/beginningd8cn/HEAD/images/pic-21-6.png -------------------------------------------------------------------------------- /images/pic-22-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drupalchina/beginningd8cn/HEAD/images/pic-22-1.png -------------------------------------------------------------------------------- /images/pic-22-10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drupalchina/beginningd8cn/HEAD/images/pic-22-10.png -------------------------------------------------------------------------------- /images/pic-22-11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drupalchina/beginningd8cn/HEAD/images/pic-22-11.png -------------------------------------------------------------------------------- /images/pic-22-12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drupalchina/beginningd8cn/HEAD/images/pic-22-12.png -------------------------------------------------------------------------------- /images/pic-22-13.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drupalchina/beginningd8cn/HEAD/images/pic-22-13.png -------------------------------------------------------------------------------- /images/pic-22-14.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drupalchina/beginningd8cn/HEAD/images/pic-22-14.png -------------------------------------------------------------------------------- /images/pic-22-15.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drupalchina/beginningd8cn/HEAD/images/pic-22-15.png -------------------------------------------------------------------------------- /images/pic-22-16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drupalchina/beginningd8cn/HEAD/images/pic-22-16.png -------------------------------------------------------------------------------- /images/pic-22-17.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drupalchina/beginningd8cn/HEAD/images/pic-22-17.png -------------------------------------------------------------------------------- /images/pic-22-18.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drupalchina/beginningd8cn/HEAD/images/pic-22-18.png -------------------------------------------------------------------------------- /images/pic-22-19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drupalchina/beginningd8cn/HEAD/images/pic-22-19.png -------------------------------------------------------------------------------- /images/pic-22-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drupalchina/beginningd8cn/HEAD/images/pic-22-2.png -------------------------------------------------------------------------------- /images/pic-22-20.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drupalchina/beginningd8cn/HEAD/images/pic-22-20.png -------------------------------------------------------------------------------- /images/pic-22-21.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drupalchina/beginningd8cn/HEAD/images/pic-22-21.png -------------------------------------------------------------------------------- /images/pic-22-22.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drupalchina/beginningd8cn/HEAD/images/pic-22-22.png -------------------------------------------------------------------------------- /images/pic-22-23.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drupalchina/beginningd8cn/HEAD/images/pic-22-23.png -------------------------------------------------------------------------------- /images/pic-22-24.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drupalchina/beginningd8cn/HEAD/images/pic-22-24.png -------------------------------------------------------------------------------- /images/pic-22-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drupalchina/beginningd8cn/HEAD/images/pic-22-3.png -------------------------------------------------------------------------------- /images/pic-22-4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drupalchina/beginningd8cn/HEAD/images/pic-22-4.png -------------------------------------------------------------------------------- /images/pic-22-5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drupalchina/beginningd8cn/HEAD/images/pic-22-5.png -------------------------------------------------------------------------------- /images/pic-22-6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drupalchina/beginningd8cn/HEAD/images/pic-22-6.png -------------------------------------------------------------------------------- /images/pic-22-7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drupalchina/beginningd8cn/HEAD/images/pic-22-7.png -------------------------------------------------------------------------------- /images/pic-22-8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drupalchina/beginningd8cn/HEAD/images/pic-22-8.png -------------------------------------------------------------------------------- /images/pic-22-9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drupalchina/beginningd8cn/HEAD/images/pic-22-9.png -------------------------------------------------------------------------------- /images/pic-4-10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drupalchina/beginningd8cn/HEAD/images/pic-4-10.png -------------------------------------------------------------------------------- /images/pic-4-11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drupalchina/beginningd8cn/HEAD/images/pic-4-11.png -------------------------------------------------------------------------------- /images/pic-4-12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drupalchina/beginningd8cn/HEAD/images/pic-4-12.png -------------------------------------------------------------------------------- /images/pic-4-13.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drupalchina/beginningd8cn/HEAD/images/pic-4-13.png -------------------------------------------------------------------------------- /images/pic-5-10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drupalchina/beginningd8cn/HEAD/images/pic-5-10.png -------------------------------------------------------------------------------- /images/pic-5-11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drupalchina/beginningd8cn/HEAD/images/pic-5-11.png -------------------------------------------------------------------------------- /images/pic-5-12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drupalchina/beginningd8cn/HEAD/images/pic-5-12.png -------------------------------------------------------------------------------- /images/pic-5-13.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drupalchina/beginningd8cn/HEAD/images/pic-5-13.png -------------------------------------------------------------------------------- /images/pic-5-14.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drupalchina/beginningd8cn/HEAD/images/pic-5-14.png -------------------------------------------------------------------------------- /images/pic-5-15.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drupalchina/beginningd8cn/HEAD/images/pic-5-15.png -------------------------------------------------------------------------------- /images/pic-5-16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drupalchina/beginningd8cn/HEAD/images/pic-5-16.png -------------------------------------------------------------------------------- /images/pic-5-17.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drupalchina/beginningd8cn/HEAD/images/pic-5-17.png -------------------------------------------------------------------------------- /images/pic-5-18.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drupalchina/beginningd8cn/HEAD/images/pic-5-18.png -------------------------------------------------------------------------------- /images/pic-5-19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drupalchina/beginningd8cn/HEAD/images/pic-5-19.png -------------------------------------------------------------------------------- /images/pic-5-20.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drupalchina/beginningd8cn/HEAD/images/pic-5-20.png -------------------------------------------------------------------------------- /images/pic-5-21.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drupalchina/beginningd8cn/HEAD/images/pic-5-21.png -------------------------------------------------------------------------------- /images/pic-5-22.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drupalchina/beginningd8cn/HEAD/images/pic-5-22.png -------------------------------------------------------------------------------- /images/pic-5-23.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drupalchina/beginningd8cn/HEAD/images/pic-5-23.png -------------------------------------------------------------------------------- /images/pic-5-24.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drupalchina/beginningd8cn/HEAD/images/pic-5-24.png -------------------------------------------------------------------------------- /images/pic-5-25.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drupalchina/beginningd8cn/HEAD/images/pic-5-25.png -------------------------------------------------------------------------------- /images/pic-5-26.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drupalchina/beginningd8cn/HEAD/images/pic-5-26.png -------------------------------------------------------------------------------- /images/pic-5-27.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drupalchina/beginningd8cn/HEAD/images/pic-5-27.png -------------------------------------------------------------------------------- /images/pic-5-28.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drupalchina/beginningd8cn/HEAD/images/pic-5-28.png -------------------------------------------------------------------------------- /images/pic-5-29.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drupalchina/beginningd8cn/HEAD/images/pic-5-29.png -------------------------------------------------------------------------------- /images/pic-5-30.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drupalchina/beginningd8cn/HEAD/images/pic-5-30.png -------------------------------------------------------------------------------- /images/pic-5-31.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drupalchina/beginningd8cn/HEAD/images/pic-5-31.png -------------------------------------------------------------------------------- /images/pic-5-32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drupalchina/beginningd8cn/HEAD/images/pic-5-32.png -------------------------------------------------------------------------------- /images/pic-9-10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drupalchina/beginningd8cn/HEAD/images/pic-9-10.png -------------------------------------------------------------------------------- /images/pic-9-11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drupalchina/beginningd8cn/HEAD/images/pic-9-11.png -------------------------------------------------------------------------------- /images/pic-About_the_Author.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drupalchina/beginningd8cn/HEAD/images/pic-About_the_Author.png -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Beginning Drupal 8 中文版 2 | 3 | *上传到主分支:* 4 | 你可以登录到自己的分支,然后找一个request 的按钮,点击进入,然后默认配置往下走。 5 | 6 | 现在DrupalChina正在组织校对《Beginning Drupal 8》一书,现在正在分工对中文进行校对。 7 | 8 | Drupal8翻译:342823468(不参与勿加) 9 | 10 | 翻译分工详见:[组织《Beginning Drupal 8》中文版翻译](http://drupalchina.cn/node/6096 "") 11 | 12 | 13 | 文档格式:Markdown 14 | 15 | github地址:https://github.com/drupalchina/beginningd8cn 16 | 17 | 关于markdown: 18 | 19 | window 推荐用:http://markdownpad.com/ 20 | mac 推荐用:http://25.io/mou/ 21 | Mastering Markdown:https://guides.github.com/features/mastering-markdown/ 22 | 中文的语法指导:http://markdown.tw/ 23 | -------------------------------------------------------------------------------- /SUMMARY.md: -------------------------------------------------------------------------------- 1 | # Summary 2 | 3 | * [Introduction](README.md) 4 | * [前言](chapters/introduction.md) 5 | * [第1章 Drupal介绍](chapters/chapter-01.md) 6 | * [第2章 创建和管理内容](chapters/chapter-02.md) 7 | * [第3章 创建和管理用户](chapters/chapter-03.md) 8 | * [第4章 分类](chapters/chapter-04.md) 9 | * [第5章 内容类型](chapters/chapter-05.md) 10 | * [第6章 使用Drupal主题](chapters/chapter-06.md) 11 | * [第7章 创建菜单](chapters/chapter-07.md) 12 | * [第8章 Drupal 区块](chapters/chapter-08.md) 13 | * [第9章 视图](chapters/chapter-09.md) 14 | * [第10章 创建页面](chapters/chapter-10.md) 15 | * [第11章 Drupal模块](chapters/chapter-11.md) 16 | * [第12章 模块剖析](chapters/chapter-12.md) 17 | * [第13章 多语言功能](chapters/chapter-13.md) 18 | * [第14章 管理站点](chapters/chapter-14.md) 19 | * [第15章 使用 Drush](chapters/chapter-15.md) 20 | * [第16章 使用 Git](chapters/chapter-16.md) 21 | * [第17章 全部放在一起](chapters/chapter-17.md) 22 | * [第18章 响应式网站](chapters/chapter-18.md) 23 | * [第19章 创建博客网站](chapters/chapter-19.md) 24 | * [第20章 创建一个企业网站](chapters/chapter-20.md) 25 | * [第21章 构建社区网站](chapters/chapter-21.md) 26 | * [第22章 构建电子商务网站](chapters/chapter-22.md) 27 | * [附录A 安装 Drupal](chapters/appendix-A.md) 28 | * [附录B 其他资源](chapters/appendix-B.md) 29 | 30 | -------------------------------------------------------------------------------- /chapters/introduction.md: -------------------------------------------------------------------------------- 1 | # 前言 # 2 | 3 | 翻译:蹊 4 | 5 | ## 关于作者 ## 6 | 7 | ![关于作者](../images/pic-About_the_Author.png) 8 | 9 | Todd Tomlinson 在亚利桑那州吉尔伯特镇Unicon公司担任Drupal高级企业架构师。在过去20年中,为世界各地公共和私营部门的客户设计,开发,部署和支持复杂的网络解决方案。从Drupal4开始,他一直用Drupal作为主要平台,创建了出色和性能卓越的站点。 10 | 11 | ## 关于技术审查 ## 12 | 13 | Clive Linsell 是一名ISOS( www.isos.com )的高级开发人员。他计划,开发并交付了几十个商业级的解决方案,覆盖了广泛的行业。他广泛的用PHP(Drupal,Symfony,CodeIgniter等),C#,Ruby和(最近的)Swift进行工作。他会弹吉和钢琴,还是利物浦足球俱乐部的忠实支持者。大多可以在Drupal Answers( http://drupal.stackexchange.com )找到他,他的帮助相当于版主。 14 | 15 | ## 致谢 ## 16 | 17 | 我要感谢以下人员: 18 | 19 | 我的妻子Misty每天激励我做所有能做的事情。 20 | 21 | 我的父母鼓励我去探索新的机遇。 22 | 23 | 我的姐姐为有我这样的一个极客弟弟感到酷。 24 | 25 | 我的女儿Anna, Alissa, 和 Emma在她们很想去电影院和公园的时候,给我这个爸爸时间写书。 26 | 27 | 我的优秀团队:John Blakely, Chris Franz, John Lewis, Eric Goldman, Lasbrey Nwachukwu,Chuck Crandall, Robert Nield, Drew Wills, Jim Layne, Jason Lacy, David Lipari, Jesus Cabanillas, Dan Barber,Jillian Fenton, Lisa Di Pietro, Patty Wolfe, Chris Lawson, and Patience Breinholt。你们让工作不只是挂帽子,你们做的每一件事让工作像一个大家庭。John, Justin, Abby, Todd P., Todd M., Jason, Nick, Troy, Daniel, Darren, and Jon在过去的两年中一直站在我这边,像兄弟一样渡过人生。我期待着和你们未来的旅程。 28 | 29 | 渴望创建Drupal的理想和激情。 30 | 31 | Drupal社区竭诚为您制作星球上最好的CMS平台。 32 | 33 | Apress出版社团队领导我跨越创作这本书的丛林。没有你们对出版这本星球上最好的书的热情,我没有机会把“出版一本书”从我的遗愿清单上划掉。 34 | 35 | ## 简介 ## 36 | 37 | 在短暂的生命里,Drupal已经对互联网的风景产生了巨大的影响。作为一个网络内容管理系统(CMS),Drupal能够为或大或小的组织,创建特性和内容丰富的网站。作为一个web应用程序框架,Drupal正在改变人们思考web应用程序开发的方式。当我第一次接触到Drupal平台的能量,我意识这不仅仅是另一个内容管理解决方案。当我看到如此轻松快速地构建功能丰富的网站,我的齿轮转向,整个职业生涯聚焦Drupal。与客户工作的时候,我经常被问起,“我在哪里可以去找比Drupal新的?”不幸的是这里没有我可以指出的全面资源。因此我开始我的旅程:编写 Beginning Drupal 7, Pro Drupal 7 Development, 还有现在的 Beginning Drupal 8. 38 | 39 | 我也经常被问,“什么是Drupal?”简短的回答是,“Drupal是一个开源的web内容管理系统,允许您快速轻松地创建简单或复杂的网站,跨度从一个简单的博客到一个企业网站,社交网站,或几乎任何你能想到的。“构建Drupal只会被你的想象力和你在平台上花费的时间所限制。 40 | 41 | 作为一个开源的平台,Drupal社区不断通过创造新的和令人兴奋的附加模块提高平台和扩展核心平台的功能。如果这里有一个新的概念出现在web上,同天就会出现一个实现这个概念的Drupal模块。背后的社区平台成就了Drupal的今天,也将成就未来。我将向您展示如何利用来自于社区的功能,方便您用最少的工作构建不可思议的解决方案。 42 | 43 | 拿起这本书是你踏上如何使用Drupal旅程的第一步。如果你跟着我贯穿全书,你将具备知识和经验去建立复杂而有力的基于Drupal的网站。你也必须有必要的基础去超越基本,扩展我在这本书里提到的概念。 44 | 45 | 学习Drupal和学习任何新技术一样,会有颠簸和障碍,它们会让你退缩,划伤你的头。我希望这本书可以帮助你平滑颠簸并为你提供足够的信息轻松越过这些障碍。我期待看到你的网站并和你相遇在即将召开的DrupalCon。 46 | 47 | -------------------------------------------------------------------------------- /chapters/appendix-B.md: -------------------------------------------------------------------------------- 1 | # 附录B 其他资源 2 | 3 | 在开始学习Drupal 之前,有些时候你需要找一些Drupal 模块,主题或者是其他Drupal相关的技术(比如主体化),甚至一些操作系统级别的命令使用(比如如何使用命令行备份网站), 因此,这里将会总结一些常用的网站。 4 | 5 | ## Drupal 模块 6 | 7 | 寻找Drupal模块主要来源是官方站点Drupal.org ( www.drupal.org/project/project_module ),每一个社区贡献的Drupal木块都会有一个独立的主页,在那里有此模块的不同版本的下载地址,甚至一些相关文档的连接和示例。 8 | 9 | ## Drupal 主题 10 | 11 | 寻找Drupal主题主要来源是官方站点Drupal.org( www.drupal.org/project/project_theme ),一般你可以搜索到几十个主题,通过查看每个主题的截图,挑选出你想要然后下载下来。 12 | 13 | ## Drupal 文档 14 | 15 | Drupal 社区里面汇集了很多在线指南( www.drupal.org/documentation ),你可以找到下面的指导目录。 16 | 17 | * 使用和开发者指南(User and Builder Guides) 18 | * 理解Drupal(Understanding Drupal) 19 | * 安装指南(Installation Guide) 20 | * 管理和安全指南(Administration & Security Guide) 21 | * 结构指南(Structure Guide) 22 | * 建站指南(Site Building Guide) 23 | * 多语言指南(Multilingual Guide) 24 | * 主题化指南(Theming Guide) 25 | * 移动指南(Mobile Guide) 26 | * 开发者指南(Developer Guides) 27 | * Drupal 开发(Develop for Drupal) 28 | * API 参考(API Reference) 29 | * 开发者示例(Examples for Developers) 30 | * Git 文档(Git documentation) 31 | * 其他信息(Other Information) 32 | * 名词解释(Glossary) 33 | * 代码片段(Code snippets) 34 | * 故障排除(Troubleshooting) 35 | * 常见问题解答(FAQs) 36 | * 教程(Tutorials and recipes) 37 | * 资源向导(Resource guides) 38 | 39 | ## 问题讨论区 40 | 41 | Drupal 官方论坛是最好的寻求帮助的地方( www.drupal.org/forum ),可能对于每一个你想象的到的问题这里有成千上万中解决方案。 如果你遇到问题,很有可能这里已经有详细的解决方案了,当然如果你找不到你可以在此论坛中提出问题然后你会在几个小时之后收到别人的解答。另外就是Druapl的问题社区了( http://drupal.stackexchange.com ),Stack Exchange通常遇到问题的第二个去处。 42 | 43 | ## 站点部署服务商 44 | 45 | 如果你在找一个可以部署你的Drupal网站的地方,你可以在 www.drupal.org/hosting 中找到很多支持Drupal 的公司。 46 | 47 | ## 去哪里学习HTML,CSS 48 | 49 | w3cschools( www.w3schools.com )是一个很不错的学习站点,你可以找到很多容易理解的教程和优秀的代码示例。 也有其他站点比如Code School( www.codeschool.com ) 会有一些免费的教程。 50 | 51 | ## 视频教程 52 | 53 | 在youtube上面有成千上万个视频教程基本上涵盖Drupal的大部分话题。 在搜索框中输入"Drupal" 你将会找到很多相关的视频。 也有一些很不错的优秀的付费站点比如Drupalize ( https://drupalize.me ) 和BuildAModule ( http://buildamodule.com )。 54 | 55 | ## Drupal 播客(Drupal Podcasts) 56 | 57 | 在iTunes 中也有很多Drupal 相关的podcasts资源。 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | -------------------------------------------------------------------------------- /chapters/chapter-07.md: -------------------------------------------------------------------------------- 1 | #第7章 创建菜单# 2 | 译者:勇敢的心(鑫) 3 | 4 | 确定你的新网站成功与否的一个关键因素是,游客是否能够在你的网站中找到信息,特别是那些你希望他们找到的信息。Drupal有三种为网站提供导航功能的基本机制: 5 | 6 | * 能够引导用户到新页面的嵌入内容的文字链接 7 | * 单击时能够引导用户到新页面的图像和按钮 8 | * 文字或图片的水平或垂直的链接菜单 9 | 10 | 在本章中,您将学习如何使用Drupal的管理员界面来创建和管理菜单。 11 | 12 | ##菜单排序## 13 | 菜单的最简单的形式,是将用户引导到一个新网页或网页的水平或垂直的链接列表。 14 | 如果你检查你的新网站的首页,只在这个页面上你就会看到至少六个菜单。参见图7-1。 15 | 16 | ![图7-1 网站上的菜单](../images/pic-7-1.png) 17 | 18 | 图7-1 网站上的菜单 19 | 20 | 从上到下,网站上的菜单是 21 | 22 | * 管理菜单,包括“管理(Manage)”等; 23 | * 页面顶部的子管理菜单栏,包括“内容(Content)”等; 24 | * 用户帐户菜单(标题栏顶部),包括“我的账户(My account)”和“注销(Log out)”; 25 | * 主导航菜单,包括“首页选项卡(the Home tab)”等; 26 | * 左侧栏中的工具菜单,包括“添加内容(Add content)”等; 27 | * 页脚菜单,包括“Contact(联系表单)”等。 28 | 29 | 菜单帮助网站访客了解(和访问)该网站提供的内容,特色和功能。在这本书中,我们创建的示例网站上,显示的菜单都是文本链接。Drupal 8还提供了创建基于按钮和/或图像的菜单的机制。创建菜单是通过Drupal8内核中的一组页面完成的。创建菜单以及菜单上的项目有三个基本活动: 30 | 31 | * 添加一个项目到已有的菜单。 Drupal 8自带一些已经创建好的菜单。你需要做的就是为这些菜单添加项目。 32 | * 创建一个新菜单。如果Drupal 8自带的菜单不能满足需求,你可以自己创建一个新的菜单。 33 | * 将菜单分配在页面上的区域中。如果你创建了一个新的菜单,你需要为将分配一个页面上的区域内。 34 | 35 | ##为菜单添加项目## 36 | 两个可以添加到我们的页面上作为菜单项的通用项目: 37 | 指向我们网站中现有元素(一个页面,一个内容项,一个与分类项相关联的内容列表,等等)的链接,或者指向网站外部的链接(例如,www.drupal.org)。 38 | 39 | **为菜单添加内容项** 40 | 为菜单添加项目的两种方法: 41 | 42 | * 最好的做法是使用内容创建页面(参见图7-2),或者,本书后面将提到的,其他元素的创建页面,如面板页面或视图。之所以使用这种方法,是因为当你删除该内容项目时,Drupal将自动从相应的菜单栏中删除该项目。当你使用菜单管理页面来手动创建一个菜单项时,作为网站的所有者你必须记住,从菜单中手动删除该项目。 43 | * 你也可以使用菜单管理页面创建菜单项,或者创建或编辑内容的时候,直接在表单中创建菜单项 。 44 | 45 | ![图7-2 为菜单添加项目](../images/pic-7-2.png) 46 | 47 | 图7-2 为菜单添加项目 48 | 49 | 要创建一个新的内容项,单击您的网站首页上(假设你是以管理员身份登录的)的任何“添加内容(Add content)”链接,然后选择“基本页面(Basic page)”内容类型。比如, 为新创建的内容类型输入标题和正文,然后点击右侧的菜单设置链接,之后选中"创建一个菜单链接(Provide a menu link)",就会显示出定义菜单的表单(参见图7-2)。输入你希望该项目出现在菜单上的标题,并在“父项(Parent item)”下拉列表中选择“主导航”界面,这里是你希望该项目出现的位置。在输入菜单项的值后,点击页面底部的“保存和发布(Save and publish)”按钮, Drupal将显示您刚才创建的页面,与该页面相关联的菜单项也会出现在该页面左上角的主导航菜单中。在网站的任何一个页面,只要点击这个链接, 就会直接跳转到我们刚刚创建的页面。 50 | 51 | ##为外部网页添加菜单项## 52 | 您可以通过添加一个菜单项来添加通向外部网站的菜单项。要做到这一点,点击页面顶部的“管理(Manage)” 链接,并点击子菜单中的“结构(Structure)”链接。在“结构(Structure)”页面上,单击“菜单(Menus)”链接。在“ 菜单(Menus)”页面上,单击主导航菜单中“编辑菜单(Edit menu)”按钮旁边的三角图标,并选择“添加链接(Add link)”选项。然后你会看到“添加菜单链接(Add menu link)”的页面(见图7-3)。输入标题(此例中,我使用了Apress),链接,这是我们要链接的外部页面的完整网址(在这个示例中我使用了 http://apress.com ),确定“已启用(Enabled)”复选框被选中,而且出于演示的目的,从在“父链接(Parent link)”下拉列表中选择“主导航(Main navigation)”。 53 | 54 | ![图7-3 为外部网页添加菜单项](../images/pic-7-3.png) 55 | 56 | 图7-3 为外部网页添加菜单项 57 | 58 | 输入所有值后,单击页面底部的“保存(Save)”按钮(可能需要向下滚动才能看到它)。 Drupal将显示分配给主导航菜单的菜单项的完整列表,包括我们刚刚创建的新项。通过点击管理菜单中的“返回网站(Back to site)”导航链接回到你的网站的首页。 现在你可以看到刚才添加的新菜单项。点击该菜单项将带你到你在创建菜单项时输入的外部链接。 59 | 60 | ##创建一个新菜单## 61 | 有时Drupal8创建和启用的标准菜单不足以满足你的需求,这时你就需要创建新的菜单。举个例子,当为公共图书馆创建一个基于Drupal的网站时,我经常被要求为图书馆中每个部门创建独特的菜单(Adult Services,Youth Services,Teen Services,Circulation等等各一个菜单)。在这种情况下,Drupal 8附带的基本菜单不能满足该图书馆的要求。要创建一个新的菜单,单击你的网站任何页面顶部的“管理(Manage)”链接,选择子菜单中的“结构(Structure)”链接。在“Structure”页面上单击“菜单(Menus)”,并在“Menus”页面点击“添加菜单(Add Menu)”链接。这时将显示用于创建一个新的菜单的页面(参见图7-4),输入菜单的标题和说明(可选),单击“保存(Save)”按钮,现在你有了一个新的菜单,接下来就可以使用本章前面描述的方法来为它添加项目了 62 | 63 | ![图7-4 创建一个新的菜单](../images/pic-7-4.png) 64 | 65 | 图7-4 创建一个新的菜单 66 | 67 | 保存菜单后,您就可以为它添加项目了。作为练习,使用“为外部网页添加菜单项”这一节中所述的过程,为下面的外部链接创建菜单项:apress.com,yahoo.com,google.com和bing.com。完成后,你的菜单应该如图7-5所示。 68 | 69 | ![图7-5 您的具有项目的菜单](../images/pic-7-5.png) 70 | 71 | 图7-5 您的具有项目的菜单 72 | 73 | 这时,该菜单中就在 Drupal 上生成了,但它还没有被分配到页面的某一区域,因此它对网站访问者还是不可见的。为了使你的菜单可见,点击任意页面顶部的“管理(Manage)”链接,并点击子菜单中的“结构 (Structure)”链接。在结构页面点击“区块布局(Block layout)”链接。在“区块布局(Block layout)”页面,向下滚动直到你在该页面右侧“放置区块(Place blocks)”一栏中找到特殊功能菜单(Special Features Menu )(参见图7-6)。 74 | 75 | ![图7-6 “Block layout”页面](../images/pic-7-6.png) 76 | 77 | 图7-6 “Block layout”页面 78 | 79 | 单击“特殊功能菜单”链接,将打开“配置区块(Configure block)”的页面(见图7-7)。在该页面选择您希望菜单出现的区域。假设你正在使用 Bartik 主题,选择 Sidebar Second 选项,然后单击“保存区块(Save block)”按钮。有关 Bartik 主题中可用区域的概述,请参阅第六章。 80 | 81 | ![图7-7 为特殊功能菜单分配区域](../images/pic-7-7.png) 82 | 83 | 图7-7 为特殊功能菜单分配区域 84 | 85 | 点击屏幕左上角的“返回网站(Back to site)”按钮返回到首页。瞧!你的新菜单出现了(见图7-8)。现在,您可以进行分类啦。 86 | 87 | ![图7-8 特别功能菜单出现在首页上](../images/pic-7-8.png) 88 | 89 | 图7-8 特别功能菜单出现在首页上 90 | 91 | #总结# 92 | 93 | 在这一章,介绍了向菜单添加链接和创建菜单的基础知识。我解释了为菜单添加内容项目和添加外部网站链接的过程。我还介绍了如何启用新的菜单,使其出现你的网站上。 94 | 95 | 在下一章中,我会进入区块,讲解将各种各样的内容和图像导入网站的基础知识。 96 | -------------------------------------------------------------------------------- /chapters/chapter-08.md: -------------------------------------------------------------------------------- 1 | # 第8章 Drupal 区块 2 | 3 | 在本章中,我重点介绍如何使用块将内容和一些“小部件”(包括用户登录表单,最新的博客文章,当前登录到您的网站的列表,目前天气情况,等等)放入特定位置。我将介绍Drupal8的标准区块,贡献模块附带的区块,以及如何建立一个全新的自定义区块的信息。在本章的最后,你可以使用这个令人兴奋地功能创建页面内容。 4 | 5 | ## 区块 6 | 7 | 区块是一个通用术语,适用于自己包含的内容,菜单,或者代码。Drupal 8有一些附带的标准预置区块:“用户登录”区块,搜索区块,“谁在线”区块,“最新用户”区块,“最新内容”区块,等等。也有其他贡献模块附带的区块,例如块共享最新的天气报告的区块,你最近Twitter的职位申请区块,或你当前的Facebook状态区块。作为网站管理员,您可以构建自己的自定义区块,如即将到来的事件列表。 8 | 9 | ## 在页面上使用区块 10 | 11 | 在第6章我介绍了主题的结构和主题如何在页面定义“区域”。图6-1展示了主题被分成第一边栏,第二边栏,精选热门,内容,和其他几个区域。现在我会告诉你如何把一个到几十个区块分配到主题的各个区域。并解释这样做通过提供有趣的、高价值的功能增加你的网站访客的兴趣。 12 | 图8-1是在一个页面上用区块被分配各个区域的一个例子。这个页面有七个区块。 13 | 14 | ![block](../images/pic-8-1.png) 15 | 16 | 图8-1 看看你是不是可以发现这些区块 17 | 18 | 这个例子包括一个菜单区块(导航栏),交互式区块(搜索框和用户登录),和信息区块(谁是新用户,最近的内容,最近的评论和Drupal技术支持)。 19 | 20 | 让我们来看看Drupal8附带的区块,并把这些区块分配在你网站的区域内。然后,我们将安装一个或两个能提供简单区块的模块,您可以添加到您的网站,然后我们将从头开始创建一个全新的自定义模块。 21 | 22 | ## 找到可用的列表 23 | 24 | 在你的网站上去找可供你使用的模块列表,点击页面顶部的“管理(Manage)”链接,然后点击二级菜单中的“结构(Structure)”链接,进入到结构页面。在结构页面,点击“区块布局”链接,显示了“区块布局”页,页面上列出了你系统上所定义的所有区块,其中有些已分配到某些区域有些尚未分配。见图8-2。 25 | 26 | ![区块布局页面](../images/pic-8-2.png) 27 | 28 | 图8-2 “区块布局”页面 29 | 30 | 在“区块布局”页面中,您会看到的Drupal8提供的一些可以放在网站网页上的预装的区块。在页面的右边一栏,从区块列表中选择“放置区块”框中的几个列表项。点击区块的标题,在“配置区块”表单页面,从选择列表中选择一个区域(例如,如果你使用的是Bartik主题首先是选中第一边栏,)。分配区块的区域后,点击“保存区块”按钮。如果您返回到网站首页,你会在已分配到的指定区域中看到你激活的区块。 31 | 32 | ## 重新排列区块 33 | 有时候,你可能想要重新排列页面上的区块位置。在前面图8-1所示的例子中,我们想要让“最新内容”和“最新评论”区块出现的“最新用户”区块上面。要重新排序区块,如前节所述定位到“区块布局”页面。在“块状布局”页面,如图8-2所示,只需点击并按住要移动的区块旁边的加号(+),将该区块拖动到它将要显示的区域的列表中的指定位置。当您松开鼠标按钮时,你会看到Drupal的重新排列成果(暂时性的),您将在区块说明列表的顶部看到一条消息,“你有未保存的更改。”滚动到页面的底部,并点击“保存区块”。Drupal将保存更改并显示该消息。通过点击页面左上角的“返回网站”链接返回到首页,你会看到重新排序后的区块。 34 | 35 | ## 重新分配和停用区块 36 | Drupal还提供了一种机制,可以把一个区块移动到不同区域,也可以将已激活的区块停用。要进行更改,导航到“区块布局”页面(结构➤区块布局)。 37 | 在“块状布局”页面(参见图8-2)中,在已激活区块中点击对应的区域列表,在下拉列表中找到<无>选项。紧接着选择<无>,该项目将从“区块布局”页面的区域消失,将出现在页面底部中的禁用部分。接下来,单击您已分配到某一区域的区块对应的区域列表,并从选择列表中选择与之前不同的区域。选择新的区域后,你操作的模块将会移动到新分配的区域列表中,并且会显示在列表的顶部。进行更改之后,滚动到页面的底部,并点击“保存区块”,它会将更改提交到Drupal数据库。回到网站首页,你会在页面看到你刚才所做的更改。 38 | 39 | ## 配置区块 40 | 41 | 您可以在“配置块”页中选中不同的配置对区块进行设置。配置选项包括重写区块的标题和区块的基于几个可选参数的可见性的设置。作为你可能会在将来使用这些功能的例子,让我们来修改“谁在线”区块,使其只在您的网站的首页上显示,只有当访问者是使用ID和密码登录的系统用户才可见。为了改变这些,导航到“区块布局”页面,并定位到“谁在线”区块。如果你还没有为那个区块分配区域,先按照上一节中的步骤分配好。接下来,单击该区块的配置链接,打开区块的配置页面,参见图8-3。 42 | 43 | ![谁在线区块的配置页面](../images/pic-8-3.png) 44 | 45 | 图8-3 “谁在线”区块的配置页面 46 | 47 | 在这个表单页面,你可以覆写当模块展示的时候“谁在线”这个标题是否显示(取消“显示标题”复选框),指定多少用户将出现在新进用户的列表中(每区块的项目数“Items per block”),通过选中覆盖标题来覆写标题,当你点击复选框后,在出现的文本字段中输入新的标题,并将该区块放置在一个新的区域。 48 | 49 | 你可能希望这个区块只出现在网站的某些页面上。默认情况下它是出现在每一个页面的。例如,你可能希望“新进用户”区块只出现在网站首页,在“配置区块”页面底部(参见图8-4),你在“可见性”部分会看到“页面”选项卡。要设置区块只显示在首页,点击“为下列页面显示”单选按钮,在文本框中输入是用来表示网站首页的特殊术语),你也可以通过在文本框输入页面链接来制定其他页面(如/content)。 50 | 51 | ![选择可见性设置](../images/pic-8-4.png) 52 | 53 | 图8-4 选择可见性设置 54 | 55 | 也可以设置一个区块使它只在特定角色的特定类型用户访问时显示,点击“角色”标签,通过用户角色选项检查和设置可见性。例如,我们设置该模块只在用户登录后访问网站才显示。(参见图8-5)。 56 | 57 | ![选择基于角色的设置](../images/pic-8-5.png) 58 | 59 | 图8-5 选择基于角色的设置 60 | 61 | 点击“已登录用户”复选框后,你可以点击页面底部的“保存区快”并返回到网站首页。 62 | 63 | 为了测试你的更改,进入一个首页以外的页面,你会发现“谁在线”这个区块不再显示了。退出登录返回首页,你会发现“新进用户”这个区块不再显示,因为你不是已登录状态。 64 | 65 | ## 使用贡献模块区块 66 | 67 | 确实有数以千计贡献模块可用于Drupal。这些模块以区块的形式作为向访客展示信息的主要方式,如当地天气。如果该模块已在您的网站上安装并启用,由该模块生成的块将出现在“区块布局”页面上。只需简单的把需要的区块根据本章前面所述放在相应的区域即可。如果您尚未安装该模块,按照第11章所列的步骤进行安装。 68 | 69 | 采用贡献模块区块的一个例子是Wunderground天气区块显示的天气预报(见图8-6)。 70 | 71 | ![伦敦的天气(或任何其他城市!)](../images/pic-8-6.png) 72 | 图8-6 伦敦的天气(或任何其他城市!) 73 | 74 | 现在可在你的网站上显示有数以百计的模块会生成区块。访问www.drupal.org/project/project_module 浏览列表。 75 | 76 | ## 创建自定义模块 77 | 78 | 有可能是你需要一个块,甚至浏览了贡献模块列表后,你无法找到任何符合您特殊要求的模块。在这种情况下,您可以创建一个自定义模块。自定义模块可以包含静态HTML和JavaScript的任意组合并且可以像下面的或更复杂,你想让它成为哪样都行。 79 | 80 | 为了演示创建一个自定义模块,我们将创建一个显示的“Hello World!”的例子,静态HTML文本虽然它可能不会是那么令人兴奋的,但是它确实说明了创建一个新块的过程。第一步是定位回到“块状布局”页面。一旦出现(参见图8-2),点击页面左上角的“自定义块库”选项卡。在“自定义块库”页面,点击“添加自定义模块”按钮。 81 | 82 | 83 | 84 | ### 创建 85 | 86 | ![自定义块的块设置](../images/pic-8-7.png) 87 | 88 | 图8-7 自定义块的块设置 89 | 90 | 保存块后,点击页面的顶部的“阻止布局”选项卡,在自定义类别下“放置块”对话框中寻找新建立的块。点击你创建的块的名称然后分配到页上的区域。单击“保存块按钮”,并返回到您的网站主页,你会看到在你所指定的区域上创建的块(见图8-8)。 91 | 92 | ## 总结 93 | 94 | 块是用于让创建和显示在您的网站动态内容和互动功能增强的强大的机制。在本章中,我们探讨了Drupal8附带的块,使用贡献模块,以及如何从头开始创建一个自定义模块。在下一张中,我们将继续介绍其他主题来使用块。 95 | 96 | 97 | ---- 98 | 本文由Athena 负责翻译,我最终整理成Markdown 格式 . 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | -------------------------------------------------------------------------------- /chapters/chapter-13.md: -------------------------------------------------------------------------------- 1 | # 第13章 多语言功能 # 2 | 我们生活在一个具有文化和国家界限的环境中,然而因为互联网,能够使相隔万里的两个人通过文字、语音或者视频来进行直接沟通交流。从此,访问我们网站的人可能是我们的邻居也可能是在地球另一边的一个人。所以目前那与些跟我们生活在不一个国度,拥有不同母语的人进行交流显得司空见惯。如果设计师在其网站上能够打破语言的障碍,那么他们就可能吸引到过去做梦都没想到的访问者。而Drupal 8通过其内置的多语言功能,将这种可能性变成现实。 3 | 4 | ##多语言入门## 5 | 创建多语言支持网站的第一步是确定网站内容支持哪几种语言。Drupal 8 能够将你的网站渲染成几乎地球上的任何一种语言。 当然,Drupal 8 不做实际的内容翻译工作。它的运行机制是首先让用户选择语言列表,然后将已经被人工翻译好的内容呈现给访问者。 6 | 7 | 在你确定好你的网站将支持的语言列表清单之后,下一步是将启动drupal 8 核心中的多语言功能。首先点击页面顶部的管理菜单进入管理页面,然后在二级菜单的扩展链接模块,向下滚动页面,你将看到 drupal 8的多语言模块(见图 13-1)。 8 | 9 | ![图13-1 多语言模块列表](../images/pic-13-1.png) 10 | 11 | **图13-1 多语言模块列表** 12 | 13 | 配置翻译模块提供翻译网站中例如站点名称,词汇,菜单,区块等站点元素以及其他网站上和文本相关的配置功能。内容翻译模块提供处理所有和文本相关的事项,例如文章等。翻译接口模块为网页中的静态元素,提供多语言接口,比如表单的标签。 语言模块负责定义网站中所支持的语言。 核对多语言类别中所有的功能模块的配置,并点击保存配置按钮。 下一步是配置drupal 8的多语言功能。首先登录到配置页面。点击管理菜单的管理链接,在二级菜单中点击配置。在配置页面, 向下滑动页面,你将看到区域和语言部分(见图 13-2) 14 | 15 | ![图13-2 多语言配置选项](../images/pic-13-2.png) 16 | 17 | **图13-2 多语言配置选项** 18 | 19 | ## 指定网站支持的语言 ## 20 | 21 | 通过在配置页面的区域和语言部分,点击语言包的链接来设置你的网站所支持的语言。如果你在安装drupal 8 实例的时候将英语作为你的站点默认语言。你的语言包部分将显示如下图13-3所示的样子。 22 | 23 | ![图13-3 基础语言](../images/pic-13-3.png) 24 | 25 | **图13-3 基础语言** 26 | 27 |
要启用新的语言支持可以点击“添加语言”按钮,然后在你下拉菜单中选择一种你的网站将支持的语言,然后点击添加按钮,如图13-4所示。 28 | 29 | ![图13-4 添加语言](../images/pic-13-4.png) 30 | 31 | **图13-4 添加语言** 32 | 33 | ## 激活配置语言 ## 34 | 35 | 设定好你的网站所支持的语言列表之后,下一步是设定Drupal在什么情况下站点切换到哪种语言。在语言页的顶部,单击检测和选择的选项卡以 36 | 查看列表中的选项来指定语言切换功能发生时的操作。(如图13-5) 37 | 38 | ![图13-5 语言检测与选择](../images/pic-13-5.png) 39 | 40 | **图13-5 语言检测与选择** 41 | 42 | 正如在检测方法一栏所示,你将有多种选择来指定Drupal如何决定选择哪种语言来呈现网页元素: 43 | 44 | 45 | - 通过URL匹配的方式指定语言选择,例如: http://example.com/en 为英文版本, http://example.com/ru 俄语版本。 46 | 47 | 48 | - 通过一个通过自定义代码设定并存储在缓存中的缓存参数指定。 49 | 50 | 51 | - 通过用户浏览器首选项中设置的浏览器的默认语言。 52 | 53 | - 帐户管理页允许您设置不同语言的管理接口和您的网站的内容部分。 54 | 55 | - 用户从下拉列表或者一个选项中选择了一种语言,确保这种选择能够使块提供给访问者选择所想要语言的功能。 56 | 57 | 处于演示目的,核对查询的网址并选择语言选项,然后点击保存设置按钮继续。 58 | 59 | +某些选项,如URL设置,提供配置定义这些设置将如何生效的参数的功能。点击配置按钮查看参数。 通过选择特定的语言选项,我们现在有机会获得这个为用户提供了选择他们喜欢的语言能力的区块。将这个区块放置到有“块状布局”的页面(管理➤结构➤块状布局),你将在块状布局的列表中看到一个名为语言切换的区块在系统类中。点击语言切换的链接,分配块到主题所支持的一个区域。如果您正在使用Bartik,一个不错的选择将是两个边栏的区域之一。您选择的区域后,不要忘记在“块状布局”页面的底部点击“保存块”按钮。启用“语言切换”块后,你的页面应该类似于图13-6。 60 | 61 | ![图13-6 语言切换器区块](../images/pic-13-6.png) 62 | 63 | **图13-6 语言切换器区块** 64 | 65 | ## 内容翻译实例 ## 66 | 67 | 在添加完成“语言切换”区块之后,你现在可以准备做下一步内容翻译了。点击管理菜单中的管理链接,然后点击二级菜单中的配置链接退到配置页面。然后在配置页面点击语言包的超链接转到语言包页面。在确认完成你的网站所支持的语言之后,你会看到有一个名为接口翻译项(如13-7)的列。这一列展示了每一种语言已经翻译的元素数量(第一个数)和可以翻译的元素数量,可以翻译的元素是指标签,错误提示信息以及在模板文件或者模块中定义的字符串。如图13-7,很多元素已经已经由drupal社区翻译完成。 68 | 69 | ![图13-7 接口翻译](../images/pic-13-7.png) 70 | 71 | **图13-7 接口翻译** 72 | 73 | 在需要手动输入翻译结果的文本框的界面翻译元素列表中点击任意元素(如图13-8),如果需要过滤列表只显示没有翻译的元素,可以在过滤可翻译的字符串的查询功能部分点击搜索按钮,并选择只显示未翻译的字符串。点击过滤按钮将会显示未翻译的元素列表。 74 | 75 | ![图13-8 字符串翻译成另一种语言](../images/pic-13-8.png) 76 | 77 | **图13-8 字符串翻译成另一种语言** 78 | 79 | 当输入部分或者全部未翻译字符串的翻译结果后点击保存翻译按钮。退回到语言包页面,你已经翻译的字符串元素的数量、字符串总数以及已经翻译元素的百分比都将显示在界面上。在你安装新的模块创建新的表单或者创建其他具有可翻译元素的功能时,需要翻译的元素总数可能会随之增加。因此需要经常查看该页面,确保相关需要翻译的元素全部被翻译。 80 | 81 | ##配置实体## 82 | 83 | 在安装了多语言支持网站的下一步是制定哪些内容类型,分类词汇和用户配置文件是可翻译的。返回到配置页面,在区域和语言部分,点击“内容的语言类型和翻译”链接(见图13-2)。在这个页面,你将会看到在你的网站上支持翻译类型的选项列表。只要选择你将为其提供翻译功能的元素即可。为了演示,选中内容,自定义菜单和分类术语三种。当你选中一项时,你将会看到一系列可以为该元素设置的翻译功能的选项(如图13-9)。 84 | 85 | 以文章内容类型显示的可被翻译的元素项明细为例。对于文章内容类型,包含标题,内容,评论设置,图片和标签。为了演示,选中所有项,并点击保存按钮。 86 | 87 | ![图13-9 语言配置内容](../images/pic-13-9.png) 88 | 89 | **图13-9 语言配置内容** 90 | 91 | ## 内容翻译 ## 92 | 93 | 一切就绪之后,接下来是将网站的本地语言翻译成你的网站配置所支持的各种语言。为了演示,假设你已经在上一步配置好了文章内容类型,用本地语言创建了一篇测试文章。点击管理菜单上的管理链接,在二级菜单中找到内容链接,点击“添加内容”按钮,选择文章的内容类型创建文章。需要注意的是在创建文章的表单中将会出现一个新的字段,也就是语言选择列表。为了演示,选择默认语言代表网站的基本语言(例如,如果您安装的Drupal8的英文版本,从选择列表中选择英文),例如,在我的Drupal8网站,我用“This is a test article”为标题和“Hello World this is a test article in English”为内容的文章。点击“保存并继续”之后,你将会在文章内容的表格上面看到一个翻译的选项(你需要以具有内容编辑权限的管理员身份登录)。这个新的标签允许你随时使用翻译功能。 94 | 95 | ![图13-10 翻译选项](../images/pic-13-10.png) 96 | 97 | **图13-10 翻译选项** 98 | 99 | 单据翻译选项卡将显示的你在配置多语言支持列表中设置的语言并显示网站内容的翻译情况。(见图13-11) 100 | 101 | ![图13-11 语言翻译状态](../images/pic-13-11.png) 102 | 103 | **图13-11 语言翻译状态** 104 | 105 | 单击特定语言的“添加”按钮将显示特定内容的节点编辑表单,允许您(或其他人翻译人员)看到该内容项的原始语言版本,并提供重写翻译版本的功能。列表中选择一个语言尝试该功能。这是将我的测试文章翻译成法语(参见图13-12)。 106 | 107 | ![图13-12 将文章翻译成法文](../images/pic-13-12.png) 108 | 109 | **图13-12 将文章翻译成法文** 110 | 111 | 点击保存并发布按钮之后,Drupal将显示你刚才翻译成的文章,并在语言切换模块高亮显示该语言。尝试按照前面的步骤,点击翻译选项按钮完成其他网址支持语言的翻译。在你完成所有的语言翻译之后,测试一下语言切换功能查看文章在每一种语言下的翻译情况。如果你选择了一种从左到右的语言(我选择了希伯来语),你会发现drupal 解析文章的细微不同:例如语言切换的区块等元素将会从左一到右边(假设你将语言切换功能放在在Bartik主题的边栏第一区块)。 112 | 113 | 如果你编辑了内容项或并更改了任何字段(例如,一篇文章的标题或正文),请记住,其他翻译需要随之更新。(见图13-10) 114 | 115 | ## 总结 ## 116 | 117 | 在这一章,我们讲述了drupal 8多语言支持的功能。这对于那些希望不仅仅能够吸引母语用户,还希望更广泛受众的网站是一个功能丰富而强大的工具。把你的网站内容翻译成多语言从而打开通过文字接触世界的机会的大门。而这正是drupal 8的一个强有力的功能特色。 118 | -------------------------------------------------------------------------------- /chapters/chapter-01.md: -------------------------------------------------------------------------------- 1 | # 第1章 Drupal介绍 2 | 3 | 翻译:天哲 遗漏的部分由蹊添加上 4 | 5 | 本章主要对drupal是什么样的内容管理系统,Drupal的主要组成部分,以及在drupal网站如何创建内容做了基本概述。 6 | 7 | ## 内容管理系统 8 | 9 | 简而言之,一个CMS就是一个软件包,它提供了制作,发布和管理网站内容的工具。 “内容”包括新闻报道,博客文章,视频或照片什么,播客,文章,或者你是销售产品的描述。用更一般的术语描述,内容是由文字,图表,照片,音频和视频的任意组合,您网站的访客能够阅读,看,听。 10 | 11 | 一个CMS通常提供了许多功能,能够简化搭建,开发和管理网站,其中包括下列内容: 12 | 13 | * 一个管理界面 14 | * 存储内容的数据存储位置 15 | * 将物理页面所需数据与数据库中的信息相关联的机制。 16 | * 用于创作,发布和内容管理的工具集 17 | * 用于创建和管理菜单与导航元素的组件 18 | * 用来定义和应用主题所需的工具集 19 | * 用户管理 20 | * 一个安全框架 21 | * 社交网络功能,如论坛,博客,wiki和调查 22 | * 分类和标记 23 | * 在线表单 24 | * 电子商务功能 25 | 26 | 现在有数以百计的CMSes可用(查看 www.cmsmatrix.org )。它们的范围从简单的博客为中心的平台,如WordPress,到复杂的企业级内容管理解决方案,如Drupal的。 27 | 28 | ## Drupal 29 | 30 | Drupal是用PHP编写以GNU许可形式发布的开源免费的可自由使用的CMS。 31 | 32 | Drupal起源于荷兰大学的学生Dries Buytaert的一个项目。该项目的目标是为Buytaert和他的朋友分享新闻和事件。 在2001年,Buytaert投身到Drupal的开源项目,与社区形成共识,以原来简陋的项目为起点,成为现在全网最强大和功能丰富的CMS平台之一。个人,团队和社区使用Drupal的功能来轻松发布,管理和组织网站上内容,从个人博客到大型企业和政府网站都可以使用。 33 | 34 | 标准的Drupal发布版本,被称为Drupal核心,包括可创建典型宣传网站,单个或多个用户的博客,互联网论坛或社区网站与用户内容生成这些基本功能。在Drupal核心中的功能具有编写和发布内容;创建和管理用户,菜单和论坛;并使用网络浏览器基于管理界面管理自己的网站。 35 | 36 | Drupal被设计成可以通过下载附加模块和自定义模块来加强功能的内容管理系统。有成千上万的附加模块(被称为贡献或“contrib”模块)扩展Drupal核心的功能,涵盖的功能广泛,包括电子商务,社交网络,与第三方应用程序和多媒体集成。 37 | 38 | Drupal可以在能够运行PHP5.4.5+的Web服务器(包括Apache,IIS,lighttpd和Nginx)与来存储内容和设置的数据库(如MySQL,SQLite,或者PostgreSQL)的任何计算平台上运行。 39 | 40 | ## Drupal核心 41 | 42 | 当您下载并安装的Drupal,要正安装的文件通常被称为Drupal核心。核心相当于一个基本网站的“引擎”功能,与其他应用的现成功能一起,创建功能相对完善的网站。 Drupal核心的主要组件功能包括创建和管理 43 | 44 | * 内容 45 | * 文件上传/下载 46 | * 菜单 47 | * 用户帐户 48 | * 角色和权限 49 | * 分类 50 | * 论坛 51 | * 次提取并以各种形式如列表和表显示内容 52 | * 基于所见即所得内容编辑器 53 | * Drupal核心还包括一个功能丰富的搜索引擎,多语言功能,以及记录和错误报告。 54 | 55 | ## 贡献模块 56 | 57 | 虽然Drupal核心可以用来构建功能丰富的网站,也有可能,核心功能不能满足特定的需求。在这种情况下,第一个步骤是通过搜索成千上万的自定义模块,来自世界各地的贡献的开发者Drupal的模块,来解决你的需求。这很可能也是其他人早有同样的功能要求,并已有开发扩展Drupal核心功能的的解决方案来提供给你。为了找到一个贡献模块,请访问 www.drupal.org/project/project_module 的Drupal官方网站。 58 | 59 | 你会发现一些分类列表和当前类贡献模块的数量(用于所有Drupal版本)。此处是分类类型和模块的数量的简单例子(每时每刻都有模块被添加,所以模块的数量是截至写这个例子时的数目): 60 | 61 | * 管理(1145) 62 | * 社区(614) 63 | * 内容(1981) 64 | * 内容显示(1612) 65 | * 内容构建工具包(CCK)(673) 66 | * 开发者(960) 67 | * 电子商务(892) 68 | * 媒体(778) 69 | * 第三方集成(1908) 70 | * 公用事业(1959) 71 | 72 | 为了找到所支持Drupal8的模块,选择“核心兼容性”搜索筛选器里的8.x。 73 | 最流行的贡献模块(在右边的收缩过滤器列表中选中“最多安装量”),和你可能会想安装的应用模块如下: 74 | 75 | * 商务:一个全功能的Web店面模块,提供了所有的推销产品(物理以及电子下载)所需的机制,收集信用卡支付和管理的出货量。如果你想卖的东西在您的网站,这是你将要使用的模块。 76 | * 显示套件:允许你完全通过拖放界面控制你的内容显示。 77 | * 日历:提供创建和呈现日历上的事件列表的能力。 78 | * 备份和迁移:处理按照计划备份drupal数据库和基于之前的备份数据恢复网站数据的功能。是每个成品网站必备的模块。 79 | * 谷歌分析:提供了一个简单易用的表单上设置谷歌分析您的网站。谷歌分析是一项免费服务,跟踪你的网站访问者的数量,以及这些游客来自哪,他们用哪些搜索字词找到你的网站,他们查看了那些网页,同时在您的网站上他们花多长时间,许多其他有用的指标,将帮助您查看和了解的使用您的网站。有关谷歌分析的更多信息,请访问: www.google.com/analytics 。 80 | * Pathauto:通过自动生成一个基于页面标题相对搜索引擎友好的“漂亮”的网址(如 www.example.com/examples 而不是默认的 www.example.com?node=1234 Drupal的URL)。 81 | * 调度:提供在指定的时间将节点内容变为已发布或者不再发布的能力。 82 | * 这允许作者现在创建一个节点点不显示在网站上,直到未来一个特定时间。 83 | 84 | ## Drupal主题 85 | 86 | 主题是Drupal的组件,它定义网站页面的结构以及视觉效果。一个Drupal主题像这样定义您的网站属性: 87 | 88 | * 在页面上信息将被显示成多少列(左,中和右的三列布局;窄的左列和宽的内容右侧的两栏布局;一列的布局,等等)。 89 | * 页面顶部是否有横幅栏。 90 | * 页面底部是否有底角栏。 91 | * 是否有导航菜单(在页面的顶部,在横幅兰下方,在右列,等等)。 92 | * 在页面上使用的颜色。 93 | * 用于网页上的各种元件的字体和字体大小(如标题,标题的字体大小,和正文)。 94 | * 图形元素,例如站标。 95 | 96 | Drupal核心包含了许多可以使用在你的新网站的现成的主题。您还可以可在 www.drupal.org/project/project_theme 免费下载一个或多个主题,或者按照 www.drupal.org/documentation/theme 的说明创建自己的主题。 97 | 98 | ## 创建内容 99 | 100 | 没有内容的网站就像一本书,没有文字,没有新闻的报纸,没有文章的杂志:几乎不值得看。 Drupal使的网站内容的创建,发布和管理更加容易。让我们来通过创建我们的第一篇内容看看它是多么的简单。如果你还没有安装的Drupal,请访问附录,并按照说明一步一步的过程安装和配置Drupal的核心。 101 | 102 | 获取Drupal内容编辑界面有多种方法。我将重点放在最简单的一种,然后再讨论第2章的其他方法。 103 | 104 | 在您的新网站的首页,“还没有创建首页内容”的提示信息附近你会看到“添加内容”链接。在左侧栏中,你还会在工具菜单中看到一个“添加内容“的链接(见图1-1)。点击任意一链接:他们都能带你到内容编辑表单,创建您的第一篇内容。 105 | 106 | ![图1-1 单击任意“添加内容”可开始](../images/pic-1-1.png) 107 | 108 | **图1-1. 单击任意“添加内容”可开始** 109 | 110 | 接下来,您将看到您可以使用的内容类型的列表(见图1-2)。 Drupal8有两个基本内容类型:文章和基本页面。这两种内容类型提供了向你可以写入的内容项和正文区域,输入作者和文本字段。不同的内容类型提供附加元素。在文章的情况下,你必须有输入“标签”对你的内容和图像进行分类的能力。我将在本书后面涵盖“标签”和其他几个内容类型,还有能够创建自定义内容类型的能力。 111 | 112 | ![图1-2 选择你的内容类型](../images/pic-1-2.png) 113 | 114 | **图1-2.选择你的内容类型** 115 | 116 | 从最简单的内容类型,一个页面,作为你的新网站的第一个内容项目的基础。 117 | 118 | 单击“基本页面”链接,打开内容创建表单,用于创建内容类型(见图1-3)。在此表单,输入您的第一篇文章的标题,和一些文本到正文。当你输入标题和文章正文之后,单击右侧边栏中的“推广选项”链接,并从选项显示的列表中,勾选“推荐到首页”复选框。当这个选项被选中,它告诉Drupal在您网站的头版显示这篇文章。如果未选中,请点击复选框。最后,向下滚动到页面底部,并点击“保存并发布”按钮(我将在第二章介绍其他选项)。 119 | 120 | ![图1-3 创建基本页](../images/pic-1-3.png) 121 | 122 | **图1-3.创建基本页** 123 | 124 | 点击“保存和发布”按钮,你刚才写的内容马上就显示在你的网站的首页了。 125 | 126 | ![图1-4 瞧,这就是你发布的](../images/pic-1-4.png) 127 | 128 | **图1-4.瞧,这就是你发布的** 129 | 130 | 恭喜!你已经能够在你的新drupal网站制作并发布了新的内容了。这本书剩下的部分将涵盖许多其它内容创作,发布和管理功能。你可以利用druapl以自己的方式搭建令人难以置信的网站。 131 | 132 | ## 总结 133 | 134 | 本章重点阐述了什么事cms,dupal核心提供的函数,如何通过贡献模块封装函数、drupal主题和在drupal站点创建内容。第2章将深入探讨的内容创建,发布和Drupal 8的管理能力。 135 | 136 | 137 | 138 | -------------------------------------------------------------------------------- /chapters/chapter-06.md: -------------------------------------------------------------------------------- 1 | # 第6章 使用Drupal主题 2 | 3 | **翻译:phpworld** 4 | 5 | 在本章当中,我将介绍如何安装一个新的主题来改变你站点的外观和感觉,指导你如何选择、下载、并使用你喜欢的主题,在前面的章节你已经添加了一些东西在站点里面,本章我们将看到一些惊艳的Drupal特性让你拍案叫绝。 6 | 7 | Drupal网站的布局外观是被叫做主题的组件来实现的,主题定义了: 8 | 9 | * 页面使用的颜色 10 | * 文本、标题、链接和其他元素的字体 11 | * 图片或图形的布局(这里说的是页面修饰外观的图片或图形,而不是信息内容里的) 12 | * 页面布局(比如顶部菜单、banner、次菜单、侧边栏、页脚等) 13 | 14 | 主题可以很简单,也可以很复杂,它是由HTML代码、CSS、js、Twig模板引擎的变量和表达式构成,Twig模板引擎很简单,不懂php设计的人员也很容易就能上手使用, 15 | 其实我们已经使用了主题,前面章节安装的基本Drupal8站点使用了Bartik默认主题,Bartik是一个优秀的黑蓝色系主题,有个相对简单的结构(见图6-1),它提供17个不同的区域供你放置:内容、控件、图片、视频、表单等其他元素,在第9章我们会了解如何放置元素到区域,使用什么管理工具。 16 | 17 | ![图6-1 Bartik主题](../images/pic-6-1.jpg) 18 | 19 | **图6-1 Bartik主题** 20 | 21 | 你在浏览各种Drupal主题的时候会发现他们大多遵循标准布局,当然你可以设计一个不遵循标准的主题布局,图6-2展示了我怎么使用Drupal主题引擎去创建俄勒冈大学的一个网站,它用来供高校学生们管理学习档案和进度,页头和页脚使用棕色背景,内容区域使用绿色背景: 22 | 23 | ![图6-2 创建非传统主题](../images/pic-6-2.jpg) 24 | 25 | **图6-2 创建非传统主题** 26 | 27 | ## Drupal主题是如何工作的: 28 | 29 | 了解一些主题是如何工作的基础知识将有利于后面章节的学习,在这里我将简要介绍。 30 | 作为站点管理员,你可以选择喜欢的主题,你可以从 www.drupal.org/project/project\_theme 下载,也可以购买商业主题,也可以从一个基本主题开始创建自定义的主题,你很可能看到一个和自己想要的主题相近的主题,比如Zen \( www.drupal.org/project/zen \),那么可以以它为基础改进。如果在成百上千的主题中都找不到一个合意的,你还可以从头开始完全自定义主题。 31 | 32 | 如果你找到一个喜欢的主题,下载它,解压后保存到站点根目录的/themes文件夹下, 33 | 一旦保存后,你可以在管理界面看到它 34 | 一旦在管理界面开启这个主题,Drupal将加载它,用它定义的结构、样式、颜色、字体、图片等去渲染每一个页面。 35 | 36 | ## 找到一个新主题: 37 | 38 | Drupal8附带了Bartik, Seven, Stark,Classy主题,尽管Bartik是一个非常棒的主题,但你很可能不会在你的站点使用它(你在浏览web时可能常常看到有站点用它做主题),Seven是默认的管理主题,专门用来渲染管理界面,Stark是一个很简单的主题,几乎没有什么样式,如果你想要一个极简型的着重文本的主题,那么它很适合你,Classy是一个基本主题,供你在其上进一步创作自定义主题,但你极有可能希望能从数以百计的主题中自由选择并下载使用。 39 | 40 | 在搜寻新主题之前,你应该坐下来准备一张白纸,至少描绘出你站点首页的布局,它们包括: 41 | 42 | * 是否需要一个头部或banner区域呢?如果要,你们要多高?是否横跨整页? 43 | * 是否要个水平菜单?如果是,那么有多少个菜单链接?在哪放置? 44 | * 是否要一个左边栏或右边栏?怎么放置?具体多少个? 45 | * 是否要一个页脚?它横跨整个页面吗?设计成固定宽度吗?(比如960px宽),还是要能自动调整以适应手机、平板、桌面等多终端? 46 | 47 | 回答了这些问题将把搜寻范围变小,快速找到支持你布局和设计目的的主题。 48 | 搜寻主题最好的办法是去Drupal官网,然后浏览主题栏目,请访问 www.Drupal.org/project/project\_theme \(见图6-3\)。 49 | 50 | ![图6-3 排序选择Drupal主题](../images/pic-6-3.jpg) 51 | 52 | **图6-3 排序选择Drupal主题** 53 | 54 | 出于演示目的,我们找一个适合我们布局和配色方案的Drupal8主题,打开( www.Drupal.org/project/project\_theme \),从“Core compatibility”下拉列表选择8.x以限制只搜索能兼容Drupal8的主题,点击搜索,网站将显示兼容8.x的主题列表。 55 | 56 | 你能进一步缩小搜索范围,如通过主题名、维护状态、开发状态、主题状态(完整项目或沙箱项目,沙箱项目表示项目还在孵化阶段,尚未释出),你也能用“Sort by”选项去排序结果,可选排序项有:创建时间、最后发布、最后构件、标题、作者、最多安装等。选择最后发布将显示出最近添加的主题(包括最近有更新的主题),当你想看看最近社区有什么贡献的时候这个功能很棒。出于演示目的,我们选择主题标题,那将以主题名的字母顺序排序 57 | 浏览主题列表,看看各种可用的主题,大多数主题开发者提供一个页面截图,让你可以看出主题的布局和设计,作为一个例子,我们选择Gratis主题 \( www.drupal.org/project/gratis \),该主题提供了一个干净并且是响应式的布局,响应式布局意味着它能适应多种终端屏幕大小,见图6-4: 58 | 59 | ![图6-4 Gratis主题](../images/pic-6-4.jpg) 60 | 61 | **图6-4 Gratis主题** 62 | 63 | ## 如何安装一个主题: 64 | 65 | 下一步是去下载你想要的主题,Drupal8有个新功能,让下载和安装主题变的很简单,复制主题文件的URL然后粘贴到表单即可,如何找到表单?点击管理-外观-安装新主题即可,见图6-5: 66 | 67 | ![图6-5 安装新主题](../images/pic-6-5.jpg) 68 | 69 | **图6-5 安装新主题** 70 | 71 | 另外有两个方法可以安装新主题:使用Drupal管理接口上传文件到你的服务器,或者手动FTP上传文件到站点根目录的themes目录下,如果使用管理接口,那么你要确保Drupal有正确的权限配置(译注:如php对目录的可写权限,curl的网站https证书配置等) 72 | 现在我们用ftp上传安装一个主题,我们将使用Gratis主题\( www.Drupal.org/project/gratis \),打开网址,滚动到页面下方,将看到下载区域,选择一个适用于8.x的稳定版,如果没有稳定版,可以尝试开发版,但它可能还有些BUG。下载并解压,将解压后的文件夹整个上传到服务器根目录的/themes目录下(译注:不是上传文件夹里面的东西,是连文件夹上传)。 73 | 你也可以使用管理界面上传安装包,点击菜单:管理-外观-安装新主题即可,如图6-6: 74 | 75 | ![图6-6 安装新主题](../images/pic-6-6.jpg) 76 | 77 | **图6-6 安装新主题** 78 | 79 | 在这个界面提供了两种方法安装新主题: 80 | 81 | * 从URL安装:到主题下载页面,找到适合的版本,右键复制下载链接,然后粘贴到这里 82 | * 上传未解压的主题安装包,这个就是前面说的管理界面上传安装包进行安装 83 | 84 | 一旦你粘贴了URL或上传了安装包,就可以点击安装按钮,这个时候Drupal会显示安装进度(译者注:推荐用文件上传方式安装,用粘贴url方式时Drupal8是用curl去远程获取安装包,由于是https协议,你需要为curl配置证书文件,否则将出错),安装完成后页面会提示你是否去启用该主题。 85 | 下一步是去管理-外观界面,在未安装的主题组里面你将看到刚刚上传的主题,如图6-7: 86 | 87 | ![图6-7 未安装主题](../images/pic-6-7.jpg) 88 | 89 | **图6-7 未安装主题** 90 | 91 | 在Gratis主题的描述下面,点击安装并设为默认,你就启用该主题了,如果操作成功,你会看到一个提示说Gratis现在是默认主题了,点击页面顶部左边的返回网站,准备迎接惊喜吧!你应该看到站点被新主题渲染了,如图6-8: 92 | 93 | ![图6-8用新主题渲染站点](../images/pic-6-8.jpg) 94 | 95 | **图6-8 用新主题渲染站点** 96 | 97 | ## 用于管理界面的主题: 98 | 99 | 网站的管理界面往往是宽和长的,有时候和外观主题匹配的不好,针对这个问题,Drupal8让你可以指定一个主题来作为管理界面的主题,你可以试着用一个新主题看看是不是适合做管理主题,代表性的是用一个简单干净至少960px宽的主题做管理主题,要改变管理主题,点击管理-外观然后滚动到底部,你会看到更改管理主题的设置,在下拉列表里面选一个你想要的管理主题,然后点击保存配置即可,在Drupal8中默认是使用Seven作为管理主题,如果你改变了管理主题,记得点击保存配置按钮。 100 | 101 | ## 主题配置: 102 | 103 | Drupal8提供了一组主题配置选项,可以改变或更新你主题的某个方面,这个特性依赖于主题开发者是否遵循Drupal主题设计的标准,这些选项可以决定哪些元素能被怎样显示(如logo、站点名、标语等等),主题是否使用它默认的logo,是否使用默认快捷图标(快捷图标也被称为网站图标,出现在你浏览器地址栏网址的旁边,或收藏夹里),点击菜单:管理-外观,你可以看到更新和设置选项卡,如图6-9: 104 | 105 | ![图6-9 主题配置选项](../images/pic-6-9.jpg) 106 | 107 | **图6-9 主题配置选项** 108 | 109 | 尝试改变一些设置选项,比如logo,去掉复选框,然后上传一个自定义的logo,然后点击保存配置按钮,返回站点首页去看一看站点的改变(译注:随着Drupal8次版本的更新发展,此处已经有微小变化,以实际显示为准) 110 | 提示:你如果想去看一看别人用Drupal做的网站,可以参考下Dries Buytaert的个人网站,那里列出了网上比较著名的Drupal站点,网址是: [http://buytaert.net/tag/drupal-sites](http://buytaert.net/tag/drupal-sites) 111 | 112 | ## 总结: 113 | 114 | 在这一章里,我们感受到了用模板主题建一个Drupal网站的惊喜,在短短几分钟内,我们通过很少的步骤改变了网站整体的外观和感受,也花了些时间浏览Drupal官网上面的主题。改变网站整体外观感觉这是那么简单快速,令人惊讶。 115 | 116 | **校对 戎建伟** 117 | 118 | -------------------------------------------------------------------------------- /chapters/chapter-21.md: -------------------------------------------------------------------------------- 1 | # 第21章 构建社区网站 # 2 | 3 | 翻译:Viving 4 | 5 | 在过去的几年里,人们的在线社区聚合能力出现井喷式增长。你能想到的几乎所有领域都有在线社区————从技术(think Drupal交流社区!),体育(比如,某足球俱乐部的球迷社区),娱乐(比如,某种流行音乐的爱好者交流社区),到食品、营养、划船、飞行、濒危动物,还有其它数以千计的不同主题的虚拟社区里,人们聚集在这里分享思想、交流问题、发起活动,互相交流联系。有的在线社区重点围绕个别产品、系列产品或者某些公司,也有些是由公司赞助用来帮助和指导他们产品或服务的购买者。机会是无限的,推出一个在线社区仅需两个或者两个以上的人以及一个好的创意。 6 | 7 | Drupal是一个构建在线社区的绝佳平台,Drupal Common( www.drupal.org/project/commons )提供了一个满足开发在线社区的绝大部分功能需求的现成的解决方案。 本章里我将为 Druapl学习者们创建一个在线社区。大家可以跟着一起练习,也可以将它作为一个创建自己的社区网站的引导性的模板。 8 | 9 | ## 社区网站的需求 ## 10 | 11 | 和往常一样,开发任何一个网站都需要从网站需求入手。不同类型的网上社区网站通常有以下需求: 12 | 13 | 1. 用户注册功能。 14 | 1. 发布内容功能。 15 | 1. 创建和管理一个wiki的功能。 16 | 1. 编辑和发布事件信息的功能。 17 | 1. 用户关联与追踪的功能。 18 | 19 | Drupal Commons提供了所有以上功能,并且是作为它的基础功能的一部分。 20 | 21 | ## Drupal Commons的安装 ## 22 | 23 | 建立一个社区网站的第一步就是 Drupal Commons 的安装。你可以从 www.drupal.org/project/commons 中下载Drupal Commons。像前面安装Drupal一样,你需要在你的网站服务器的合适位置上解压下载下来的“tar”或者“zip”文件(确定服务器上的网站平台存放路径)。 24 | 25 | 解压上述文件,你的根目录里就会有一个名为 commons-8.x-3.12的文件夹。 你需要将所有文件上移一个层级以避免必须输入example.com/commons-8.x-3.12访问你的网站。在Linux或者OS X系统中,你可以通过导航将文件移动到commons-8.x-3.12目录(注意你的目录名称将取决于你下载的版本的不同而有所不同),使用以下命令: 26 | 27 | mv* ../ 28 | 29 | mv.* ../ 30 | 31 | 需要注意的是使用“mv* ../”命令并没有移动秘钥文件如.htaccess。第二种命令则将这些隐藏文件提升了一级。 32 | 33 | 移动所有文件之后,你可以自由的去删除原来为扩展Drupal Commons文件而创建的配置文件夹。同时,你也需要创建一个settings.php文件,导航到你的站点的site/default目录并复制default.settings.php文件内容到settings.php。您还需要创建一个文件的目录。对于这两个项目,你还需要设置权限,使Web服务器可以读取和写入文件和目录。 34 | 35 | 在文件就位后,需要创建一个新的数据库,包括数据库用户ID,密码,并将相应的权限分配给该用户从而他们可以修改数据库内容或者结构。与你的托管服务提供商确认如何创建一个新的MySQL数据库和创建用户(比如使用PHPMyAdmin),或者如果你是在本地建站,就联系LAMP、MAMP或者WAMP服务提供商。 36 | 37 | 在完成初步安装任务之后,现在来安装Drupal Commons。开始安装Commons的过程与安装Drupal8内核一样,直接访问站点URL就可进入安装流程。 38 | 39 | 你可能会遇到一个“PHP的最大执行时间值太低”的错误提示。如果你是使用典型的MAMP、LAMP或者WAMP堆栈,PHP的最大执行时间一般设为30秒。由于长时间运行是与具体Drupal Commons站点任务执行情况相关联的,因此执行时间值也可能需要增加到120秒。你可以通过多种方式改变执行时间值,但最简单的方式是在你的sits/default/settings.php文件的末尾加入以下代码: 40 | 41 | ini_set('max_execution_time', 120); 42 | 43 | 出现在安装过程中的第一个页面是标准的 Drupal 8 安装中设置数据库信息(设置数据库)的页面。在数据库名、数据库用户名和数据库密码字段中分别输入相应的值,然后单击“保存并继续”按钮。 44 | 45 | 接下来的页面是标准的Drupal 8站点信息配置页面(配置站点)。为站点名称、站点的电子邮件地址、网站维护帐户、默认的国家和时区输入相应的值。网站维护帐户相当于标准的 Drupal 8 管理员帐户,但它在管理整个社区中的作用更大。 46 | 47 | 下一步是为站点配色(选择网站调色板)。这是与标准Drupal8内核安装过程的第一个较大的不同。选择好颜色并保存进入下一步。 48 | 49 | 接下来你会在系统提示下进入首页欢迎页(见图21-1)。在该页面中你会被提示输入欢迎标题、欢迎正文文本,并选择是否安装示例内容。出于演示的目的,我将安装示例内容,但当你创建新站点时,如果你不想Commons中有内容,那么请不要勾选“安装示例内容”复选框。 50 | 51 | ![图21-1 创建首页欢迎文本](../images/pic-21-1.png) 52 | 53 | **图21-1 创建首页欢迎文本** 54 | 55 | 下一步是通过提供一个组名称和组描述进入创建第一个社区的过程。示例中的“Drupal学习社区”网站的第一组将被命名为“New to Drupal”,面向那些过去并没有接触过Drupal的人们(见图21-2)。点击“保存并继续”完成安装。 56 | 57 | ![图21-2 设置第一个组](../images/pic-21-2.png) 58 | 59 | **图21-2 创建第一个组** 60 | 61 | Drupal完成安装过程后,你将被带回首页并且站点已经可以运行。图21-3为带有示例内容的示例网站截图。 62 | 63 | ![图21-3 带有示例内容的社区网站](../images/pic-21-3.png) 64 | 65 | **图21-3 带有示例内容的社区网站** 66 | 67 | 首页显示了站点中各个组的活动摘要和示例社区网站中的组成员列表。点击页面顶端的“Groups”链接显示登陆页面,该页面中列出了网站中的所有组以及每个组的概述(见图21-4)。 68 | 69 | ![图21-4 组登陆页面](../images/pic-21-4.png) 70 | 71 | **图21-4 组登陆页面** 72 | 73 | 点击组名称即可进入该组的登陆页面,显示该组的帖子列表、组贡献者以及认为适合在登陆页显示的其它部分(比如即将发生的事件列表)。图21-5为“New to Drupal”组页面截图。 74 | 75 | ![图21-5 初次来到Drupal组页面](../images/pic-21-5.png) 76 | 77 | **图21-5 初次来到Drupal组页面** 78 | 79 | ## 创建新组 ## 80 | 81 | 在网站的安装过程中我们创建了“New to Drupal”组页面,但如果我们想新增一个组该怎么做呢?Drupal Commons提供了通过内容页面增加和管理组的功能。点击管理菜单中的“Content”,在内容页面点击“Add Content”按钮,“Select Group”是你希望创建的内容类型,并在创建一个组页面,输入新组的详细信息(见图21-6)。 82 | 83 | ![图21-6 创建一个新组](../images/pic-21-6.png) 84 | 85 | **图21-6 创建一个新组** 86 | 87 | 在例子中,我创建了一个名为“Drupal Ninjas”的新组。我已经为这个组提供标题,输入了组说明,设置了“Privacy setting”仅允许我选择邀请的人才能成为组成员(毕竟,Drupal忍者是个稀有品种,呵呵),并在话题区域建立第一个讨论主题。点击保存按钮添加新的组,自此它已经准备好接收新成员了。由于该组被限制,所以他将不会显示在网站的公开部分,除非是已经登陆状态并且他是“Drupal Ninjas”的组成员。 88 | 89 | ## 添加事件 ## 90 | 91 | Drupal Commons为在网站上创建和列出事件提供了非常理想的工具。要创建一个新事件,请点击管理菜单中的“Content”链接,然后点击内容页面中的"Add content"链接。从内容类型列表中选择事件并填写该事件的详细信息。事件内容类型提供了事件标题、事件描述字段,一个有关事件的更多信息的URL地址链接,与该事件有关联的组,事件日期和地点,以及例如是否需要注册和名额限制等信息。添加完事件,它会自动显示在事件列表上,通过点击主导航菜单上的事件链接可以找到。 92 | 93 | ## 创建帖子 ## 94 | 95 | 组最常见的用途之一是与其他成员共享信息,通过帖子功能发布状态信息是实现信息共享的主要机制。要创建一个新帖子,需要访问组登陆页面在创建一个帖子区域中输入内容。你可以在组登陆页面中直接输入帖子,或者为了加入更多的详细信息,在点击“创建帖子”链接后点击页面底部右边的创建一个帖子文本区域点击“进入完整表单”模式。帖子会按照“创建日期”的降序排列(最新的在前)自动显示在组登陆页面中。 96 | 97 | ## 创建维基 ## 98 | 99 | 群体的内容的其它形式是维基,在这里维基被定义为在整个社区拥有增加、修改和删除内容的权限的内容。要创建一个组里的一个维基,点击管理菜单内容链接里的“创建内容”链接,在内容类型列表中选择维基并输入标题、正文和该维基关联的组。再创建好维基后,它会显示在与该维基相关联组的登陆页面的“river of content”那里。该组成员可以对维基进行编辑,有机的扩展文档中所包含的内容。 100 | 101 | ## 管理组 ## 102 | 103 | 作为一个组的管理者,你能够使用帮助你管理你的组的一系列工具。点击组登陆页面顶部附近的管理组按钮(假设你已经登陆并且为该组的管理者),组管理者登陆页面列出了新增人员到组、组内人员管理、组内人员权限分配以及管理角色等链接。每个组都有自己的一套权限和自己的角色设置体系,使得每个组都能管理谁有权限访问什么。 104 | 105 | ## 附加功能 ## 106 | 107 | 在基于 Drupal Commons 的站点上还有许多可以用的附加功能,比如: 108 | 109 | - 发散:在站点上建模常用内容的功能。 110 | - 跟踪:跟踪站点内用户、内容、组的功能,与Facebook类似。 111 | - 类似:发现站点中“类似”内容片断的功能。 112 | - 社会共享:站内内容共享到社交媒体站点的功能。 113 | - 可信联系人和私信:站内用户交流和消息交互功能。 114 | - 多语种:社区网站内的多语种内容支持功能。 115 | 116 | 鉴于Drupal Commons建立在Drupal内核之上,你也可以在你的站点上安装或者使用几乎任何其他Drupal贡献模块。 117 | 118 | ## 总结 ## 119 | 120 | 要建立一个社区为主的 Drupal 网站,使用Drupal Commons作为网站的起始点还是比较容易的。建站最难的部分在于定义谁能创建组、谁能管理组和谁能发布内容的逻辑结构。用 Drupal Commons 建站的体力劳动量是很少的。 121 | 122 | 下一章我们将探讨如何使用现成的 Drupal 资源——Drupal Commerce打造一个电子商务网站。 123 | -------------------------------------------------------------------------------- /chapters/chapter-12.md: -------------------------------------------------------------------------------- 1 | #第12章 模块剖析 2 | 3 | 虽然可以建立相对复杂的Drupal8站点而无需使用内部模块,但是你需要了解模块的内部运作,才能充分利用模块的特点。在这一章中,我会带你从简单的Drupalqu 8模块开始去了解这些模块。 4 | 5 | ##你的第一个Drupal8模块 6 | 7 | 别担心,我们会让它简单化!我们只做一件事,就是把“Hello Drupal 8 World!”在页面中展示出来。我们在这一节的努力将是一个类似于图12-1的页面。 8 | 9 | ![图12-1 你好Drupal8世界!](../images/pic-12-1.png) 10 | 11 | **图12-1 你好Drupal8世界!** 12 | 13 | ###第1步:创建模块目录 14 | 15 | 第一步是创建一个目录,构成你的模块文件的归属。所有贡献模块(非核心)位于你的Drupal8个网站的根目录下的模块目录。如果您已经安装任何Drupal8核心模块意外的模块,你会在这个目录看到它们。 16 | 17 | 使用操作系统的文件管理器,或从一个终端窗口,在命令提示符下,导航到你的网站的modules目录,并创建一个自定义的新的目录命名。 Drupal的最佳实践指出,那些不是从Drupal.org下载的自定义模块,应该被存放在一个自定义的子目录。导航到自定义目录和在自定义目录中创建一个名为hello的新目录。 18 | 19 | ###第2步:创建模块信息文件 20 | 21 | 下一步骤是创建一个hello.info.yml文件。此文件告诉Drupal的有关你的模块,并提供了出现在网站的管理部分的扩展页信息。使用您喜欢的文本编辑器,创建一个具有以下内容的hello.info.yml文件: 22 | 23 | name: Hello 24 | type: module 25 | description: 'My first Drupal 8 module.' 26 | package: Awesome modules 27 | version: 1.0 28 | core: '8.x' 29 | 30 | 第一行指定,因为它是出现在模块页面上的模块的名称。第二行指定,我们正在创建一个模块。 (例如,将使用主题为类型的值)。第三行是模块的描述,这也会出现在扩展页上。包字段为分组模块组合在一起的机制。例如,如果你访问你的站点的扩展页面,你会看到一个数字在一个盒子里有核心的标题所列的模块。我们将使用一些独特的东西对我们的模块,并将其放置在一个名为`Awesome modules`的包中。如果你正在写一个模块,例如,创建新的Web服务功能,您应该使用创建Web服务的其它模块的包名,以确保网站管理员可以很容易地找到你的模块。版本为模块创建一个版本号,以及核心指定了的Drupal版本在此模块用于写入。在我们的例子中,我们记这个模块为Drupal8。 31 | 32 | ###第3步:创建模块文件 33 | 34 | 对于我们的Hello模块的模块文件做一件事情:返回我们的模块提供的页面上显示的文字。模块文件可以做很多事情,但对于我们的例子中,我们将只专注于基础知识。 35 | 36 | 使用您喜欢的文本编辑器,创建一个名为hello.module用以下文本的新文件: 37 | 38 | hello_hello_world(), 82 | ); 83 | } 84 | } 85 | 86 | 我们的控制器文件的开头用PHP开始标签开始,作为控制器使用PHP编写的。第二行定义,我们正在使用我们的控制器命名空间: 87 | 88 | namespace Drupal\hello\Controller; 89 | 90 | 第三行定义了我们要继承Drupal的核心ControllerBase类,而不必一切从头开始编写: 91 | 92 | use Drupal\Core\Controller\ControllerBase; 93 | 94 | 回忆第4步,在我们使用'\ Drupal\hello\Controller的HelloController :: SayHello'来调用函数以返回内容给现实。类HelloController 是的HelloController::sayhello的第一部分: 95 | 96 | class HelloController extends ControllerBase { 97 | 98 | 下面的是从你的路由器呼叫的后半部分(HelloController:Hello)。该行代码定义了返回的信息回当访问者访问我们的网站上/hello的URL所显示的页面的功能。 99 | 100 | public function sayhello() { 101 | 102 | 其余的代码只需调用我们在模块文件 hello_hello_world()创建的功能。该函数返回渲染阵列的Drupal知道如何在页面上显示文本“Hello Drupal 8 World!”,然后返回它回到我们的模块路由器。 103 | 104 | return array( 105 | '#markup' => hello_hello_world(), 106 | ); 107 | 108 | 保存此文件,我们已经准备好使用我们的新模块!在访问该网站的管理部分的扩展页面,向下滚动直到看到 Awesome Modules section(见图12-2)。 109 | 110 | ![图12-2 我们的“Hello Drupal 8 World!”模块扩展页](../images/pic-12-2.png) 111 | 112 | **图12-2 我们的“Hello Drupal 8 World!”模块扩展页** 113 | 114 | 勾选旁边模块的名称,然后单击“保存配置”按钮来启用模块,模块启用后您现在就可以测试你的第一个Drupal8模块了!要执行模块,跳转到您的主页,并添加/hello到URL的末尾(我们定义了我们的模块的路由文件的路径)。你应该看到如图12-1前面显示的内容。 115 | 116 | ##其他模块文件 117 | 118 | 我们的Hello模块是一个很简单的模块,其目的是帮助你了解一个模块是如何在Drupal构造的最初的学习曲线。现在你知道了非常基本的模块,你可以看看其他贡献模块,甚至是Drupal8核心,看更复杂的模块中创建学习与增加的复杂性相关的文件。您可以在 www.drupal.org/developing/modules/8 了解。我强烈推荐从 www.drupal.org/project/examples 下载.在这个模块你会发现,展示的Drupal8模块是如何构造的,一个伟大的起点,用于创建Drupal8模块的几个例子。 119 | 120 | ##总结 121 | 122 | 恭喜!你写了第一个Drupal8模块,并获得你的第一个信心朝着成为一个Drupal模块开发的忍者。本章的目的是给你一个概述,所以你将在获得足够的信息去通过其他模块探索。虽然为Drupal模块开发学习曲线比较陡,这是你采取沿着这条道路的第一步。 123 | -------------------------------------------------------------------------------- /chapters/chapter-17.md: -------------------------------------------------------------------------------- 1 | # 第17章 全部放在一起 2 | 3 | **翻译:蓝眼泪** 4 | 5 | 读这本书为你继续提升Drupal技能打下很好的基础。如果你刚接触网页内容管理系统的概念,那么当你第一次使用Drupal建站的时候你很可能没办法立即进入状态并建立一个高度复杂的网站。但是,就像生命中所有的事情,你必须从某一个地方开始,并且你现在有工具和知识可以开启你的Drupal之旅了。对于那些曾有过内容管理经验的人,希望这本书在指明 Drupal 如何工作上有所帮助,这样你就可以将你在其他CMS平台上知道的东西和 Drupal 提供的东西相关联。 6 | 7 | ##现在做什么 8 | 9 | 学习任何东西都需要练习,练习带来舒适感,这种舒适感又带给我们做新事情的能力与动力。学习 Drupal 需要时间,学习,实践,和耐心。学习 Drupal 做好的方法之一就是用 Drupal 建立一个真实的网站。不论这个网站是关于你孩子的体育团队、你的教会、一个社区、非营利性组织,或是其他阳光下的事物,专注于一个有利于一些人或组织的项目可以让你有学习动力,这动力在你学习的过程中会有所帮助。你又如何能一直跟得上Drupal的最新知识进度呢? 10 | 11 | ##看一下其他基于 Drupal 的网站的思路 12 | 13 | 虽然你很难在看到一个网站的时候就知道那是一个 Drupal 站,不过这有一个很好的资源帮助你找到用 Drupal 创建的网站。 Drupal 的创始人 Dries Buytaert 建立了一个清单,清单上都是用 Drupal 创建的知名度很高的网站。你可以在他的个人网站上找到这个列表,链接: http://buytaert.net/tag/drupal-sites 。 Dries 在搜罗来自世界各地不同行业和地点的广泛的网站这方面做得很好。他在不断地更新这个列表,所以为那个网页加一个书签并经常访问是一个很好的主意。 14 | 15 | 通过浏览 Dries 收集的网站列表(目前已超过100)你可以很快地察觉到人们成功基于 Drupal 建立的网站的类型。通过浏览其他网站你可以获得一些灵感,这个灵感包括设计(网站的视觉效果)、布局(页面如何结构化)、组织结构(内容的显示方式)以及已部署的特性和功能。查看其它网站是许多开始做 Drupal 新项目的一个共同的起点。 16 | 17 | ##密切关注 Drupal 和贡献模块 18 | 19 | 使用 Drupal 的好处之一就是它是一个不断发展的平台。当网络上出现一些新概念,Drupal 往往是第一个具备相关实现能力的内容管理系统,要跟上这种变化很简单:经常看看 www.drupal.org/project/project_module ,看看最新的模块和网站上发布的更新(如图17-1) 20 | 21 | ![图17-1 Drupal.org上查找模块搜索的过滤器](../images/pic-17-1.png) 22 | 23 | **图17-1 Drupal.org上查找模块搜索的过滤器** 24 | 25 | 当访问页面时,你会看到“排序”( Sort by )选择列表,其中一个选项是“最后发布”( Last release ),选择这个选项,点击搜索,模块列表会以日期降序排列,最新的模块将在列表顶部。根据你访问网站的次数,你可能只需要几分钟浏览一下新模块的列表,看看有什么是可用的。 26 | 27 | ##获取参与本地 Drupal 用户群 28 | 29 | 在全球有数以百计的 Drupal 用户群,包括区域性的用户组以及针对一些特定主题或行业(如教育、图书馆、政府等)的用户组。你本地的 Drupal 群是一个认识你的社区内的新的 Drupal 用户的好地方,也是一个学习的好地方,因为大多数的群组在定期举行的见面会中会提供一些培训。通过访问 https://groups.drupal.org 定位一个你附近的群,或者是针对你感兴趣的领域的群。 30 | 31 | ##在 Drupal 上建立你的网站的方法 32 | 33 | 虽然在 Drupal 上建立网站没有正式的“ Drupal 方法论”,但是有几个行业最佳的实践和流程,你可以以此为参考开始建立你的 Drupal 网站。表17-1描述的流程看起来有些太大,而且比你认为你建站所需要的复杂得多,但是从以往的经验中我发现,基于我建立网站的范围和复杂性,考虑列表中的步骤应用并执行它是很适当的方式。 34 | 35 | **表17-1 在 Drupal上 建立你的网站的方法** 36 | 37 | | 阶段 | 任务 | 具体内容 | 38 | | :-- | :-- | :-- | 39 | | 1 | | **开始你的项目** 这个阶段有七个任务用来帮你思考并定义你的网站将做什么。Drupal 就像一堆木材:使用适当大小的木材你可以搭建出任何类型和风格的房子。然而,在你想好要建的房子的细节之前你不会先拿着板子和钉子直接做。你可以把项目的这个阶段当制作你建站的蓝图。在这个阶段,你要在纸上记录网站的关键环节,而非在 Drupal 上。当你了解了你要建什么就可以开始你的创建活动了。 | 40 | | | A | **你的新网站是关于什么的?** 以叙事的形式记录一下,你新网站的目的是什么,通常还要描述一下网站的目标客户。把这个文件作为你的“电梯演讲”,意思是,如果你在电梯遇到一个人,他问你你的网站是做什么的,你可以在离开前逐句背诵这个文件内容来回答。这个活动会迫使你用简明的术语定义你的网站是什么,访问网站的会是哪些人。 | 41 | | | B | **确定谁将访问和使用你的网站** 列出你新网站的目标访客的各种类型,例如一个图书馆的访客类型可能有儿童、青少年、年轻人、成年人、求职者和老年人。最受欢迎的一个方式是找一张白纸,在纸上画一个盒子,将这个盒子当做浏览器窗口,窗口里面是你的网站,在盒子上画一些“火柴人”,并为每个“火柴人”添加一个类型标签。 | 42 | | | C | **确定你将向访客提供的内容** 在搭建网站的过程中,常常有人雄心壮志地想“如果我撘起来了,他们就会来访问”,这是一个错误的想法。 那即使他们访问你的网站,你将向他们展示什么内容让他们可以留在你的网站上,在网站上四处浏览然后将你的网站添加到标签夹以备日后访问。你可能希望为每一种类型的访客画一张纸,在左边画一个人物并列出这个人在访问网站时会感兴趣的内容。不同访客类型之间的内容可能会有重复,这没关系,最重要的是你要为每种类型的访客量身定制,想想要向每一位访客提供什么内容使他们注意并不断访问我们网站。对于一个图书馆网站,内容类型可能就是书评、影评、音乐评论、推荐阅读书目以及在图书馆将要上新的目录。 | 43 | | | D | **确定你将向访问者提供的功能** 内容通常只是构成网站的一个方面,你可能想要提供一些交互性的功能,如博客、调查、视频、音频、论坛、在线表单、电子商务、RSS订阅,或其它交互功能。在这项任务中,列出你想向访客提供的所有交互性功能。 | 44 | | | E | **定义网站结构** 检查前几步中记录的内容类型和功能,你将开始看到逻辑分组和类别。您可能会看到基于一个话题或科目的逻辑分组,或者你会看到基于特定类型访客的分组。我们用图书馆网站作为一个例子,你可能在书评中看到横跨所有访问者类型的逻辑分组,你也可能看到专注于老年人和他们的社区资源的使用的内容的逻辑分组,这里的每个逻辑分组都可能,也许应该,成为你网站的一个主要页面。 | 45 | | | F | **定义内容类型和分类结构** 可能有些内容类型并不像 Drupal 的页面内容类型那样只需要一个标题和正文。例如,你定义“事件”作为一个内容类型,一个事件需要有标题、开始日期、开始时间、结束日期、结束时间和地点,而为“事件”创建一个自定义的内容类型应该是比较好的,该内容类型会强制要求那些附加信息的输入,而不是依靠作者自主地在普通页面输入那些值。在这一步中,你要创建自定义内容类型的列表并为每一个内容类型添加相关的属性(如开始日期、开始时间)。在定义内容类型的时候,也该考虑一下分类以及如何在网站上归类内容了。 | 46 | | | G | **定义网站导航结构** 你对以下内容都有了理解,访问者类型、他们想在你网站上看到什么内容、你网站的逻辑分组和主要页面组成,现在可以定义网站的导航(菜单)了。如果你知道某个特定访问者类型是你的主要访客,那么应该提供一种方式让他们可以很容易的找到想看的信息,要实现这个最典型的做法是提供一个菜单。在这个任务中,你将确定所有你希望为访客提供的链接,并且确定这些链接将如何组合起来(如菜单)。以图书馆为例,你可能决定在页面顶部创建一个主菜单,这个菜单会提供图书馆、地点、时间以及如何联系图书馆的链接;你可能决定创建二级菜单,将访问者通过链接引导至图书、电影、音乐或活动的页面;你也可能决定创建另一种菜单,它有助于引导特定类型的访客直接到他们感兴趣的领域的页面,如青少年,青少年,成年人,老年人,和企业主的链接。您可以通过定义某些菜单链接的下拉菜单项来将这个概念引导到另一个更具体的层次上;例如在书籍这个菜单下,你可能想提供一些链接如:推荐的书籍、新书、可订购书籍。 | 47 | | 2 | | **设置你的Drupal环境** 现在,你对你要建立的东西已经有所了解,下一阶段就是配置 Drupal 环境以开始创建我们的 Drupal 网站 | 48 | | | A | **确定将你的新网站部署在哪里** 您可以轻松地在您的桌面或笔记本电脑上建立新的网站,然后在托管的环境上部署该网站,或者你可以选择在有你网站生产版本的环境下建立网站,两种方法都很好。然而,在不久的将来你会想要将网站部署在有商业可行性的托管供应商那里,或者是你自己组织的托管平台上。要查找支持 Drupal 的商业托管服务提供商的清单,请访问www.drupal.org/hosting。 | 49 | | | B | **安装和配置Drupal** 根据附录 A 中一步一步的介绍,在台式机、笔记本、或托管服务提供商提供的环境上安装 Drupal 。 50 | | 3 | | **视觉设计** 你可以在网站创建的前期,中期或者结束前,选择或设计 Drupal 主题。对大多数人来说,大致了解网站做出来的样子,有助于想象网站最终的布局。可能会有一种情况,你无法提前选择或设计主题,比如你要为一个品牌(包括logo,颜色,图案,字体,等等)尚未完成的组织建立网站,在这种情况下,我们仍然可以使用一个通用的主题继续创建网站。 | 51 | | | A | **寻找一个符合你要求的现存主题** Drupal.org 上有成百上千的主题,可能有的主题的布局和设计刚好与你想要在网站上使用的方式很接近。访问 www.drupal.org/project/project_theme 查看主题列表。如果你找不到符合需求的主题,你可以使用 Drupal 网站上列出的“启动器”主题之一(如禅-Zen)作为一个开始。重温第六章看一下如何下载和安装 Drupal 主题的详细说明。 | 52 | | | B | **实现您网站的特定设计元素** 如果你从 Drupal.org 选择了一个现成的主题(而不是从零开始创建的),你可能会想要改变主题的 logo 、颜色等内容。主题开发这个话题已经超出了这本书的范围,不过你可以阅读后边的 Drupal 主题的概念,你会在 www.drupal.org/documentation/theme 页面发现你想查看的文件,通过修改文件以实现自定义主题。 | 53 | | 4 | | **下载并安装贡献模块** 在第一阶段的任务 D 中,你记录了想要向访客提供的除内容外的功能(如博客、RSS、视频、投票、论坛、电子商务等),在这个阶段中你将搜索、安装和启用所需的可解决需求功能的模块。 | 54 | | | A | **确定需要的来解决所需功能的模块** 有些功能可能能通过 Drupal8 的核心模块来实现(如 Book 、 forum 等),而其他功能可能需要查找合适的模块来实现。访问 www.drupal.org/project/project_module 页面来查找模块。使用页面顶部的过滤器根据你想要在网站上实现的功能缩小这些模块的搜索范围。如果你正在苦苦寻找合适的模块,是 Drupal.org 论坛是一个很好的资源。社区是非常有用的,在上边发布一个关于用什么模块来实现特定的特性或功能的简短的问题,可能会减少你研究的时间,并且避免选择不适合的模块。 | 55 | | | B | **下载和安装所需模块** 当你确定了可以实现你网站上功能的模块后,按照第十一章的步骤对每一个模块进行安装、启用、配置并设置权限的操作。 | 56 | | 5 | | **创建自定义内容类型** 如果你在第一阶段的 E 任务处确定了要创建的自定义内容类型,那么现在是时候创建自定义内容类型了。按照第5章的说明,使用内容类型列表和各自的属性列表来创建新的内容类型。 | 57 | | 6 | | **创建视图** 在某些页面上,你可能需要提供一个内容的列表或表格视图。现在是一个构建这些视图来支持下一步中创建的页面的好时机。如何创建视图,请查看第9章。 | 58 | | 7 | | **创建一个普通页面** 使用书中描述的技巧来创建实际的页面(例如,使用布局模块来创建复杂的页面布局)。查看10章描述的如何使用布局,和8章使用区块的描述。创建您在第一阶段,任务E中确定的各个页面。 | 59 | | 8 | | **完成网站上的菜单** 随着页面的完成,现在要准备好完成网站的菜单。重新查看第一阶段任务F中定义的导航结构,确定已经解决了网站上的所有导航需求。如何创建菜单,请查看第7章。| 60 | | 9 | | **完成配置** 进行到这一步,应该要配置网站了。在这一阶段,确定你已创建了所有用户角色,已经赋予了不同角色相应的权限,并配置了如何创建用户账户。如何定义角色及分配权限,请查看第3章。 | 61 | | 10 | | **创建内容** 现在你已经配置了网站,创建了内容类型,定义了视图,创建了面板,定义了用户角色及权限,现在应该在网站上创建内容了。 | 62 | | 11 | | **测试网站** 当你的网站准备进入生产环境的时候,要先进行测试,以确保你你预期的每一项都能实现。作为一个匿名用户(未登录到网站)进行网站的测试。为每一个你定义的角色创建一个账户是很好的方法,以每一种角色登录,确保每一个角色的权限都和预期的一样。 | 63 | | 12 | | **部署到生产环境** 现在将网站部署到托管的生产环境下。 | 64 | | | A | 如果你是在你的电脑或笔记本上创建的网站,那么需要把整个网站的目录复制到托管的生产服务器上,还需要备份数据库并在托管环境下恢复数据库的数据。有关此过程的其他详细信息,请查看第14章。 | 65 | | | B | 如果您是在托管服务提供商平台创建你的网站,那么你就不需要移动您的网站了。 | 66 | | 13 | | **管理您的网站** 像在第14章中描述的那样,监控和管理新的 Drupal 网站。 | 67 | 68 | 69 | ##总结 70 | 71 | 在这一章,我讲了创建 Drupal 新站的方法,这个方法将我在书中涵盖的步骤都联系了起来。虽然每一个网站都是不同的,但这些步骤大致适用于任何类型的网站。将这套方法中的每一步都想一遍,这很重要的,事实上,我会建议你找一个安静的角落,把这个方法大略的走一遍,然后再开始创建你的新网站。这套方法迫使你在开始建站之前要思考你想要达到的目的是什么,最大限度的减少建站的风险,然后你会发现你几乎完全避免了那些风险。 72 | 73 | 下一章的重点是创建响应式的网站,意思是使你的网站良好地显示在各式各样的设备上,如智能手机、平板电脑、笔记本电脑、台式机、或其他的像手表一样的新兴设备等。 74 | -------------------------------------------------------------------------------- /chapters/chapter-19.md: -------------------------------------------------------------------------------- 1 | # 第19章 创建博客网站 # 2 | 3 | 翻译:夏小雪 4 | 5 | 截至2015年4月,大约有2.297亿个Tumblr博客,7580万个Wordpress博客,数以百万计的Blogger博客、Drupal及其他平台建立的博客,保守估计,这些博客网站大约占所有网站类型数量的33%(根据 www.internetlivestats.com 的统计目前共有约9.23亿个网站),也就是说十亿网站里有近三分之一的是博客。平均每天发布的博客文章竟有300万篇之多(Technorati)。 Drupal网站建设者光是建立博客类型的网站就足够忙的了! 6 | 7 | 在本章节中,我将用Drupal 8核心模块建立一个专注于drupal 8学习的博客网站,以此示范使用drupal轻松打造网站的过程。大家可以跟着一起练习,也可以将它作为创建自己博客网站的引导性范本。准备好开始制作你的博客网站! 8 | 9 | ## 明确博客网站需求 ## 10 | 11 | 如前章节所述,开发任一网站都要从需求入手。在本例中我们的博客网站需求有以下几点: 12 | 13 | 1. 基于简单的内容类型创建带有标题、和主题图片的文章功能; 14 | 2. 要有分类及通过主题浏览内容的功能,主题包括贡献模块、托管主机、安装Drupal8、开发模块、性能、安全、站点管理、站点建设、主题皮肤; 15 | 3. 制作内容的易用编辑工具,推荐所见即所得编辑器(WYSIWYG editor); 16 | 4. 基于发布日期的文章列表功能,时间降序排列; 17 | 5. 分类浏览文章功能; 18 | 6. 文章评论功能。 19 | 20 | 针对前述需求,我们可以考虑如何用Drupal满足这些需求,根据需求我们的解决方案如下: 21 | 22 | 1. 使用文章(Article)作为博客的基本内容类型(content type),这一内容类型可解决博客内容的所有需求,文章包括一个标题字段(title)、内容字段(body)和图像字段(image); 23 | 2. 使用分类(taxonomy)对文章内容进行主题归类。建立一个以话题为术语(term)的词汇表(vocabulary),在文章内容类型中建立一个分类术语引用(term reference)的字段供选择主题; 24 | 3. Drupal 8 核心提供了一个所见即所得编辑器; 25 | 4. 创建一个按发布日期降序排列的文章摘要列表视图(view); 26 | 5. 创建一个话题词汇表的分类术语列表视图,将视图以区块形式显示,为每一个术语添加该分类列表页面的链接; 27 | 6. 文章评论默认启用。 28 | 29 | ## 安装 Drupal ## 30 | 在明确了需求与解决方案之后, 创建一个博客网站的下一步是安装 Drupal。按照附录A的步骤安装Drupal,可以安装在在本地,或者你的服务器上,或者共享主机上,或者使用Pantheon和Acquia提供的服务。 31 | 32 | ## 安装及创建主题 ## 33 | 34 | 安装好了Drupal之后,下一步是选择一个主题。你有以下这些选择: 35 | 36 | * 从零开始创建主题; 37 | * 从Drupal启动主题中选择,并且定制内容已符合你的需求; 38 | * 在 [www.drupal.org/project/project_theme](http://www.drupal.org/project/project_theme) 上选择一个接近你需求的主题,然后针对特定的需求修改CSS和布局; 39 | * 在 [www.drupal.org/project/project_theme](http://www.drupal.org/project/project_theme) 上选择一个符合需求的主题直接使用; 40 | * 从 Drupal商业主题网站中购买一个付费主题; 41 | * 将别的CMS上的主题(比如 Wordpress)转换为 Drupal 8 的主题; 42 | * 使用Drupal 8 的任一标准核心主题。 43 | 44 | 在本例中,我们选择第四个方案。 访问 [www.drupal.org/project/project_theme](http://www.drupal.org/project/project_theme) ,过滤条件选择兼容 Drupal8.x,然后搜索。经过搜索浏览,我们选择了最接近需求的主题, Gratis。 按照第六章的叙述,下载安装Gratis,然后设置它为我们这个博客网站的默认主题。完成以上步骤之后我们开始建设我们的博客网站(如图19-1)。 45 | 46 | ![图19-1 安装免费主题Gratis](../images/pic-19-1.png) 47 | 48 | **图19-1 安装免费主题Gratis** 49 | 50 | 配置主题的下一步是设置LOGO和站点名称,移除安装Drupal 8 的时候默认开启的区块。 51 | 52 | 设置LOGO标志:点击管理菜单的二级菜单中的外观(Appearance)链接,点击刚才选择并安装的主题(本例中为Gratis)旁的设置(Setting)链接,取消选中“使用主题提供的默认标志(Use the default logo supplied by theme)”,上传你的LOGO标志然后点击“保存设置(Save configura)”按钮。 53 | 54 | 更新站点名称:点击管理菜单的二级菜单中的配置(Configuration)链接,点击配置页面中的“站点信息(Site information)”链接。考虑到我们正在建设的是一个专注于学习Drupal8的博客网站,那么现在在“站点名称(Site name)”栏位中输入一个合适的标题吧,接着点击“保存设置(Save configura)”按钮。 55 | 56 | 最后一步是移除安装Drupal8时默认建立并启用的区块。点击管理菜单的二级菜单中的结构(Structure)链接,点击“区块布局(Block layout)”链接。通过将区块的区域列修改为“无”来移除所有的自动显示的区块。完成后点击页面底部的“保存区块(Save blocks)”按钮。现在网站的基本工作已经完成,下一步我们将对内容按话题进行分类。 57 | 58 | ## 创建分类 ## 59 | 60 | 我们的博客是专注于Drupal 8学习的网站,在前面的内容中我们明确了需求,其中一个是按话题来浏览内容的功能,因此我们需要创建一个名为“话题”的分类词汇表,建立需求2中所列的术语(贡献模块、托管主机、安装Drupal8、开发模块、性能、安全、站点管理、站点建设、主题皮肤)。 61 | 62 | 要创建词汇表,点击管理菜单的二级菜单中的结构(Structure)链接,选择结构页面中的分类(Taxonomy)链接。点击“添加词汇表(Add vocabulary)”按钮来创建一个新的词汇表,名称为“话题(Topic)”。添加需求2中需要的术语(贡献模块、托管主机、安装Drupal 8、开发模块、性能、安全、站点管理、站点建设、主题皮肤)到词汇表中。完成以上内容,话题词汇表列表页面将如图19-2所示。 63 | 64 | ![图19-2 话题词汇表](../images/pic-19-2.png) 65 | 66 | **图19-2 话题词汇表** 67 | 68 | ## 更新文章内容类型 ## 69 | 70 | 接下来我们要在文章内容类型中创建一个用来确定博客发布内容所属话题的新字段。选择结构(Structure)➤内容类型(Content types)➤文章(Article),然后选择“管理字段(Manage fields)”链接,然后创建一个新的字段,字段类型为分类术语(Term reference),使用话题词汇表作为这个字段的基本选项。关于更多添加字段的细节,请查阅第五章。在文章内容类型中添加完这个字段后,创建新文章的页面应如图19-3所示,它会有一个话题词汇表的术语列表。 71 | 72 | ![图19-3 添加话题到文章内容类型](../images/pic-19-3.png) 73 | 74 | **图19-3 添加话题到文章内容类型** 75 | 76 | 我们要对内容类型进行的另一个更改是关闭自动发布新微博到网站首页的功能。我们要在下一步创建的视图中控制页面的展示。接下来实现关闭自动发布到首页的功能,点击“编辑文章内容类型(Edit Article content type)”页面顶部的编辑选项卡,选择表单底部垂直选项卡中的“发布选项(Publishing options)”,取消选中“推荐到首页(Promoted to front page)”并点击“保存内容类型(Save content type)”按钮。现在我们可以通过使用文章内容类型赖发布博客了。 77 | 78 | ## 创建视图 ## 79 | 80 | 在网站建设过程中的下一步是创建一个渲染网站内容的视图,我们需要以下两个视图: 81 | 82 | * 发布日期降序排列的摘要列表,页面顶部显示最新的博客文章 83 | * 话题分类词汇列表,向网站访问者提供便捷的方式浏览他们感兴趣的话题的帖子。 84 | 85 | 在创建视图之前,让我们先有一些文章内容以便之后能够即时直观的看到视图显示效果。我们来添加一些虚拟的博客文章(参考第二章),为它们选择不同的话题(比如主机托管,性能,主题皮肤)。创建完这些博客文章后,我们就可以开始创建最主要的视图了。点击管理菜单第二层中的结构(Structure)链接,选择结构页面中的视图(Views)链接。点击“添加视图(Add new view)”按钮,在“视图名称(View name)”栏位输入“博客文章(Blog posts)”。然后修改视图设置,在“类型为(of type)”选择列表中选择文章(Article),最后,点击“保存并编辑(Save and edit)”按钮。我们将要创建一个区块显示,因此点击添加(Add)按钮并在显示类型列表中选择添加区块(Block)。然后对该视图做以下更改: 86 | 87 | 1. 点击“显示名称(Display name)”按钮,把值从“区块(Block)”变更为“博客列表(Blog Listing)”。 88 | 2. 点击标题(Title)链接,然后输入“最新发布博客(Latest Blog Posts)”作为标题。 89 | 3. 点击显示(Show)链接,把值从“字段(Fields)”改为“内容(Content)”。当“查看模式(Row style options)”出现时,选择摘要(Teaser)模式,然后按应用(Apply)按钮。 90 | 4. 排序标准(Sort Criteria)选项应该已经被设置为按内容发布时间降序排列,这种排序标准将会把最新发布的文章放置在文章列表的顶部。 91 | 5. 按下保存(Save)按钮来保存此视图。 92 | 93 | 我们要创建的第二个视图是话题词汇表的分类术语列表视图。我们将使用这个列表作为导航到术语列表页面的菜单以展示所有分配给该话题的博客文章。点击管理菜单第二层中的结构(Structure)链接,选择结构页面中的视图(Views)链接。点击“添加新视图(Add new view)”按钮,输入“博客话题(Blog Topics)”作为视图名称。在视图设置的显示(Show)列表中选择分类术语(Taxonomy terms),在“类型(of type)”选择列表中选择话题(Topics),排序依据(sorted by)栏位设置为不排序(Unsorted),点击“保存并编辑(Save and edit)”按钮后继续。 94 | 95 | 我们要将这个视图作为区块显示,因此点击添加(Add)按钮并在显示选项中选择添加区块(Block)来创建一个新的区块显示。点击“显示名称(Display name)”按钮,在“管理名称(Administrative name)”栏位中输入“话题菜单(Topics Menu)”,然后点击应用(Apply)按钮。点击标题(Title)链接,然后在标题(Title)栏位中输入“按话题浏览(Browse by Topic)”,然后选择“应用全部显示(Apply(all displays))”按钮。该视图这样就保存好了。 96 | 97 | 现在我们已经针对需求做好了视图,下一步就是将视图放进页面。 98 | 99 | ## 放置区块 ## 100 | 101 | 完成了视图以后我们就可以把这些创建好的区块放进页面了。点击管理菜单第二层中的结构(Structure)链接,选择结构页面中的“区块布局(Block layout)”链接。点击博客文章:点击博客列表链接右侧的“放置区块(Place blocks)”并选择“内容(Content)”作为列表显示的区域。我们想要限制这一区块显示,让它只出现在站点首页而不是每一页,因此选择配置区块底部垂直排列的页面(Pages)选项卡,然后在“在特定页面显示区块(Show block on specific pages)”表单中选择“为列出的页面显示(Show for the listed pages)”。在文字输入框中输入,这是Drupal默认的首页地址快捷方式,然后按下“保存区块(Save block)”按钮。 102 | 103 | 下一步,在“放置区块(Place blocks)”中选择博客话题:话题菜单(Blog Topics: Topics Menu)区块,然后把它放在主题提供的其中一个侧边栏里。评论功能已经启用,所以我们也同样希望在我们的网站能够有一个列表来展示最新评论。 Drupal 8默认提供了一个区块来完成此需求。从“放置区块(Place blocks)”框内选择“最新评论(Recent Comments)”区块,然后把它与博客话题菜单区块放在同一个侧边栏内。现在,你的区块布局应该类似图19-4。在离开区块布局页面前记得保存区块。 104 | 105 | ![图19-4 区块显示区域配置](../images/pic-19-4.png) 106 | 107 | **图19-4 区块显示区域配置** 108 | 109 | 在完成测试博客文章发布,测试评论发布和配置网站区块布局之后,最后的成品看起来很不错哟!(如图19-5) 110 | 111 | ![图19-5 最终产品](../images/pic-19-5.png) 112 | 113 | **图19-5 最终产品** 114 | 115 | 随便点击任一博客文章标题或者“更多(Read more)”链接将会带你到文章内容详细页面,点击侧边栏任一话题链接则会带你到该话题下的文章列表页面,列表页标题是分类术语名称,如图19-6所示。这是一个简单却又十分有有效的用分类术语过滤内容的解决方案! 116 | 117 | ![图19-6 话题页面](../images/pic-19-6.png) 118 | 119 | **图19-6 话题页面** 120 | 121 | ## 总结 ## 122 | 123 | 利用 Drupal 8 核心,我们只做一些简单的步骤就创建了一个博客网站。这是一个很好的开始,而且你也可以利用本章节介绍的方案去做别的功能,比如创建一个按月显示的博客文章视图,让网站访问者能够互动的论坛,或者别的任何你希望实现的其他功能。使用Drupal做解决方案你仅仅只会被你的想象力,你的技巧和花费时间所限制。 124 | 125 | 在下一章,我们将在Drupal上围绕建立企业网站的需求来扩展解决方案。 126 | -------------------------------------------------------------------------------- /chapters/appendix-A.md: -------------------------------------------------------------------------------- 1 | #附录A 安装Drupal 2 | 3 | **翻译:蓝眼泪** 4 | 5 | 如果你将你的站点安装在网络托管服务商提供的环境中,那可能有工具为你安装drupal,如果是这样你可以绕过附录,按照服务商提供给你的方向进行。但是如果你需要在你的笔记本、台式机或服务器上安装drupal的话,那么你可以看看这个附录。 6 | 7 | 在接下来的章节中,我会带你一步步的进行基础组件的安装-PHP、Mysql、Apache,以及drupal8的下载及安装。在附录最后,你将安装Drupal8,并通过书中的内容进行准备工作。 8 | 9 | ##安装Drupal所需基础 10 | 11 | 在安装Drupal前,你在即将安装Drupal的平台上需要有操作系统的权限。这个平台,不管是笔记本、台式机还是服务器,必须安装并配置几种软件用来支持运行Drupal需要的基本元素(MySQL、PHP、Apache和IIS)。操作系统和硬件的类型可依你的喜好进行选择,你可以在Windows、OS X,或基于Linux的平台上安装和配置Drupal,硬件可以是本地机(台式机、笔记本或有物理访问路径的服务器)或托管的服务器(由一个组织管理的分享或专用的服务器)。 12 | 13 | 在你开始安装Drupal之前,需要在平台上下载、配置及运行一下组件: 14 | * Web服务器:Apache,Nginx,Lighttpd,或微软的IIS服务器。在本书中,我用的是Apache,因为Apache在所有支持Drupal的平台上都能运行。有关安装和配置IIS的信息,请访问 www.microsoft.com 15 | * PHP:Drupal使用的编程语言 16 | * 关联的数据库服务器:MySQL或PostgreSQL都可以。为了简化安装过程,我选择了MySQL。有关PostgreSQL的安装和配置信息,请访问 www.postgresql.org 17 | * FTP(文件传输协议):用于上传文件到服务器 18 | * 各种类库:用于图像处理、安全连接和邮件路由 19 | 20 | 如果你想在托管的环境中运行你的Drupal站点,你的托管服务商已经将建立基础组件的工作进行完了。如果你是使用的托管公司,那么你可以跳过“Drupal安装”这一部分。如果你要在台式机或笔记本上开发网站,然后将网站部署在服务器上,那么你需要在台式机或笔记本上安装并配置支持Drupal的基础组件,请照如下步骤进行。 21 | 22 | ##设置安装Drupal的平台 23 | 24 | 在安装Drupal之前,有三个基本组件要准备好:平台(硬件和操作系统)、Web服务器(软件,如Apache)、数据库(如MySQL)。如果你在一个商业托管公司的平台上,可以跳过“Drupal安装”这一部分,因为你需要的都是默认安装好的。 25 | 26 | 根据你平台上操作系统的不同,可能有些组件已经安装好了(如OS X已经安装了PHP和Apache)。然而,让所有组件一起工作对大多数人来说都是一个难点。有一群很有才华的人在 www.apachefriends.org 上创建了一个叫XAMPP的集成(all-in-one)软件包(XAMPP表示Apache,MySQL,PHP,Python),他的安装和配置对于最初级的技术人员来说都是很简单的。在Windows,OS X操作系统,Linux和Solaris上都可以安装XAMPP。 27 | 28 | 在XAMPP中包含的Drupal重要组件有: 29 | * Apache:处理请求的网络服务器软件包,有人发送请求时将服务器上的内容返回给申请人 30 | * MySQL:存储Drupal内容的关联数据库 31 | * PHP&PEAR:PHP,创建和维护Drupal的开发者使用的编程语言;PEAR(PHP扩展和应用程序库),PHP开发者使用的开源代码的一个结构化的库 32 | * PHPMyAdmin:一个很好的工具,可用于创建和管理数据库、表及存储在Drupal数据库中的数据 33 | 34 | 在 www.apachefriends.org 上有在各个平台上安装XAMPP的详细说明。有一些东西可以替代XAMPP,如OS X的MAMP,要查找替代列表可在Goole中搜索“Apache AND MySQL AND PHP stacks”。 35 | 36 | ##安装Drupal 37 | 38 | 现在基本的组件已经安装完成,准备安装Drupal了。在服务器上安装Drupal有八个基本步骤,不管你是在Windows、OS X操作系统、Linux还是共享主机的服务器上运行Drupal,这都是必须的。 39 | 40 | 1. 从 http://drupal.org/project/drupal 下载当前的drupal8安装包到你电脑上 41 | 2. 解压缩Drupal的安装包tar.gz或zip文件 42 | 3. 将解压缩的文件移动到你网络服务器的根目录下,如果你想在服务器上运行多个网站就移动到根目录的子目录下(如www-root/drupal8或htdocs/drupal8) 43 | 4. 创建settings.php文件 44 | 5. 创建files目录 45 | 6. 创建将用于新的Drupal站点的数据库 46 | 7. 创建数据库用户账户 47 | 8. 开始进行Drupal安装脚本以及设置网站 48 | 这些步骤将在后续的章节中进行详细的描述。 49 | 50 | ###下载Drupal 51 | 52 | 下载Drupal很简单,访问 www.drupal.org/project/drupal 选择最新的版本和语言(如英语或法语)的Drupal,从主页上下载下来。Drupal版本号是随时间变化的,但是主页上的列出的最新版本是安全的,可以放心的下载、安装及配置。另外,通过Drush下载Drupal会更简单,详见第15章。 53 | 54 | 要下载Drupal,右击你想要下载的版本及格式即可,压缩文件(tar.gz或zip)会自动下载到你配置好的接收文件夹中。 55 | 56 | ###解压Drupal安装包 57 | 58 | 从Drupal.org上下载的是一个压缩包,压缩包中包含建立及运用Drupal8所需的所有文件和目录。你需要吧tar.gz文件或zip文件解压出来,可以通过双击文件(在OS X操作系统或Linux中)或用解压工具打开文件。双击文件将会在你电脑上创建一个文件夹,文件夹中是原始状态下的所有文件和目录。 59 | 60 | —————— 61 | 注意:由于操作系统的不同或操作系统中文件管理器的不同设置,你可能会看到.htaccess文件,也keen那个看不到,因为它在Linux和OS X操作系统是隐藏文件。这是在下一步必须移动的一个关键的文件。如果你看不到.htaccess文件,请更新文件浏览器的设置使得你在进行下一步之前可以看到隐藏文件。其他的操作系统可能也有类似的文件,如IIS中的web.config. 62 | —————— 63 | 64 | ###将Drupal移动到Web服务器的根目录下 65 | 66 | 下一步是将上一步中解压的Drupal文件夹中的所有内容移动到Web服务器下的根目录中。如果你使用的是XAMPP,根目录是XAMPP安装文件中的htdocs文件夹。如果你将Drupal安装在托管服务器中,根目录是托管公司指定的(例如,我使用的托管服务器的根目录是public_html),如果你不确定Drupal文件要放在哪里,可以让托管公司查一下。 67 | 68 | 当所有文件都放在了相应位置,可以进行下一步了。 69 | 70 | ###创建settings.php文件 71 | 72 | Drupal用settings.php文件存储网站的配置参数,如数据库名称、访问数据库的用户名和密码。Drupal中有一个默认的settings.php文件将作文我们Drupal的起点。进入你上一步移动的文件夹中的目录sites/default,在这个目录下你会看到default.settings.php文件,复制这个文件并将新文件重命名为settings.php。 73 | 74 | 下一步,设置settings.php的权限使所有人都可以读取和更新文件。在更新进程中Drupal要有更新文件的能力。如果你不确定如果设置权限,查看一下你的操作系统设置权限的指南。 75 | 76 | ###创建files文件夹 77 | 78 | Drupal将所有上传的文件和目录存储在服务器的一个目录上,该目录的标准名称是文件,在本机的话是sites/default目录。创建一个新的目录,命名为files,设置权限使网络服务器可以写入该目录。 79 | 80 | ###创建Drupal数据库 81 | 82 | 创建数据库是一个相对简单的过程。如果你在使用XAMPP或网络托管服务器,你可以使用phpMyAdmin管理工具,要使用你笔记本或台式机的管理工具,访问链接 http://localhost/xampp (如果你使用XAMPP的话)或者是你已安装的有适当面板的链接,在工具条上你会看到phpMyAdmin,点击链接打开phpMyAdmin管理页面。 83 | 84 | 在这个页面上,定位在“创建数据库”标签的右下方的文本框中,输入一个简易且和网站相关的名字(用这种方法便于以后确定哪个数据库是与哪个网站相关的,尤其是当你的服务器上运行多个网站的时候)。MySQL是非常灵活的,你可以给你的数据库定义任何你想要的名称,但是,它还是有一些你要遵循的标准的,标准如下: 85 | * 只使用小写字符 86 | * 用下划线分割单词 87 | * 数据库名称不可超过64个字符(MySQL限制) 88 | 89 | 为了演示,我创建了一个数据库,名为“drupal8testsite”,输入数据库名称后单击创建按钮,如图A-1 90 | ![创建一个新的MySQL数据库](../images/pic-a-1.jpg) 91 | 图A-1 创建一个新的MySQL数据库 92 | 93 | 下一步出现的屏幕上显示的就是我们创建的数据库。在这个页面可以创建表,但是我们并不需要做这一步,因为我们安装Drupal的时候数据表会自动创建。 94 | 95 | ###创建数据库用户账户 96 | 97 | 下一步是创建一个与我们刚才创建的数据库相关联的MySQL用户。你可以使用安装MySQL是自动创建的root账户,但为了安全起见,创建一个只访问该数据库的用户账户会更好一些。要打开创建用户账户的面板,单击“权限”选项卡即可,这个页面列出了所有的用户账户,单击页面底部的“添加用户”按钮。 98 | 99 | 在“添加用户”页面有四个字段要我们填写以创建新用户(见图A-2) 100 | * 用户名:这是我们数据库用户用来使Drupal登录数据库的唯一值。在这里我们输入“drupal8”。 101 | * 主机:这个字段限定了用户可以登录哪个系统。为了安全起见,我们从下拉列表中选择“localhost”,Localhost就是你的Web服务器,我们不希望用户从本地服务器以外的地方登录系统。 102 | * 密码:设置一个密码,并在确定密码(re-type)的字段输入相同密码。 103 | * 为用户分配数据库:保持默认,即none。 104 | 105 | ![创建一个新的数据库用户](../images/pic-a-2.jpg) 106 | 图A-2 创建一个新的数据库用户 107 | 108 | 当你点击按钮,phpMyAdmin就为你创建好了用户。最后一步是将你创建的用户分配给数据库,并将使用数据库所需的权限赋予新用户。要分配用户,单击刚刚创建的用户前方的图标,并向下滚动到“数据库特定权限”部分,从下拉列表中选择你创建的数据库,然后点击该部分的“转到”按钮,然后会出现一个列表,你可以通过这个列表授予用户数据库的操作权限,单击列表顶部附近的“检查所有链接”,然后单击“转到”按钮,现在可以开始配置Drupal了。 109 | 110 | ##Drupal设置 111 | 112 | 现在开始配置Drupal,打开浏览器,在地址栏输入“http://localhost”,如果你要将drupal8安装在根目录的子目录下,输入链接为子目录的路径,在第一页有站点可用的语言(见图A-3),我选择了英语,点击“保存并继续”。下一步允许你选择你希望安装的配置文件,标准(Standard)安装包含我在书中描述和使用的Drupal完整版的所有核心模块,最小配置(Minimal)是安装裸机版的Drupal,没有很多我在书中描述的核心模块。对绝大多数的Drupal网站所有者来说,标准版是一个比较正确的选择。如果你正在开发一个自定义平台(自己分配配置文件和特定模块),你可以选择最小模式(Minimal)。在当前例子中,我们选择标准版(Standard),点击“保存并继续”。 113 | ![图A-3 选择安装配置文件](../images/pic-a-3.jpg) 114 | 图A-3 选择安装配置文件 115 | 116 | 在下一页,显示了你可以选择的配置文件版本,大多数情况下你会选择标准版(如图A-4) 117 | ![图A-4](../images/pic-a-4.jpg) 118 | 图A-4 119 | 120 | 下一页需要你提供之前创建的数据库的具体信息,在这个页面(如图A-5),完成以下字段的输入: 121 | * 数据库名称:输入你创建数据库时使用的名称(在例子中是“drupal8testsite”)。 122 | * 数据库用户名:输入你创建新用户时的用户名(在例子中是“drupal8”)。 123 | * 数据库密码:输入你创建新用户时的密码。 124 | ![图A-5 设置数据库参数](../images/pic-a-5.jpg) 125 | 图A-5 设置数据库参数 126 | 127 | 如果你忘记了之前设置的值,可以通过phpMyAdmin查看。 128 | 129 | 在你输入正确的值之后,Drupal将运行安装脚本。当Drupal创建了支持你新网站的数据表之后,你可以设置一些简单的参数(如图A-6) 130 | ![图A-6 网站设置页面](../images/pic-a-6.jpg) 131 | 图A-6 网站设置页面 132 | 133 | 在这个页面要输入以下信息: 134 | * 站点信息 135 | 网站名称:你站点的名称 136 | 网站e-mail地址:这个默认e-mail地址将被用于发送Drupal系统生成的出站邮件 137 | * 网站维护账户 138 | E-mail地址:这个地址是发出邮件的管理员相关的电子邮件 139 | 用户名:这是新网站的管理员用户名,最好是容易让你记住的名字 140 | 密码:输入管理员账号的密码 141 | 确认密码:在密码字段重新输入管理员密码 142 | * 区域设置 143 | 默认国家:你所在的国家(如果你不想指定默认国家可以保留None值,这是可选项) 144 | 默认时区:为你的网站选择合适的时区 145 | * 更新通知 146 | 自动检查更新:选中后,系统会自动检查Drupal核心及你安装的模块的更新情况,在突出情况下会显示发布的新版本及补丁。选中这个是个很好的选择,与手动检查更新比较的话它使得跟踪模块更新情况更容易。 147 | 接收电子邮件:如果选中的话,当Drupal检测到新版本的模块后会自动给管理员发邮件。 148 | 149 | 在你更新了这个选项的值之后,只需要单击“保存并继续”按钮即可。 150 | 151 | 点击这个按钮之后会出现一个页面,页面显示你已成功安装Drupal! 152 | 153 | 安装结束后,它会自动将你引导到网站的主页上。 154 | 155 | ##总结 156 | 157 | 在本附录中,我讲述了设置服务器及安装Drupal的内容。你现在可以开始使用Drupal8平台开启创建网站的旅程了。 158 | -------------------------------------------------------------------------------- /chapters/chapter-18.md: -------------------------------------------------------------------------------- 1 | # 第18章 响应式网站# 2 | 3 | 翻译:蹊 4 | 5 | 就在几年前,智能手机和平板电脑并不存在,如今我们生活在一个分析家预测下的手机和平板电脑的网站流量于2014年超过笔记本和台式电脑的世界里。我们生活在一个移动端的世界,作为Drupal网站建设者,重要的是要处理日益增长的智能手机和平板电脑的使用,在我们建立新站点的时候,要开始优先考虑移动端。 如果大多数的用户访问我们的网站是在较小的屏幕上,无论他们使用什么设备,都能提供了不起的用户体验是很明智的。 6 | 7 | 幸运的是,Drupal 8 能处理在不同宽度屏幕上渲染站点的挑战(手机,phablets,平板电脑,笔记本电脑,台式电脑,电视)在这一章里,我们将着眼于利用Drupal 8响应式工具和响应式主题,以及步入基本的CSS主题处理响应性。 8 | 9 | ##定义响应式 10 | 11 | 你听说过“响应式”和“移动友好度”,但是网站响应式到底意味着什么?简单的说,响应式意味着你的网站在不同宽度屏幕的多种设备上可以浏览和使用,而无须滚动很远,在小型设备上阅读,内容依旧大小合适。 12 | 13 | 响应式也意味着,你的用户访问网站时,用户体验自动适应设备。例如,如果你的站点的某些元素在小型设备上显示不佳,你可以选择访问者使用小型设备时不显示这些元素,但是访问者使用笔记本和台式机时仍可以显示。响应式也可能意味着利用设备的功能,如手势或滑动浏览你的网站,而不是要求更多传统的指向-点击的界面。无论你选择哪种定义,响应式设计的基本概念是使你的站点在所有设备均可用。 14 | 15 | ##如何设计响应式网页 16 | 17 | 响应网页设计作品通过结合检测网站访问者使用的设备的屏幕宽度,利用CSS定义元素基于屏幕的宽度如何在页面上显示。比如一个页面,该页面有三个等宽列,每个占屏幕宽度的33% 。如果你在配有15英寸屏幕1680像素的笔记本电脑的页面浏览,每列宽约560像素则该网站会看起来不错(见图18-1)。 18 | 19 | ![图18-1 普通笔记本的屏幕分辨率](../images/pic-18-1.png) 20 | 21 | **图18-1. 普通笔记本的屏幕分辨率** 22 | 23 | 打开iPhone上的同一页,列缩小到320像素的33%,约106像素。列变得狭长,列中的文本变得看不到——最好的是浏览者必须滚动到左边或右边,才能看到非常小的文本列和图片(见图18-2). 24 | 25 | ![图18-2 普通iphone4的屏幕分辨率](../images/pic-18-2.png) 26 | 27 | **图18-2. 普通iphone4的屏幕分辨率** 28 | 29 | 更好的方法是检测到用户正在用320像素宽的设备浏览,用每列320像素或100%宽度取代水平三列横跨页面,各列堆积在顶部。就像在15英寸的笔记本电脑上看一样,每列几乎是一样宽,在iPhone4上依然可以看到(见图18-3)。 30 | 31 | ![图18-3 列堆积](../images/pic-18-3.png) 32 | 33 | **图18-3. 列堆积** 34 | 35 | Media Queries 是一个CSS工具,结合浏览器报告屏幕的宽度,让你专门为给定宽度的设备写css。 media query 的一般格式是: 36 | 37 | @media (max-width: 600px) { 38 | 39 | .body { 40 | 41 | font-size: .9em; 42 | 43 | } 44 | 45 | } 46 | 47 | query 始于@media和最大宽度:600px的指定范围内,{}里面的css只能在600px或更小的浏览器窗口被应用。你也可以指定你查询的宽度范围: 48 | 49 | @media (min-width: 321px) and (max-width: 599px) { 50 | 51 | .body { 52 | 53 | font-size: .7em; 54 | 55 | } 56 | 57 | } 58 | 59 | 在这种情况下,任何设备的屏幕宽大于等于321px和小于等于599px之间css会包含{}的应用。在前面的两个例子中,设备上的任何文本在600px宽以内字体有 .9em,设备在321px到599px宽会有 .7em,(解释em的单元将在之后章节“普通css变成响应式”这一段提到)。 60 | 61 | 当你看到市场的各种设备,你会发现你可能需要在你的css文件里用几个 media queries 去解决你的站点在不同设备上的渲染。 media queries 的个数取决于你的页面在屏幕上缩放的时候,内容的格式出现多少变化。如果你的站点是单栏设计,那么你能够侥幸不使用 media queries,但是多数站点不止一栏,甚至单栏站点也需要为横向菜单做出调整。 62 | 63 | ##制作你的响应式站点 64 | 65 | 制作你的Drupal8 响应式站点有三个基本选择: 66 | 67 | - 从 Drupal.org 选择一个现成的主题,含有 media queries 定义的跨设备工作的主题样式表和css。 68 | - 选择一个初始主题,比如,从 Drupal.org 下载Zen这个主题,在该主题的响应式框架上构建。   69 | - 采用无响应式的主题,添加 media queries 和 width-specific CSS,使得站点在任何宽度都能渲染正常。 70 | 71 | 每种方法都有其优点,取决于您的CSS的合适程度和你识别页面上的元素需要做出改变的能力,这种改变基于访问站点的游客的屏幕宽度 72 | 73 | 我用得最多的解决方案是第二个选项,从Zen建立子主题,然后定制它来满足我的客户的需求。无论您选择哪种方式, 都值得购买 Jonathan Fielding 的这本书 “Beginning Responsive Web Design with HTML5 and CSS3” (Apress, 2014),去指导你沿着这条路往前走。 74 | 75 | ##浏览器工具帮助你测试你的响应式主题 76 | 77 | 在选择和安装所需的主题后,最好下载浏览器插件,这样可以很容易看到你的站点在不同宽度设备上的效果(除非你足够富有去购买市场上每一种设备)。Chrome有一个很好的工具叫做响应式网页设计测试仪(Responsive Web Design Tester)。谷歌商店提供了一个免费的插件,提供常用设备的下拉式列表。单击工具栏上的工具图标,你会看到设备列表(见图18-4)。选择列表后,一个新的Chrome窗口就会打开,显示你的站点在那个设备上的效果。Firefox和Safari也有类似插件,工作一样好。 78 | 79 | ![图18-4 chrome浏览器的 Responsive Web Design Tester 插件](../images/pic-18-4.png) 80 | 81 | **图18-4. chrome浏览器的 Responsive Web Design Tester 插件** 82 | 83 | 有了浏览器的工具,下一步是看你的网站在不同的屏幕宽度和回答下列问题: 84 | 85 | 1. 在页面上哪些元素需要调整合适的显示(例如,列,图像和字体大小) 86 | 1. 对于较小的屏幕,哪些元素应该从页面中删除?重点应该是对小屏幕的用户来说最重要的内容。 87 | 1. 哪些导航元素需要改变,使得导航对没有鼠标指向和点击小型设备来说更易操作。 88 | 89 | 很可能,你会发现有的元素在不同的屏幕宽度下,为了在小屏幕宽度下可用,需要做出改变。为了使用能够改变显示元素的能力,你需要找到你的主题的样式表(通常出现在主题/ < themename > / CSS文件夹)和加上需要能够调整css的 media queries 。以下是 media queries 的推荐列表,在如今市场上的多数屏幕宽度上可用。 90 | 91 | /* Smartphones (portrait and landscape) ----------- */ 92 | 93 | @media only screen and (min-device-width : 320px) and (max-device-width : 480px) 94 | 95 | { /* Styles */ } 96 | 97 | /* Smartphones (landscape) ----------- */ 98 | 99 | @media only screen and (min-width : 321px) 100 | 101 | { /* Styles */ } 102 | 103 | 104 | /* Smartphones (portrait) ----------- */ 105 | 106 | @media only screen and (max-width : 320px) 107 | 108 | { /* Styles */ } 109 | 110 | 111 | /* iPads (portrait and landscape) ----------- */ 112 | 113 | @media only screen and (min-device-width : 768px) and (max-device-width : 1024px) 114 | 115 | { /* Styles */ } 116 | 117 | 118 | /* iPads (landscape) ----------- */ 119 | 120 | @media only screen and (min-device-width : 768px) and(max-device-width : 1024px) and 121 | (orientation : landscape) { /* Styles */ } 122 | 123 | /* iPads (portrait) ----------- */ 124 | 125 | @media only screen and (min-device-width : 768px) and (max-device-width : 1024px) and (orientation : portrait) 126 | 127 | { /*Styles */ } 128 | 129 | 130 | /* Desktops and laptops ----------- */ 131 | 132 | @media only screen and (min-width : 1224px) 133 | 134 | { /* Styles */ } 135 | 136 | /* Large screens ----------- */ 137 | 138 | @media only screen and (min-width : 1824px) 139 | 140 | { /* Styles */ } 141 | 142 | /* iPhone 4 ----------- */ 143 | 144 | @media only screen and (-webkit-min-device-pixel-ratio : 1.5), only screen and (min-device-pixel-ratio : 1.5) 145 | 146 | { /* Styles */ } 147 | 148 | 你会注意到,一些 media queries 指定所使用的设备的方向,纵向或横向。这只是另一种工具,用于收缩将被应用到设备上的css。 149 | 150 | 根据你使用的主题,media queries 将被放在 style.css 或者layout.css的结尾。如果你使用的主题已经通过 media queries 支持响应式,在这上面构建是个好主意。在Bartik主题的情况下,看着CSS目录,你会看到三个CSS文件:layout.css,style.css和colors.css。如果检查 layout.css 文件,你会看到主题的创建人已经在css 文件里放了两个 media queries。 151 | 152 | @media all and (min-width: 560px) and (max-width: 850px) 153 | 154 | @media all and (min-width: 851px) 155 | 156 | 这两个媒体查询中包含了一些CSS,他们覆盖了主题生成的出现在不同页面的元素。这两个 media queries 用于调整所有页面的元素,从而在所有设备上可用的用例,但是这里还有需要你去调整针对iphone4的特定元素的用例。加入以下 media query 和css相关条目,在iphone4或更小的屏幕的设备上能特殊变化。 157 | 158 | @media all and (max-width: 320px) 159 | 160 | 你可能要调整的常见元素是列的宽度、字体大小和图像大小。s用浏览器的响应式页面设计工具查看站点,这会帮你识别哪些元素需要改变。 161 | 162 | ##修改普通css处理响应式 163 | 164 | 当设计一个响应式网站时,第一要考虑的事情是需要改变固定的像素宽度和基于点的字体大小。多年来,我们一直在设计像素完美的站点,但响应式设计,我们需要将我们的思维从精确的像素转向百分比和行长单位(ems)。如果你是一个有经验的设计师和css开发者,改变你看待设计和用css实现设计是最难的一个方面。一旦您完成了转型,这个过程将是比较简单的——但是首先,我们要思考页面上的元素尺寸将要占用的显示宽度的百分比。如果你使用固定的像素宽度,其结果将是你的访问者使用小屏幕设备时将必须水平滚动才能看到你的网站完整宽度。举个例子,用你的智能手机查看 whitehouse.gov 。不幸的是,这个网站没有响应式(到2015年初),需要你用你的手指向右滚动,才能看到该网站的整个宽度。 165 | 166 | 首先要检查的页面的任何元素,当你在小屏幕上访问网站时,是使网站缩小以适应窗口还是需要你向右滚动才能看到页面的完整宽度。Drupal站点的典型元素包括 regions,blocks,panel panes,和 views 经常被要求进行调整。这些元素通常会被设为固定像素宽度,要改成响应式,需要设成百分比宽度。 167 | 168 | 要确定改变哪些CSS元素,使用谷歌 Chrome Responsive Web Design Tester,只需右键单击您要更改的元素,然后选择检查元素( Inspect Element) 选项。(见图18-5) 169 | 170 | ![图18-5 使用chrome的 Inspect Element 工具](../images/pic-18-5.png) 171 | 172 | **图18-5. 使用Chrome的 Inspect Element 工具** 173 | 174 | 媒体查询,浏览器响应式设计工具(如Chrome 的 Responsive Web Design Tester)以及通过右键审查元素快速定位CSS的方法使得制作响应式主题成为相对容易的任务。剩下的唯一一件事情就是添加带有媒体查询的{}的CSS选择器和改变CSS的属性,比如把宽度调到一个合适的值,浏览器完成剩下的事情。 175 | 176 | 从响应式设计到表现适宜的跨越设备宽度,有一个学习曲线。旅程从第一步开始,你现在有足够的知识兴致盎然的走下去。 177 | 178 | ##总结 179 | 180 | 在今天这样一个移动世界,建立一个网站,如果不是响应移动设备的网站,那么你的大部分站点访问者会在用户体验上有挫败感。花写时间增加一些媒体查询和css覆写 css文件 ,您的网站的访问者会更开心。虽然不可能总是取悦所有的人,至少试着适配你的网站访客可能会用的设备是一个很好的主意。正如你在本章中看到的,它确实不难,而且实际上很有趣! 181 | -------------------------------------------------------------------------------- /chapters/chapter-03.md: -------------------------------------------------------------------------------- 1 | # 第3章 创建和管理用户 2 | 3 | 翻译:蹊 4 | 5 | 现在,您的网站已经建立和运行,你需要作出几个决定。首先,网站上除了你还有别的管理员吗?其次,你的网站是向所有人开放,或有用户需要登录查看内容和其他功能?在本章中,我将讨论Drupal如何对待您的网站的访客,以及如何作为网站管理员配置Drupal的功能,以限制你系统上的用户帐户的功能。 6 | 7 | ## 用户、角色和权限 8 | 9 | 控制谁在你的网站有权做什么,是通过Drupal的安全功能完成的。Drupal的安全功能通过个人用户账户、用户角色和权限的组合,来定义谁有权查看、创建、更新、删除。 10 | 11 | Drupal 8 的用户(或站点访问者)分为两大类:匿名用户和身份验证的用户。匿名用户访问你的网站不用使用用户的个人ID和密码。如果您访问 www.cnn.com 时没有登录,你被归类为匿名用户。同Drupal,你能支持匿名用户,你也能在你的网站限制匿名用户。身份验证用户可以使用独一无二的用户ID和密码登录您的网站。我将介绍怎样快速创建用户ID和密码,但重要的是理解两类用户之间的区别。 12 | 13 | 角色是一个Drupal的机制,可以让你和站点管理员定义您的网站的验证用户的类别。你定义您的网站的角色时可以面向特定部门(例如,人力资源,采购,销售,市场营销和客户服务每个部门一个),也可以面向功能(例如,内容创作者,审稿的内容,内容发布商)的角色,也可以与您的网站的特定部分相关联(例如,产品支持,销售,主页),也可以是你能设想的其他任何定义。角色是一种简单的把验证用户进行分类的方式,并且分类与特定权限相关联。您的网站的任何身份验证的用户可能会被分配到无、一个、或者一个以上的角色(例如,你可能有用户分配到销售部门,内容作者和产品的角色)。 14 | 15 | 在 Drupal 中权限是用于控制某一特定角色下的用户可以做什么的机制。你可以在已定义的每个用户角色里启用或撤销几十个权限。你会为特定角色设置的权限可能包括:创建一个新的页面,创建一篇新的文章,编辑任何人撰写的文章,能在网站上搜索内容,添加新的用户帐户。权限组合就是你给每个角色定义了能力,即分配到角色的用户成功登录后可做的事。 16 | 17 | 当你把角色权限和个人账号结合,你就解决了靠关键特征和内容保证安全的高级配置方案。 18 | 19 | ## 用户帐户 20 | 21 | 所有 Drupal 的网站至少有一个用户帐户:系统管理员。这个账户在安装过程中自动创建,并且是您用来管理你的网站的帐户。 22 | 23 | 只有网站管理员能创建内容和管理网站,拥有网站管理员的帐户是必须的。如果您预计会有其他人来管理或创建内容,那么你需要决定使用Drupal的哪个机制来创建用户帐户。Drupal提供了三种备选方案供您挑选: 24 | 25 | * 只有管理员可以创建用户帐户。 26 | * 游客可以无需管理员批准创建自己的帐户。 27 | * 游客可以申请一个新的帐户,但管理员批准激活账户。 28 | 29 | 选哪一种方法,取决于你如何预见网站访问者。如果你的信息性质是游客不需要登录就能看到内容或参与网站功能(例如,发布评论),那么第一个选择是最好的方法,这区别于那些访问者必须登录才能看到的内容。如果你的网站有内容或功能被认为是“不为公共使用”,并要求有用户帐户,那么你要选择的方法取决于是否让访问者未经核实其凭据(第二个选项)创建他们的账号,或者您希望管理员执行某种形式的验证激活用户账户(第三个选项)。 30 | 31 | 配置您要使用的方案,这是配置你的系统的各种用户帐户设置过程的一部分。 32 | 33 | ## 配置用户帐户设置 34 | 35 | 创建第一个用户帐户之前,建议您访问用户帐户设置页面,审查或修改一般用户帐户配置设置(见图3-1)。 36 | 37 | 要访问设置页面选择”管理”➤“配置”(假设你登录为管理员),在配置页上,定位段落标题“人员”。点击帐户设置链接,这将带你到你用来为用户账户设置各种配置参数的页面: 38 | 39 | * 联系设置:您可以在站点上让个人用户有个人联系表。此功能默认启用,要禁用它,不选中框。 40 | * 匿名用户:用于识别匿名用户的名称:在多数情况下,使用默认值“Anonymous”是合适的 41 | * 管理员角色:管理员功能扮演什么角色:选择的角色作为你安装在系统的新模块的管理员,变成了默认角色。使用默认值“管理员”是一个合适的动作。(我将涵盖在本章后面的创建角色。) 42 | 43 | ![图3-1 帐户设置页面](../images/pic-3-1.png) 44 | **图3-1 帐户设置页面** 45 | 46 | * 注册和注销:定义有关用户帐户的若干属性 47 | 48 | 注册: 49 | 50 | 谁可以注册帐户:如果只有管理员可以创建帐户,选择第一个选项“只有管理员”。如果任何访客到你的站点可以建立自己自己的账户,选择“访客”选项。如果游客可以申请账户,但是激活账户要管理员。此选项默认情况下选中。出于演示的目的,我会选择第一个选项,让只有管理员才可以创建用户帐户。 51 | 52 | “要求电子邮件验证”,是一个不错的选择。此选项要求用户响应,要求他们回应 Drupal 生成的一个电子邮件。这有助于避免“机器人”创建用户帐户,因为大多数”机器人“没有智力和能力以响应用户帐户验证电子邮件。 53 | 54 | 密码强度指示器是一个有用的工具,它可以表明一个人的密码有多强。弱密码可以很容易被破解,而一个强大的密码很难被破解。这是一个很好的工具,帮助保持您的 Drupal 站点的安全。 55 | 56 | 当取消用户帐户时:一组选项允许您定义未来当你禁用用户账户时,这个用户账户在站点上发布过的内容会发生什么。在大多数情况下,默认选项,“禁用帐户,保留所有内容”满足大多数站点的需要。但是你可以决定其他选项以适合你的站点。 57 | 58 | * 个性化:定义用户是否可以在个人资料添加签名,我会在测试站点设置默认值;但是,你可以启用或禁用签名,这取决于你是否愿意提供这些功能给用户。“通知的电子邮件地址”字段是drupal电子邮件注册和密码恢复进程中生成的用户账户中心邮件里的电子邮件地址。默认情况下,该站点的电子邮件地址在安装过程中就定义了的,你可以在“通知的电子邮件地址”字段输入一个有效的电子邮件地址覆盖默认的。 59 | 60 | 页面底部剩下的选项定义了系统生成的通知用户新账号的电子邮件格式,内容包含在每一封系统生成的电子邮件里。你可以依据个人偏好修改电子邮件内容。只需点击每个选项卡的垂直菜单,查看每个系统生成并发送给用户的邮件。如果您检查默认的内容,你会看到的值如:“\[用户:姓名\]”;这些 token 由drupal以动态内容插入到生成的邮件里。例如,\[用户:姓名\]将插入个人的用户名输入登记表并出现在电子邮件里有 token 的特殊点。 61 | 62 | 现在,您已经完成了用户账户的定义,您就可以定义角色并设置权限。 63 | 64 | ## 创建角色 65 | 66 | 用户角色是一个根据你的网站上用户组的责任和能力来对用户分类的机制。如果您的站点是一所小学,则可能有教师、学生和员工的角色。如果你的站点是一个社区站点,则可能有内容作者、内容评审、发布者和论坛管理员的角色。 67 | 68 | 创建用户角色中最难的部分是决定你需要网站上有什么样的角色。一般来说,管理一个角色少的站点比管理一个角色多的站点容易,因为你必须给每个角色设置权限。然而,较少的角色意味着更少的灵活性,因此它是一个平衡的行为,往往是,你随着时间推移你必须调整站点上你已经熟悉的用户类型。不幸的,这里没有一个公式让你用来决定你需要多少角色,幸运的是,你需要多少角色也没有正确或错误的回答。在我们的例子中,我们将创建两个通用角色: 69 | 70 | 一种角色是我们组织的一部分,负责创建、发布和管理我们站点上的内容和菜单。 71 | 72 | 一种角色是提供进入“非公开”内容的访客,仅用于身份验证的用户(访客被分配一个用户ID和密码)。这些用户可以查看内容并添加注释内容,但不能创作,编辑或删除内容。 73 | 74 | 要创建新的用户角色,假设你用管理员帐户登录,点击页面顶部菜单的管理条,然后点击子菜单 People 链接。在“人员”页面,点击 Roles 标签,这个页面供你浏览,创建,编辑,和删除角色。在此页面上有一个空白文本框标题为 Role name ,这里你可以输入新角色的名称。为了演示的目的,输入 company user 作为新角色的名称(见图3-2)。 75 | 76 | ![图3-2 在人员页面操作角色](../images/pic-3-2.png) 77 | 78 | **图3-2 在人员页面操作角色** 79 | 80 | 点击保存按钮。公司用户角色创建的结果,显示在定义的用户角色列表里,如图3-3所示。 81 | 82 | ![图3-3 定义的角色列表](../images/pic-3-3.png) 83 | 84 | **图3-3 定义的角色列表** 85 | 86 | 对于你的第二个示例用户角色,进入“受限用户”,受限制的用户是任何用户用这个账号能查看站点上有限制的内容并对内容发表评论,但是不能创建、编辑、删除内容或在我们的网站上执行任何管理功能。点击“添加角色”按钮,文本框中输入值“restricted user”,然后点击保存按钮继续。 87 | 88 | 随着新角色的定义,你已经可以将权限分配给你创建的角色了。 89 | 90 | ## 分配权限 91 | 92 | 权限提供一种机制,用于控制分配到某一特定角色下的用户能做的事情和不能做的事情。 93 | 94 | Drupal核心和每个贡献模块提供了一组预定义的权限,您必须在 role-by-role 基础上启用或禁止。将权限分配给角色,单击顶部的管理链接下的子菜单 people 链接(假设你以网站管理员的身份登录)。在人员页面单击权限标签,出现将要用于为每个已定义的角色设置权限的页面(见图3-4)。 95 | 96 | ![图3-4 为每个角色设置权限](../images/pic-3-4.png) 97 | 98 | **图3-4 为每个角色设置权限** 99 | 100 | 这个页面列出了为你的站点和你的角色定义的所有可用权限。您可以向下滚动页面,您希望角色可以有这个权限就勾选,不希望就取消勾选。 101 | 102 | 出于演示的目的,往下滚动页面直到你找到段落标题节点,在那个段落为 company user 角色勾选下列方框: 103 | 104 | * 文章:创建新内容 105 | * 文章:删除自己的内容 106 | * 文章:删除修改 107 | * 文章:恢复修订 108 | * 文章:查看修订 109 | * 基本页面:创建新内容 110 | * 基本页:删除自己的内容 111 | * 基本页:删除修改 112 | * 基本页:编辑自己的内容 113 | * 基本页:恢复修订 114 | * 基本页:查看修订 115 | * 访问内容概述页面 116 | * 管理内容 117 | * 查看发布的内容 118 | 119 | 对于受限制的用户角色,向上滚动到注释部分,并确保以下权限勾选 120 | 121 | * 查看评论 122 | * 跳过审批意见 123 | * 编辑自己的评论 124 | 125 | 一旦你已经勾选了选框所需的权限,滚动到页面的底部,点击“保存权限”按钮。此时,您已经创建角色并分配权限给那些角色。您现在可以创建用户帐户了。 126 | 127 | ## 创建用户帐户 128 | 129 | 你现在已经定义了用户角色,也进行了适当的权限设置,已经可以创建用户帐户。创建一个新的用户帐户的过程首先是通过单击页面的顶部的菜单的管理,然后点击子菜单链接的 people 。点击显示如图3-5所示的页面的链接。 130 | 131 | ![图3-5 创建用户帐户](../images/pic-3-5.png) 132 | 133 | **图3-5 创建用户帐户** 134 | 135 | 此屏幕列出现有全部用户帐户。这里,列出的唯一账户是我们完成安装过程时创建的管理员账户,要添加新用户,请单击页面顶部“添加用户”按钮,会显示“添加用户”表单(如图3-6) 136 | 137 | ![图3-6 “添加用户”表单](../images/pic-3-6.png) 138 | 139 | **图3-6 “添加用户”表单** 140 | 141 | 出于演示的目的,我们将通过输入以下值来创建一个新的用户帐户: 142 | 143 | * 在E-mail地址字段中输入:johnsmith@example.com。 144 | * 在用户名字段中输入:JohnSmith。 145 | * 在密码字段中输入:12JohnSmith34。 146 | * 在确认密码字段中输入:12JohnSmith34。 147 | * Status,确认选 Active。 148 | * Roles,选上 company user 选框 149 | * 选上“将新建账号通知用户”选框(单击此选项使得Drupal能够发送一封邮件给用户,通知他们自己的新帐户)。 150 | * 你可以选择上传用户照片\(头像\),通过勾选 Personal contact form 来启用这个人的个人联系表单 ,并依个人所在位置设置时区的值。出于演示目的,我们将保留这些字段默认值。 151 | * 点击“创建新账号”按钮保存帐户。 152 | * 点击管理员菜单下的 people 链接,可查看您的网站用户账号的完整列表(见图3-7),包括您刚刚创建的。 153 | 154 | ![图3-7 您的网站的所有用户帐户](../images/pic-3-7.png) 155 | 156 | **图3-7 您的网站的所有用户帐户** 157 | 158 | 约翰•史密斯现在可以登录到你的网站,并执行与 company user 角色相关联的所有任务。 159 | 160 | 举例,您可能要更新用户账号。例如,您可能需要重置用户的密码,更改他或她的电子邮件地址,更新他或她指定的角色,或禁用该帐户。 161 | 162 | 你可以通过点击“人员”页面上用户账号相关联的链接来执行这些动作。 163 | 164 | ## 用户生成的帐户 165 | 166 | 如果你配置你的站点为游客可以创建他们自己的账号,要求站点管理员审核批准他们的帐号,这个过程与管理员自己创建用户账户略有不同。 167 | 168 | 如果你选择用户帐户选项为游客可以创建账户但是需要管理员的批准,或者游客可以创建自己的帐户无需管理员批准他们的帐户,登录表单主页上会有一个额外的选项在“登录”按钮下面: “创建新账户” 。参见图3-8。 169 | 170 | ![图3-8 创建新账户选项](../images/pic-3-8.png) 171 | 172 | **图3-8 创建新账户选项** 173 | 174 | 点击这个链接(当你没有登录),带你进入一个屏幕,访问者可以输入他们的请求的用户名和电子邮件地址(见图3-9)。在这个例子中,输入用户名和电子邮件地址为新的帐户,并点击“创建新帐户”。(注:Drupal只允许你整站只用一个email地址,尝试重复使用email地址会弹出该账户已经存在于系统的错误提示。) 175 | 176 | ![图3-9 输入新账户信息](../images/pic-3-9.png) 177 | 178 | **图3-9 输入新账户信息** 179 | 180 | 一旦账户被创建,Drupal发送电子邮件到用户输入的电子邮件地址,显示一个成功信息:“感谢您申请一个帐户。你的帐户目前正在等待由站点管理员批准。同时,进一步指示的欢迎消息已经发送到你的电子邮件地址。” 181 | 182 | 如果你把系统配置为允许用户创建一个帐户,但要管理员手动批准该帐户,您需要访问联系人页面,然后编辑该用户的帐户,更改用户的从状态阻止到活动。直到用户的状态已经改变,他们将无法用用户名和密码登录到你的站点。如果你选择的选项是用户可以创建一个帐户,且帐户不需要管理员的批准,用户将能够立即登录到您的站点。 183 | 184 | ## 重置用户密码 185 | 186 | Drupal的特性之一,节省站点管理员一年的工时,能为用户重置密码,免去用户电邮管理员要求重置密码。如果你登出你的站点了(点击页面右上角的退出链接),你会注意到,右边栏“登录”按钮下面,有重设密码的链接(参见图3-8)。 187 | 188 | 点击这个链接打开一个页面,访问者可以输入自己的用户ID或他们的电子邮件地址。 189 | 190 | 输入一个有效的用户名和一个有效的电子邮件地址(其中“有效”是指它作为您的站点的有效用户ID存在,或是您站点上的用户帐户相关联的一个有效的E-mail地址)使得drupal生成含有“一次性登录”链接电子邮件发给用户,使他们能够重置密码。 191 | 192 | ## 总结 193 | 194 | 在这一章中,我介绍配置Drupal如何处理用户帐户和如何创建用户角色并分配权限给这些角色的过程和方法。我讨论了,决定作为网站所有者就必须设置你的站点,包括是否只有你能管理这个站点并创建内容,是否会有其他人负责那些区域。 195 | 196 | 如果其他人分配到创建内容或管理站点的任务,那么你会想配置用户帐户的基础设置,创建会在你的网站执行活动的角色并设置相应的权限。您还需要定义是否只有管理员能创建帐户,或者游客可以创建自己的帐户无需管理员批准,或游客可以创建一个帐户,但管理员必须批准它。一旦你做出这些决定并设置这一章中讨论到的参数,你就可以开始将用户添加到您的站点。 197 | 198 | 你可以管理来访者,但是如果他们不能在你的站点上找到感兴趣的内容,他们不会留下,这就是分类,将是我们接下来要谈的。 199 | 200 | -------------------------------------------------------------------------------- /chapters/chapter-10.md: -------------------------------------------------------------------------------- 1 | 第10章 创建页面 2 | === 3 | 译者:Lead 4 | 5 | #### 概要 6 | 7 | 现在你已经对内容类型、区块、视图和主题有所了解了,你就具备了用这些元素集合到你的页面上。一个页面可能是一个单独的内容表现(例如:一个关于在DrupalCon的第一天的新闻),或者可能是一个表现一个像Drupal.org首页登录页面。 8 | 你的网站每一个页面可以用不同的结构,这要感谢你选择的灵活的网站主题以及区块机制和在哪个页面(网址URL)去显示区块的功能。使用视图创建块提供了一个动态机制,用于提取内容以及通过块接口创建的静态块。 9 | Drupal8工具的组合提供了一个强大的机制来创建一个优秀的网站。 10 | 11 | 12 | #### 创建页面的基础 13 | 14 | Drupal 8核心与你的主题的结合提供了所需的所有功能,在一个网站上创建一个典型的网页。 主题提供了可以包含的内容的区域,而Drupal 8核心的内容类型,区块,和视图提供了将创建的内容放置在这些区域的机制。 15 | 16 | 在第6章你发现Bartik主题提供的区域作为你的网站内容的容器。 作为一个回顾,图10-1描述了可用于放置内容和块的区域。 17 | ![图10-1 由Bartik主题提供区域](../images/pic-10-1.png) 18 | 19 | 图10-1 由Bartik主题提供区域 20 | 21 | Bartik提供了17个我们可以放置内容和块的区域,包括头部区域典型的用于表现网站标志、搜索栏和导航元素如主菜单。Bartik只是Drupal.org里数百个可用的主题之一,每个主题都有其自有的布置和区域数量。另外,你可以使用一个起始主题,如Zen主题,然后设计出你想要的布局和区域来达到你期望的网站样式。鉴于为了演示Drupal 8 的页面建设,我们将保持在Bartik主题提供的固有样式和区域中进行。 22 | 23 | 我们将创建的第一页面是一个内容的详细页面的例子,意思是一个单一的内容显示在一个页面上伴有各种相关的块,超出只是一个内容的页面。为了演示创建内容详细信息页面,我们将使用文章内容类型创建一篇描述了即将到来的DrupalCon的文章。登录后,导航到管理➤内容。在内容页中,单击“添加内容”按钮,选择文章。输入文章标题和正文文字,并点击“保存并发布”按钮。注意一下与你的文章相关联的网址编号,因为你将用它来放置区块只出现在这篇文章页面里。 24 | 25 | 此时所有被定义为整个网站范围的块都会显示在这个页面里,围绕在DrupalCon的文章周围。但是如果你想显示更多的其他有别于标准的区块和文章呢?答案是使用视图从内容来生成区块,或者用区块接口区创建或分配一个区块出现在这个页面里。让我们开始创建一个自定义区块通过“区块布局”页面并分配该块只出现在DrupalCon页面上(见第八章复习一下关于块的内容): 26 | 27 | 1.单击顶部菜单中的“管理”链接中的按第二个菜单“结构”链接。单击“区块布局”链接以显示“区块布局”页面。 28 | 29 | 2.点击“添加自定义块”按钮来创建一个新的自定义块。 30 | 31 | 3.在“块描述”字段中,输入“DrupalCon 2015 Los Angeles.” 32 | 33 | 4.在主体里,输入“May 11-15, 2015 in the Los Angeles Convention Center.” 34 | 35 | 5.单击保存按钮。 36 | 37 | 6.在出现的“配置块”页面,找到区域选择列表并设置区域“Featured top”(如果你不使用Bartik,选择另一个突出的区块)。 38 | 39 | 7.要限制此块将出现在哪些页面上,单击竖向导航栏中的“页面”选项卡,并在页面文本区域,输入与您创建文章URL地址,以/node开始。以我的例子,那就是我写在网站上的第一篇文章,所以我会在框中输入 /node/1。接下来,单击“为下列页面显示”单选按钮,因为我们只希望这个区块出现在我们的文章页面上。 40 | 41 | 8.单击“保存块”按钮以保存新的块,然后导航到你正在工作的文章页面通过点击第二个“内容”链接菜单,然后单击内容列表中的文章标题。 42 | 43 | 在加入这个块后你应该会看到与图10-2相似内容。 44 | 45 | ![图10-2 给一篇文章详细页添加一个块](../images/pic-10-2.png) 46 | 47 | 图10-2 给一篇文章详细页添加一个块 48 | 49 | 50 | 我们可以继续这个步骤添加其他区块到这个页面的其他区域直到我们的内容和元素达到我们要显示给我们的目标用户当他们登到"DrupalCon 2015Los Angeles page"页的内容时。 51 | 52 | ### 创建登录页面 53 | 54 | 登陆页面通常是一个页面,与一个单一的内容不相关,并且可以在页面上显示几个不同的内容和几个区块。 55 | Drupal网站的主页是一个登陆页面的例子。 56 | 让我们继续为那些要参加在洛杉矶的DrupalCon的人们创建一个新页面过程。 57 | 本页将利用Bartik主题提供的多个区域去生成一个看起来如图10-3所示的页面。 58 | 59 | ![图 10-3 “What to do Around Los Angeles”页面](../images/pic-10-3.png) 60 | 61 | 图10-3 “What to do Around Los Angeles”页面 62 | 63 | 在生成这个页面的第一步是使用“基本页面”内容类型创建一个即将用到的础信息页(见第1章复习有关创建基本网页)。为了使事情变得有趣,我们只会为这一页输入一个标题,内容留空。在标题栏中,输入“What to do Around Los Angeles”,然后单击“保存和发布”按钮。我们现在有一个空白页,标题为“What to do Around Los 64 | Angeles”,没有任何其他内容,除了一些标准的在每个页面都显示的区块。 65 | 让我们创建几个区块和视图,并将它们分配给该页以使其看起来像一个登录页。 66 | 67 | 首先我们来创建一个词汇表分类,命名为“Event”,然后在词汇表了创建“DrupalCon Los Angeles”的一个项,点击管理菜单上第二个菜单“结构”按钮。点击“结构”页里选择“分类”。在“分类”页点击增加词汇表按钮,名称里项里输入'Event'。单击“保存”按钮以显示“Event”分类页。点击“添加项”按钮,并在名称字段中输入“DrupalCon Los Angeles”创建一个分类术语。点击保存按钮以保存分类术语。 我们还需要另一个“Subject”分类词汇表。按照创建“Event”分类同样的步骤,只是这一次命名的名称为“Subject”,并添加一个名为“Things to do”的术语项。 68 | 69 | 我们现在需要一种方法来指定一篇他们正在写文章一篇“things to do around Los Angeles”文章。我们可以通过在我们的文章内容类型中添加2个术语引用字段来实现这个功能,允许作者从“Event”和“Subject”中选择。在“结构”页上,单击“内容类型”链接,然后单击文章内容类型的“管理字段”链接。按照章节5中的“Customizing Your Content Type(自定义您的内容类型”的一般步骤)”,创建两个新的参考类型字段,一个“Event”和一个“Subject”。作为复习,选择“Term Reference”作为字段类型。在字段类型设置页为每个字段选择合适的词汇表。添加两个字段的字段后,你的字段列表应该会和图10-4所示类似。 70 | 71 | ![图10-4 “Event”和“Subject”字段添加到文章内容类型](../images/pic-10-4.png) 72 | 73 | 图10-4 “Event”和“Subject”字段添加到文章内容类型 74 | 75 | 76 | 下一步是创建的几篇文章,选择DrupalCon洛杉矶事件做为主题。让我们开始创建五篇文章,并使用这些文章作为创建登陆页面的基础文章。 77 | 78 | #### 创建视图 79 | 80 | 在页面的主要内容区域,我们将创建一个列表关于5个最新发表的文章聚焦在“what to do in Los Angeles”。我们将使用视图模块创建的文章列表,使用摘要显示模式为我们的网站访问者一个介绍对每个文章并且能通过点击“阅读更多”看到整篇文章的链接。用在第9章中所述的技能,创建一个新的视图给文章,通过单击“结构”菜单项并选择视图,创建一个新的视图。点击“添加新的视图”按钮,并命名为“Articles”。我们将使用这一个视图创建多个显示来创建我们想在我们的登录页上显示的输出样式。在“添加新视图”页的视图设置区域,选择文章作为我们将显示的实体类型,保持其他剩余的选项为默认状态。单击“保存和编辑”按钮继续。 81 | 82 | 我们将创建的第一个视图显示的是最新的五篇摘要列表。单击“添加”按钮以创建一个新的显示,并从选项列表中选择“区块”样式。单击“显示名称”栏中的显示名称,将显示名称更改为“Latest Articles(最新文章)”,请单击标题栏旁边的名称区域,然后输入“Latest Articles(最新文章)”以将其显示为该视图的顶部输出名称。接下来,对显示的设置,改变显示的字段为内容并选择摘要的样式作为列表显示样式。单击“使用分页”链接,改为“显示指定数量的项目并将项目集数显示为5。最后,单击“保存”按钮。 83 | 84 | 我们将创建的第二个视图显示的是一个特色文章块。我们将随机选择一篇文章,并在页面上显示整篇文章。要创建此视图显示,请单击“添加”按钮,然后选择“区块”。将“显示名称”改为“Featured article ”标题改为“Featured Article”。确保在每个你做改变的元素顶部选择列表选择覆盖方式选择“这个Block(覆盖)”,否则您的更改将应用于所有视图显示。改变显示设置为摘要模式来显示文章的缩短版。下一步,单击“排序标准”中的“添加”按钮,并添加一个新的排序顺序。从类型下拉列表中选择“全局”样式,并从“全局”样式“值”的列表中选择“Random(随机)”,然后单击“添加并设置排序标准”。 保留不勾选“把这个排序显示给用户,让它们自己选择”前的复选框,单击应用按钮完成添加新的排序标准。下一步,删除后的日期(降序)”的排序标准,通过点击“添加链接(显示排序标准正确选择重新排列)”旁边的向下拉箭头选择重新排序。在“重新排序”页面,点击相关的内容:发布日期(降序)”的"删除链接”按钮并点击应用按钮。接下来,改变分页区域连接的数量显示由5项改到1。最后,单击“保存”按钮。 85 | 86 | 我们将把我们所创建的2个区块分配给“What to do Around Los Angeles”页面来演示我们的劳动成果。单击“结构”链接,选择“区块布局”链接。在右边的列中,你会看到可用的块列表的地方。在“列表”(视图)部分中,您将看到我们刚刚创建的2个模块。点击文章:精选文章链接并将其分配到“侧边栏”区。单击“显示页”选项卡,然后单击“显示”按钮。在文本区域中输入网页的网址。在我的情况下,我的关于“在洛杉矶可以做什么”文章的网址是在/node/7,所以这是限制这一块只在这一页显示的价值,限制这一块只在这一页显示。单击“保存”按钮。做相同步骤对最新文章:最新文章,但在这里我们选择内容区域。最后,单击“区块布局”页面底部的“保存块”按钮。接下来浏览“What to do Around Los Angeles”的页面上看到我们的网页建设工作进展(见图10-5)。 87 | 88 | ![图10-5 网页建设进展](../images/pic-10-5.png) 89 | 90 | 图10-5 网页建设进展 91 | 92 | 我们将把登录页用三个附加的精选文章块包围起来,通过增加三个额外的“洛杉矶周边餐馆”文章。我们将显示为每个餐馆上传图片到临近页面底部的Featured Bottom区域内(参见图10-1区域位置)。 93 | 94 | 我们首先需要添加一个新的“Restaurants”术语到“Subject”分类词汇表里,这样可以过滤文章通过使用“DrupalCon 2015 Los Angeles”的“event”和“Restaurants”作为“Subject”的过滤条件。重复你之前的步骤(在4章)通过对结构➤分类,点击“Subject”分类向下箭头列出项目,然后点击添加新项。在“名称”栏中输入餐厅,然后单击“保存”按钮。 95 | 96 | 下一步是创建内容。单击第二个菜单选项“内容”的链接,然后单击“添加内容”按钮。选择文章内容类型并创建三个新的文章,从文章分类列表的列表里选择Restaurants,并在三个餐厅的每篇文章上传图像。要上传图片点击浏览按钮的图像位置,找到图像上传,从列表中选择相应的文件,并点击打开按钮。 97 | 98 | 随着文章就位,我们已做好去创建视图见显示每个餐厅的名字和图片作为一个区块。回到“Article”视图并: 99 | 100 | 1.单击Add按钮创建一个新的区块视图。 101 | 102 | 2.给第一个块“显示名称”为“Featured Restaurant 1”。 103 | 104 | 3.我们将要在该块的顶部显示餐厅名字而不是使用标题栏的名称,所以请单击现有的“标题”名字,从标题名称设置栏的顶部列表选择“这个Block(覆盖)”,去掉现有的名称标题,并点击“应用(此显示)”按钮。 105 | 106 | 4.我们还想在我们的块显示字段而不是摘要或全部内容显示样式,所以点击显示右边的“内容”链接并选择“字段”样式。其他配置保持在默认值。当我们选择字段作为显示的选项时,视图模块会自动将标题添加到显示的字段列表中。单击“应用”按钮返回“视图”配置页面。 107 | 108 | 5.我们也要显示我们为每一个餐厅上传的图像,所以点击添加按钮在字段选项里,并向下滚动字段列表,直到你发现“内容:显示图像在:文章。”或者,在在字段列表的顶部搜索框中输入“图像”,快速将您带到相应的字段。勾选图像字段旁边的单选框,在“增加字段”表单顶部改变选择方式“全部显示”的选项为“这个块(覆盖)”。下一步,单击“添加字段”表单底部的“应用(此显示)”按钮。“配置字段:内容:图像”表单将显示下一步,让您设置图像将如何出现在块里。取消选中“创建标签”选择框,因为我们不需要一个标签出现图片的上面。在“链接图像到选择列表”中,选择内容项目来自动将图像超链接到该餐厅的文章中,然后单击“应用(此显示)”按钮在表单的底部。 109 | 110 | 6.下一步是在创建的第一个块的过滤标准进行设置,以便只显示餐厅的文章。单击过滤标准的“添加”按钮,改变选择方式为“这个块(覆盖),”在搜索框中输入“Term”,勾选从字段返回的列表“Content: Has taxonomy term”选择框,并点击“应用(此显示)”按钮。视图显示“配置过滤准则的额外的设置”表单,允许你选择哪个术语(选择“Subject”)和选择形式(选择下拉菜单,并选中“显示等级下拉“选择框)。单击“应用和继续”按钮以进入下一个页面,从该词汇列表中选择“Restaurants”,然后单击“应用(此显示)”按钮。 111 | 112 | 7.创建第一个餐厅块的最后一步是将显示的项目数量限定为1。单击“使用分页”选项设置选项“显示特定数量的项目”并设置数值为1。 113 | 114 | 8.单击保存按钮来创建新的块。 115 | 116 | 117 | 我们需要创造两个区块来显示更多的餐馆。在视图中使用复制功能,我们会使它更容易一些。在“Featured Restaurant 1”视图处于选中状态下,点击视图设置表单右侧的“复制Featured Restaurant 1”。现在你将具有相同的名称的新的视图显示,准备修改(参见图10-6)。 118 | 119 | ![图10-6 复制视图显示](../images/pic-10-6.png) 120 | 121 | 图10-6 复制视图显示 122 | 123 | 对于这个复制的视图,我们需要做两个修改。 124 | 1.修改“显示名称”为“Featured Restaurant 2”,和 125 | 2.指定要显示哪个餐厅。 126 | 127 | 单击“显示名称”链接来改变视图的名称,将值设置为“Featured Restaurant 2”接着,单击“使用分页”链接将值更改为“显示特定的项目”(确保你选择“这一块(覆盖)”在选择分页”结构形式顶部下拉列表内。点击项目链接的数量并更新“项目显示”的值为1,“偏移量(跳过项目的数量)”内容输入1的。在选择要显示的项目之前,想好项目的偏移量作为选择要显示的项目。因为这个特定的块应该显示在列表中的第二餐厅,我们将改变偏移值为1,意思是,跳过第一个然后显示第二个。完成“Featured Restaurant 2”块后,点击复制“Featured Restaurant 2”的按钮,按照相同的步骤,以更新复制的块使用“Featured Restaurant 3”作为“显示名称”并将偏移量的值设置为2。 128 | 129 | 在建设我们的页面的下一步是放置“Featured Restaurant”到底部“Featured Bottom”区域(见图10-1)。访问“区块布局”页(点击结构页的“区块布局”链接),在放置区块页列表里选择“文章:Featured Restaurant 1”块。选择“Featured 130 | bottom first”作为该块分配的区域,点击“为下列页面显示”的单选按钮,在文本区域并输“What to do around Los Angeles”URL地址,来实现“显示块在特定的页面上”。 131 | 132 | 对“Featured Restaurant”2和3重复这些步骤,将它们放置在“Featured Bottom Second 133 | 和 Featured Bottom Third”区域。添加的“Featured Restaurant”区域在特色底部区域效果如图10-7所示。 134 | 135 | ![图10-7 推荐餐厅](../images/pic-10-7.png) 136 | 137 | 图10-7 推荐餐厅 138 | 139 | 你可以继续创建显示其他内容附加视图,添加其他的自定义块,或寻找模块生成的块来传递内容到这个页面(例如,谷歌地图和Yelp),但现在我们将标记为完成建设任务的“What to do Around Los Angeles”页面。 140 | 141 | 142 | ## 总结: 143 | 144 | 145 | 在本章中,我们组合了主题、内容类型、内容、块和视图为一个创建复杂页面在网站上的解决方案。我们将使用这些技术在第19至22章建立各种不同的Drupal8 网站。 146 | 147 | 下一步,我们将探讨通过增加扩展模块来扩大我们的网站的功能。 148 | -------------------------------------------------------------------------------- /chapters/chapter-04.md: -------------------------------------------------------------------------------- 1 | # 第4章 分类 2 | 3 | **翻译:蓝眼泪** 4 | 5 | 分类是 Drupal 新用户最易误解及理解不足的功能之一。它可能是 Drupal 提供的最强大、最有用的功能之一,但是 Drupal 的其他功能已经使新用户应接不暇,因此他们也往往会绕过它而使用其他的功能来实现他们的需求。在本章中,您将通过创建并使用分类术语的方式对内容进行分类,已便于让访客可以轻松地找到某一特定主题的相关信息。 6 | 7 | ## 分类概述 8 | 9 | 虽然我们很多人无法对“分类”进行定义,但在日常生活中我们却经常使用“分类”这一方法来管理生活中的事物。例如,你打开厨房,你会发现一个食物的有序组合:所有的调味品都放在架子顶层,罐头食品放在第二层,面食和其他盒装食品放在第三层,第四层则放盒装的谷物。将食品分类并有序的放置,以便于你在做饭的时候可以很轻松的找到需要的东西——这是最简单的分类方法的使用。如果没有这个“厨房分类系统”,可能会造成这样的问题:你所有的材料都随意地放在储藏室,但你很难找到它们,这时你会感到沮丧,也许就丧失了做饭的兴趣而选择点外卖来解决这一餐。 10 | 11 | 在 Drupal 中,分类可分为两大功能:标签和结构分类。这两个功能都很强大并且可以同时在网站上使用。 12 | 标记是分类系统一种简单而有效的使用方式,它可以使作者在一个文本字段中输入介绍内容的关键字。举一个例子,一个作者写了一篇关于替代能源的文章,他可以使用如“太阳能”、“风”和“地热”来作为关键词或标签,以此对文章进行分类。作者创建的关键词通常作为超链接放在文章结尾,访客可以通过它们定位或跳转到使用了相同关键字的其他文章。 13 | 14 | 标记是自由的,这意味着它由作者来定义他们想用什么词来将内容归类。用标记来归类文章有两个常见问题:一是不同的人会用不同的词来表示相同的概念。例如:一篇关于“雨”的文章可能被一个作者标记为“雨”,被另一个作者标记为“降落”,又被第三个作者定义为“毛毛雨”。一个网站访客想找一篇关于雨的基本概念的文章,可能会在找除了“雨”以外的词时遇到困难。另一个常见问题是拼写错误。如果一个作者用“统治”(reign)来标记关于“雨”(rain)的文章,那么访客将很难通过分类的方式用“雨”来找到这篇文章。 15 | 16 | 用分类对文章进行归类的第二种方法是结构化分类。在这种方法中,网站管理员创建所有会用于分类的关键词,而作者只需从关键词列表中选择所需的分类的词即可。结构化分类的一个好处是可以分层,这表示术语可以分组来归类文章。我们用体育分类来作为分层的例子,第一层术语可以是“团队运动”和“个人运动”,在团队运动中你可能会看到足球、篮球、棒球、曲棍球、排球和其他团队运动,而在个人运动中你可能会看到高尔夫、游泳、田径以及赛车运动。你可以继续创建运动的层次,直到你对所有体育项目都有了独特的描述。作为一个作者,如果要写一篇关于体育赛事的文章,我可以选择一个或多个已定义的术语来对我的文章进行分类。 17 | 18 | 结构化分类与简单标记相比,它的一个显著优势是它拥有通过术语类别或个别术语来查找文章的功能。在前一个例子中,你可以具体的查找关于足球的文章,或者你可以用更普通的方式寻找团队运动类别中的所有文章。 19 | 20 | 确定是否使用标记或结构化分类是一个很重要的决定,它关系到你如何分类展示你的网站。不过在Drupal中你可以同时使用两种途径来为作者提供很好的灵活性。 21 | 22 | 让我们来看一个现实的例子。假如我们要创建一个聚焦体育新闻的网站,我们的目标人群是那些喜欢关注他们所喜爱的球队发生的事情的人。我们要考虑到人们会在我们网站上如何搜索和浏览内容,我们可能会想通过运动类型来组织文章,如: 23 | 24 | * 足球 25 | 26 | * 棒球 27 | 28 | * 篮球 29 | 30 | * 曲棍球 31 | 32 | * 英式足球 33 | 34 | 人们可能会想通过球队查找体育新闻: 35 | 36 | * 乌鸦 37 | 38 | * 开拓者 39 | 40 | * 湖人 41 | 42 | * 攻略 43 | 44 | * 洋基 45 | 46 | 在这个例子中我们将和前一个例子一样采用结构化分类。我们要先创建一个词汇,这是分层结构中的最高层级。在这个例子中,我们会创建一个名为“运动类型”的词汇,我们将在这个词汇下创建的术语是:足球、棒球、篮球、曲棍球、英式足球。然后我们会创建第二层,这一层会按照球队名称定义术语,例如,我们会将乌鸦和攻略归在足球术语下,会将开拓者和湖人放在篮球术语下,会将洋基放在棒球术语下。 47 | 我们会持续创建队名,直到每一个团队都放在了合适的位置。出于演示的目的,我们会一直使用简化的列表。 48 | 49 | ## 创建词汇 50 | 51 | 使用分类的第一步是确定和创建你将用于分类网站内容的词汇。你可能只需一个词汇,也可能会需要很多个,这取决于你网站的中心和主题的广度。在网站上要应用词汇的多少是没有一个准确地定义的。最好的方法是根据你的网站内容及涵盖的主题来综合考虑。 52 | 53 | 如果你的网站主题都是相关的(如:各类运动),那么你需要一个词汇就够了。如果网站主题不是相关联的(如:一个与书相关的网站,可能会以作者、主题、出版商、目标读者等方面进行分类),那么这个网站就要多个词汇才能满足需求。 54 | 55 | 这取决于网站创建者定义的最适合网站的结构,这个结构包括作者希望网站表达的主题,希望使用的内容架构,以及希望访问者查看的内容。 56 | 57 | 当你确定了要使用的词汇,点击顶部管理菜单的管理链接,然后点击“结构”(Structure),你将看到一个包含“分类”(Taxonomy)的列表,点击“分类”\(Taxonomy)会打开一个页面,该页面会显示出你已定义的所有词汇。默认情况下,Drupal会创建一个名为“标签”的词汇,这个词汇是一个默认的通用容器。如图4-1 58 | 59 | ![图4-1 标签词汇页面](../images/pic-4-1.png) 60 | 61 | **图4-1 标签词汇页面** 62 | 63 | 要添加词汇,点击列表顶部的“添加词汇”(Add vocabulary),会打开如图4-2的页面。在“名称”(Name)输入框中输入“ Type of Sport ”,然后在“描述”(Description)字段输入一个简单的描述。描述字段是可选的,它在分类的管理界面上默认是不显示的,但是当你希望对列表的内容有所说明时可以使用这个字段。 64 | 65 | ![图4-2 创建一个新词汇](../images/pic-4-2.png) 66 | 67 | **图4-2 创建一个新词汇** 68 | 69 | 输入完成后点击“保存”(Save),然后页面会显示你的词汇相关的术语列表。因为这是一个新词汇,所以该页面的列表是空的,如图4-3所示 70 | 71 | ![图4-3 新建的词汇](../images/pic-4-3.png) 72 | 73 | **图4-3 新建的词汇** 74 | 75 | 下一步是创建一个与“运动类型”这个词汇相关的术语列表。要创建列表,点击词汇表上方的“添加术语”会出现如图4-4的页面。在Name字段输入“篮球”,并输入一个简短的描述以扩展术语的含义。 76 | 77 | ![图4-4 添加术语](../images/pic-4-4.png) 78 | 79 | **图4-4 添加术语** 80 | 81 | 输入术语和描述后,点击保存按钮。 Drupal 会显示一个添加新术语的页面,作为练习,添加几个其他的运动项目,如棒球、足球、英式足球等。当你完成了词汇相关术语的输入,点击breadcrumb部分的“运动类型”回到词汇编辑页面,点击页面顶部的列表处的词汇,打开如图4-5所示的完整列表。 82 | 83 | ![图4-5 术语的完整列表](../images/pic-4-5.png) 84 | 85 | **图4-5 术语的完整列表** 86 | 87 | 到现在,我们已经创建了一个词汇以及将用于内容分类的术语。默认情况下,术语是按照字母顺序排序的,但是在某些情况下你可能需要其他的排序方式。例如,你可能有一个与美国地区相关的词汇,定义了术语东部、中部、山区和西方(East,Central,Mountain,West),如果它们按照字母排序排序的话会是东部、山区、西方、中部(Central、East、Mountain、West排序时中英文的次序不同)。也许你想以从东到西的顺序排序,也就是说顺序应为东部、中部、山区、西方,这是你会需要与默认排序不同的方式排列术语。你可以通过简单的点击及拖拽术语左侧的箭头来实现也想要的顺序排列,排序后记得点击保存,在保存前的顺序调整都是不生效的。 88 | 89 | 我们现在必须确定哪些类型的内容会使用分类这种方式来归类内容,然后设置我们的词汇以便于它出现在创建该类型内容的创建面板上。 90 | 91 | ## 向内容类型分配词汇 92 | 93 | 要想让内容作者为内容分配术语还需要网站管理员对内容类型进行调整。第一步是确定所有你想要与新词汇关联的内容类型,你可以决定将你的网站上的所有内容类型使用词汇分类,也可以决定一部分内容类型适当地使用词汇归类。例如:你有一个关于活动场地的词汇表(如自助餐厅、健身房、庭院、足球场等),你可能会想要限制使用词汇表的内容类型,这个词汇表可能只适用于日历事件的内容类型,而非你的基本页面的内容类型。 94 | 95 | 举一个例子,我们更新一下测试网站上的“文章”这个内容类型将运动类型这个词汇和标签内容结合起来。 96 | 第一步是点击网站顶部的管理菜单,单击“结构”(Structure),点击“内容类型”(Content types)打开内容类型的列表(如图4-6) 97 | 98 | ![图4-6 可用的内容类型](../images/pic-4-6.png) 99 | 100 | **图4-6 可用的内容类型** 101 | 102 | 在每一个内容类型右侧的列表上都有一个“管理字段”(Manage fields)的按钮用来管理该内容类型相关的字段。在第5章你会学习如何在你的内容类型中添加新字段,例如,当有人使用那个类型时,为了对收集内容进行扩展,你会希望添加一个文件上传的字段,一个收集特定信息的附加文本框,复选框,无线按钮或者一个选择列表。现在,我们将专注于在内容类型中增加词汇以便于作者可以选择运动类型中的术语。 103 | 104 | 点击文章描述右侧的“管理字段”,打开将用于添加词汇的表单(如图4-7)。在这个表单上,你会发现一个“添加字段”(Add field)的按钮,点击这个按钮开始添加你的术语字段。 105 | 106 | ![图4-7 管理字段](../images/pic-4-7.png) 107 | 108 | **图4-7 管理字段** 109 | 110 | 在“添加字段”(Add field)页面,选择“添加新字段”(Add a new field)处下拉列表中的“分类术语”(Taxonomy Term)。在标题标签这个字段处,输入一个将会在内容编辑表单中出现的描述性标题,以此告诉作者这个字段要填什么。例如:输入“运动类型”,点击“保存并继续”按钮,在下一个页面你可以选择指定当作者创建文章时可以从列表选取多少个值,默认设置是选择一个术语。例如,我们希望作者可以在“运动类型”词汇中选择多个术语,那么我们就将选择列表中的数值改为无限的。下一步,点击“保存字段设置”按钮,继续页面设置。 111 | 112 | 在设置页面,我们可以选择更改之前创建的标签,输入将在页面编辑页面出现在这个字段下方的帮助文本,设置这个字段为必填(这表示作者在保存文章前必须选择一个值),然后设置一个在作者未选择时的默认值。出于演示的目的,我们先保留之前设置的标签,输入一个简短的句子告诉作者为文章选择一个合适的值;将必填复选框保留在未选中状态时,作者可以自由选择是否为文章分配运动类型的术语,同时将“运动类型”的默认值设为“无”。在引用类型中,保留默认设置即可。另一个利用视图来自定义列表可选项的方式我将在10章视图中说明。在词汇列表中通过点击复选框选择运动类型,这就表示 Drupal 在作者显示值的时候只能展示运动类型这一词汇的项。要完成新字段的添加,请单击“保存设置”(Save settings)按钮,点击后将回到“文章”这一内容类型的管理主页面。 113 | 114 | 默认的分类术语是系统自动完成的字段,它们是作者希望添加的术语中很简单的一部分,而且Drupal会查看其是否与已存在的模型相匹配。当作者了解这些分类术语时工作会很容易完成,但在这种情况下,我们需要列出作者要选择的术语列表。点击字段列表顶部展示的选项卡中的管理以改变从选择列表中自动完成的运动类型这一字段部件,并改变从选择列表上自动获取的运动列表的值,改变值后点击保存按钮,作者现在可以在写文章时从“运动类型”的术语列表中进行选择了。 115 | 116 | ## 创建内容时选择一个分类术语 117 | 118 | 基于我们之前操作的部分,使用“文章”这个内容类型创建一篇新的文章,作者可以从他创作的内容归类中拥有一个可供选择的列表。为了测试这个功能,像之前描述中的那样,点击“创建内容”(Create Content)的链接。从列出的内容类型的列表中,点击“文章”(Article)这一内容类型,当创建文章页面打开后,请注意,页面有一个新的“Type of sport”的选择列表,作者可以在这里将相关的运动类型分配给这篇文章(如图4-8)。通过输入标题、正文、通过选择列表选择一个运动类型来创建一篇文章。 119 | 120 | ![4-8 创建文章](../images/pic-4-8.png) 121 | 122 | **4-8 创建文章** 123 | 124 | 点击“保存并发布”按钮,Drupal会向我们展示一个新页面,页面中包含“相关运动”的字段,这个字段下方显示的就是你在“运动类型”列表中选择的值。为了演示分类的功能,创建两个新页面,选择你在前一个例子中选择的分类术语。你最后创建的页面保存后,点击你使用的术语,如图4-9 点击足球 125 | 126 | ![图4-9 应用了足球分类术语的内容页](../images/pic-4-9.png) 127 | 128 | **图4-9 应用了足球分类术语的内容页** 129 | 130 | 点击这个术语的结果是出现了一个页面,该页面上罗列了其他所有的足球分类术语分配到的页面(如图4-10) 131 | 132 | ![图4-10 被分配足球术语的所有页面](../images/pic-4-10.png) 133 | 134 | **图4-10 被分配足球术语的所有页面** 135 | 136 | Drupal会自动呈现所有与所选术语相关的文章。这个列表默认是以日期/时间排序的,所以最新添加的文章会在列表顶部。你可以通过更改默认视图来调整文章出现的顺序。我们将会在第9章详细地讲解“视图”(Views)相关的内容。你也应该注意到页面底部的RSS图标,RSS订阅是一个传递外部信息的行业标准途径,如新闻阅读应用程序。 137 | 138 | Drupal也可以创建与分类术语相关的所有网页的新闻订阅(RSS feed),点击RSS图标页面会呈现出一个标准列表。 139 | 140 | ## 创建对人和搜索引擎友好的列表 141 | 142 | 默认情况下,Drupal创建的内容列表的链接是与分类术语关联的,如图4-11所示 143 | 144 | ![图4-11 Drupal创建的网址](../images/pic-4-11.png) 145 | 146 | **图4-11 Drupal创建的网址** 147 | 148 | 链接的结构是“taxonomy/term/X”,其中“X”是你引用的分类术语的“term ID”。虽然Drupal里可以理解这指的是什么,但是一个人,更重要的是搜索引擎只查看列表的标题和内容无法判断这个链接(URL\)。有一个简单的补救方法就是提供一个链接别名。你可以通过编辑分类术语,在添加别名的表单上展示的字段处输入链接来添加别名。回到分类术语列表页,点击页面顶部的管理并选择结构(Structure),在结构页面点击分类(Taxonomy )链接。在分类页面,点击与你想要提供别名的术语相关联的词汇右侧的“列出术语”,找到你想要更新的词,点击编辑选项卡,在“链接别名”(URL alias)字段(如图4-12),输入一个人们和搜索引擎都比较容易理解的描述性的链接。为了保持链接的一致性与简单性,建议链接由小写字母和连字符组成。在输入链接后点击保存按钮。在浏览器的地址栏输入网站网址及你刚才创建的链接别名,在前面的例子中,链接为[http://localhost/football](http://localhost/football). 149 | 150 | ![图4-12 分类术语创建网址别名](../images/pic-4-12.png) 151 | 152 | **图4-12 分类术语创建网址别名** 153 | 154 | ## 术语分级 155 | 156 | 如果你想要对分类术语定义一个分级结构要怎么做呢? 157 | 例如:篮球 158 | 你需要有对篮球内容进行进一步分类的能力: 159 | 160 | * 篮球 161 | * 高中 162 | * 大学 163 | * 一级 164 | * 二级 165 | * 三级 166 | * NBA 167 | * 东部 168 | * 西部 169 | 170 | 幸运的是,Drupal提供了创建术语分级结构的简单机制。现在更新我们的例子,依次点击页面顶部的管理--结构--分类链接,点击添加术语,然后会出现创建术语的页面,我们从添加“高中”这个术语开始。输入“高中”作为术语的名称,然后点击页面底部的“关系”链接,在列表的“上一级术语”(parent)选择“篮球”然后点击保存,继续添加“大学”和“NBA”,上一级术语也选择篮球。创建第三层,输入“师1”为术语名称,在关系选项处选择“大学”作为上一级术语,继续添加直到前边列表中的所有术语都创建完成。产生的结构应该就像4-13展示的列表一样 171 | 172 | ![图4-13 结果列表](../images/pic-4-13.png) 173 | 174 | **图4-13 结果列表** 175 | 176 | 如果你在保存前忘记了选择父项,你可以通过点击并拖拽箭头来将术语放置在它应该在的层级位置,你也可以通过点击“编辑”按钮修改关系部分的值将术语归类在适当的父项下。我们现在可以内容项分配给父级也可以将它分配给子级。 177 | 178 | 通过这种方式创建的结果页面现在显示的相关运动是“高中“,点击高中将会呈现一个与”高中“相关联的所有页面的列表。使用视图,这个会在第5章详细介绍,可以为你展示这个层次中的所有内容,例如:所有归类在篮球下的文章,无论是高中、大学还是NBA都会展示出来。 179 | 180 | ## 分配多个词汇 181 | 182 | 有时候会有这样一种情况,当把内容由一个单一词汇来约束表达的时候你必须要克服内容分类的复杂要求。幸运的是Drupal并不限制内容类型使用的词汇数量。你只需要照着本章之前介绍的那样添加第二个字段,选择你想呈献给作者的不同的词汇即可。 183 | 184 | ## 总结 185 | 186 | 本章介绍了分类的强大又简单的特性。我建议你在第一个网站上就开始使用分类,因为你越使用它,你会发现使用它的能力向访客提供内容越便利。在讲解书中其他先进功能的时候我会持续使用分类的。 187 | 188 | -------------------------------------------------------------------------------- /chapters/chapter-15.md: -------------------------------------------------------------------------------- 1 | #第15章 使用Drush# 2 | 3 | **译者:蓝眼泪** 4 | 5 | >本章提供了一个Drush的基本概述,它是一个简化了创建和管理Drupal8网站的命令行工具。使用Drush的时候,以前往往需要你登陆到网站上,导航到网站管理页面,填写一个表单的任务,现在可以通过简单的命令行界面进行了。Drush可以使你不用登录每一个服务器和网站,实现远程管理一个或多个站点来执行日常维护的任务。Drush主要负责管理模块、主题、用户配置文件和常见的任务管理,如运行cron,创建备份和清理缓存。你甚至可以使用Drush执行SQL命令。 6 | 7 | ##安装Drush## 8 | Drush是在其核心的一套shell脚本(Unix/Linux)或bat脚本(Windows),结合PHP脚本处理大部分管理Drupal网站的任务。安装脚本和PHP在Unix/Linux和Windows上都是一个相对简单的过程。 9 | 10 | ##在Unix,Linux或OS X上安装Drush## 11 | 在Unix,Linux或OS X上安装Drush,要遵循一下步骤: 12 | 13 | 1. 从 https://github.com/drush-ops/drush 上下载Drush。在Github上Drush所在页面右侧你会看到一下Download Zip的按钮,如果你熟悉Git(见第16章),你可能想要克隆Git仓库以方便管理Drush的更新。有关克隆仓库的信息,请参见第16章。 14 | 2. 将压缩文件drush.zip放在网站根目录外的目录下。在大多数web服务器上,网站根目录是像public_html或www_root或docroot这样的目录。查看你根目录下的web服务器详细说明文档。为了安全起见,你可能不想把它放在web根目录下,因为它将可被任何人使用和执行。 15 | 3. 执行以下命令,使drush命令可执行 16 | `$ chmod u+x /path/to/drush/drush` 17 | 4. 配置系统使他能够识别Drush。有三种方式: 18 | a. 创建一个符号链接到已存在一路径中的Drush可执行目录中,例如: 19 | `$ ln -s /path/to/drush/drush /usr/bin/drush` 20 | 21 | b. 明确地将Drush可执行的添加到系统变量中,它是在shell配置文件中定义的,名称为:.profile,.bash_profile,.bash_aliases,或.bashrc,位于你的主文件夹下。例如: 22 | `export PATH="$PATH:/path/to/drush:/usr/local/bin"` 23 | 24 | 你的系统将从左到右搜索路径选项,直到找到结果。 25 | 26 | c. 增加Drush别名:如果你想使用两种版本的Drush这个方法也是很方便的,如Drupal7开发使用Drush5或6(稳定版),Drupal8开发使用Drush7(主分支)。向你的Drush7可执行的添加一个别名,把它添加到你的shell配置文件里(见前面的选项列表): 27 | `$ alias drush-master=/path/to/drush/drush` 28 | 29 | 要在你的当前会话中应用选项b和c,可以登出并重新登录或使用下边的命令重新加载bash配置文件: 30 | `$ source .bashrc` 31 | 32 | ___ 33 | 34 | 注意:如果你不走这一步,你将需要(不方便的)使用完整路径在可执行文件下运行Drush命令,`/pash/to/drush/drush`,或导航到 `/path/to/drush` 然后运行 `./drush`。将需要`-r`或`-l`选项(见下方的使用)。 35 | 36 | ___ 37 | 38 | 5.测试系统可以找到Drush: 39 | `$ which drush` 40 | 41 | 6.在Drush根目录下,运行Composer获取依赖关系: 42 | `$ composer install` 43 | 44 | 要查看Composer的更多信息,请访问 https://getcomposer.org/doc/00-intro.md 45 | 46 | ##在Windows上安装Drush## 47 | 要在Windows上安装Drush,请访问 https://www.drupal.org/node/594744 ,该页面上有如何在Windows上安装Drush的最新介绍。对于不同Windows版本和不同Drush版本来说安装方法是不同的。 48 | 49 | ##Drush命令## 50 | 执行Drush命令是相对简单和直接的。从允许你访问操作系统命令行的终端窗口或其他工具导航到你Drupal网站的根目录下,尝试一下Drush,在命令提示符下输入drush status并点击回车,Drush返回的内容应该像下面这样: 51 | 52 | ``` 53 | Drupal version : 8.0-dev 54 | Site URI : http://default 55 | Database driver : mysql 56 | Database username : d8 57 | Database name : d8 58 | Database : Connected 59 | Drupal bootstrap : Successful 60 | Drupal user : Anonymous 61 | Default theme : bartik 62 | Administration : seven 63 | theme 64 | PHP executable : /usr/bin/php 65 | PHP configuration : 66 | PHP OS : Darwin 67 | Drush version : 7.0-dev 68 | Drush configuration : 69 | Drush alias files : 70 | Drupal root : /Applications/MAMP/htdocs/d8 71 | Site path : sites/default 72 | File directory path : sites/default/files 73 | Temporary file : /Applications/MAMP/tmp/php 74 | directory path 75 | Active config path : sites/default/files/config_lFEpXnCuJgRcTN0kwUlVqp7FAr 76 | JU7Cj4s2AbZN9Fg6W22BksQHWkPzhJGqU4cfs0Ix2UD7YEqg/active 77 | Staging config path : sites/default/files/config_lFEpXnCuJgRcTN0kwUlVqp7FAr 78 | JU7Cj4s2AbZN9Fg6W22BksQHWkPzhJGqU4cfs0Ix2UD7YEqg/staging 79 | ``` 80 | 81 | status命令返回一个有关你当前Drupal8安装信息的有用的列表,另一个重要例子是使用`drush pm-download`命令行下载一个模块或主题: 82 | `drush pm-download calendar` 83 | 这个命令将在你的网站上下载日历模块的最新生产版本,还有一种缩短版的命令行`drush dl calendar`. 84 | 要在命令行启动日历模块(例子),你需要执行 85 | `drush pm-enable calendar ` 86 | 或在短版本里执行:`drush en calendar` 87 | 88 | 要禁用日历模块,使用 89 | `drush pm-disable calendar ` 90 | 或使用短版本,执行:`drush pm calendar` 91 | 92 | 如果日历模块的新版本或安全补丁已发布,而你想要应用这个更新,那么请运行 93 | `drush pm-update calendar ` 94 | 就像你看到的,通过简单快捷的命令行工具可以完成需要通过在管理界面几次点击才能完成的工作。 95 | 96 | 表15-1提供了公共Drush命令的完整列表。如需更完整的介绍请访问[http://drush.org](http://drush.org) 97 | 98 | 表15-1 Drush核心命令 99 | 100 |
命令描述
archive-dump备份代码、文件、数据库到一个文件中
archive-restore扩展站点压缩到一个Drupal网站
cache-clear清除特定的缓存,或者所有Drupal缓存
cache-get获取一个缓存对象并将它显示出来
cache-set将一个对象缓存为JSON或var_export()格式
core-config编辑drushrc,网站别名,和drupal的settings.php文件
core-cron在指定站点的所有有效模块中运行cron
core-execute执行一个shell命令,通常会使用网站别名
core-quick-drupal以最小的配置和依赖下载、安装、服务、登录到Drupal
core-requirements如果有的话,会提供你Drupal安装时的错误信息
core-rsync使用SSH远程同步Drupal与另一台服务器
core-status如果有的话,提供当前Drupal安装的鸟瞰图
core-topic在一个给定的主题上阅读详细文档
drupal-directory返回到一个给定模块/主题目录的路径
help打印此帮助消息,查看更多Drush帮助信息
image-flush刷新所有导出图像为给定的风格
php-eval在引导Drupal之后评估任意PHP代码(如果可用)
php-script运行PHP脚本
queue-list返回所有定义的队列列表
queue-run按名称运行一个特定的队列
search-index索引其余的搜索项目,而不清除索引
search-reindex强制搜索索引重建
search-status显示总共仍有多少项目待索引
self-update检查是否有更新的Drush版本中提供
shell-alias打印所有已知的shell别名记录
site-alias打印所有网站别名和本地站点的别名记录
site-install使用指定的安装配置文件与模块/主题/配置一起安装Drupal
site-reset重置持续站点设置
site-set为当前会话中持续的工作设置一个站点别名
site-ssh通过SSH的交互式会话或运行一个shell命令连接到Drupal网站服务器
test-clean清除临时表和文件
test-run运行测试。注意,您必须使用--uri选项
updatedb应用所需要的任何数据库更新(如运行update.php)
usage-send向统计记录站点发送匿名Drush使用情况,使用统计包括Drush命令名称及Drush选项名称,但不包括参数或选项的值。
usage-show显示Drush已记录但尚未发送的使用信息。使用统计包括Drush命令名称及Drush选项名称,但不包括参数或选项的值
variable-delete删除一个变量
variable-get获取部分或全部网站的变量和值的列表
version显示Drush版本
watchdog-delete删除watchdog消息
watchdog-list显示可用的消息类型和严重程度。一个提示会要求选择显示watchdog消息。
watchdog-show显示watchdog信息
101 | 102 | 表15-2 字段命令 103 | 104 |
命令描述
field-clone克隆一个字段及其所有实例
field-create创建字段和实例。返回字段编辑链接
field-delete删除字段及其实例
field-info查看有关字段,字段类型,和小部件的信息
field-update返回字段编辑网页的链接
105 | 106 | 表15-3 项目管理的命令 107 | 108 |
命令描述
pm-disable禁用一个或多个扩展(模块和主题)
pm-download从Drupal.org或其他来源下载项目
pm-enable启用一个或多个扩展(模块和主题)
pm-info显示一个或多个扩展(模块和主题)的详细信息
pm-list显示可用扩展(模块和主题)的列表
pm-refresh刷新更新状态信息
pm-releasenotes打印给定项目的发行说明
pm-releases打印给定项目的发布信息
pm-uninstall卸载一个或多个模块
pm-update更新Drupal核心和贡献的项目以及应用任何挂起的数据库更新(和PM-更新代码+数据库更新一样)
pm-updatecode更新Drupal核心和贡献的项目到最新推荐的版本
109 | 110 | 表15-4 SQL命令 111 | 112 |
命令描述
sql-cli使用Drupal的凭据打开SQL命令行界面
sql-connect一个连接到数据库的字符串
sql-create创建数据库
sql-drop删除一个给定的数据库中的所有表
sql-dump使用mysqldump或等效的操作导出Drupal数据库为SQL
sql-query执行对站点数据库的查询
sql-sync复制和导入源数据库到目标数据库。通过rsync进行转移
113 | 114 | 表15-5 用户命令 115 | 116 |
命令描述
user-add-role添加角色到指定的用户帐户
user-block阻止指定的用户(S)
user-cancel取消具有指定名称的用户帐户
user-create创建具有指定名称的用户帐户
user-information打印关于指定用户(S)的信息
user-login向指定用户帐户显示一个一次性登录链接(默认为ID1)
user-password为具有指定名称的用户账户设置或重置密码
user-remove-role移除指定用户帐户的角色
user-unblock解锁指定的用户
117 | 118 | ##总结 119 | 120 | Drush向那些喜欢命令行操作的用户提供了一个快速且容易的方法来管理网站。还有很多更高级的Drush功能,如编写Drush脚本同时执行多个任务。欲了解更多信息,请访问 http://drush.org 。 121 | 122 | 接下来,第16章介绍了如何使用Git来管理Drupal源代码。如果你喜欢Drush,你一定会喜欢的Git! 123 | -------------------------------------------------------------------------------- /chapters/chapter-16.md: -------------------------------------------------------------------------------- 1 | # 第16章 使用 Git 2 | 3 | 本章会让你对Git有一个大致的了解 。 Git 是 Drupal 社区自 Drupal 7 开发时就采用的一个源代码控制系统。你也许会问,什么是源代码控制系统。其实源代码控制系统就是能够帮助开发者去管理对文档、源代码以及其他信息集进行的变更的工具。比方说你修改了一个文档或一段代码,后来又后悔了,希望它返回到修改之前的状态,就是撤销掉所有的变更,那么源代码控制系统可以挽回这个局面。源代码控制系统的一个主要特征就是:在某一时刻对数字文档进行快照存储,在未来某一时刻可以通过这个快照使文档恢复到之前的状态。 4 | 5 | 其他有关源代码控制系统的关键环节还包括:把改动推送给其他开发者或系统的能力;采用单一基础代码库,并在此基础上为开发者们在不相互影响的情况下进行同步开发而创建副本(或者叫做‘分支’在技术上更正确),然后在某个时间点上合并所有分支,并解决由于同一文件区块(例如,一行代码)被多人修改而引起的冲突问题的能力。 6 | 7 | 在市场存在着几个不同的源代码控制系统。 Drupal 社区选择并采用的是 Git。Linux 操作系统的创作者 Linus Torvalds 在他开发 Linux 的时候想要寻找一个真正开源、快速、功能强大还容易使用的(源代码控制系统),因此他开发了 Git。在本章节,我将会讲述一些 Git 的基础功能,你也许会在你的 Drupal 8 网站上使用这些功能。 8 | 9 | ## 安装 Git 10 | 11 | 使用 Git 的第一步就是安装它。但是安装它之前,你可查看一下它是否已经被安装过了。在终端窗口的命令提示行中键入`git`后按下回车键,如果你看到一系列 Git 命令,那恭喜你,你的 Git 早就安装好了。如果你看到的一些以 "command no found"(命令未找到)结尾的内容,那么是时候安装 Git 了。 12 | 13 | ## 在 Linux 上安装 Git 14 | 15 | 在 Linux 中安装 Git 只需要一步简单的操作。 如果使用的系统是基于 Debian 的发行版,譬如说 Ubuntu,那么只需在终端窗口中输入`apt-get install git`。如果你使用的不是基于 Debian 的发行版,你可以使用 yum 来安装 Git,在终端窗口中输入 `yum install git-core`。 安装完成后,在命令提示符后键入`git`,按下回车键,你现在应该会看到一系列 Git 命令。 如果不是这样的话,访问 Git 的官方网站 http://git-scm.com 并查询帮助文档。 16 | 17 | ## 在 OS X 上安装 Git 18 | 19 | 在 OS X 上安装 Git 可以通过图形界面来完成。安装包在 http://sourceforge.net/projects/git-osx-installer 上获取。这个简单易用的工具提供一个快速的方法让你在你的 Mac 上安装 Git。下载这个 dmg 文件,点击启动这个安装工具,并跟随指引操作。一旦完成安装,打开一个终端窗口,在命令提示符后键入`git`,按下回车键,以确保 Git 已经安装好了。如果 Git 已经正确地安装了,你应该会看到一系列 Git 命令,如果不是这样的话,访问 http://git-scm.com 寻找帮助。 20 | 21 | ## 在 Windows 上安装 Git 22 | 23 | 要在 Windows 上安装 Git,请从 http://msygit.GitHub.io 下载安装 Git 的 exe 文件。 这个Windows安装包会为你安装 Git 的工具,使你能够在终端窗口中执行 Git 并且提供图形界面工具来管理你的 Git 仓库。 安装完成之后,启动一个终端窗口,在命令行中键入 `git`,按下回车键。 你应该会看到一系列的 Git 命令。 如果你没看到一系列命令,访问 http://msygit.GitHub.io 寻求帮助。 24 | 25 | ## 使用 Git 26 | 27 | 在你使用 Git 的过程中,有一些基本的 Git 命令会让你渐渐的离不开Git这个工具了 。使用 Git 的第一步是创建一个 Git 仓库,这个仓库里存放着你想要进行版本控制的所有东西。让我们使用安装完成的 Drupal 8 作为我们第一个 Git 项目,将它置于源代码控制状态下。使用终端,导航到你的 Drupal 8 项目的根目录下。 在终端窗口中,键入 `git init`,然后按下回车键。 28 | 29 | ------ 30 | 31 | **注意** 如果你已经为这个网站创建了一个 Git 仓库,那么 `git init` 命令会返回一条错误信息。 32 | 33 | ------ 34 | 35 | 你应该会看到类似于此消息的内容: 36 | 37 | Initialized empty Git repository in /Applications/MAMP/htdocs/drupal8/.git/ 38 | 39 | 如果仓库未能成功创建,访问 Git 官方网站,寻找关于你所遇到的错误的帮助。 40 | 41 | 仓库创建完成之后,下一步需要进行的是添加元素到仓库里。既然我们还没有添加任何文件,我们将会把 Drupal 8 目录下的所有文件添加到 Git 中。要做到这一点,输入下面的命令: 42 | 43 | ```bash 44 | git add -A . 45 | ``` 46 | 47 | 确保你输入的命令最后有那个小点点,因为它代表着当前目录。如果你成功地将所有的文件添加到仓库里,你将会返回到命令提示符状态下,并且没有错误信息显示。当你键入 `git status`时并按下回车键,你应该会看到一个长长的,包含着新增到仓库里但还未提交的文件列表。 48 | 49 | 将刚刚添加的文件提交的操作会生成一个快照。在未来当你遇到进行变更后需要恢复到之前状态的情况,你可以回滚到这个快照。 添加和提交文件的频率取决于你或者你的项目团队,关键的目标在于可以及时回滚到之前的状态。那么现在让我们使用下面的命令将 Drupal 8 的文件提交到我们的 Git 仓库中。 50 | 51 | ```bash 52 | git commit –m "initial commit to the repository" 53 | ``` 54 | 55 | 执行提交命令之后,你应该会看到一串关于新节点在你的 Git 仓库中创建的消息,每个提交的文件都会有一条消息。这时如果你执行`git status`命令,你应该会看到"everything is up to date"(所用文件都是最新的): 56 | 57 | ``` 58 | On branch master 59 | nothing to commit, working directory clean 60 | ``` 61 | 62 | 进行到这里,我们已经完成文件提交,并且获得了将文件恢复到刚刚提交时的状态的能力。接下来要进行的是对文件进行一些变更,并提交这些变更。让我们对已有的文件做一些修改,并且添加一个新文件,来看看 Git 对这两种情况是如何作出响应的。首先,在你的 sites/default/files 目录下创建一个文档。 为了演示,我们新建一个名为 test.txt 的文件,里面包含几行信息,这样我们就能看到 Git 在运转。文件创建完成之后,执行`git status`来验证 Git 已经检测到这个新文件。你应该会看到类似的输出: 63 | 64 | # On branch master 65 | # Untracked files: 66 | # (use "git add ..." to include in what will be committed) 67 | # 68 | # test.txt 69 | 70 | 那么让我们按照提示信息,使用`git add test.txt` 来将文件添加到 Git. 添加文件后,使用`git status`来看看文件是否已经被添加了。你应该会看到类似的输出: 71 | 72 | # On branch master 73 | # Changes to be committed: 74 | # (use "git reset HEAD ..." to unstage) 75 | # 76 | # new file: test.txt 77 | # 78 | 79 | 其中,文件名前面的“new file:”表明 Git 目前在跟踪该文件。 80 | 81 | 现在让我们将这个新文件提交到仓库中,这样我们就可以在未来恢复到现在这个这状态。 82 | 使用下面的命令提交文件: 83 | 84 | ```bash 85 | git commit –m "committing the initial version of test.txt to the repository" 86 | ``` 87 | 88 | 提交完成之后,执行`git status`来验证所有文件都已经提交了。你应该会看到那条表示没有东西需要被提交了的消息。 89 | 90 | 现在让我们对 test.txt 进行一下修改。添加更多的信息到 test.txt 文件当中,看看 Git 能否察觉到这个文件中的变更。 添加完文本之后,执行`git status`。你应该会看到类似的消息: 91 | 92 | # On branch master 93 | # Changes not staged for commit: 94 | # (use "git add ..." to update what will be committed) 95 | # (use "git checkout -- ..." to discard changes in working directory) 96 | # 97 | # modified: test.txt 98 | # 99 | 100 | Git 识别到了 test.txt 的变更。现在,我们可以使用`git add test.txt`和`git commit -m "modified test.txt"` 将修改版的 text.txt 添加到 Git 并提交。提交完成之后,使用`git log`命令来查看你的仓库的提交历史。你应该会看到两条跟下面内容相似的与你提交的文件有关的提交记录。 101 | 102 | commit d4c24ca1854e53676178141be86246b1a3cb0a1a 103 | Author: Todd Tomlinson 104 | Date: Wed Mar 19 08:27:10 2014 -0700 105 | 106 | modified test.txt 107 | 108 | commit 39b5859fa70d1aafacd5c04d7695e715fdfd6bd6 109 | Author: Todd Tomlinson 110 | Date: Wed Mar 19 08:23:04 2014 -0700 111 | 112 | committing the initial version of test.txt to the repository 113 | 114 | 在上面的列表中,你可以看到两个不同的提交ID(commit ID)。如果你需要将 test.txt 恢复到初始状态,你可以使用那个初始的 commit ID 来进行操作。回滚到以前状态的命令是`git revert `。为了撤销我对 test.txt 的变更,我会使用第一个 commit ID,那个以“bd6”结尾的 ID。 115 | 116 | ```bash 117 | git revert 39b5859fa70d1aafacd5c04d7695e715fdfd6bd6 118 | ``` 119 | 120 | 恢复完成后,查看 test.txt 文件,我可以看到文件已经回到我对它进行修改前的原始状态。呦! 121 | 122 | 现在,你已经有足够的基础信息来搭建你的本地 Git 仓库并存储你的变更。但是你所有的变更都只是本地地存储在你的笔记本、台式机或者服务器。同时往往你可能希望你的代码仓库能够被别人浏览并且/或者修改。为你的 Git 仓库提供访问管理的解决方案有好几个,而 GitHub 是其中很受欢迎的一个,同时也是本章将会为你介绍的那一个。 123 | 124 | ## 使用 GitHub 125 | 126 | 使用 GitHub,你可以与他人共享你的 Git 仓库,方便你在你的笔记本或者台式机进行开发而网站驻留在远程服务器的状况。在这些场景中, GitHub 提供一个可以通过互联网访问的环境,而且如果你觉得你的仓库可以开放大众访问,这项服务是免费的。你可以通过每月支付少量费用升级你的 GitHub 账号,你就可以创建私有仓库,这样只有那些被授予权限的人才能访问。为了演示,我们将会使用免费版的 GitHub。 如果你还没有账号,访问 https://GitHub.com 并注册一个新的账号。 127 | 128 | 注册账号后,第一步是创建一个仓库。在你的 GitHub 登录页面(登录后的第一个页面),你可以看到一个或者多个用来创建创库的链接和按钮。点击其中一个链接,你会看到类似图16-1的页面。 129 | 130 | ![创建新的 GitHub 仓库](../images/pic-16-1.png) 131 | 132 | **图16-1 创建新的 GitHub 仓库** 133 | 134 | 为了创建一个仓库,在“仓库名称(Repository name)”字段中输入一个名称,在描述字段(description)中输入一段描述,并且在“添加 .gitignore(Add .gitignore)”选择列表中,选择 Drupal。 135 | 136 | .gitignore 包含一些你希望 Git 不去跟踪的文件名。 就 Drupal 的情况来说,这包含本地配置文件,例如网站根据本地的执行环境而定制的 settings.php。 通过忽略 settings.php,你可以省去每次从主仓库中拉取代码后需要进行的一系列调整,比如说数据库配置。 137 | 138 | GitHub 上的仓库创建完成之后,下一步是将你本地的仓库推送到 GitHub。在你的 GitHub 仓库页面的右侧,你可以看到一条克隆URL(clone URL)。复制那个URL,因为你将你的本地仓库推送到 GitHub 时需要它。 139 | 140 | 这个过程的第一步是在你的本地机器上建立 GitHub 联系。在你的 Drupal 8 站点根目录下,使用下面的命令,添加一条指向你的远程 GitHub 仓库的引用。记得粘贴克隆URL(clone URL)来替换 ``: 141 | 142 | ```bash 143 | git remote add origin 144 | ``` 145 | 146 | 当你添加完远程仓库后,下一步是在你试图推送本地仓库到 GitHub 前,将在 GitHub 上已经存在而本地没有的文件变更拉取到本地。当你试图将变更推送到 GitHub ,而同时远程上面存在着一些本地没有的变更,Git 会告诉你,你的分支落后于远程分支,你需要先将这些变更拉取下来。 因为我们在 GitHub 上面添加了一个 .gitignore 文件,远程仓库中确实含有一些本地没有的变更。要解决这个问题,使用下面的命令: 147 | 148 | ```bash 149 | git pull origin master 150 | ``` 151 | 152 | 这个命令会将 GitHub 上面所有的变更拉取下来,并且与本地的仓库合并。下一步是将我们本地的仓库推送到 GitHub, 因为此时我们的 GitHub 仓库基本上是空的。使用下面的命令将我们的 Drupal 8 站点推送到远程仓库: 153 | 154 | ```bash 155 | Git push origin master 156 | ``` 157 | 158 | 我们的变更推送完成之后,本地仓库与远程仓库是同步的。当你在本地仓库中添加或者修改文件,你需要将它们推送到 GitHub 上面,这样其他人就可以访问它们了。这个过程是相当简单的: 159 | 160 | 1. 使用`git status`查看哪些本地文件被添加到你的 Drupal 8 实例,或者哪些文件被修改过。 161 | 2. 从这个添加和修改的文件列表中,使用`git add <文件名>`将他们添加到 Git。(使用`git status`命令列出的真实的文件名替代`<文件名>`)。如果你在同一个目录下有几个文件被添加或者更改,你可以通过使用`git add <目录名>`添加那些文件所在的目录来完成同样的任务。 162 | 3. 使用`git commit -m "一些用来描述正在提交的变更的消息"`来本地提交你的变更。你可以在每一个文件添加后(译者注:添加到暂存区)进行一次提交或者在你将有所新增或者变更的文件添加后进行提交。这个取决于在某一问题上你想要的回滚粒度。在大多数情况下,在添加一组文件后进行提交就足够了。 163 | 4. 本地提交完成之后,是时候将他们推送到 GitHub 了。使用`git push origin master`来推送这些变更。如果你的 GitHub 仓库上有多人操作,当你推送文件时可能会遇到一个错误情况:你的主分支落后(远程分支)X个提交。只需要执行`git pull`来下载并合并这些变更,然后重新执行`git push origin master`。当你修改的文件同时被别人修改了,Git 会报告一个合并冲突。 Git 会将有用的信息写入到在文件中冲突发生的地方。检验文档并且解决那些问题。关于解决合并冲突的更多信息,可以查阅 http://git-scm.com/documentation 上的 Git 文档。 164 | 165 | 随着你的 Drupal 8 站点已经上传到 GitHub,你可以让其他人访问你的仓库,这样他们可以下载你的仓库,并且随意地提交变更到你的仓库。如果你已经升级了你的 GitHub 账号,你需要跟随 GitHub 仓库登录页面上的步骤为你的仓库添加访问控制。如果你没有升级你的 GitHub 账号,你就不需要任何的访问控制,因为默认情况下,免费账号都是公开访问的。要将你的 GitHub 仓库克隆到你的笔记本、台式机或者服务器,你可以使用 `git clone` 命令或者在你的仓库登录页面上使用下载 ZIP(Download ZIP)按钮来下载 zip 文件。最佳的方法是使用 Git clone来拷贝这个仓库。 要做到这一点,只需复制你的 GitHub 仓库登录页右侧的 “HTTPS 克隆 URL (HTTPS clone URL)”,然后执行下面的命令: 166 | 167 | ``` 168 | git clone 169 | ``` 170 | 171 | 使用你的 GitHub 仓库登录页中列出的真实 URL 替代 ``。示例如下: 172 | 173 | ``` 174 | git clone https://GitHub.com/Drupal8Todd/drupal8.git drupal8 175 | ``` 176 | 177 | 上面的代码会将 GitHub 仓库克隆到名为 drupal8 的目录中。克隆完成后,我就可以使用、修改、添加到仓库、并且随意地提交这些变更到 GitHub 仓库中。网上有大量文档解释如何在 Git 网站上管理多人开发的 Git 仓库,这些内容包括创建独立分支,让在开发者在上面进行修改,然后在他们准备好的时候合并回主分支。 178 | 179 | ## 在 Drupal.org 上使用 Git 180 | 181 | 你也可以使用 Git 来克隆 Drupal 或者它的模块和主题。Drush(参见第15章)使得下载、更新模块和主题变得简单,然而你也许会有想要回馈修改到 Drupal 核心或者一个社区模块或者主题的时候。这样你需要使用 Git 来贡献你的修改到 Drupal.org 或 一个模块仓库,或者一个主题仓库。跟随本章前面介绍的步骤来克隆一个远程仓库,访问 www.drupal.org/project/drupal 并点击页面顶部附近的"version control"链接。在结果页面当中,你会看到关于如何克隆仓库的指引。每一个模块或者主题的登录页面上都有这样的"Version control"链接。你也可以按照前面介绍的步骤来克隆模块或者主题的仓库。有关如何贡献代码给社区的指南,请访问 www.drupal.org/contribute/development。 182 | 183 | ## 总结 184 | 185 | 你第一次能够将文件恢复到之前的状态的时刻,将会是由衷赞美那些创作像 Git 这样的源代码控制系统的人的日子。它可以将文件从备份中恢复过来,然而实际情况是,你敲两下键盘就可以相对轻松地将一个文件或者整个网站回滚到之前的状态。你第二次赞美 Git 创作者的时候,应该是你的网站需要多人共同开发的时候,需要不同开发者贡献各自的代码到这个项目上。花点时间去学习 Git 的基础,可以让你免除一生中,那些因为你尝试通过质量不一的备份,将网站恢复到之前状态而出现的头痛,心痛,甚至偶尔的通宵达旦。 186 | -------------------------------------------------------------------------------- /chapters/chapter-02.md: -------------------------------------------------------------------------------- 1 | # 第2章 创建和管理内容 2 | 3 | 译者:Lmu_Xuzl 4 | 5 | 记住,一个没有内容的网站就像一本没有字的书一样空洞而乏味。在本章,我专注于Drupal内容创建,发布,编辑和管理功能,为您提供必要的知识并创建,发布和管理Drupal网站上的新内容应用。您开始在前一章的过程;现在让我们来看看你可以添加什么应用。 6 | 7 | ## 了解基本知识 8 | 9 | 内容是任何网站的主要组成部分,无论是使用Drupal或是其他工具建站。内容是游客来到一个网站上寻找的目标,而缺少内容往往使游客失望而归。在其最基本的内容形式,内容是任何文字、图片、视频、音频和图形的组合。 10 | 内容模块可采取各种不同的形式: 11 | 12 | * 新闻故事 13 | * 博客文章 14 | * 产品描述 15 | * 公司简介 16 | * 论坛发帖 17 | * 照片 18 | * 维基条目 19 | 20 | 基于Drupal的网站上的内容正文往往放置在标题后面。在第一章,我创建一个基本的页面,它包含的内容与标题和主体。Drupal提供了能力扩展和自定义内容类型。自定义内容类型允许您创建额外的字段,可以用来捕获其他相关信息。一个常见的例子是一个日历事件。 21 | 一个事件包括标题和正文\(事件的描述\),以及其他相关信息,如:日期和时间、地点,甚至地图或照片。我将在第5章介绍如何创建自定义内容类型。 22 | 23 | ## 在Drupal中创建内容 24 | 25 | 在第一章中,我介绍了Drupal的内容创建功能向您展示了如何创建您的第一个内容项和发布到你的网站。第一章的内容类型所使用的基本页面。 Drupal 8 包括第二个内容类型:一篇文章相当于一个基本页面,唯独不相同的是文章有图像载入功能和附加字段标签,这里笔者将讲解一下。标签是简单的词帮助进行分类,整理和搜索网上的相关内容。他们是一个强大的Drupal功能能,我们会在第四章详细讨论。 26 | 要创建和发布新的文章,点击自己的网站的”添加内容”,并选择文章从内容类型的列表。用于创建文章页的过程相当于一张表单的提交,就可以创建了,除了图片上传和标签字段。建流程:先输入一个标题,接下来上传一个图片用过单机Briowse按钮,找到一张照片在你的电脑上上传和包含在整篇文章中。\(见图2 - 1\)。 27 | 28 | ![图2-1。浏览您的计算机图像您要添加到您的文章](../images/pic-2-1.png) 29 | 30 | 图2-1 31 | 32 | 在找到并上传图片,内容创建表单应该以图像的形式显示一张缩略版图片,联通一个文本字段。它是将描述性的文本显示出来是一个好主意。 33 | 34 | ![图2-2 你要上传的图片显示,你被赋予添加描述性文本的机会](../images/pic-2-2.png)图2-2 35 | 36 | 下一步是创建正文和相关的标记你的文章\(见图2 - 3\)。标签可以是任何单词或简短字符串列表,有逗号分割,描述所涵盖的一般的文章。我么将在第四章详细讨论标签。 37 | 38 | ![图2-3 创建文章主体文本并添加标签](../images/pic-2-3.png) 39 | 40 | 图2-3 41 | 42 | 接下来,点击页面底部的“保存并发布”按钮。通过点击首页标签返回到您的网站的主页。然后你将看到已更新的主页,上面显示了您的新文章(见图2-4)。 43 | 44 | ![图2-4 已更新的主页出现](../images/pic-2-4.png) 45 | 46 | 正如你在图2-4中看到,,一篇文章显示已经上传的图片以及已经输入的标签的列表。我将介绍标签和第四章中详细分类,但只作为一个预习点, 点击其中的一个tags自动渲染tag为相同term的文章列表。 47 | 48 | 图2-4 49 | 50 | ## 摘要和完整节点 51 | 52 | 一个Drupal的核心内容相关的特性是自动显示的内容项目的能力,无论是“摘要”模式或“完全节点”视图模式。简略的文章摘要介绍,通常是第600个字符,而“完全节点”指的是内容的完整长度。在图2-4中,你会发现一个“读更多”链接两篇文章的底部。这告诉您,Drupal是自动显示内容在摘要模式项目。您可以修改摘要的长度以及视图模式等几个方面。我将在第10章讨论细节。 53 | 54 | ## 编辑内容 55 | 56 | 有些时候,您需要编辑已经发布的网站内容。编辑内容的步骤和创建内容步骤几乎完全相同,唯一的区别是需要找到你想改变的内容。要查找的内容,请单击菜单中的内容链接在页面的顶部。内容页列显示所有发布的内容,并通过过滤的内容出版状态,内容,语言类型,和标题搜索功能。要从列表编辑内容项显示的内容页面,只需单击编辑按钮就将显示编辑内容界面。如果您发布的内容有需要更改的地方,您发布的用户登陆\(见第6章\),您将看到查看、编辑和删除操作选项卡。\(见图2 - 5\)。 57 | 58 | ![图2-5您可以通过单击编辑按钮来编辑您自己的网站内容](../images/pic-2-1.png) 59 | 60 | 图2-5 61 | 62 | ## 摘要和完整节点 63 | 64 | 默认情况下,Drupal允许作者内容项的编辑、更新和删除内容。只有网站管理员或用户与角色,允许他们编辑、更新和删除其他作者的内容对内容进行更改。如果您没有看到编辑内容项的标题旁边,然后你不是登录一个账户与适当的权限更改项。要改变一个内容项,单击编辑选项卡。Drupal将在编辑模式下显示的内容项,在那里你可以更改或删除内容项\(见图2 - 6\)。 65 | 66 | ![图2-6 显示为编辑模式的内容](../images/pic-2-6.png) 67 | 68 | 图2-6 69 | 70 | 还有另一种方式来编辑您的文章。尝试更新您在上一步中创建的文章导航回主页。要导航回主页,点击“返回网站”按钮位于页面的左上角。在主页上,将鼠标悬停在你想改变的文章。你会发现铅笔图标显示为你悬停标题的右侧(见图2-7)。点击铅笔图标,选择 71 | “快速编辑”选项,然后单击内容主体。 72 | 73 | ![图2-7 铅笔图标](../images/pic-2-7.png)图2-7 74 | 75 | --- 76 | 77 | > 注意:如果你想编辑的文章的第一篇文章是一个列表,然后围着那篇文章将导致两个铅笔图标出现。顶部的图标提供了编辑生成的内容列表视图的能力出现在该网页上,而第二个铅笔图标将带你到该文章的编辑表单。 78 | > 79 | > --- 80 | 81 | 其它内容选项----第二章:创建和管理内容 82 | 将会弹出一个窗口,在该窗口中你可以不离开主页进行该文本的更新。在编辑器中更改好文本内容并单击”保存”按钮。保存以后新版自动呈现在主页。这是一种快速弥补或修复错误的了不起的办法。 83 | 84 | ![图2-8 页面内容编辑](../images/pic-2-8.png) 85 | 86 | 图2-8 87 | 88 | 如果您想对编辑界面做一些修改,喜欢全屏编辑界面,点击铅笔图标\(见图2 - 7日\)并选择”编辑”选项。这是一样的内容项点击任何标题来查看内容详细信息页面\(内容项将作为一个独立的页面完整的呈现\)并选择”编辑”选项卡下面的标题内容,正如我们先前所做的一样。 89 | 90 | ## 其它内容选项 91 | 92 | 在内容编辑表的右边栏(见图2-6),我们修改其中一个项目-Promotion Options-在我们保存新的内容项目前。让我们看看和着相关联的其他选项内容项之前更高级的内容主题。 93 | 你单击编辑选项卡内容项的标题旁边更新和检查的项目。 94 | 右列: 95 | 96 | * “创建新版本”复选框 97 | * 菜单设置 98 | * 评论设置 99 | * URL路径设置 100 | * 编著信息 101 | * 发布选项 102 | 103 | 与这些项目相关的选项将在下面几节中描述。修订信息您曾经做了更改文档,保存这些更改,然后意识到你犯了一个错误,需要“撤消”你所做的更改?有没有意识到这一点后关闭Microsoft Word, 但为时已晚无法恢复到其更改前状态的文件?还有随之而来的时候,您或别人会更改内容的项目,您会希望您有之前内容的副本,它被改变了。Drupal通过提供能够创建解决了这个问题内容的新版本(复制功能)时内容项目被改变。编辑您所创建的样本文章在前面的步骤,为您在右栏中的“创建新版本”复选框。输入的说明您所做的更改(见图2-9),在“修订日志信息”栏。 104 | 105 | ![图2-9 输入你所做更改的描述](../images/pic-2-9.png) 106 | 107 | 图2-9 108 | 109 | 一旦你输入你改变了什么说明,请单击“保存并继续发布”按钮。 Drupal在显示与修订标签内容(见图2-10)。 110 | 111 | ![图2-10 您现在的项目包括修订标签](../images/pic-2-10.png) 112 | 113 | 图2-10 114 | 115 | 单击修订选项卡,可到列出当前版本和以前的所有版本的页面内容项(见图2-11)。 116 | 117 | ![图2-11。所有修订项目出现在这个屏幕上](../images/pic-2-11.png) 118 | 119 | 图2-11 120 | 121 | 您可以通过单击以前版本的日期和时间查看文章的以前发布的版本。 122 | 123 | 在浏览器中单击后退按钮,返回到上一个页面,您可以点击回复链接,改变目前发布的版本到先前发布的版本。点击“还原”Drupal会显示询问您是否真的要恢复到以前发布的版本的页面。点击在Drupal撤销按钮取消发布结果的当前版本和发布所选版本。 124 | 125 | ## 菜单设置 126 | 127 | 可能有情况下,当一个内容是很重要的,可以单独列出一个菜单显示在导航上面。默认的Drupal创建一个“主导航”菜单。主导航菜单通常是显示在页面的顶部。我会在详细菜单在第5章,但现在我会告诉你如何将内容项分配到主导航菜单。在你的网站的首页,将鼠标悬停在已创建的内容项目,然后按一下铅笔图标,然后选择编辑链接。点击菜单设置链接(见图2-6)。菜单设置面板会出现。选中“提供一个菜单链接”复选框,然后你会看到四个字段(见图2-12):“菜单链接标题,”,“说明”,“父项目”和“重量”。在“菜单链接标题”字段中输入几个字能够用来描述性的链接标题为您内容项(请记住,这会出现一个菜单,因此使用尽可能少的文字越好)。在“说明”字段中输入您希望当有人悬停在该菜单项显示的文本。从“父项”下拉列表中,选择“主导航”,在那里我们的网站主导航条是主要的横向菜单。 128 | 129 | 你会看到首页列出的正下方主要导航,这是出现在图2-4中的首页链接。在本例中,选择主导航作为父项,因为我们希望我们的链接显示为另一个选项卡旁边已经存在的主页选项卡。离开“权重”字段设置为零,如果你想让你的菜单按字母顺序。 130 | 您可以通过从值的列表中选择一个重量覆盖字母排序功能。该数字越低,则“轻”的项目将在菜单上。横向菜单,轻项目似乎左边的一个重项。对垂直菜单,上面出现一个较轻的物品重项。设置排序权重是有用的在你想要的情况下,例如, 主菜单链接始终显示为第一个菜单项很有用。 131 | 132 | 要强制首页链接列表的前面,选择从值的下拉列表中最小的数字。 133 | 134 | ![图2-12 点击菜单设置链接,设置首选项](../images/pic-2-12.png) 135 | 136 | 图2-12 137 | 138 | 点击“保存并继续发布”按钮,Drupal会保存您的内容项,项目现在出现在主要的导航菜单,菜单项按字母顺序排序。缺省情况下,菜单项按字母顺序排序; 你可以通过菜单管理工具更改排序顺序,我们将在第8章中讨论这种情况,我们是一个单件的内容链接到菜单项。在案件要在其中多个内容项目链接到一个菜单项,你需要创建一个登陆页面(见第7章)或视图(参见第10章)。如果您使用的是标准Bartik主题(这是默认的主题在Drupal 8),你应该看到靠近你的页面的顶部,您在“菜单中输入的值的新选项卡链接标题“字段。单击该选项卡将带您进入该内容项(见图2-13)。 139 | 140 | ![图2-13 单击新菜单选项卡看到的内容项](../images/pic-2-13.png) 141 | 142 | 图2-13 143 | 144 | 如果你删除相关的内容项,菜单项将自动消失。 145 | 146 | ## 评论设置 147 | 148 | Drupal提供了游客的能力到你的网站对你的网站的内容发表评论。尝试,单击“编辑”选项卡下的标题内容项,或在你的内容项并单击铅笔图标并选择编辑。右列的内容编辑表单,点击评论设置。单击链接显示屏幕如图2 - 14所示。 149 | 150 | ![图2-14 设置您的意见的喜好](../images/pic-2-14.png) 151 | 152 | 图2-14 153 | 154 | 提供两种选择:打开,默认选项(见图2-15),它允许网站访问者发表评论,与此内容类型创建的内容项目。关闭,从排除游客发布的注释。有可能是在那里你不希望游客有要发表评论的能力的情况下。试试这两个选项看到的内容如何显示您网站上的差异。离开打开选项选择并点击“保存并继续发布”按钮。你会看到在添加新评论内容形式立即显示内容的下面。编辑内容,然后选择关闭选项,并点击“保存并继续发表”按钮。你会发现在如何显示您的内容项的显著变化,因为评论将不再出现。 155 | 156 | ![图2-15 随着打开的默认设置,用户现在可以发布在网站上的评论](../images/pic-2-15.png)图2-15 157 | 158 | 使用默认设置的开放,游客到您的网站现在可以编写和发布评论的回应你的内容项\(假设你有设置权限允许匿名用户发表评论,我将介绍在第6章\)。请尝试输入主题和注释,然后点击保存。你的评论现在应该出现在注释部分。由于内容作者(或该网站的管理员),你可以删除,编辑或回复评论点击每个注释下的链接。评论通常出现的时间顺序。作为站点管理员,你有能力指定如何注释显示:无论是在列表的顶部或第一条评论最新评论在列表的顶部贴。我将介绍如何设置默认顺序在第10章。在单个内容项打开和关闭的意见提供了对哪些项目的绝对控制权接受意见。您还可以设置是否接受在内容类型级别的意见,每一个意见内容项使用该内容类型将“继承”该设置创建的。我将设置全局参数,如接受意见,在第10章。 159 | 160 | ## URL路径设置 161 | 162 | 您可能已经注意到工作时的修正功能,你所示的URL浏览器的地址栏看起来像 [http://localhost/node/1](http://localhost/node/1) ,URL中的“节点”告诉我们Drupal显示一块的内容\(节点\)和“1”代表节点的惟一ID被显示。在这种情况下,它是第一个节点,我们在系统中创建,所以ID是1。这一数字将1我们添加的每个节点增加。虽然HTTP://本地主机/节点/ 1获取我们的内容,我们想要的网址是不是很以人为或搜索引擎友好。幸运的是,Drupal让我们重写URL的东西,是更容易理解和代表性的网页上的内容的显示。单击编辑选项卡,或将鼠标悬停在您的内容项,然后单击铅笔图标,然后选择编辑。在右边栏中,点击URL路径设置。 Drupal的让你创建一个别名,或备用网址,相同的内容项目为http://本地主机/节点/ 1。在“网址别名”字段中输入比节点/ 1更具描述性的链接。对于例如,如果本文介绍的休闲划船,你可能会在“URL输入”休闲划船“别名“字段。请注意,您只需输入你的网站的基本URL的URL部分;例如,如果你的网站是网址是 [http://example.com](http://example.com) ,就没有必要在“网址别名”字段输入 [http://example.com](http://example.com) ,只有URL的描述部分(见图2-16)。 163 | 164 | ![图2-16 更改内容的网址为更具描述](../images/pic-2-16.png) 165 | 166 | 图2-16 167 | 168 | > 注意:您必须使用连字符,下划线,句号或其它字符的话在你分开 169 | > URL。不能在单词直接使用空格。 170 | 171 | 进入新网址别名后,点击“保存并继续发表”按钮的下方生成。 Drupal将使用您创建的新别名URL重新显示页面。在我们的例子中,新网址是http://本地主机/全约艇。新的网址很容易的人了解,更重要的是,为方便搜索引擎拿起:网址更好地表明页面提供的内容。创建别名网址是在您的网站创建内容的一个重要方面。然而,手动为每一个内容项的别名是乏味的。幸运的是,有一个Drupal模块,自动创建安装并启用后,模块保存网站上的所有内容项的网址别名。该模块被称为Pathauto,并在第1章介绍我将像模块的安装Pathauto在第8章。 172 | 173 | ## 编著信息 174 | 175 | 再次,单击编辑选项卡,或使用铅笔图标编辑内容项。点击创作信息在 176 | 右列中,你会看到如图2-17所示的图片。 177 | 178 | ![图2-17。在此输入作者信息](../images/pic-2-17.png) 179 | 180 | 图2-17 181 | 182 | 该页面提供有关谁创造内容的用户和日期的内容信息在撰写。您不太可能会想改变这个信息,但是你可以修改,如果你需要。 183 | 184 | ## 推荐选项 185 | 186 | 垂直菜单的最后一项是推荐选项。单击“编辑”选项卡或使用铅笔图标编辑 187 | 内容项。点击推广链接选项看到屏幕如图最近。 188 | 189 | ![图2-18 检查出你的推荐方案](../images/pic-2-18.png) 190 | 191 | 图2-18 192 | 193 | 在第一章中,我们使用了“推荐到首页”选项告诉Drupal,我们希望这篇文章出现在我们的网站的首页。如果我们取消选中此复选框,我们的文章会从前面取出页面,但仍然将可以通过我们设置在前面的步骤,或者直接通过网址在:HTTP://本地主机/节点/ X,其中X是我们正在寻找的内容的节点ID。我将介绍对于具有内容显示在后面的章节头版当我谈到替代方法Drupal的先进功能。“粘在列表的顶部”选项提供了一种机制,用于确保总是该内容条目显示在列表的顶部。我将覆盖在第10章中详细列出了这是一个有用的功能,当你有要突出,如在您的网站上张贴的内容规则的文章内容。 194 | 195 | ## 删除内容 196 | 197 | 我已经介绍了如何创建和编辑内容,但我还没有介绍如何删除内容。可能会有 198 | 情况下,你的内容不再是与你的网站相关,你想删除它。 199 | 删除一个内容项的过程相当简单。首先创建一个新文章下面覆盖的步骤 200 | 早些时候一章。标题和内容不重要,因为你将立即删除 201 | 文章在你创建它。完成后,单击“保存并发布”按钮。如果你查看那块 202 | 的内容,你可以: 203 | 204 | * 单击删除选项卡\(参见图2 - 10\) 205 | * 悬停在文章并单击铅笔图标来显示一个删除链接 206 | * 从内容清单页面\(点击菜单上的内容\)你可以点击删除按钮操作列 207 | * 如果要编辑内容,你可以点击内容编辑表单底部的删除链接 208 | 209 | 所有这些删除方法是从Drupal数据库永久的删除内容项。如果您创建了一个菜单链接内容项,菜单项也将被删除。 210 | 可能你根本不需要一个内容项的情况下出现在网站上,但你希望保留这篇文章以供将来参考,或情况下你工作在一个长文章,需要完成它在稍后的时间。在这种情况下,有效地隐藏内容项从游客到您的网站,只需编辑这篇文章,点击旁边的箭头发表的“保存并继续”按钮来显示“保存和取消发布”链接。单击该链接时保留内容但隐藏内容从游客到你的网站。 211 | 212 | ## 内容预览 213 | 214 | 你不妨另一个活动来执行,你在创作网站上的内容是如何预览当它保存在网站上公布该项目的外观。在内容底部的预览链接编辑表单做到了这一点,显示您的内容,它会出现在传情模式,以及在全内容模式。 215 | 216 | ## 查找内容 217 | 218 | 很可能你的网站有几十个成百上千的内容项,并在某些时候你需要某种能力寻找你想看一个项目,改变,或删除。查找内容,你能做的有下列: 219 | 220 | * 导航到项目所在的页面,并点击旁边的编辑按钮标题。 221 | * 在地址栏输入项的URL,您的web浏览器。 222 | * 使用您的网站的搜索功能搜索项。 223 | * 使用内容列表网页。 224 | 225 | 任何方法将完成工作任务,但是使用内容列表页面内容可能是最常见的方法。查看此页面,选择管理➤内容。你会看到如图2-19所示的屏幕。 226 | 227 | ![图2-19 查看内容列表网页](../images/pic-2-19.png) 228 | 229 | 图2-19 230 | 231 | 在此页面,您可以通过点击标题,内容类型,作者,状态,或更新的列排序列表标题,然后单击向上和向下的三角形,按升序或降序排列。你也可以筛选结果(限制是什么示出)通过从顶部的下拉菜单中选择的状态(例如,已发表或未发表)和/或内容类型下拉菜单(如文章或基本页)。点击过滤器按钮将刷新列表只显示那些符合您选择的条件的项目。从列表中的任何项目,您可以点击文章的标题,查看这篇文章,或者您也可以点击箭头操作按钮右边露出编辑或删除选项。您也可以保存,发布,取消发布,删除,提升为头版,置顶头版,使粘和删除粘性上同时多个内容项。只需点击复选框以每个内容的左项,从“选择用”下拉菜单中选择要应用到所有的项目,你的选择勾选,然后单击应用。 232 | 233 | ## 总结 234 | 235 | 本章着力打造的内容,设置在创建时可用的各种选项内容项,更新和删除内容。你学会了如何把一个菜单上的内容项等等,用户可以轻松地找到并查看内容,以及如何创建搜索引擎 - 以及用户友好的URL。在这一点上,你需要创建一个基本的Drupal网站的基本技能和理解,但现在停药意味着你会错过这一切的Drupal所提供的等丰富而强大的功能。 236 | 237 | 在接下来的章节中,我将描述的过程创建复杂的页面布局,绘制的清单的内容,并控制谁可以访问各种特性和功能在您的网站,我将分享提示和技巧来管理您的新网站。 238 | 239 | -------------------------------------------------------------------------------- /chapters/chapter-14.md: -------------------------------------------------------------------------------- 1 | #第14章 管理站点# 2 | 3 | **翻译:蹊** 4 | 5 | ##管理您的 Drupal 站点 6 | 7 | 如果你遵循了之前的章节,你现在有足够的知识建立一个基于 Drupal8 的网站。建立你的网站并发布到世界上是一种让人惊喜的经验,总是给你带来巨大的自豪与快乐。无论你的网站有两三页或是几百页,部署一个网站,看着站上的访问量是一个有益和丰富的经验。部署你的网站只是旅程的一部分,它绝不是结束。作为一个自豪的网站拥有者,您必须监视它,培育它,展开它,支持它,所有这一切都囊括在网站管理中。 8 | 9 | 管理一个 Drupal 网站可以是一个相对简单的任务,这取决于你的网站的规模,用户的数量,有能力创作内容的用户数量,还有你已经安装的模块的数量。在过去的几年中,我创建了一些个人的、已经启动和运行的“pet”项目网站(译者注:由于个人兴趣搭建的项目网站),除了出去看一眼站点日志我没有做其他的。有一些我建的其他站点需要更多关注,而关注程度取决我刚提到的标准。 10 | 11 | 您需要考虑定期执行的典型的站点管理任务,包括 12 | 13 | - 备份网站,这样就可以在发生灾难时恢复。 14 | - 备份文件系统(目录文件)。 15 | - 检查日志,看看是否需要你解决任何错误。 16 | - 检查,看看是否有任何安全补丁模块已安装。 17 | - 检查,看看是否有模块更新,部署在站点有意义。 18 | - 检查,看看是否有 Drupal 核心 更新需要部署在站点上。 19 | - 批准新的用户账户请求。 20 | 21 | 在本章中,我将详细介绍每一种管理任务。 22 | 23 | ##备份和恢复您的网站 24 | 25 | 如果你不想做这个管理任务列表上的事,至少要保证你的数据安全,遇到意外灾害可以恢复。你很容易推迟备份网站,因为你很可能几乎不需要回去从备份恢复的你的站点。但是,从经验来看,第一次你需要恢复你的网站、但你没有备份的时候,将会是你最后一次不从一开始就把备份准备好的时候。听取这个经验,花你几分钟设置备份很值得。 26 | 27 | 28 | 29 | 有三种路可以走,以解决您的新网站备份: 30 | 31 | - 你可以使用你的服务器托管商给你提供的公共组件用来备份的数据库和目录等 32 | - 你可以使用 Drupal 的 Backup and Migrate 模块,用定义的时间表自动备份站点的数据库,以及同样重要的是,很容易从以前的备份恢复您的网站。 33 | - 你可以使用 Drush 下载网站和数据库的副本。 34 | 35 | 以上三种方法一样好,Backup and Migrate 模块是一个完美的解决方案,为那些不太倾向于使用操作系统级命令计划备份的用户创建脚本以备份Drupal站点。第一种方法缺点是覆盖太广,因为它的变化取决于您的托管服务提供商,所以我只阐述后两种方案。我将向您展示如何从备份恢复网站的方法。 36 | 37 | ##用 Backup and Restore 模块备份 38 | 39 | Backup and Migrate 模块需要你去安装,因为它不是 Drupal 核心的一部分。你可以在 www.drupal.org/project/backup_migrate 找到模块细节。安装模块,遵循涵盖第11章的内容。 40 | 41 | 要访问 Backup and Migrate 配置页面,访问( http://localhost/admin/content/backup_migrate )使用您的网站所在的真实 URL 替换 http://localhost 。按下回车键后,您将看到 Backup and Migrate 模块的配置面板。 42 | 43 | 配置 Backup and Migrate 模块的第一步是定义备份文件存储在服务器上的哪个地方。点击页面的顶部的 Destinations 选项卡,显示如图14-1所示的页面。文件存储位置由两个设置决定: 一个用于手动备份,在站点管理员处点击“现在备份”链接来执行备份,另一个就是自动备份。我将稍后介绍如何设置自动备份。你也可以设置你想要备份的数据库。默认情况下,模块自动检测你的站点使用的数据库并设置参数。在安装和设置模块的过程中,你可以选择覆盖默认的目录和数据库,或者你也可以像我一样,保留默认值。 44 | 45 | ![图14-1 为备份设置目标目录](../images/pic-14-1.png) 46 | 47 | **图14-1.为备份设置目标目录** 48 | 49 | 下一步是设置自动备份的时间表。为此,单击页面顶部的 “Schedules” ,显示如图14-2所示的配置选项。如果你之前还没有设置计划,该页面会只显示 “Add schedule” 链接。单击链接可查看您可以设置的计划备份的参数。首先,输入计划的名称。我们将设置为以每天为基础进行备份,因此输入 “Daily Backups” 作为名称。接下来,设置 “Backup every” 字段为1天。最后,设置 “Number of Backup files to keep” 为14,这意味着 Drupal 将在删除最旧的备份和存储最新的备份之前,保留备份14天。这有助于保护您免受旧备份文件消耗大量硬盘空间。精心设置这个值。你可以依你的行业的法定要求,保存文件在某些天,周,月,或者年。最后,点击 “Save schedule” 按钮。 50 | 51 | ![图14-2 设置自动备份的时间表](../images/pic-14-2.png) 52 | 53 | **图14-2.设置自动备份的时间表** 54 | 55 | Drupal 现在可以自动以日期为基础备份站点了。最后一步是执行你的站点的手动备份。这样做,点击Backup标签(看图14-3)。在结果页面上, Backup from 后面的列表设置为 Default Database ,选择默认数据库( Default Database )作为备份来源( Backup from ),将“到( to )”设置为手动备份目录( Manual Backup Directory )(你可以选择下载到本地电脑),将“使用( using )”设置为默认设置( Default Settings )。最后点击 “Backup now” 按钮 56 | 57 | ![图14-3 手动备份你的站点](../images/pic-14-3.png) 58 | 59 | **图14-3. 手动备份你的站点** 60 | 61 | 备份完成时,Drupal 会在屏幕上重新显示生成的备份文件的名字,存储目录,备份花费多长时间执行。 62 | 63 | ##用Drush备份 64 | 65 | 对于那些熟悉命令行的站长,使用 Drush 命令行提供了一个简单的解决方案。备份数据库,如果只是备份数据库,只要定位到你的站点的目录结构内,从命令提示符执行以下 Drush 命令,使用你希望的文件的名称替换: 66 | 67 | ```bash 68 | drush sql-dump –-result-file= 69 | ``` 70 | 71 | 这运行的结果是一个SQL转储被创建并存储在 Drupal 站点的根目录。如果你想备份整个网站,包括代码、文件、数据库、使用`drush archive-dump`, 这个命令会创建一个归档文件,其中包含3个文件。使用 archive-dump 时, Drush 创建一个以日期和时间为文件名的归档文件,并在完成的时候报告文件的存储位置。 72 | 73 | ##恢复备份 74 | 75 | 如果由于某种原因,你需要恢复之前你备份的系统状态,你可以使用和你创建备份相同的工具恢复备份,如下所述。 76 | 77 | ##用 Backup and Migrate 恢复 78 | 79 | 如果你需要用备份和迁移这个模块创建的备份恢复系统,请返回到 Backup and Migrate 管理页面( http://localhost/admin/content/backup_migrate ),并选择备份文件恢复系统。单击 Destinations 选项卡,显示存储备份的目标目录列表。参见图14-4。 80 | 81 | ![图14-4 存储备份的目标目录列表](../images/pic-14-4.png) 82 | 83 | **图14-4. 存储备份的目标目录列表** 84 | 85 | 因为我们使用手动备份,点击 “list files” 链接手动备份目录,显示如图14-5所示的页面。 86 | 87 | ![图14-5手动备份目录和文件来恢复](../images/pic-14-5.png) 88 | 89 | **图14-5. 手动备份目录和文件来恢复** 90 | 91 | 在这个例子中,我们能够只需在备份文件点一下恢复,从我们某一时刻某一状态的手工备份恢复系统。如果你启用定期备份并没有手动备份你的系统,描述的过程是相同的,除了选择的 “list files” 链接来自定期备份目录,点击该链接会显示备份文件,这些文件是基于此前几步由你设置的定期备份而自动创建的 92 | 93 | ##用 Drush 恢复 94 | 95 | 对于那些熟悉命令行的人,使用 Drush 命令行提供了一个简单的解决方案。从 `drush sql-dump` 创建的备份恢复数据库,只需在定位到你的站点目录结构内,在命令提示符执行下列 drush 命令(将 example.sql 替换为你用 sql-dump 命令时创建的文件名) 96 | 97 | ```bash 98 | drush sql-connect < example.sql 99 | ``` 100 | 101 | 从 “archive-dump” 文件恢复整个网站,使用 102 | `drush archive-restore `,``是归档文件的名称,文件中包含了代码,数据库,和文件。 103 | 104 | ##备份文件系统 105 | 106 | Backup and Migrate 模块只备份你的 Drupal 数据库的内容。Drupal设置本身,意味着 Drupal 核心,你安装的贡献模块,安装的主题,对模块的定制,用户上传的任何文件,都不会被 Backup and Migrate 模块保存。 107 | 108 | 备份文件系统有几个选择: 109 | 110 | - 简单地将整个 Drupal 目录复制到另一个地方(例如,下载网站到本地计算机,如果您在托管服务器上运行)。 111 | - 复制的Drupal目录到 USB / CD / DVD ,如果你在你的本地桌面/笔记本电脑上运行。 112 | - 在托管环境的情况下,与供应商合作,以确保您备份 Drupal 目录的频率足以保证在发生灾难的情况下,损失降到最低。 113 | - 使用命令行创建网站的归档文件(如 tar 文件)。 114 | 115 | 无论您选择哪种方案,如果用户上传文件和发布的内容带附件(甚至每天备份,就像你在Backup and Migrate 设置的计划),您应该频繁备份文件系统,如果你禁止上传文件和内容附件,最好还是每周备份(由于模块更新)。 116 | 117 | ##恢复文件系统 118 | 119 | 要恢复文件系统,复制你在前几部创建的备份,拷到你的站点的服务器的根目录下,如果您使用的压缩工具,例如 tar 或 zip ,在根目录下解压。 120 | 121 | ##检查日志文件 122 | 123 | 有了备份,下一个管理任务是,定期检查日志文件,以查看是否有在系统中需要被纠正的错误(例如,“page not found”错误)。要查看日志文件,单击顶部菜单的报告( Reports )链接,显示报告列表,它们可帮助您管理您的新 Drupal 站点。见图14-6。 124 | 125 | ![图14-6 标准报告列表](../images/pic-14-6.png) 126 | 127 | **图14-6. 标准报告列表** 128 | 129 | 我将在本节聚焦其中三份报告(你只要点击链接就能轻松查看其他报告): 最近的日志消息,“page not found”的错误,状态报告。 (我将在本章后介绍可用更新。) 130 | 131 | ##最近的日志消息 132 | 133 | Drupal 提供了丰富的事件记录框架,对于管理 Drupal 站的人可能会对此感兴趣。模块开发人员和 Drupal 核心维护人员利用此功能来记录任何的,他们觉得很重要的,足以记录在日志文件的事件。如果单击“最近的日志信息”链接,你会看到一个报告,类似于图14-7。 134 | 135 | ![图14-7最近的日志消息](../images/pic-14-7.png) 136 | 137 | **图14-7. 最近的日志消息** 138 | 139 | 您的邮件将在图14-7所示的不同,因为你已经执行的操作会有所不同。消息的该列表包括错误和成功的事件(例如,用户登录到系统在日志文件中的结果,显示他们登录的日期和时间)。只需点击该邮件,就能看到 Drupal 核心 开发者认为有必要分享给站点管理员的细节。解决你可能会看到错误的最好的资源是去 Drupal.org 查看出错的模块的相关讨论。如果你没有在模块的相关页面找到答案,第二步就是去 Drupal.org 的论坛发帖询问,这种情况极少,除非你是遇到错误的第一个人,如果真是这样,在论坛上发帖求助的话,通常获得知道如何解决这一问题的人的快速响应。 140 | 141 | ##顶部“找不到网页”的错误 142 | 143 | 返回到报告主页,并点击“Top ‘page not found’ errors”链接,显 144 | 示“404”错误和或者“page not found”错误的列表。见图14-8。 145 | 146 | ![图14-8 “page not found”的报告](../images/pic-14-8.png) 147 | 148 | **图14-8.“page not found”的报告** 149 | 150 | 重要的是定期检查这些报告,看看是否有访客点击链接时出现“坏链”。解决页面上的错误列表需要对你的部分进行调查和分析。你应该聚焦计数高的错误,因为这些错误可能会影响到访客。要解决“page not found”错误 ,你有三个基本选项:忽略这些错误,为报错“page not found”的 URL 创建对应的页面,或在 .htaccess 文件中创建重定向规则,将这些请求重定向到一个有效的URL。 151 | 152 | ##状况报告 153 | 154 | 一般来说您的网站的“健康”报告可以从报告页面点击状态报告 (Status report) 链接进行访问。单击这个链接显示一个页面,这个页面高亮显示了 Drupal 中相对重要的设置(见图14-9)。当你运行这个报告,项目会被检查,包括是否关键配置文件是否免于未经授权的修改,是否更新数据库。 Drupal 8 的模块安装有修订办法,所以数据库不可能过时。如果出现数据库被报告为过时,运行 http://localhost/core/update.php 脚本,数据库与模块的当前状态同步(通过您的站点所在的实际URL替换 http://localhost )。 155 | 156 | ![图14-9状况报告](../images/pic-14-9.png) 157 | 158 | **图14-9. 状况报告** 159 | 160 | 你最有可能去看 Drupal core 的状态,贡献模块和主题的问题。如果 Dupal.org 有Drupal的新版本,或者贡献模块,主题有了新版本,这些项目将显示为黄色。 161 | 162 | ##检查更新和安全补丁 163 | 164 | 如果状态报告显示模块或主题有更新可用,你需要检查,看看哪些类型的更新可用。无论是在你开发新网站的时候还是网站已经成品的时候,还有这有三大类更新目录需要你重视: 165 | 166 | - 安全补丁 167 | - 模块更新 168 | - Drupal 核心更新 169 | 170 | 在大多数情况下你会想尽快解决安全更新,而你可以选择每月,每季甚至更低频率的更新模块和 Drupal 核心 。模块和 Drupal 核心 的更新的典型处理是,发现模块或者 Drupal 核心 的bug并且/或者提供新特性给模块或 Drupal 核心 。作为站点管理员,你将需要确定,通过查看每个更新的版本说明,决定是否马上更新(例如,修复一个在站点上折腾的bug),或者延迟修复。 171 | 172 | 检查是否有任何安全补丁或更新,单击模块和主题项目旁边的状态链接报告上的 out of date 链接。 out of date 报告列出你安装在站点上有更新的模块和主题。是你决定下载并安装模块更新之前,在 Drupal.org 访问每个有更新的模块的主页,看看有没有人报告模块的新版本有bug,这是个不错的主意。我曾经经历过一个案例,我的一个站安装了新版的模块,引起了网站升级前所没有的的bug。升级前检查一下是个好习惯。 173 | 174 | 要安装一个主题或模块的更新,只需点击“下载更新”。Drupal 将自动下载,安装并启用了更新。见图14-10 175 | 176 | ![图14-10 可用的模块和主题更新](../images/pic-14-10.png) 177 | 178 | **图14-10. 可用的模块和主题更新** 179 | 180 | 在 Drupal 核心被更新的情况下,这个过程是稍微复杂一些。要更新 Drupal 核心: 181 | 182 | 1. 确保你已经备份数据库! 183 | 2. 确保备份整个 Drupal 的目录! 184 | 3. 使用 Drush ,运行以下命令:`drush up drupal` 185 | 4. 测试您的网站。 186 | 187 | 更新 Drupal 核心的另一种方法是,先备份 modules,profile,sites 和 theme 目录和 .htaccess、web.config 文件在您的网站的根目录下,一旦确保拷贝这些目录,下载 Drupal 核心,并提取存档文件到您的网站的根目录。提取过程是:把Drupal放在一个你下载的带版本名字的子目录里(例如,Drupal-8.0.0-beta7),把子目录里的文件都移动到网站根目录。如果在 Linux/OS X,使用以下命令: 188 | 189 | ```bash 190 | mv * ../ 191 | ``` 192 | 193 | ```bash 194 | mv .* ../ 195 | ``` 196 | 197 | 如果是在其他的操作系统上,使用能用的工具,移动文件和目录。 198 | 199 | 一旦你移动 Drupal 到位,继续移动备份文件和目录,移动到站点根目录下各自的位置。 200 | 201 | ##审批用户帐户的请求 202 | 203 | Drupal 让你,一个站点管理员,确定如何在您的网站创建用户账户。您可以 204 | 205 | - 允许站点访问者创建自己的账户并且不需要站点管理员批准。 206 | - 允许站点访问者创建一个账户,但是需要站点管理员批准后才能使用这个账户。 207 | - 限制为只有站点管理员可以创建账户。 208 | 209 | 选哪种方法,完全取决于你是否允许游客有自己的帐户。如果你的网站上不提供这种互动功能,就没有理由让游客创建自己的账户。如果你给认证用户提供有限的权限(例如,如果你不让通用“认证账户”有任何管理权限功能)同时你不想被求账号的打搅,那么最好让访客未经批准就可以创建帐户。如果你想控制谁可以拥有账户,那么你将要配置您的网站,访问者可以注册一个帐户,访客可以注册账户,但是在他们的账户激活前需要你通过他们的请求。 210 | 211 | 要设置您的网站如何处理用户帐户,单击顶部菜单的“配置”链接,展开你的站点的主配置页面。在这个页面,你会看到一个选项类别 “PEOPLE” 。在这一类别中,你会看到一个“账户设置”链接。点击链接,显示帐户设置页面,如图4-11所示。 212 | 213 | ![图14-11 账户设置页面](../images/pic-14-11.png) 214 | 215 | **图14-11. 账户设置页面** 216 | 217 | 在这个页面,你会发现一个区块标题叫 Registration and Cancellation。在图14-11中,选项设置成游客在这里可以注册一个用户帐户,但需要管理员的批准。 218 | 219 | 要查看此功能的工作原理,请点击页面右上角的角落的“退出”,这将以匿名用户身份返回您的站点的主页(没有登录到该网站) 220 | 221 | 在左列中,登录表单下,有一个链接“创建新帐号”。单击链接看到一个新的用户可以申请一个新的帐户的表单。 222 | 223 | 游客需要提供用户名和一个有效的电子邮件地址创建一个新帐户。一旦这些参数被输入且访问者点击“创建新帐号” ,Drupal重新在你的站点主页提示消息,他们的账号正在等待站点管理员审核。 224 | 225 | 您作为网站管理员,现在必须激活他们的帐户。要做到这一点,点击页面顶部的 People 链接查看你的站点上的用户列表。见图 14-12 226 | 227 | ![ 图14-12 新用户列为阻止](../images/pic-14-12.png) 228 | 229 | **图14-12. 新用户列为阻止** 230 | 231 | 在图14-12中,可以看到一个名叫 托德•汤姆林森 的账户刚刚创建,而且用户的状态被设置为阻止,这意味着用户被阻止登录到网站。 232 | 如果你的网站有几个用户帐户,您可能需要过滤列表,只看被阻止用户和需要激活用户。为了过滤列表,单击字段状态选择列表下方的 filter 按钮,选择 blocked。 233 | 234 | 下一步,点击 filter 按钮,限制只有那些被阻止和需要被激活的用户的列表显示在页面。点击每个您要激活的用户旁边的复选框,并确保更新选项选择列表设置为 解除被选择用户的阻止 点击 update 按钮。 235 | 一旦更新完成了, 状态栏现在显示我们的新用户 托德•汤姆林森 是激活状态。见图14-13。 236 | 237 | ![ 图14-13 所有用户设置为激活](../images/pic-14-13.png) 238 | 239 | **图14-13. 所有用户设置为激活** 240 | 241 | ##总结 242 | 243 | 在这一章中,我介绍 Drupal 网站的基础管理。我解释了与运行您的新网站相关的关键的管理任务。 244 | 245 | 依赖于你的站点的复杂性和你部署的特性,这里可能会有另一个针对这些附加功能的管理任务。这个列表会获取你开始的路径,以确保你的网站是有备份,无错误,最新的。欲知其他的 Drupal 管理话题, 访问 Drupal.org 网站。 246 | 247 | 哇,在这点我们已经介绍了大量的信息。现在,你有建立从简单到复杂的网站的必要知识,你现在知道如何管理你的新网站。下一章概述 drush 工具。 248 | 249 | -------------------------------------------------------------------------------- /chapters/chapter-11.md: -------------------------------------------------------------------------------- 1 | #第11章 Drupal模块# 2 | 3 | 译者:勇敢的心(鑫) 4 | 5 | 就现在的Drupal而言,它已经很惊人了。Drupal 8核心所提供的特性和功能往往超过使用Drupal建站的人员的需求。但有些时候你可能需要Drupal核心本身没有的功能。在这种情况下,为了达到预期——完成任何你想在基于Drupal的网站上实现的事情,你不妨看看那些数以千计的贡献模块。 6 | 7 | 在本章中,您将学习如何查找,安装,启用和配置贡献模块。 8 | 9 | ##查找贡献模块## 10 | 11 | 一个贡献模块本质是一个或一组用来扩展 Drupal core 功能的程序。贡献模块由成千上万积极参与Drupal社区的开发者们免费设计、开发、提供。模块可以从 Drupal.org 下载,并通过模块管理页面启用。接下来我将详细介绍添加模块的过程。 12 | 13 | 一个贡献模块可以很简单,比如只是提供一种机制来自动创建文章的标题;也可以很复杂,比如一个具备产品管理、库存管理、订单管理、发货管理、信用卡处理、客户管理和退货管理等完备功能的电子商务店面。贡献模块数量巨大,形态大小各异,并且涵盖了各种各样的话题。为了找到贡献模块,请访问 www.drupal.org/project/project_module ,并通过“模块类别(Module categories)”下拉列表中浏览模块的种类。示例类别包括以下内容(类别名称后括号中的数字代表写作的时候该类别下可用模块的数目): 14 | 15 | * 管理(1,410) 16 | 17 | * 商业/广告(653) 18 | 19 | * 社区(687) 20 | 21 | * 内容(2,370) 22 | 23 | * 电子商务(1109) 24 | 25 | * 导入/导出(496) 26 | 27 | * 移动端(176) 28 | 29 | * 多语言(244) 30 | 31 | * 性能和可伸缩性(379) 32 | 33 | * 用户管理(540) 34 | 35 | * 第三方集成(2302) 36 | 37 | * 应用程序(2393) 38 | 39 | 译者注:类别名称的翻译供参考 40 | 41 | 正如你从这些例子中看到的那样,有数以千计跨越多种类别的模块。这里所列的类别的常规标题不利于展现隐藏其后的可用模块的丰富功能。通过扫描数百个模块来找到你需要的那个模块往往需要研究和耐心。复杂的要求,可能还需要多个模块一起来解决一个更大的问题。了解哪些模块做什么,哪些模块配合起来使用很好,哪些模块不能一起使用等常常是构建一个复杂的Drupal网站最大的挑战。 42 | 43 | 这里给出的一个建议是访问 www.drupal.org/project/project_module ,在“排序方式(Sort by)”一栏中选择“最新发布(Last release)”排序选项,然后单击搜索(Search)按钮。出现的列表将显示最新的已经向社会发布的模块和模块更新。每隔一两天访问一次该网站,并通读网站上最新添加的或更新的模块的说明。每天只需要几分钟的时间,你就能快速了解那些模块以及通过 Drupal 提供的模块实现的方案的类型。 44 | 第三方网站 http://drupalmodules.com ,能很好地帮助我们找到合适的模块。该网站提供了模块查找功能,使得为特定工作找到合适的模块变得更容易。 45 | 46 | ##下载并安装一个模块## 47 | 48 | 为你的站点安装一个新的模块有三个基本途径:下载模块文件到你的服务器、使用模块管理界面上的“安装新的模块(Install new module)”功能或使用Drush。我将在本章介绍前两种方法,并在第15章介绍如何使用Drush。 49 | 安装模块的第一步是找到合适的模块。正如前面所述,有成千上万的模块可供挑选;找到合适的模块往往是最大的挑战。为了便于演示,我们选择两个最流行、最有用的模块: Google Analytics module 和 Display Suite module 。首先,我们将通过下载文件到服务器来下载 Google Analytics module ,然后我们将使用这一节的方法通过“安装新模块”功能来下载 Display Suite module 。 50 | 51 | ####下载模块文件到您的服务器#### 52 | 我将通过下载模块文件到我的 Drupal 8 网站的模块目录来演示如何安装 Google Analytics module 。步骤如下: 53 | 54 | 1. 访问 Drupal.org/project/modules 找到该模块。您可以使用搜索功能或模块页面上的过滤器来查找一个模块,但是要知道Drupal.org对模块的网址(URL)的标准命名法是以模块的名称作为URL的最后元素。快速搜索谷歌分析模块:访问 www.drupal.org/project/google_analytics 。 55 | 56 | 2. 向下滚动到该模块的下载部分。在大多数情况下,你应该选中要安装模块的最新版本。最新版本以绿色背景高亮显示。在某些情况下,你可能需要使用一个仍处于开发阶段的模块,如果一个稳定的版本尚未公布。开发版本通常以红色背景高亮显示,并且具有以-dev结尾的版本号。您应该谨慎使用预(DEV)版本的模块,因为这些模块都尚未完全开发,并没有被彻底地测试。要下载一个模块,右键单击 tar.gz 链接(下载 Drupal8 的版本),然后单击你的浏览器提供的弹出菜单中的保存(Save)选项。如果你的 Drupal 8 安装在本地计算机上,你可以在你的安装 Drupal 的模块目录中直接保存tar.gz文件。如果你的Drupal没有安装在本地计算机上,使用 FTP 将文件复制到模块目录服务器上。模块目录位于在你建立的网站根目录Drupal 8 中。 57 | 58 | 3. 解压文件。解压该文件时,取决于你的操作系统,你可以在文件浏览器中找到该文件,并双击;也可以在命令行解压缩文件,比如使用gunzip一类的工具来解压GZ文件或tar一类的工具来解压tar文件。随着你解压后的文件加入到模块目录,你就可以在模块文件夹中看到一个以google_analytics命名的文件夹。此时,您就可以启用该模块了。 59 | 60 | 4. 要启用模块,点击页面顶部的管理菜单中的“Manage”链接,然后点击二级菜单中的“Extend”链接。点击“Extend”链接将带您到模块管理页面,在那里您可以搜索到该模块。向下滚动页面,你应该将看到以“Statistics”命名的部分,其中应包括 Google Analytics module 。勾选模块旁边的复选框,然后单击页面底部的“保存配置(Save configuration)”按钮。 61 | 62 | 看!谷歌分析模块现已启用,并能够在网站上使用了。您可以按照相同的过程来安装任何你想添加到你的站点上的贡献模块。 63 | 64 | ####使用安装新模块功能#### 65 | 66 | 安装新模块的第二种方法是使用模块管理页面上的安装功能。此功能提供了一种只输入安装文件的URL,并点击一个按钮来下载安装模块的能力。这种方法需要你有可以访问您的服务器的FTP,一个有效的FTP用户帐户,并且模块目录设置了适当的权限,允许FTP用户写入。 Drupal 将自动下载模块的安装文件,解压安装文件,将文件移动到正确的目录,并安装模块。要访问模块页面(在里面你可以下载并安装新的Drupal模块),只需点击顶部菜单的“Manage”链接,然后点击二级菜单中的“Extend”链接。 Drupal将显示模块管理页面,该页面显示了所有作为 Drupal core 组成部分的模块(见图11-1)包括我们刚才安装启用的 Google Analytics module 。 67 | 68 | 从模块管理页面开始,步骤如下: 69 | 70 | ![图11-1 Drupal模块](../images/pic-11-1.png) 71 | 72 | 图11-1 Drupal模块 73 | 74 | 1. 要开始安装过程,请点击网页顶部附近的“安装新模块(Install new module)”按钮,然后将弹出安装模块的页面,见图11-2。 75 | 76 | ![图11-2 该模块安装页面](../images/pic-11-2.png) 77 | 78 | 图11-2 该模块安装页面 79 | 80 | 81 | 2. 在安装模块的页面上,也提供了模块的安装文件的URL(来自Drupal.org),或在您下载该模块到您的计算机的情况下,使用“上传一个模块或主题(Upload a module or theme)”功能来从你的电脑把该文件上传到服务器。为了简化这个过程,我们将使用第一个文本框来指定我们将要安装的 Display Suite module 的URL。要找到 Display Suite module 的网址,请访问 www.drupal.org/project/ project_module ,在“Core compatibility” 选择列表中选择“8.x”,并在搜索模块文本框(Search Modules)中输入“Display Suite”。单击搜索(Search)按钮。在搜索结果中,向下滚动,直到你在列表中看到 Display Suite module ,点击标题将显示该模块的主页。你应该是 www.drupal.org/project/ds 的页面,其中ds是模块开发人员使用的 Display Suite 的缩写。 82 | 83 | 3. 向下滚动到Display Suite 主页的下载部分,在那里你会找到模块的当前版本的列表(见图11-3)。在我们的例子中,我们想要该模块的Drupal 8版本,所以找到可用版本列表中该模块的8.x版本。 84 | 85 | ![图11-3 可用版本的显示模块套件](../images/pic-11-3.png) 86 | 87 | 图11-3 Display Suite 的可用版本 88 | 89 | 90 | 4. 要捕获安装文件的URL,右键单击您要安装的版本的下载链接,然后从浏览器的选项菜单中选择相应的复制链接位置(copy link location)选项。返回到模块管理页面,将URL粘贴在上面的文本框中,您现在就可以安装该模块了。 91 | 5. 要开始安装过程,点击安装按钮。 Drupal将自动从Drupal.org下载安装文件,解压压缩文件,并将所有文件以及模块相关的目录移到你的服务器的相关目录中,然后运行与模块相关的安装脚本。 92 | 6. 模块现在已安装但尚未启用。要启用该模块,必须选中模块管理页面上相应的复选框(见图11-4),并点击页面底部的“保存配置(Save configuration)”按钮。对于 Display Suite 模块,你至少需要启用 Display Suite 和 Display Suite UI 模块。 93 | 94 | ![图11-4 模块管理页面](../images/pic-11-4.png) 95 | 96 | 图11-4 模块管理页面 97 | 98 | 此时Display Suite module已安装启用完毕,可以使用了。现在,您可以按照相同的步骤来为你的网站安装任何你想要的贡献模块。 99 | 100 | 101 | ##配置模块和设置权限## 102 | 103 | 一些,虽然不是全部,模块提供一定程度的定制和配置。在许多情况下,只需要设置权限规定谁可以使用这些模块。 104 | 要设置模块的权限,单击页面顶部的管理(Manage)链接,然后点击二级菜单中的人员(People)链接。在人员管理页面,点击权限(Permissions)标签可以查看网站上设置的所有权限。 105 | 106 | 我们在前面的步骤中安装了 Google Analytics module ,还需要设置权限,以便管理员可以管理 Google Analytics module 的配置参数。向下滚动权限列表,直到找到该模块(见图11-5)。 107 | 108 | ![图11-5。权限谷歌分析模块](../images/pic-11-5.png) 109 | 110 | 图11-5 Google Analytics module 的设置 111 | 112 | 要为该模块设置权限,勾选管理员一栏中 Google Analytics 管理员对应的复选框,然后单击页面底部的“保存权限 (Save permissions) ”按钮。现在,你已经能够为网站的管理员设置 Google Analytics module 的配置参数了。当你安装启用其他模块时,记住审查并设置该模块的权限。 113 | 114 | 一些模块可以设置配置参数,如 Search module (Drupal core 的一部分)。要查看模块的配置参数,请点击页面顶部管理菜单中的管理(Manage)链接,然后点击二级菜单中的配置(Configuration)链接。配置页面列出了所有能够设置配置选项的模块(见图11-6)。不是所有的模块遵循这个惯例。如果您没有看到你正在处理的模块的配置链接,查看 Drupal.org 上该模块主页里相应的文档,或者检查您的站点中模块目录中对应的 readme.txt 文件。 115 | 116 | ![图11-6模块的配置页面](../images/pic-11-6.png) 117 | 118 | 图11-6 模块配置页面 119 | 120 | 当查看模块配置页面时(见图11-6),你会看到一个搜索和元数据部分,在这部分,有一个搜索设置的链接。点击该链接以查看搜索的配置参数(见图11-7)。 121 | 122 | ![图11-7 搜索的配置选项](../images/pic-11-7.png) 123 | 124 | 图11-7 搜索的配置选项 125 | 126 | 不是所有的模块提供设置配置参数的能力;它依赖于模块做什么,以及模块开发者确定这些配置选项是否必要。你最好访问一下设置页面,检查所有已安装并启用的模块的配置选项,以确保它们被正确地设置。 127 | ##启用其他模块## 128 | 129 | 你可以“继承”一个现有的Drupal站点,或者您可能希望启用已在网站上存在的其他模块(例如,某些模块是 Drupal core 的一部分,但没有在 Drupal 的安装过程中自动启用)。要查看您的网站可用模块的列表,只需点击页面顶部的管理链接,随后点击二级菜单中的扩展链接。这样做将打开图11-8所示的模块管理页面。 130 | 131 | ![图11-8 模块管理页面](../images/pic-11-8.png) 132 | 133 | 图11-8 模块管理页面 134 | 135 | Drupal的模块管理页面被分为几个部分,每个部分包含一个或一组模块。被作为 Drupal core 的一部分的模块,在列表中的核心(Core)部分。为了演示,我们将启用一个默认情况下不在 Drupal 的安装过程中启用的模块—— Aggregator module 。正如图11-8所示, Aggregator module 不被选为启用(模块名称左侧的复选框指示模块启用与否)。要启用模块,立即选中模块名称左侧的复选框,并滚动到页面的底部,点击“Save configuration(保存配置)”按钮来启用该模块,以便它可以在你的新网站中使用。 136 | 点击“Save configuration(保存配置)”按钮后,Drupal将重新显示模块管理页面,同时在页面顶部显示“successful configuration(配置成功)”消息。 Aggregator module 现在可以使用了。 137 | ##升级模块## 138 | 139 | Drupal 模块的升级往往是修复了漏洞和附加新的功能。幸运的是,当一个模块的新版本已经发布,Drupal 会告诉你,并提供了自动更新该模块到最新版本的机制。要查看所有可用的更新,只需点击模块管理页面顶部的更新选项卡(见图11-8),或点击管理下的二级菜单中的报告链接,然后单击“Available updates(可用更新)”链接(见图11-9)。 140 | 141 | ![图11-9 报告页面](../images/pic-11-9.png) 142 | 143 | 图11-9 报告页面 144 | 145 | *** 146 | 注意:可能有些情况下你不想升级模块;例如,升级一个模块将会中断另一个相关模块。我建议你在进行更新之前,查看 Drupal.org 的论坛,看是否有人已经报告了问题。 147 | *** 148 | ##卸载模块## 149 | 150 | 可能有这些情况:你在安装了一个模块后却发现它不是你想要的那样,或者它会给你的网站带来问题。在模块管理页面的顶部,你会发现“Uninstall(卸载)”选项卡。单击该选项卡将会显示具有自动卸载能力的模块的列表(见图11-10)。要卸载模块,选中模块旁边的复选框,点击页面底部的“卸载”按钮。 151 | 152 | ![图 11-10模块卸载页面](../images/pic-11-10.png) 153 | 154 | 图 11-10模块卸载页面 155 | 156 | *** 157 | 注意:并非所有模块都有自动执行卸载的能力。这种功能是由模块开发人员创建的。并不是所有模块开发人员都很友善地提供此功能。 158 | *** 159 | 在其中一个模块不提供自动卸载功能的情况下,删除该模块的过程是 160 | 1. 导航到您的服务器上的模块目录。 161 | 2. 选中包含该模块的文件夹,删除该文件夹。 162 | 卸载模块时,您应使用注意事项,因为模块之间经常存在依存关系,这意味着一个模块的正常运行依赖于另一个模块。如果您不能确定模块是否具有依存关系,访问 Drupal.org 上该模块的页面并查看模块的描述。有依存关系的模块将在描述的正文中列出这些依存项。或者,检查你的服务器上该模块的 info.yml 文件。里面列出该模块的依赖项 。 Views 模块的 info.yml 文件 如下所示: 163 | >name: Views 164 | >type: module 165 | >description: 'Create customized lists and queries from your database.' 166 | >package: Core 167 | >\# version: VERSION 168 | >\# core: 8.x 169 | >dependencies: 170 | >\- filter 171 | 172 | ##11 个顶级模块## 173 | 174 | 有几个模块,似乎每个人的"收藏夹"列表中都有。对于我们这些Drupal工作者,这些模块代表我们的标准"工具腰带",我们在几乎每个 Drupal 的项目中使用。本节对它们每一个做简要概述。如前所述,请每天花几分钟,访问 www.drupal.org/project/project_module ,浏览这些网页是免费的 ! 175 | 176 | 177 | ###Views 178 | 179 | 当你询问有经验的 Drupal 开发者他们最喜欢的模块是什么,Views将是他想到的第一个或第二个答案。当你在网站上选择或呈现内容时, Views module 就像一把瑞士军刀一样好用。您可能使用 Views 的一个例子是,当你创建了50条内容,每个项目描述一个过去发生的新闻事件。你可能需要列出这50项,并且是按照每个故事的发布日期排序。 Views 可以帮你完成。此外,您可能希望新闻文章的列表像一个Excel电子表格一样以表格形式列出。 Views 可以帮你完成。您可能还需要为游客提供一个新闻文章以表格形式列出的页面,并且表格为游客提供通过单击文章表格视图的标题之一对文章进行分类的功能。 Views 可以帮你完成。您也可以提供一个过滤机制,使游客能够选择一个与您的所有新闻故事相关联的主题、人员或地点,就能只看到那些满足搜索条件的文章。 Views 可以帮你完成。您可能还需要为那些使用了 feed aggregators 的游客提供新闻文章的RSS提要。 Views可以帮你完成。 Views 是一个极其易于使用且非常强大的模块,几乎每个人都必须拥有。而好消息是,它是 Drupal 8 core的一部分。第9章将详细介绍如何使用 Views 。 180 | 181 | ###Layout 182 | 183 | 流行度紧随其后的是 Layout 。在第八章中当我们在网站上放置块时,你看到我们只限于把块放入我们正在使用的 Bartik 主题定义的区域。但是,如果我们想要把内容区域划成行和列以便我们能够创建包含很多元素的登陆页面呢? Layout 就派上用场了。对于高级的页面布局,没有一个工具比 Layout module 更容易使用、功能更强大。第10章将介绍如何使用 Layouts。 184 | 185 | ###Rules 186 | 187 | Rules 模块允许管理员有条件地定义基于事件的执行操作。例如,如果您想在每一个评论发布到网站时自动给网站管理员发送一封邮件来请求管理员的审查和批准,您可以使用 Rules 来配置该行动。 188 | 189 | ###Display Suite 190 | 191 | Display Suite 给你一个拖和拖放界面,这允许你完全控制你的内容的显示形式。你可以按照你想要的方式来安排你的节点,视图,评论和用户数据,而无需浏览几十个模板文件。 192 | 193 | ###Nicemenus 194 | 195 | Drupal 现成的菜单功能提供一种易于使用的创建水平和垂直菜单的机制,这些菜单被限制为单一层次。在很多情况下,你会希望具备创建下拉菜单(适用于水平菜单)或滑动菜单(适用于垂直菜单)的能力。 Drupal的菜单系统提供了以分层方式分配菜单项的能力;但是,它需要我们 Drupal 开发者格式化菜单,才能保证当用户将鼠标悬停在一个菜单项时有下拉菜单或滑动菜单出现。幸运的是,我们拥有能够自动呈现下拉或滑动菜单的 Nicemenus 模块。 196 | ###Pathauto 197 | 成功优化搜索引擎的关键要素之一是提供您的网站上有意义的 URL 。默认情况下, Drupal 8 现成的URL看起来像 http://localhost/node/1 。搜索引擎不知道“node/1”的意思,也也不知道与该页面相关联的内容是关于什么的,只是“看一眼”URL 。网站的访客也可能很难导航到那些未通过菜单链接或访问的页面,例如 http://localhost/node/2487 ,就不是很直观。幸运的是,我们有 Pathauto 模块,它可以为正在创建的结点创建一个“别名URL”。网址别名采用节点名字的形式,同时带有用来分隔单词的连字符,并且所有的字都换成小写。以 http://localhost/node/2487 为例,如果该节点的标题为“Special deals of the month”,由Pathauto产生的 URL 应该是: http://localhost/specialdeals-month ( Pathauto 生成URL时,会除去像“the”和“of”这样的常用词)。别名网址将成为呈现页面时 Drupal 使用的主要路径,是相比于 http://localhost/node/2487 对用户和搜索引擎更友好的版本。 198 | 199 | ###Webform 200 | Webform 模块提供了一个简单易用的创建在线表单的界面。您可以使用在线表单来捕捉网站访问者填入表格的信息,而且几乎可以是你能想到的任何类型的信息。表格可能是求职申请表,信息申请表,甚至是一个事件登记表。你用 Webform 来创建表格时,表格的类型几乎没有任何限制。这个模块提供了一种创建和输出表单的扩展能力。那就是给预先确定的人发送电子邮件,邮件包含了某人在表单中输入信息的内容。提供了两种工具,一个是可以生成关于捕获表单信息的报告,另一个可以将输入表格的信息导入到一个 Excel 表格里。 201 | 202 | ###Backup and Migrate 203 | 204 | Backup and Migrate 模块能在你定义的固定时间点(每12小时、每24小时等等)自动备份你的 Drupal 数据库中的信息。 Backup and Migrate 也提供了只需点击一个按钮即可(实时)手动备份数据库的功能。您也可以通过选择以前的备份并单击还原按钮来还原备份。许多Drupal的管理员在晚上睡得很安稳,因为他们知道他们的网站正在被自动备份。 205 | 206 | ###Date 207 | 208 | Date模块提供了一套工具,用于创建和使用网站上的日期,如选择日期时弹出的日历。 209 | 210 | ###Library 211 | 212 | Library 模块具有用于与外部库集成的其他所有模块的共同特性。尽管 Library 这个词的任何延伸义都不够吸引人,但如果你使用了调用外部库(比如外部JavaScript库)的模块, Library 将是那些必须具备的模块之一。 213 | 214 | 215 | ###Drupal Commerce 216 | 217 | 如果你的网站有电子商务的任何元素(如销售衬衫之类的实物物品或出售订阅之类的虚拟物品),则有两种主要选择: Ubercart (Drupal 中电子商务模块的鼻祖)或者 Drupal Commerce 。这两种解决方案都提供世界一流的电子商务能力,事实上他们也是在 Drupal 站点上开展电子商务的标准。 218 | 219 | ##总结 220 | 221 | 在这一章中,你学会了如何通过使用贡献模块来显著增强你的 Drupal站点的功能。从字面上讲有数以千计的免费模块可供选择,这意味着如果你想在您的 Drupal 站点上做一些事情,存在一个模块提供你需要的功能是很有可能的。接下来我们将学习模块是如何构成的。 222 | 223 | -------------------------------------------------------------------------------- /chapters/chapter-09.md: -------------------------------------------------------------------------------- 1 | # 第9章 视图 2 | 3 | 翻译:peter 4 | 5 | 6 | ## 视图 7 | 8 | 如果你问使用过Drupal一段时间的人,什么是杀手锏模块。这个答案很可能是视图,面板,或者自定义内容类型。在这个列表中,视图通常是最先提到的。很多用户说不能没有视图模块。视图模块有什么特别的地方昵?简单的说,视图为你提供了一个易于选择和操作的界面,用于显示在你网站的内容列表。 9 | 10 | 你可能使用的视图示例 11 | 12 | * 在你的网站显示最新发布的文章,通过时间进行升降排序。 13 | * 在一张表中列出许多公司的地理位置,通过点击公司地理位置,城市,州和国家的标题进行排序 14 | * 显示图片库 15 | * 显示幻灯片 16 | * 显示日历 17 | * 显示博客文章列表,并通过主题进行筛选 18 | * 创建一个RSS feed,呈现你的网站最新发布的最新内容 19 | * 显示你能想到的任何类型的的列表,创建表单和内容并储存在你的网站中,像列表,RSS feed,在第五章中,我们创建事件内容类型。让我们创建一些时间列表,并把它放在工作中。将对访问者使用视图模块是有帮助的。如果你没有完成第五章的。现在是一个极好的时间回到第五章。通过实例来工作。以便于有所需的内容来支持你将来的活动。 20 | 21 | ## 视图模块 22 | 23 | 视图模块在Drupal8中是核心模块,默认情况下已安装并开启。 24 | 为了验证视图模块已经安装并开启,点击页面上的管理链接中扩展选项中的子菜单。在扩展页面搜索功能。输入视图进行搜索。如果这个视图模块存在,你应该看到2个模块列表 如图 9-1 所示。如果复选框没有被勾选。请勾选并点击"保存配置"按钮。 25 | 26 | ![view](../images/pic-9-1.png) 27 | 28 | 图9-1 验证查看已安装并启用 29 | 30 | 这个视图模块是幕后组件。用来从处理数据库中的读取的内容,并显示出来。这个视图UI模块,UI在这代表用户界面。是管理员创建和配置形成视图界面。我们将在本章其余的部分来讲解视图UI。 31 | 32 | ## 创建一个视图 33 | 34 | 随着视图的安装并开启。我们已经准备好了。但是一个视图没有内容,那么,它仅仅是一个空白页。所有第一步创建一些内容。在本章我们已经有几篇先前创建好的文章。所有让我们使用这些作为我们首次涉足的观点。如果你跳过前面的练习或者已经删除那些你创建的文章。然后在花一点时间创建几篇。 35 | 36 | 我们现在已经创建一个文章列表的视图。点击页面上的管理链接,再点击二级菜单结构链接中的视图链接。它将跳转到视图管理界面。你将在页面上看到几个已有的视图。这些视图是Drupal的核心组成部分,提供最新的内容列表,最近的评论,新用户,谁在线,以及其他的信息。如果你通过第八章的学习,你会认识到这些视图。像这些视图,我们会在这一章节使用几个区块来展示。 37 | 38 | 要添加一个视图,在页面上点击“添加新的视图”按钮。在这页它展示了一个新的视图(参见图9-2)。定义如下: 39 | 40 | * 视图名称:这个名称必须是唯一的(尚未在网站中另一个视图中使用)。选择一个描述名称是一个好主意,让其他人看到这个列表描述可以更轻松正确的使用描述名称。对于第一种视图,用最近的文章最为名称。 41 | * 说明:这又是一个字段,你可以使用它来提供更多视图信息。勾选旁边的描述复选框,然后输入“网站上发布的的最新文章列表”。 42 | * 查看设置:这组字段定义将由什么类型的内容来呈现视图。如果你点击展示列表,你将看到不同的选项,例如内容,日志,文件,评论,内容修改版本,分类(术语),和用户。我门的观点聚焦在文章类容。在标记字段限制我们的提供的视图仅仅包含这些条款。我们将跳过标签字段到排序选项。选择未分类(我将在后面来整理这个例子)。 43 | 44 | ## 创建你的第一个视图 45 | 46 | * 页面设置:视图提供创建内容的列表功能,在你的网站上通过一个URL访问一个单独的列表页面的的功能。出于演示,勾选"创建一个页面"复选框。你必须填写页面标题(或者保留默认值)和输入链接到列表中的URL路径(或保留默认值)。在显示的格式中,类似于没有格式化列表中的摘要,设置项目呈现10条数量。点击分页,它将呈现文章列表。如果 在文章列表超过10篇文章,一个分页器将出现在文章列表底部,以便于浏览者查看所有的文章,每页仅显示10篇文章。 47 | * 区块设置:虽然我们学习了区块在第八章。但是出于学习的目的。我们将允许我们的视图创建一区块(放在一个页面的任何地方)。显示该区块最新的三个事件。点击"创建一个区块"框,输入区块标题名称(或保持默认值),将保留格式保留为格式化标题列表名称(链接)。将项目组第三个“使用这个”复选框选中。 48 | 49 | ![view](../images/pic-9-2.png) 50 | 51 | 图9-2 创建新视图 52 | 53 | 点击“保存并修改”按钮。会跳转到下一个配置视图页面。如图9-3所示。 54 | 55 | 56 | ![view](../images/pic-9-3.png) 57 | 58 | 图9-3 视图编辑页面 59 | 60 | 乍一看,定义一个视图的形式看起来很复杂,幸运的事,这是表面的假象。 61 | 62 | 首先你将会看到视图配置上的一个列表,在我们的例子里,我们有一个页面和一个区块。视图的强大功能之一是一个单一的视图可以呈现多个显示的功能。我们可能会使用的最近的文章类型作为例子,它包括: 63 | 64 | * 在网站上显示所有文章,并显示每一篇发布的文章详情。 65 | * 一个区块列出最近5篇文章,每一篇文章只显示的标题 66 | * 另一个区块显示最近5篇文章,每一篇文章显示的标题和内容简介 67 | * 还有一个区块显示最近10篇文章,显示文章的标题,发布日期,编写作者和内容简介。 68 | 69 | 这是一个简单的视图用于创建几种不同内容类型,每个类型在文章中都呈现不同的格式。 70 | 71 | 我们将开始定义2个显示区,页面和区块。当我们第一次选择配置视图(参见图9-2),它们将通过视图自动被创建。通过前两个步骤的工作,我们将添加到显示列表。 72 | 73 | ##页面显示 74 | 75 | 首先让我们定义这个页面显示。点击页面显示配置下面的页面按钮,在页面之上我们将完成文章的标题,内容,作者,发布状态和时间及日期。让我们从上到下,从左到右配置我们需要的页面显示参数。 76 | 77 | 1. 从修改页面显示的名称到更多的描述,像"所有文章页面",到改变这个值,点击"页面"右侧的页面名称。并在弹出框中的管理描述字段输入新的值。接着点击应用按钮。我们将看到这个新的值.呈现在视图编辑区域并左侧栏位"显示名称字段"视图名字字段的左侧栏。 78 | 2. 在这个区域,改变视图的的标题,这个值会在视图顶部直接输出。然而让我们改变"所有文章"。点击"最近的文章",从列表中选中"此页面(覆盖)",这个意味着我们改变的这个值仅仅应用这个特别的视图显示。如果你设置成"显示所有",每一个视图都将显示这个新的标题。因为不同的目的,我们会有不同的显示。"所有文章"在选择标题后,对其他显示器是不友好的。 79 | 3. 在格式区域。我们可以使用有不同的输出生成一个列表。点击"格式化的列表"会看到一个输出格式列表选项: 80 | 81 | * 网格(表格):输出显示行和列。在我们的例子中,每一篇文章将填充一行网格(表格)。对于图片库显示图片这是一个好的选择。 82 | * HTML列表:输出一个有序或者无序列表。在我们的例子中,每一篇文章将会显示在列表中封闭的"__ol__ __li__" 或者 "__ul__" 标签内。如果没有类似的HTML标签,如果你不熟悉HTML标签,在查看这个伟大的教程或者拿起一本伟大HTML开发入门书籍在。 83 | * 表:作为一个HTML输出显示。每一个字段显示一列。当你想提供一列的值来排序输出表,这是一个好的表。 84 | * 没有格式化式化的列表:作为一个列表显示,但是不像HTML列表,这儿没有 __ul__ , __ol__ 或者 __li__ 标签。在我们的页面例子中,我们设置无序列表。当改变这个值除了"没有格式化列表",记住在这个列表中选中"此页(覆盖)".如果你点击设置右侧的"没有格式化的列表",你将看到这个配置所有的有效的类型选项。每一个参数都有自己的选项供你设置。 85 | 4. 在格式部分,我们定义了参数要如何处理我们想要展示的内容。内容和字段时最常用的内容选项。 86 | * 内容:显示当前正在选择的完整实体。在这些文章案例中,这个完成的文章将被展示出来。 87 | * 字段:使你显示特别的字段的实体进行渲染。在我们的例子中,我们正在选择和现实的文章。我们可以有一个我们想要展示的文章标题和发布日期视图。使用字段选项,我们可以展示特别的字段,以及这些字段在页面的显示顺序。在我们的页面例子中。我们将选择内容展示。像摘要,一个文章截取版本,显示600字符集。当我们在摘要模式定义了我们要设置的页面显示内容。所有展示我们已经设定的值。如果我们想要通过这个视图来渲染这个实体文章。我们点击这个摘要文字,在视图模式列表中默认为"默认值"中选择。对于我们示范的目的,在显示模式中设置摘要显示。 88 | 5. 在我们的例子中,这个字段配置参数没有被显示,因为我们将显示整个文章。在本章的后面,我们创建显示区块,我们将覆盖这些字段。 89 | 6. 过滤标准在下一个配置区域。你可以通过添加视图显示的过滤标准,来渲染这个内容显示。当我们创建这个视图(参见图9-2)时,在第一个配置屏幕上,我们选中这个视图,并设置仅显示文章。通过选择文章,我们设置了一个过滤仅仅显示文章内容类型。此外,视图也为发布(未发布)的内容创建过滤条件。在我们的视图中我们会添加别的过滤标准;例如,在文章案例中,我们可能想一个显示视图仅仅展示最近30天发布的文章。我们可以通过添加任何一方面的过滤标准来限制储存在项目中值的输出。出于演示的目的,我们将单独设置过滤标准。当我们创建显示区块时,在本章之后将覆盖添加的的过滤标准。 90 | 7. 这个排序部分提供了特定的内容列表排序。在默认情况下,这个值将通过节点ID(通常在Drupal内容项目中的唯一标示)的顺序排序。你想要设置一个标题排序标准,按照这个列表你想按照字母排序,或者通过最新发布的文章列表的日期排序。让我们在标题中添加一个排序标准。点击排序标签右侧的添加按钮,你将在你的网站上看到你定义的所有字段的一个完整列表,我们想要过滤这个列表名字中的"标题"字段。这样做,进入"标题"来搜索字段和在列表字段中选择"内容:标题",向下滚动,知道你发现"内容:标题",检查该字段的复选框,在本页顶部选择之的改变,然后点击"应用"按钮。在下一个屏幕允许设置这个排序,上升或者下降,也向网站访问者公开这个选项。在这个实例页面中,不检查没有选择的复选框。我们想要按照这个标题排序。点击"应用(显示)"按钮继续。滚动到屏幕底部,你现在应该看到这个页面将如何输出显示。在第二列的配置选项里(参见图9-3),我们将开始为我们的列子定义页面设置。 91 | 8. 每个显示视图作为页面被定义,并且有一个唯一的URl。特别是路径字段中。在我们的例子中,让我们用"/all-articles(全篇)"作为URL。点击"没有路径被设置",在这个"这个菜单路径或网址"表单输入所有文章路径文本字段。点击应用按钮继续。 92 | 9. 菜单字段提供给我的选项来添加我们的视图显示页面到一个菜单。出于演示的目的,我们将添加它到这个"主导航"菜单。点击"无菜单"参数,然后点击"普通菜单"选项。在这个配置页面添加菜单项,输入标题,描述和选择"主导航"菜单作为这个项目菜单。对于你的网站建设,你可能想要作为一个菜单添加到一个视图页面而不是"主导航"菜单.在表单上输入值后点击应用按钮。 93 | 10. 视图提供了限制谁能看到这个输出的显示视图。你可以设置的访问限制 94 | * 无:任何人都能看到输出。 95 | * 权限 : 这个访问者必须是被分配一个有权限角色才能看到输出。 96 | * 作用 : 这个访问者必须被分配特别的角色才能看到这个输出。 97 | 通过定义这个被设置的权限。这个默认权限是访问者要有访问网站视图内容的权限(见图9-3)。在大多数默认值是合适的。在我们的示例页面,我们将把他们设为默认值。仅仅有权限的访问者能看到视图内容输出。 98 | 11. 在头设置,你可以在你的视图顶部添加一些东西。例如,你可以创建一个介绍性的段落,通过内容描述渲染视图,或在你网站上定义一个区块,输出另一个视图,或几个其他元素。点击添加按钮和选择列表中的选项。大多数相同的选项添加到介绍性的段落,这样做,点击"全局:文本区域"选项,在选择列表的顶部选择"这个页面(覆盖)"选项。点击"应用(所有显示)"按钮。在下一个表单中,输入你想要在视图中显示的文本。如果你想在头部文本显示即使在你的视图中没有值,勾选这个"显示视图没有内容"的复选框,然后点击"应用(所有显示)"按钮。 99 | 12. 底部设置,像头部一样,你可以添加一个底部设置输出视图,然后像设置第11步一样添加一个底部视图。 100 | 13. 如果你的视图没有内容。例如,在你网站上没被发布的文章——你可以提醒访问者,在你设置之前提示没有内容存在的消息。创建消息跟创建头信息和底部信息一样。当没有内容时按照步骤11添加一个信息。 101 | 14. 如果你的视图返回一个很长的列表。考虑到在底部视图使用的分页。限制显示的数量在任何给定的时间范围。例如,一个视图可能返回100个内容项,而不是显示所有100个内容作为一个很长的列表。你可以使用分页展示,一次显示10项,分页显示在视图显示内容列表底部,这个分页配置选项也提供特别的数量项(例如,3个最新文章),或列出所有适合的筛选条件列表项。在第三列(参见图9-3),有几个高级配置选项,我们将关注其中2个,要显示的选项,点击高级配置选项。 102 | 15. 上下文配置器时一个功能强大的配置选项,允许你利用网页中传递的值,进行过滤,返回给的视图。例如,我们希望限制返回我们所标记过的特定的分类文章。如果我们的文章内容类型有"事件"分类词汇作为一个字段编辑用于特别的分类文章相关联,我们会使用网站传递的值来过滤文章的显示。通过选择的一个上下文过来"已有的分类项ID",然后为文章设置内容类型,分类词汇和过滤值类型转换成项目名字或项目ID,你现在可以更新这个路径成" __全部文章/%__,这里的"__%__"代表通过网址传递过来的一个值。我们可以认为有一个视图可以通过分类词汇显示任何文章。这个单一的视图可以通过"__/all-articles/drupal__(/所有文章/drupal)"来渲染关于Drupal文章列表。或者通过__/all-articles/dinosaurs__(/所有文章/恐龙),或者是我们的分类词汇的任何一种术语。很神奇吧!为了简单起见,在我们的例子中不使用上下文来过滤。 103 | 16. 在案例中使用关联,你需要从2个不同内容类型来满足特定的视图要求。例如,你有一个类容类型,列出来地址,操作时间和辅助选项。而不是每个事件上键入的信息都在发生在那个地方。 你可以在事件内容类型和地点内容类型之间建立关联,使两个内容类型中存储的信息结合起来,这样可以代替在每个某地的事件中添加信息说明。你已经在你的显示视图中内容类型创建过一次有效的关联字段。因为我们很简单,我们现在设置这个关联。在这一点上,我们准备测试我们的视图。运行程序之前确保你点击了保存按钮。在保存之后,返回到你网站的首页,然后你应该在你的主导航菜单看到所有的文章链接(如果你使用Bartik主题,他应该在屏幕上出现一个标签)。点击所有文章链接(或标签),你将看到你的劳动成果(参见图9-4)。 104 | 105 | ## 区块显示 106 | ![view](../images/pic-9-4.png) 107 | 108 | 图9-4 所有文章查看页面 109 | 110 | ### 区块显示 111 | 112 | 随着文章页面显示我们的所带的区块,现在让我们修改这个区块显示。通过导航到管理 》结构 》视图 返回管视图理页面。查找最近的文章视图,点击操作栏中的编辑链接。你现在应该看到最近的文章视图配置页面(参见图9-3)。 113 | 114 | 在这个过程中的第一步时点击视图列表中的区块按钮。你应该能够直接找到文章页按钮。点击区块按钮显示区块所有配置参数,让我们来更新这个显示,让它仅仅显示最近3篇文章标题并按照发布时间排序,降序以便于最近一篇文章显示在页面顶部。让我们先从更新一些更具描述性的名称开始,接着做一些我们需要的做的来改变区块本身: 115 | 116 | 1. 在第一栏中,"显示名称",点击区块改变"行政名称"字段的值为"最近的文章区块". 117 | 2. 设置标题为最近的文章,因为它仍然适用于所要显示的区块。 118 | 3. 设置格式化为"为未格式化的列表",因为我们仍然想要文章显示为一个列表。 119 | 4. 改变显示选项为字段,因为我们仅仅想在我们列表中显示文章标题。 120 | 5. 在字段区域,设置显示标题选项。如果它没有显示标题。点击添加按钮,在那个区域搜索这个标题,添加到区块显示。 121 | 6. 在过滤标准区域,设置内容发布状态显示已经发布的内容和内容类型设置为文章内容类型。 122 | 7. 在排序标准区域,点击添加按钮,搜索日期。你将看到"内容:发布日期"在列表选项里。检查这个字段旁的复选框,改变这个选项值为"这个区块(覆盖)",在底部点击"应用(显示所有)"。出现在下一个表单上,选择"倒序排序",因为我们想在列表顶部显示最新文章文章,最旧的文章在底部。应用这些改变。 123 | 8. 最后,我们要在第二列最后三个配置选项改变值来限制文章显示数量。检查确保使用"分页"值来设置每页显示一个特定数目的项目,例如3项。"当我们设置我们特定的值在视图上"。点击保存按钮。你现在准备吧你刚刚在网站上创建的一个块放到一个页面上。页面上的导航到结构,然后点击"区块布局"链接。在"区块布局"页面上,在这个"区块地点"栏里,你可以看到你想创建的视图显示列表,见下面的(视图)列表区域,(如图9-5)。 124 | 125 | ![view](../images/pic-9-5.png) 126 | 127 | 图9-5 列表(视图)块 128 | 129 | 点击最近的文章:最近的文章区块链接,分配一个区域。现在列表上的一个区域后,保存这个区块。返回你网站首页。你应该高兴的看到通过你创建并使用的视图区块中的文章列表。(如图9-6)。 130 | 131 | ## 过滤 132 | 133 | ![view](../images/pic-9-6.png) 134 | 135 | 图9-6 该网页显示最近的文章块列表 136 | 137 | ### 过滤 138 | 139 | 在前面的例子中,我们基于内容和发布状态过滤输出我们的视图。这些都是最经典的过滤视图显示。但是你是否想限制输出视图显示超出内容和状态?让我们以标签为例来演示过滤器的强大。在本节中,在我们网站上我们将添加一个标签例如文章。编辑几篇你的文章,在标签字段,输入几个关键字,并用逗号分开,描述每篇文章的内容。至少在你的两篇文章上使用类似的关键词以便于我们在后面的例子中使用这些文章。为了找到更新的文章,在主菜单中点击内容链接,在表单列表上点击编辑按钮添加标签到现有文章。添加标签之后,返回我们之前章节创建的文章页面。你添加的标签现在显示在每一篇摘要下面。(如图9-7)。 140 | 141 | ![view](../images/pic-9-7.png) 142 | 143 | 图9-7 通过视图渲染标签 144 | 145 | 作为一个快速演示分类,标签,和视图的的能力。点击一个标签,在你网站的项目上你输入Drupal将呈现一个这个标签的内容列表。在幕后,Drupal是使用视图来生成这个列表。但是,让我们更进一步,允许用户通过输入一个标签过滤文章列表中显示的内容。 146 | 147 | 通过点击页面结构上的视图链接,回到视图管理页面。找到最近的我们已开启的文章视图,点击编辑按钮。在视图显示区域点击显示所有文章按钮配置页面。通过点击添加过滤标准添加一个新的过滤标签。在"添加过滤标准"表单上的搜索框输入"标签"搜索这个标签字段。勾选这个"内容:标签(field_tags)"字段复选框。改变选项为"页面(覆盖)"以便于只在本页面显示这个过滤标准,然后点击"应用(显示所有)"按钮。 148 | 149 | 接下来的步骤是选择过程,我们希望显示的接口类型,无论是一个下拉的选择列表,或自动在用户类型关键词搜索。这个下拉字段将会展示给用户有效的选项,而自动完成方法要求用户知道他们希望搜索的选项。该选项依赖于你的用户体验。出于演示的目的,选择下拉菜单,点击"应用并继续按钮"。 150 | 151 | 下一步时配置过滤器,并知道它是怎么工作的。我们想要允许用户选择哪一个过滤选项,这样我们将为用户展示这个过滤器以便于他们能控制这个视图的内容显示,这样,点击勾选"显示这个过滤器给游客,允许他们改变它"选择框。设置为"过滤类型"设置为"单一过滤",改变这个标签"选择一个或多个标签"。设置为"其中之一",这意味着我们想要用户仅选择从网站上存在的文章标签值。还要检查"多选"框,来允许访问者选择多个标签进行搜索。点击应用按钮继续这个过程(如图9-8),然后保存这个视图所作的更改。 152 | 153 | ![view](../images/pic-9-8.png) 154 | 155 | 图9-8 配置过滤器 156 | 157 | 在主菜单上通过点击所有文章链接回到本文章页面。或在你的网站上访问这个*/最近的文章*URL。你将在你的文章列表上看到你显示的过滤器。选择一个或多个标签,然后点击应用按钮将看到一个新的过滤器方法(如图9-9)。太神奇了!你触及到视图能为你做的表面。 158 | 159 | ##高级视图输出 160 | 161 | ![view](../images/pic-9-9.png) 162 | 163 | 图9-9 基于用户输入滤波输出 164 | ### 高级视图输出 165 | 166 | 在视图中创建内容摘要和字段列表是最常用的用法。但是,如果你停留在那里,你可能会错过更多强大的功能。在这个区域,我会说明当我们建立Drupal网站期间遇到的常见场景。 167 | 168 | 创建RSS订阅 169 | 170 | 一个常用的视图是创建RSS订阅,一个RSS订阅是一种行业标准的发布内容格式。它通过应用被使用例如新闻、Drupal网站。而RSS订阅没有像网上主播鼎盛时期那样流行。仍然有案例使用RSS订阅意义,例如在其他网站提供订阅内容。 171 | 172 | ## 创建表 173 | 174 | 让我们以最近的文章视图来为所有文章创建一个RSS订阅。首先,通过点击管理单里的管理链接回到视图页面,接着点击结构链接,最后点击在结构页面链接。找到最近的文章视图,点击编辑按钮这个视图。我们将在页面上的视图区域通过点击添加按钮创建一个显示RSS订阅。对于列表中的选项,选择订阅。接下来在输入一个订阅的将被访问的URL。在"订阅设置"区域的第二栏中,点击"不设置"链接,输入一个网址。出于演示的目的,我会输入一个*rss/articles*的URL,我也可以使用任何URL,但是我发现它在我的RSS订阅URL里面rss的前缀更明显要显示的URL是什么。通过点击应用来保存URL的改变。然后点击在视图表单底部点击保存按钮来更新视图。你现在有一个RSS订阅,在其他网站可以使用你网站上面的文章。访问这个URL显示这个订阅输出。(如图9-10) 175 | 176 | ![view](../images/pic-9-10.png) 177 | 178 | 图9-10 一个视图生成RSS提要 179 | 180 | ### 创建表 181 | 182 | 将内容渲染为列表在大多数情况下表现很好,但是有时用户可能更喜欢内容通过表格的形式展现。出于演示的目的,回到这个文章视图编辑表单为了创建一个新的显示,将在电子表格中渲染文章字段。在视图区域点击添加按钮,选择区块显示类型。改变"显示名称"像你之前那样。这次的"文章表格"。在这个格式化区域点击"没有格式化列表",改变表格输出显示的类型。记住在点击"应用(显示所有)"按钮之前,先改变页面顶部选项为"这个区块(覆盖)"。出现的下一个屏幕你可以设置你新的表格选项。(如图9-11)。 183 | 184 | ![view](../images/pic-9-11.png) 185 | 186 | 图9-11 表样式选项 187 | 188 | 这种表单选项,你会想使用最常用的排序选项。现在我们的表格仅仅有一列,文章标题字段,但是我们必须完成这步之后才能添加其他字段。我们可能想有一个或多个这样的列有最终用户来排序。对于排序列,用户点击这列的标题,视图自动根据表格基础进行升序排列(如果用户在次点击,将为降序排列)。点击排序表格的复选框标题这列,在接下来的几个步骤中会添加别的列后我们将回到这种表单。 189 | 190 | 在下面的列表字段你会找到一个名称为"分组字段NR.1"的选择列表。在表格中你可以渲染输出这个组,就像在你表格中不同的部分,可以通过简单的选择你想要排序的分组结果的字段。例如,如果你有一个出售属性列表,你可以通过邮政编码或城市分组输出。共享一个邮政编码的所有属性将在表中单独的分离出来。出于演示的目的,设置选项为无。 191 | 192 | ## 查看附加模块 193 | 194 | 这里有额外的样式选项。但是在大多数情况下设置这些选项为默认值足够了。点击应用按钮完成这个这一步。 195 | 196 | 单列的表格是无聊的。只不过是显示一个列表而已。那么让我们添加2个额外的字段来丰富表。添加一个文章发布日期字段,另一个添加该文章相关的标签.我们将添加的每一个字段作为单独的一列。要添加字段,在页面的字段区域点击添加按钮(如图9-3),在我们的视图上展示了列表上的每一个有效的字段。为了方便的找到我们想要的字段,在列表字段顶部搜索框输入"创建",然后在表单中会显示搜索的结果列表。选择"内容:撰写"字段旁的复选框。选择"这个区块(覆盖)"选项是为了防止这个表单字段被添加到我们创建过的别的视图中显示。点击"应用(显示所有)"按钮。在下一个屏幕会提供这个"撰写"字段的配置选项来显示。包括字段的标签显示,CSS样式选项,当一个给定的文章没有值和选项的时候,该怎么做。为这些选项设置一个默认值然后点击应用。 197 | 198 | ##视图附加模块 199 | 200 | 这个视图模块它自己是一个有利工具来展示你的网站上内容。当你结合其他特定的模块,你会得到一个全新的强大的功能。这里有几个"必须拥有"附加模块,你不妨考虑用它来构建你的网站,这儿有一些我非常喜欢的模块: 201 | 202 | * 幻灯片视图( ):这个模块提供一个简单易用的界面,用于创建幻灯片内容显示视图。这里有许多幻灯片视图模块,但是这种是最容易使用的一个。 203 | * 日历():需要显示日历事件?这是你的模块。它提供给你一个丰富的设置工具,创建并显示任何类型的日期字段和日期值包括(年,月,周,日)。在我所有的网站上它是一个必备的模块。 204 | * 轮播[*jCarousel*]():我的大多数项目涉及一些轮播形式的内容显示。这个模块让创建一个内容项目列表更简单,作为它作为一个转盘轮流显示。 205 | * 拖拽视图():希望提供一个管理界面,允许内容编辑病在视图中重新排列这些选项。在你的视图中该模块提供一个简单拖拽界面来重组项目。 206 | * 谷歌地图():希望在地图上显示有地理(位置)信息内容?这个模块集成谷歌地图和视图,为了提供一个易于使用的解决方案,在地图上显示内容项。 207 | * 视图数据导出():希望从你的网站导出内容到一个CSV文件,电子表格,Word文档,文本文件,或XML文件中?该模块提供了这样的功能。 208 | 209 | 也有些附加视图附加模块,在这里我们没有讲到。请访问并在右列分类列表点击这个视图链接.在写文章的时候,有756个关于视图的贡献模块!通过浏览这个列表(记得看看是否是你感兴趣的Drupal8的模块版本)。人们已经创建了许多惊人功能的视图模块。 210 | 211 | ## 总结 212 | 213 | 我仅仅了解到如何在你的心网站上使用视图。视图是非常强大的。是Drupal模块中一个"杀手锏"模块之一。 214 | 到现在为止,我们把重点放创建区块内容,菜单和模块的基本组成部分。在下一章中,我们看看在使用这些元素来创建页面。 215 | 216 | 217 | 218 | -------------------------------------------------------------------------------- /chapters/chapter-22.md: -------------------------------------------------------------------------------- 1 | # 第22章 构建电子商务网站 2 | 3 | **翻译:伟太** 4 | 5 | 在一个相对较短的20年来,在互联网上销售产品和服务已经从新奇事物变成企业的主流业务。如果你的公司没有提供一个在线渠道给你的目标客户,你正错过一个增加收入、市场份额以及盈利的巨大机会。Drupal Commerce 为构建在线店面提供了强健而且功能完整的解决方案。在本章中,我将带您完成创建一个电子商务网站的流程。为了演示在 Drupal 上建立电子商务网站的简易,我将创建一个专注于销售 Drupal T恤,咖啡杯和帽子的网站。该概念可以扩展到出售任何物理或虚拟货物,所以欢迎你跟着我一起构建Drupal的电子商务网站,或者使用呈现的例子作为指导,来创建你自己的电子商务网站。 6 | 7 | ## 确定电子商务网站的需求 8 | 9 | 正如你多次在本书中读到,下手构建任何网站的开始是,确认该网站的需求。 10 | 11 | 本章介绍的示例电子商务网站的需求对许多电子商务网站来说是常见的,包括: 12 | 13 | 1. 在网站上展示在售产品的能力。 14 | 2. 销售具有特定属性(比如说产品尺寸)的产品的能力。 15 | 3. 购物者把产品放进购物车并管理购物车的能力。 16 | 4. 购物者结账和支付,包括提供信用卡结账以及选择送货方式,的能力 17 | 5. 购物者访问网站并且检查以前的订单的能力。 18 | 19 | 需求在手,我们接着就可以确定我们将如何使用 Drupal 来满足这些需求。使用 Drupal Commerce Kickstart 发行版,在此基础上创建店面。Commerce Kickstart 提供了一个预配置的解决方案,使得许多需求开箱即可实现,包括: 20 | 21 | - 用于在网站上创建和展示产品的产品模板,包括具有属性(比如尺寸)的产品。 22 | - 一个可以让访问者将产品放进购物车,并且在购物体检中管理商品的购物车系统。这个购物体检包括拥有多种支付方式的结账流程以及为产品(实物产品)选择运送方式。 23 | - 用以查看过往订单的客户界面 24 | 25 | 作为一个 Drupal 发行版,Drupal Commerce Kickstart 发行版是由一个团队装配的。这个团队已经将所有贡献模块准备到位,使得你的店面搭建变得容易,并且用最少的功夫让网站迅速运行起来。你也可以跟随 Commerce Kickstart 团队的路径,找到所有相关的模块并且分别安装。这两种方案我都试过,我发现使用 Kickstart 明显更加快速、简单,所以我会现在更加容易示范的路径,使用 Commerce Kickstart 开始。 26 | 27 | ## 安装 Drupal Commerce Kickstart 28 | 29 | 安装 Drupal Commerce Kickstart 的过程除了定制的安装界面,几乎跟安装 Drupal 8 核心 一样。 按照说明下载 Drupal Commerce Kickstart (www.drupal.org/project/commerce_kickstart) 到你的 Web 服务器的一个目录中, 执行跟安装 Drupal 核心 一样的基本步骤。创建数据库和数据库用户,然后在你的浏览器中打开网站开始安装过程。 30 | 31 | 这个过程的第一步是接受隐私政策以及用户协议。这个跟安装 Drupal 8 不一样,因为这个发行版中包含有请求隐私政策以及用户协议同意的第三方库(见图22-1)。如果你同意这些条款,请点击 “Let's Get Started(让我们开始)” 按钮。 32 | 33 | ![确认同意隐私政策以及用户协议](../images/pic-22-1.png) 34 | 35 | **图22-1 确认接受隐私政策以及用户协议** 36 | 37 | 这个过程的下一步是验证安装要求,以便继续进行安装。如果你还没创建 `/sites/default/files` 目录以及 `settings.php`,你可以去创建。这些步骤跟安装 Drupal 8 核心一样,在文件管理系统中导航到相应的位置并创建它们两个。 38 | 39 | 验证系统需求验证之后,下一步是指定数据库类型,数据库名称,数据库用户和数据库密码。 40 | 除了有一点点区别之外,这个过程跟安装 Drupal 8 核心一样(见图22-2)。你将需要(提前)创建那个数据库,或通过你的主机提供商的管理界面,或者在命令行中使用 MySQL,又或者采用像 PHPMyAdmin 这样的工具来创建这个数据库。 41 | 42 | ![数据库设置](../images/pic-22-2.png) 43 | 44 | **图22-2 数据库设置** 45 | 46 | 输入数据库设置并点击“保存并继续”按钮之后,Drupal Commerce 会在数据库中创建必要的表,并执行所有关于 Drupal 8 核心以及与“ Drupal Commerce基础实现”关联的贡献模块的安装、启用操作。图22-3 显示了安装进度。 47 | 48 | ![正在创建数据表并启用模块](../images/pic-22-3.png) 49 | 50 | **图22-3 正在创建数据表并启用模块** 51 | 52 | 这个过程的下一步是填写你网站的基本信息,具体包括你网站的名称、商店的e-mail地址,商店管理员的用户名和密码,以及商店的国家和时区信息(见图22-4)。商店信息输入完成之后,点击“保存并继续”按钮。 53 | 54 | ![网站配置参数](../images/pic-22-4.png) 55 | 56 | **图22-4 网站配置参数** 57 | 58 | 这个过程的最后一步是,决定你是否想要从一个示范商店开始,你是否希望将你的网站内容翻译成多语言,你网站的基础货币是什么,以及如果有需要的话,你的网站使用哪一种类型的税率(见图22-5)。为了演示如何建立一个商务网站,我将不会安装那个示范商店,但是我会启用其他所有附加功能来开始创建一个新的商店,而且我会启用美国税率。 59 | 60 | ![配置商店](../images/pic-22-5.png) 61 | 62 | **图22-5 配置商店** 63 | 64 | 点击“创建并完成”按钮,Drupal Commerce 会安装额外的功能并且完成安装流程。访问网站的主页,你可以看一个“入门”弹出窗口,为你提供有关设置网站的丰富信息。我建议你找个时间将它通读一遍。关闭那个弹出窗口会显示默认主页,类似于图22-6。 65 | 66 | ![新的店面](../images/pic-22-6.png) 67 | 68 | ## 设置产品分类 69 | 70 | Commerce Kickstart 提供了一个用分类对产品进行分组的机制,这样网站访问者可以根据你定义的分类来浏览商品。完成安装 Kickstart 之后,你可以看到页面左上角有“Sample Category 1(示例分类一)”、“Sample Category 2(示例分类二)”的链接。对于我们的示例网站,我们会将这些分类改为杯子跟T恤,并添加第三个分类,帽子。 71 | 72 | 要管理分类,点击(悬停至,译者注)管理菜单的 “Products(产品)” 链接,点击下拉菜单中的“Categories(分类)”。在分类页面,单击“Product category(产品分类)”的 “List term(列出术语)” 链接,然后编辑 “Sample Category 1” 为 “Shirts(T恤)” ,接着编辑 “Sample Category 2” 为 “Cups(杯子)”。点击 “Add term(添加术语)” 为 “Hats(帽子)”添加新的分类。完成上面的修改并添加“帽子”分类后,分类列表应该如图22-7。单击 “Save(保存)” 。 73 | 74 | ![产品分类](../images/pic-22-7.png) 75 | 76 | **图22-7 产品分类** 77 | 78 | ## 设置产品 79 | 80 | Drupal Commerce 使用产品类型的机制来创建产品信息。把产品类型当做 Drupal 8 核心里面的内容类型。 一个产品类型包含一组的用来描述你正在出售的产品的字段,包括如产品标题,SKU,价格,产品图片等要素。你可以有一个或者多个产品类型。创建多个产品类型主要是因为用来描述你正在出售的各种产品的字段之间存在着明显差异。举个例子,我们假设你要出售T恤和电影。用来描述T恤的字段(例如,材料,颜色,尺寸)跟用来描述电影的字段(例如,流派,评价,演员,时长)显著不同。在这种情况下,为电影单独创建一个产品分类会是合理的。Commerce Kickstart 使用术语 “variations(变型)” 作为产品类型的标签(而现成的 Drupal Commerce 使用“产品类型”)。 81 | 82 | 要查看 Commerce Kickstart 里面的变型,点击管理菜单上的“Store settings(商店设置)”,在下拉菜单中点击“Variation types(变型类型)”。“变型类型”页面(见图22-8)中列出了网站上已经定义的所有的产品变型。点击产品变型的“管理字段”链接,关于产品类型的所有字段就会显示出来,使用的用户界面跟 Drupal 8 核心的内容类型一样。你可以添加字段,重新排列字段,并控制产品的展示。 83 | 84 | ![产品变型](../images/pic-22-8.png) 85 | 86 | **图22-8 产品变型** 87 | 88 | 现成的产品变型包含了标题,SKU,价格和图片字段。虽然这可以很好地用于我们将要在网站上出售的咖啡杯,但是他并不适用于T恤,因为我们需要指定颜色和尺寸,而且对于帽子来说,我们需要指定颜色而不是尺寸。这个问题的解决方案是创建两个新的产品款式类型(产品变型),一个用于帽子,一个用于T恤。 89 | 90 | 要创建一个产品款式类型,点击“Variation types(商品款式类型)”页面(见图22-8)上的“Add product variation type(添加商品款式类型)”按钮,并给它一个名字“shirts(T恤)”。勾选“编辑时默认为这个产品款式类型的产品创建新的修订版”和“创建匹配的产品展示类型”。 91 | 92 | ----- 93 | 94 | **注意** 一个匹配的产品展示实际上是一个用来展示商店产品的内容类型。Drupal Commerce 习惯性地将产品的展示以及产品的信息存储分离。这意味着要展示一个产品,你需要一个产品款式类型、和一个用来展示产品的内容类型。Commerce Kickstart 将这个过程变得简单一些。通过勾选“创建匹配的产品展示类型”选项框,Drupal 会自动创建用来展示产品的内容类型。 95 | 96 | ----- 97 | 98 | 点击“保存并添加字段”后,唯一我们需要做的是在字段管理页面上添加一个图片字段,一个颜色的选择列表,一个尺寸在的选择列表,如图22-9所示。Kickstart 自带预设置的图片字段,所以只需在“选择一个已有字段”的列表中选择那个字段。要添加颜色选择列表,创建一个新的“列表(文本)”字段来提供颜色选项。给字段命名为“Color(颜色)”并选择“列表(文本)”之后,在控件一列中选择“选择列表”。点击“保存”按钮,然后以“名|值对”(例如:白色|白色)的形式输入一列可用的颜色选项。点击“保存字段”的设置按钮,在这个字段最后的配置表单中,勾选“启用此字段作为属性字段添加到购物车表单中”,这样购物车就可以在添加商品到购物车时指定颜色。点击“保存设置”按钮完成颜色字段配置。遵循同样的步骤创建“Size(尺寸)”字段。字段添加完成之后,T恤产品类型应该如图22-9。 99 | 100 | ![T恤内容类型](../images/pic-22-9.png) 101 | 102 | **图22-9 T恤内容类型(应该为T恤产品变型)** 103 | 104 | 添加字段后,还有一些其他的任务要执行。首先,整理T恤变型的展示。点击屏幕上方的“管理显示”选项卡,隐藏图片字段的标签。点击页面顶部“添加到购物车确认视图”的链接,看看有哪些值会出现在“购物车确认”页面中。将标题,尺寸颜色添加到显示,这样购物者可以更完整地看到什么在他们的购物车里面。为“购物车中的产品”、“行项”、“节点:摘要”显示模式进行同样的设置。 105 | 106 | 我们还需要对为展示T恤而自动创建的内容类型进行一些修改。点击“站点设置”,并在下拉菜单中点击“结构”链接。在“结构”页面,单击“内容类型”链接可查看商店中创建的内容类型的列表。从列表中,点击T恤内容类型的“编辑”链接,并进行以下更改: 107 | 108 | 1. 点击“评论设置”选项卡,将“新内容的默认评论设置”设置为“隐藏”。因为我们不希望客户提交关于T恤的评论。 109 | 2. 点击页面上方的“管理字段”选项卡(见图22-9)。我们需要为内容类型添加两个字段:一个“正文”字段,一个“产品分类”字段。这些字段用于在我们的示例网站上推销产品,并且属于产品展示而不是产品。幸运的是,这两个字段作为默认的 Kickstart 实现的一部分已经存在了,所以我们需要做的是使用“添加已有字段”来添加它们俩。 110 | 3. 点击页面上方的”管理显示“选项卡,对T恤显示方式做一些修改: 111 | 112 | * 确保标题的标签设置为隐藏 113 | * 将“产品:标题”移动到隐藏列表当中,因为我们已经有一个标题字段了 114 | * 将产品价格移动到列表的第二位 115 | * 将正文字段移动到列表的第三位,并隐藏其标签 116 | * 移动“产品:颜色”, “产品:尺寸”和产品分类字段到隐藏区域,因为颜色跟尺寸会作为产品变型显示的一部分出现。 117 | * 保存修改。 118 | 119 | 4. 通过页面上方的“摘要”链接,进入“摘要”显示设置,以进行下面的更改。 120 | 121 | * 将除了标题,“产品:价格”,产品变型,“产品:图片”的所有字段移动到隐藏区域 122 | * 将“产品:图片”字段移动到第一位 123 | * 隐藏产品变型的标签 124 | * 保存修改 125 | 126 | 5. 更新“管理显示”选项卡下面的“产品列表显示”,如下: 127 | 128 | * 将“产品:图片”字段移动到第一位 129 | * 将“产品:标题”字段隐藏,因为我们已经有标题字段 130 | * 移动价格字段放在需要显示的字段中的最后一位 131 | * 保存修改 132 | 133 | T恤、杯子都按照同样的步骤进行修改。同时添加一个不含尺寸字段的“帽子”商品款式类型,因为帽子只有一个尺寸。 134 | 135 | ## 创建产品 136 | 137 | 创建完T恤,帽子的商品款式类型之后,是时候对它们进行测试,确保它们以像想要的方式工作。我将创建一个新的T恤,“Drupal Flys T恤”。跟着这个例子来,请点击主菜单上面的“产品”按钮并点击下拉菜单中的“添加一个产品”。在操作列表中选择“T恤”,并在标题字段中输入“Drupal Flys”。这里是有趣的开始;我们需要为想要出售的每一个颜色和尺寸组合创建变型(款式)。例如,我们希望出售四个尺寸的白T恤,所以我们需要在“颜色”下拉菜单中选择白色,并且对每一个尺寸,在“尺寸”列表中选择一个(译者注:每一个产品颜色尺寸组合都需要一个产品变型,或者说产品款式)。为颜色和尺寸组合输入SKU码,在“分类”下拉菜单中选择“T恤”,设置价格并添加图片。为了这次演示,所有的图片都使用蓝色T恤。填充完第一个款式(变型)之后,表单应该如图22-10。 138 | 139 | ![正在创建产品变型(款式)](../images/pic-22-10.png) 140 | 141 | **图22-10 正在创建产品变型(款式)** 142 | 143 | 填完第一个款式(变型)之后,点击“创建款式(变型)”按钮。下一步是创建我们想要出售的所有款式,选择颜色和尺寸,为每一个颜色尺寸组合设置唯一的SKU码。通过点击“添加新的产品款式(变型)”来启动进程,按着上面段落中提到的步骤为每一个颜色和尺寸组合添加新的款式(变型)。最后的结果是一个长长的产品款式列表,部分显示出来的列表如图22-11。 144 | 145 | ![产品变型(款式)列表](../images/pic-22-11.png) 146 | 147 | **图22-11 产品变型(款式)列表** 148 | 149 | 150 | 保存“Drupal Flys T恤”后,该产品面向客户的视图,如图22-12所示。 151 | 152 | ![Drupal Flys T恤](../images/pic-22-12.png) 153 | 154 | **图22-12 Drupal Flys T恤** 155 | 156 | 添加一个小码的白色“Drupal Flys T恤”到我的购物车。Kickstart 会在购物车中,以我在为T恤设置产品变型模板进行配置时定义的形式显示项目(见图22-13)。 157 | 158 | ![项目被添加到购物车](../images/pic-22-13.png) 159 | 160 | **图22-13 项目被添加到购物车** 161 | 162 | 继续构建示例电子商务网站,跟随“Drupal Flys T恤”一样的步骤创建一个示例帽子和一个示例咖啡杯,唯一例外的是,帽子会有多种颜色而没有多种尺寸,杯子只会有一种颜色以及一个尺寸。 我会使用“帽子产品变型”来创建一个帽子而使用通用的“产品展示”来创建一个杯子。 163 | 164 | 如果我现在点击页面上方的分类链接,点击“Cups(杯子)”,页面会展示我创建的那个杯子;点击“Shirt(T恤)”,页面会展示“Drupal Flys T恤”,点击“Hats(帽子)”,页面会展示我创建的那顶帽子。 165 | 166 | ## 展示产品 167 | 168 | 要在你的店面上展示产品,有许多事情可以做。你可以将单独的产品链接添加到菜单,或者在内容中嵌入链接。你可以通过点击靠近页面上方的“分类”,像示例中演示的那样使用分类列表的方法,或者你可以创建视图来展示产品,基于你在这个视图上应用的标准以及过滤机制。作为一个例子,我将创建一个产品列表视图,用来展示网站上的所有产品,并按分类排序、分组。跟着一起来,将鼠标移动到管理菜单的“站点设置”链接上,然后点击下拉菜单中的“视图”链接。 169 | 170 | 点击视图页面中的“添加视图”按钮,在“添加视图”页面(见图22-14),进行以下操作: 171 | 172 | 1. 给视图一个名字;在这里我叫它做“产品”。 173 | 2. 在“显示”选择列表中选择了“Commerce 商品”,来指示在视图中显示什么。 174 | 3. 将要显示的产品类型保留为“全部”,因为我们想要显示所有的产品类型。 175 | 4. 让视图设置为“不排序”。 176 | 5. 点击“继续编辑”按钮。 177 | 178 | ![正在创建产品视图](../images/pic-22-14.png) 179 | 180 | **图22-14 正在创建产品视图** 181 | 182 | 在视图的配置页面中,我会遵循创建视图的基本步骤,使用来自“Commerce 商品”的字段,包括一个名叫“添加到购物车”的字段,这个字段允许访问者通过简单点击一个“添加到购物车”按钮将产品添加到他们的购物车。图22-15展示我为创建视图而进行的基本设置。 183 | 184 | ![正在配置产品展示视图](../images/pic-22-15.png) 185 | 186 | **图22-15 正在配置产品展示视图** 187 | 188 | 基于我对视图如何在网站上展示的构想,我会添加一个区块并且/或者页面展示,这样可以就可以将产品罗列在一个页面或者在菜单(页面)中提供一个视图的链接。图22-16展示视图可能会如何显示在网站上。 189 | 190 | ![产品列表视图](../images/pic-22-16.png) 191 | 192 | **图22-16 产品列表视图** 193 | 194 | 另外一个建议是添加筛选到你的视图,这样客户就可以快速地找到他们正在寻找的产品。使用视图筛选条件是提供这个功能的好方法。我已经将产品类型、产品颜色、产品尺寸的暴露的过滤器添加到视图,使得客户容易地将产品列表收缩到符合他们正在寻找的产品的条件(例如,黑色、中码的T恤)。图22-17显示过滤条件的设置细节以及最终在视图顶部出现的过滤器。 195 | 196 | ![产品过滤器](../images/pic-22-17.png) 197 | 198 | **图22-17 产品过滤器** 199 | 200 | ## 配送、税收、支付以及其他功能 201 | 202 | 有一些功能可以在Drupal Commerce 商店实现,其中包括的项目,如提供运费报价给购物者,计算增值税(VAT),以各种形式支付,提供折扣优惠券以及更多的功能。出于演示的目的,Kickstart 已经启用了带有预配置的多种功能。 203 | 204 | ### 配送 205 | 206 | 有几个 Commerce 贡献模块帮助提供配送选项,比UPS,美国邮政,以及其他。当你访问 www.drupal.org/project/commerce_shipping , 你会发现有模块提供统一费率、UPS,FedEx,美国邮政,佳能打邮政,ConnectShip以及 Kiala选项支持。如果你想要的配送方法在模块列表中无法找到,也会有开发者API为创建新的配送方法的提供能力。 207 | 208 | Kickstart 自带启用免费的运送方式。然而,出于演示的目的,我想向客户收取运费,我会使用 Kickstart 默认启用的 Commerce Flat Rate (统一费率)模块。 要启用并且配置统一费率配送,将鼠标悬停在“网店设置”管理菜单项,点击下拉菜单中的“运送”。在“运送”管理页面中, 点击页面左上方的“添加一个统一费率服务”。在“添加固定服务”的配置页面(见图22-18)中,给服务取一个标题,一个在结算过程中会出现的展示标题,以及一个会在所有订单中使用的基本费用。为了演示,我将会为每一次配送收取$10的固定费用,作为运费以及手续费。 209 | 210 | 其他的运费模块,如UPS,美国邮政,FedEx,全部都会根据箱子的数量以及出货的重量来计算实际的费用。当你使用像UPS,美国邮政,FedEx这样的配送方式时,你会需要进行一些额外工作,为每一个产品添加尺寸、重量,以及添加你在配送产品中使用的标准箱尺寸。它们每一个模块都在一个箱子能放多少个产品这问题上进行最佳的估计,以此来确定需要多少个箱子以及总费用是多少。你也可以使用计算规则来处理UPS,美国邮政,FedEx或者其他服务返回的费率。查询 Drupal.org 上的文档,了解如何添加其他运送方式,配置那些方法以及创建并使用运算规则。 211 | 212 | 建立统一费率运送服务后,删除配送服务中的“免费配送”方法,来只提供统一费率的选项。在“运送”页面(网店设置 ➤ 运送),点击“免费配送”右边的“删除”链接。 213 | 214 | ![建立统一费率运送方式](../images/pic-22-18.png) 215 | 216 | **图22-18 建立统一费率运送方式** 217 | 218 | ### 税收 219 | 220 | Drupal Commerce 支持 销售税和增值税(VAT)。要配置税金,将鼠标悬停在“商店设置”菜单项,点击下拉菜单中的“税金”。Kickstart 预配置了一个密歇根州的示例销售税率。要了解税收的配置方式,点击 “Michigan Sales Tax(密歇根州销售税率)”的编辑链接,并注意字段以及它们的值(见图22-19)。 221 | 222 | ![示例密歇根州销售税率](../images/pic-22-19.png) 223 | 224 | **图22-19 示例密歇根州销售税率** 225 | 226 | 如图22-19所示,定义一个新的税金的时候,你必须给它一个标题,其中管理标题会出现在管理页面,展示标题会在结算过程中显示,一个应用到订单中每一个产品的税率,以及税金的类型(销售税或者增值税)。这个页面上定义了税率的值,而第二步是定义这个税率如何应用。如果你点击“保存税率”按钮,你会返回到税金管理页面,点击“配置组件”链接,看看如何将税率运用到客户已经购买的商品(见图22-20) 227 | 228 | ![配置税金规则](../images/pic-22-20.png) 229 | 230 | **图22-20 配置税金规则** 231 | 232 | 税金规则配置分为两个组件,一个使用规则所必须满足的条件,以及一个满足条件后将要执行的动作。在密歇根州销售税的例子中,条件是订单的“州”字段设置为“MI(密歇根州)”。在条件配置表单中(见图22-21),你可以找到一个“数据选择器”的字段,用来定义条件时基于哪个值,这个例子中是“commerce-line-item:order(电子商务行项:订单)”。地址字段允许你选择销售税是基于收货地址或账单地址。对于美国的税费,税率是基于账单地址的。“地址组件”允许你选择哪个字段用于比较,由于我们正在处理州销售税,我们选择的字段是“行政区域(州/省)”。我们希望用于比较行政区域的值的操作符是“等于”,并且最后的元素是,我们希望比较的值,本例中是“MI(密歇根州)” 233 | 234 | ![配置税金规则](../images/pic-22-21.png) 235 | 236 | **图22-21 配置税金规则** 237 | 238 | 当你遇到郡税或者城市税时,你可以使用跟上述的州税相同的方法,选择郡或者城市作为比较的基准,使用郡或者城市的名字作为值。。要增加新税种,只需按照密歇根的例子来创建一个新的税率。你可以根据你配送的和你的公司经营的州,在网站上设置几个税率。请根据你所在州的规定征税以及报税。 239 | 240 | ### 支付 241 | 242 | Drupal Commerce 为收取客户费用提供了几种方法,包括:信用卡支付,Paypal,亚马逊支付及其他方法。对于信用卡支付,你有一些支付服务(提供商)的选项,例如:Authorize.net, American Express, CyberSource, FirstData, Commerce SagePay, Commerce Cielo, Adyen, ePay, MoIP, Ogone, Pagamento, PageSeguro, PayEx, Payflow Link, PayLeap, PayPal, SagePay, and Sermepa。每一个支付服务都有自己的配置参数。请查看每个服务相关的模块文档以了解安装以及配置的具体细节。 243 | 244 | 出于演示网站的目的,我将使用Kickstart 默认启用的“示例支付”。你可以导航到“支付方式”的管理页面,检查对应的配置参数。为了达到这个目标,将鼠标悬停在管理菜单中的“保存设置”链接,然后点击下拉菜单中的“付款方式”链接。在“示例支付”的“Editing reaction rule(编辑响应动作)”的页面中,你将看到运费、支付是由事件以及动作管理。你可以查看“事件”和“动作”来看看启用支付方式的一般方法。 245 | 246 | 随着可购买产品,发货配置,税收启用和付款配置完成,是时候来下个订单。要选择一个项目(产品)来放到您的购物车,请点击在靠近页面顶部的菜单中列出的产品类型中的一个,并从该列表中单击该产品(你想要添加的产品)的名称,并选择属性,例如颜色和大小,如果适用于该产品,还有你想添加多少到你的购物车。添加项目到你的购物车后,你应该可以看到一个弹出通知,该项目已经添加到你的购物车(见图22-13)。在弹出通知上,点击“去收银台”按钮,开始结帐过程(见图22-22)。 247 | 248 | ![购物车](../images/pic-22-22.png) 249 | 250 | **图22-22 购物车** 251 | 252 | 如果在购物车中的物品和数量看起来是正确的,接着点击“结帐”按钮,进入计费和发货信息。对于所有订单来说,送货地址和帐单地址是需要的(可以是同一地址)。如果你是网站的回头客,并且已经登录,Drupal Commerce 通讯录模块会根据你在地址簿中存档的地址预填充一些值,这个档案是作为订单处理流程的一部分创建的。(见图22 -23)。 253 | 254 | ![设置账单和送货地址](../images/pic-22-23.png) 255 | 256 | **图22-23 设置账单和送货地址** 257 | 258 | 点击“继续下一步”按钮,将显示结帐过程的“运送”步骤。因为我们只有实现了一个同一费率运送方式,所以这个页面上没有太多的要做。如果你已经实现了UPS,美国邮政,联邦快递或其他航运服务,并启用了多个送货选项(例如,标准陆运,第二天空运,为期2天的空运),购物者将有更多的选项以及从运营商的价格系统中获得的费用信息。运输成本是基于包裹的数量和订单的重量计算。 259 | 260 | 选择送货方式后,下一步是审查的订单并输入付款信息。使用 Kickstart 的“示例配送方法” 会预先生成一个示范的信用卡号码和到期日。如果您有其他付款方式,您可能还有其他的选项进行填写。下一步是进行付款并完成订单。结算完成的消息将会显示,包括给予购物者跟踪的订单号。 261 | 262 | 您可以修改通过管理界面结帐流程。将鼠标悬停在管理菜单中的“商店设置”项,然后点击“结帐设置”链接。你会看到的结账步骤列表以及它们在文档流中出现的位置(见图22-24)。您可以重新排列项目,但如果你这样做要谨慎,因为有些项目需要按顺序出现才能使功能生效(例如,支付处理后设置送货方式发生会导致配送费用不被列入了客户的支付中)。 263 | 264 | ![配置结账流程](../images/pic-22-24.png) 265 | 266 | **图22-24 配置结账流程** 267 | 268 | ## 总结 269 | 270 | 本章中,我介绍了安装 Drupal Commerce 以及配置店面的基本过程。还有许多额外的模块和技术用来建立和运营一个基于 Drupal Commerce 的网站。我建议你花时间在 Drupal.org 并且 查看一堆 专注于建立和运营 Drupal Commerce 店面的 Youtube 视频。 271 | 272 | 来到这里,你以及读完全书了。恭喜你!你的旅程才刚刚开始,我期待在你学习Drupal经验而进步的时候不断地看到你的作品。我希望在即将到来的 DrupalCon 或 DrupalCamp 上看到你。 273 | --------------------------------------------------------------------------------