From cdae3fadea9ed63b1d82cb586c3eb34f1ec1b5e6 Mon Sep 17 00:00:00 2001 From: Cam Findlay Date: Tue, 11 Nov 2014 12:34:23 +1300 Subject: [PATCH] Tutorials review and update image path --- .../Windows_IIS7.md | 2 +- .../Windows_Platform_Installer.md | 16 +++---- .../04_Directory_Structure.md | 4 +- .../01_Tutorials/01_Building_A_Basic_Site.md | 42 ++++++++---------- .../01_Tutorials/02_Extending_A_Basic_Site.md | 41 ++++++++--------- docs/en/01_Tutorials/03_Forms.md | 21 ++++----- docs/en/01_Tutorials/04_Site_Search.md | 11 ++--- ... 05_Dataobject_Relationship_Management.md} | 26 +++++------ docs/en/01_Tutorials/index.md | 18 ++------ .../01_Templates/06_Themes.md | 2 +- .../03_Forms/How_Tos/Simple_Contact_Form.md | 2 +- docs/en/02_Developer_Guides/14_Files/index.md | 8 ++-- .../03_CMS_Layout.md | 2 +- .../How_Tos/Customise_CMS_Tree.md | 4 +- docs/en/04_Changelogs/2.2.0.md | 2 +- docs/en/04_Changelogs/3.0.0.md | 6 +-- ...ook-front-cover-design-june2009preview.jpg | Bin 5508 -> 0 bytes ...ook-front-cover-design-june2009preview.png | Bin 19027 -> 0 bytes 18 files changed, 97 insertions(+), 110 deletions(-) rename docs/en/01_Tutorials/{05_Dataobject-Relationship_Management.md => 05_Dataobject_Relationship_Management.md} (91%) delete mode 100644 docs/en/_images/silverstripe-cms-book-front-cover-design-june2009preview.jpg delete mode 100644 docs/en/_images/silverstripe-cms-book-front-cover-design-june2009preview.png diff --git a/docs/en/00_Getting_Started/01_Installation/04_Other_installation_Options/Windows_IIS7.md b/docs/en/00_Getting_Started/01_Installation/04_Other_installation_Options/Windows_IIS7.md index adb2f2e33..9a455c1fa 100644 --- a/docs/en/00_Getting_Started/01_Installation/04_Other_installation_Options/Windows_IIS7.md +++ b/docs/en/00_Getting_Started/01_Installation/04_Other_installation_Options/Windows_IIS7.md @@ -154,7 +154,7 @@ Two other important folders to set the permissions on are `assets` and `silverst You will need to give **Modify** permission to **IUSR** user. To do it right click the folder and choose **Properties**. Then open the security tab, press **Edit** and add the **IUSR** user to the list by clicking the **Add** button. Afterwards tick **Modify** under **Allow** for that user. Repeat these steps for each folder. -![](_images/iis7-iusr-permissions.jpg) +![](/_images/iis7-iusr-permissions.jpg) ## Install SilverStripe diff --git a/docs/en/00_Getting_Started/01_Installation/04_Other_installation_Options/Windows_Platform_Installer.md b/docs/en/00_Getting_Started/01_Installation/04_Other_installation_Options/Windows_Platform_Installer.md index f645e451c..10b5c56ae 100644 --- a/docs/en/00_Getting_Started/01_Installation/04_Other_installation_Options/Windows_Platform_Installer.md +++ b/docs/en/00_Getting_Started/01_Installation/04_Other_installation_Options/Windows_Platform_Installer.md @@ -40,11 +40,11 @@ a beta version of the software) ## Screenshots -![](_images/webpi-2-a-silverstripe-choice.jpg) -![](_images/webpi-2-b-dependencies.jpg) -![](_images/webpi-2-c-downloading-and-installaing.jpg) -![](_images/webpi-2-d-installer-questions-step1.jpg) -![](_images/webpi-2-e-installer-questions-step2.jpg) -![](_images/webpi-2-f-success-message.jpg) -![](_images/webpi-2-g-silverstripe-homepage.jpg) -![](_images/webpi-2-h-cms-interface-working.jpg) +![](/_images/webpi-2-a-silverstripe-choice.jpg) +![](/_images/webpi-2-b-dependencies.jpg) +![](/_images/webpi-2-c-downloading-and-installaing.jpg) +![](/_images/webpi-2-d-installer-questions-step1.jpg) +![](/_images/webpi-2-e-installer-questions-step2.jpg) +![](/_images/webpi-2-f-success-message.jpg) +![](/_images/webpi-2-g-silverstripe-homepage.jpg) +![](/_images/webpi-2-h-cms-interface-working.jpg) diff --git a/docs/en/00_Getting_Started/04_Directory_Structure.md b/docs/en/00_Getting_Started/04_Directory_Structure.md index 2b3a524fa..6998592ff 100644 --- a/docs/en/00_Getting_Started/04_Directory_Structure.md +++ b/docs/en/00_Getting_Started/04_Directory_Structure.md @@ -50,7 +50,7 @@ Example Forum: | `forum/code` | PHP code for model and controller (subdirectories are optional) | | ... | ... | -![](_images/modules_folder.jpg) +![](/_images/modules_folder.jpg) ### Module documentation @@ -73,7 +73,7 @@ Example Forum Documentation: | `forum/docs/en/` | English documentation | | `forum/docs/en/index.md` | Documentation homepage. Should provide an introduction and links to remaining docs | | `forum/docs/en/Getting_Started.md` | Documentation page. Naming convention is Uppercase and underscores. | - | `forum/docs/en/_images/` | Folder to store any images or media | + | `forum/docs/en//_images/` | Folder to store any images or media | | `forum/docs/en/Some_Topic/` | You can organise documentation into nested folders. Naming convention is Uppercase and underscores. | |`forum/docs/en/04_Some_Topic/00_Getting_Started.md`|Structure is created by use of numbered prefixes. This applies to nested folders and documentations pages, index.md should not have a prefix.| diff --git a/docs/en/01_Tutorials/01_Building_A_Basic_Site.md b/docs/en/01_Tutorials/01_Building_A_Basic_Site.md index 94fbfb9c5..ffe2f43d4 100644 --- a/docs/en/01_Tutorials/01_Building_A_Basic_Site.md +++ b/docs/en/01_Tutorials/01_Building_A_Basic_Site.md @@ -1,3 +1,4 @@ +title: Building a basic site summary: An overview of the SilverStripe installation and an introduction to creating a web page. # Tutorial 1 - Building a Basic Site @@ -17,9 +18,9 @@ templates - one for the home page, and one for the rest of the site. ## Installation -You need to [download the SilverStripe software](http://www.silverstripe.org/stable-download) and install it to your local machine or to a webserver. +You need to [download the SilverStripe software](http://www.silverstripe.org/software/download) and install it to your local machine or to a webserver. -For more information about installing and configuring a webserver read the [Installation instructions and videos](../installation). +For more information about installing and configuring a webserver read the [Installation instructions and videos](/getting_started/installation). This tutorial uses the SilverStripe CMS default theme 'Simple' which you will find in the themes folder. We will investigate the existing template files that make up the theme as well as create some new files to build upon the theme. @@ -45,13 +46,13 @@ When designing your site you should only need to modify the *mysite*, *themes* a ### User Interface Basics -![](_images/tutorial1_cms-basic.jpg) +![](/_images/tutorial1_cms-basic.jpg) The CMS is the area in which you can manage your site content. You can access the cms at http://localhost/your_site_name/admin (or http://yourdomain.com/admin if you are using your own domain name). You will be presented with a login screen. Login using the details you provided at installation. After logging in you should see the CMS interface with a list of the pages currently on your website (the site tree). Here you can add, delete and reorganize pages. If you need to delete, publish, or unpublish a page, first check "multi-selection" at the top. You will then be able to perform actions on any checked files using the "Actions" dropdown. Clicking on a page will open it in the page editing interface pictured below (we've entered some test content). -![](_images/tutorial1_cms-numbered.jpg) +![](/_images/tutorial1_cms-numbered.jpg) 1. This menu allows you to move between different sections of the CMS. There are four core sections - "Pages", "Files", "Users" and "Settings". If you have modules installed, they may have their own sections here. In this tutorial we will be focusing on the "Pages" section. 2. The breadcrumbs on the left will show you a direct path to the page you are currently looking at. You can use this path to navigate up through a page's hierarchy. On the left there are tabs you may use to flick between different aspects of a page. By default, you should be shown three tabs: "Content", "Settings", and "History". @@ -59,11 +60,11 @@ should see the CMS interface with a list of the pages currently on your website * Settings - Here you set the type of page behavior, parent page, show in search, show in menu, and who can view or edit the page. * History - This allows you to view previous version of your page, compare, change, and revert to previous version if need be. 3. Within the "Pages" section (provided you are in the "Content" or "Settings" tab) you can quickly move between pages in the CMS using the site tree. To collapse and expand this sidebar, click the arrow at the bottom. If you are in the history tab, you will notice the site tree has been replaced by a list of the alterations to the current page. -![](_images/tutorial1_cms-numbered-3.jpg) +![](/_images/tutorial1_cms-numbered-3.jpg) 4. This section allows you to edit the content for the currently selected page, as well as changing other properties of the page such as the page name and URL. The content editor has full [WYSIWYG](http://en.wikipedia.org/wiki/WYSIWYG) capabilities, allowing you to change formatting and insert links, images, and tables. 5. These buttons allow you to save your changes to the draft copy, publish your draft copy, unpublish from the live website, or remove a page from the draft website. The SilverStripe CMS workflow stores two copies of a page, a draft and a published copy. By having separate draft and published copies, we can preview draft changes on the site before publishing them to the live website. You can quickly preview your draft pages without leaving the CMS by clicking the "Preview" button. -![](_images/tutorial1_cms-numbered-5.jpg) +![](/_images/tutorial1_cms-numbered-5.jpg) ### Try it @@ -76,7 +77,7 @@ To create a new page, click the "Add New" button above the site tree. When you create a new page, you are given the option of setting the structure of the page ("Top level" or "Under another page") and the page type. The page type specifies the templates used to render the page, the fields that are able to be edited in the CMS, and page specific behavior. We will explain page types in more depth as we progress; for now, make all pages of the type "Page". -![](_images/tutorial1_addpage.jpg) +![](/_images/tutorial1_addpage.jpg) **SilverStripe's friendly URLs** @@ -86,7 +87,7 @@ page in the database. Note that if you have sub-pages, changing the Top level URL field for a page will affect the URL for all sub-pages. For example, if we changed the URL field "/about-us/" to "/about-silverstripe/" then the sub-pages URLs would now be "/about-silverstripe/URL-of-subpage/" rather than "/about-us/URL-of-subpage/". -![](_images/tutorial1_url.jpg) +![](/_images/tutorial1_url.jpg) When you create a new page, SilverStripe automatically creates an appropriate URL for it. For example, *About Us* will become *about-us*. You are able to change it yourself so that you can make long titles more usable or descriptive. For @@ -181,7 +182,7 @@ Then, using a loop over the page control *Menu(1)*, we add a link to the list fo This creates the navigation at the top of the page: -![](_images/tutorial1_menu.jpg) +![](/_images/tutorial1_menu.jpg) @@ -218,7 +219,7 @@ You can also create the pages elsewhere on the site tree, and drag and drop the Either way, your site tree should now look something like this: -![](_images/tutorial1_2nd_level-cut.jpg) +![](/_images/tutorial1_2nd_level-cut.jpg) Great, we now have a hierarchical site structure! Let's look at how this is created and displayed in our template. @@ -288,7 +289,7 @@ to get the top level page title. In this case, we merely use it to check the exi Both the top menu, and the sidebar menu should be updating and highlighting as you move from page to page. They will also mirror changes done in the SilverStripe CMS, such as renaming pages or moving them around. -![](_images/tutorial1_menu-two-level.jpg) +![](/_images/tutorial1_menu-two-level.jpg) Feel free to experiment with the if and loop statements. For example, you could create a drop down style menu from the top navigation using a combination of if statements, loops, and some CSS to style it. @@ -331,7 +332,7 @@ Earlier we stated that every page in a SilverStripe site has a **page type**, an template, or template layout, corresponding to the page type. Therefore, the first step when switching the homepage template is to create a new page type. Each page type is represented by two PHP classes: a *data object* and a *controller*. Don't worry about the details of page -types right now, we will go into much more detail in the [next tutorial](2-extending-a-basic-site). +types right now, we will go into much more detail in the [next tutorial](/tutorials/extending_a_basic_site). Create a new file *HomePage.php* in *mysite/code*. Copy the following code into it: @@ -357,7 +358,7 @@ After building the database, we can change the page type of the homepage in the In the CMS, navigate to the "Home" page and switch to the "Settings" tab. Change "Page type" to *Home Page*, and click "Save & Publish". -![](_images/tutorial1_homepage-type.jpg) +![](/_images/tutorial1_homepage-type.jpg) Our homepage is now of the page type *HomePage*. Regardless, it is still rendered with the *Page* template. SilverStripe does this as our homepage inherits its type from *Page*, @@ -389,27 +390,20 @@ We'll also replace the title text with an image. Find this line: Your Home page should now look like this: -![](_images/tutorial1_home-template.jpg) +![](/_images/tutorial1_home-template.jpg) SilverStripe first searches for a template in the *themes/simple/templates* folder. Since there is no *HomePage.ss*, it will use the *Page.ss* for both *Page* and *HomePage* page types. When it comes across the *$Layout* tag, it will then descend into the *themes/simple/templates/Layout* folder, and will use *Page.ss* for the *Page* page type, and *HomePage.ss* for the *HomePage* page type. So while you could create a HomePage.ss in the *themes/simple/templates/* it is better to reuse the navigation and footer common to both our Home page and the rest of the pages on our website. -![](_images/tutorial1_subtemplates-diagram.jpg) +![](/_images/tutorial1_subtemplates-diagram.jpg) ## Summary So far we have taken a look at the different areas and functionality within the pages area of the CMS. We have learnt about template variables, controls and if statements and used these to build a basic, but fully functional, website. We have also briefly covered page types, and looked at how they correspond to templates and sub-templates. Using this knowledge, we have customized our website's homepage design. -In the next tutorial, [Extending a Basic Site](2-extending-a-basic-site), we will explore page types on a deeper level, and look at customising our own page types to extend the functionality of SilverStripe. +In the next tutorial, [Extending a Basic Site](/tutorials/extending_a_basic_site), we will explore page types on a deeper level, and look at customising our own page types to extend the functionality of SilverStripe. -[Next tutorial >>](2-extending-a-basic-site) - -## Books on SilverStripe - -* [Official book on SilverStripe in English](http://www.silverstripe.org/silverstripe-book). -* [Official book on SilverStripe in German](http://www.silverstripe.org/das-silverstripe-buch). - -![](_images/silverstripe-cms-book-front-cover-design-june2009preview.jpg) +[Next tutorial >>](/tutorials/extending_a_basic_site) diff --git a/docs/en/01_Tutorials/02_Extending_A_Basic_Site.md b/docs/en/01_Tutorials/02_Extending_A_Basic_Site.md index e25555711..16adf8a65 100644 --- a/docs/en/01_Tutorials/02_Extending_A_Basic_Site.md +++ b/docs/en/01_Tutorials/02_Extending_A_Basic_Site.md @@ -1,3 +1,4 @@ +title: Extending a basic site summary: Building on tutorial 1, a look at storing data in SilverStripe and creating a latest news feed. # Tutorial 2 - Extending a basic site @@ -5,7 +6,7 @@ summary: Building on tutorial 1, a look at storing data in SilverStripe and crea ## Overview -In the [first tutorial (Building a basic site)](1-building-a-basic-site) we learnt how to create a basic site using SilverStripe. This tutorial will build on that, and explore extending SilverStripe by creating our own page types. After doing this we should have a better understanding of how SilverStripe works. +In the [first tutorial (Building a basic site)](/tutorials/building_a_basic_site) we learnt how to create a basic site using SilverStripe. This tutorial will build on that, and explore extending SilverStripe by creating our own page types. After doing this we should have a better understanding of how SilverStripe works. ## What are we working towards? @@ -13,12 +14,12 @@ We are going to work on adding two new sections to the site we built in the firs The first of these new sections will be *News*, with a recent news listing on the homepage and an RSS feed: -![](_images/tutorial2_newslist.jpg) +![](/_images/tutorial2_newslist.jpg) The second will be a *Staff* section, to demonstrate more complex database structures (such as associating an image with each staff member): -![](_images/tutorial2_einstein.jpg) +![](/_images/tutorial2_einstein.jpg) @@ -52,7 +53,7 @@ Creating a new page type requires creating each of these three elements. We will A more in-depth introduction of Model-View-Controller can be found [here](http://www.slash7.com/articles/2005/02/22/mvc-the-most-vexing-conundrum). -![](_images/tutorial2_pagetype-inheritance.jpg) +![](/_images/tutorial2_pagetype-inheritance.jpg) ## Creating the news section page types @@ -118,7 +119,7 @@ it. Add a *$db* property definition in the *ArticlePage* class: } -Every entry in the array is a *key => value* pair. The **key** is the name of the field, and the **value** is the type. See ["data types"](/topics/data-types) for a complete list of types. +Every entry in the array is a *key => value* pair. The **key** is the name of the field, and the **value** is the type. See ["data types and casting"](/developer_guides/model/data_types_and_casting) for a complete list of types.
The names chosen for the fields you add must not already be used. Be careful using field names such as Title, @@ -173,7 +174,7 @@ would create a new tab called "New Tab", and a single "Author" textfield inside.
We have added two fields: A simple `[api:TextField]` and a `[api:DateField]`. -There are many more fields available in the default installation, listed in ["form field types"](/reference/form-field-types). +There are many more fields available in the default installation, listed in ["form field types"](/developer_guides/forms/fields/common_subclasses). :::php return $fields; @@ -183,7 +184,7 @@ Finally, we return the fields to the CMS. If we flush the cache (by adding ?flus Now that we have created our page types, let's add some content. Go into the CMS and create an *ArticleHolder* page named "News", then create a few *ArticlePage*'s within it. -![](_images/tutorial2_news-cms.jpg) +![](/_images/tutorial2_news-cms.jpg) ## Modifing the date field @@ -268,13 +269,13 @@ To access the new fields, we use *$Date* and *$Author*. In fact, all template va spread across several tables in the database matched by id - e.g. *Content* is in the *SiteTree* table, and *Date* and *Author* are in the *ArticlePage* table. SilverStripe matches this data, and collates it into a single data object. -![](_images/tutorial2_data-collation.jpg) +![](/_images/tutorial2_data-collation.jpg) Rather than using *$Date* directly, we use *$Date.Nice*. If we look in the `[api:Date]` documentation, we can see that the *Nice* function returns the date in *dd/mm/yyyy* format, rather than the *yyyy-mm-dd* format stored in the database. -![](_images/tutorial2_news.jpg) +![](/_images/tutorial2_news.jpg) ###ArticleHolder Template We'll now create a template for the article holder. We want our news section to show a list of news items, each with a summary and a link to the main article (our Article Page). @@ -302,12 +303,12 @@ We'll now create a template for the article holder. We want our news section to Here we use the page control *Children*. As the name suggests, this control allows you to iterate over the children of a page. In this case, the children are our news articles. The *$Link* variable will give the address of the article which we can use to create a link, and the *FirstParagraph* function of the `[api:HTMLText]` field gives us a nice summary of the article. The function strips all tags from the paragraph extracted. -![](_images/tutorial2_articleholder.jpg) +![](/_images/tutorial2_articleholder.jpg) ### Using include files in templates -We can make our templates more modular and easier to maintain by separating commonly-used components in to *include files*. We are already familiar with the `<% include Sidebar %>` line from looking at the menu in the [first tutorial (Building a basic site)](1-building-a-basic-site). +We can make our templates more modular and easier to maintain by separating commonly-used components in to *include files*. We are already familiar with the `<% include Sidebar %>` line from looking at the menu in the [first tutorial (Building a basic site)](/tutorials/building_a_basic_site). We'll separate the display of linked articles as we want to reuse this code later on. @@ -350,7 +351,7 @@ And this one to the *HomePage* class: This will change the icons for the pages in the CMS. -![](_images/tutorial2_icons2.jpg) +![](/_images/tutorial2_icons2.jpg)
Note: The `news-file` icon may not exist in a default SilverStripe installation. Try adding your own image or choosing a different one from the `treeicons` collection. @@ -370,7 +371,7 @@ It would be nice to greet page visitors with a summary of the latest news when t } -This function simply runs a database query that gets the latest news articles from the database. By default, this is five, but you can change it by passing a number to the function. See the [Data Model](../topics/datamodel) documentation for details. We can reference this function as a page control in our *HomePage* template: +This function simply runs a database query that gets the latest news articles from the database. By default, this is five, but you can change it by passing a number to the function. See the [Data Model and ORM](/developer_guides/model/data_model_and_orm) documentation for details. We can reference this function as a page control in our *HomePage* template: **themes/simple/templates/Layout/Homepage.ss** @@ -387,7 +388,7 @@ When SilverStripe comes across a variable or page control it doesn't recognize, The controller for a page is only created when page is actually visited, while the data object is available when the page is referenced in other pages, e.g. by page controls. A good rule of thumb is to put all functions specific to the page currently being viewed in the controller; only if a function needs to be used in another page should you put it in the data object. -![](_images/tutorial2_homepage-news.jpg) +![](/_images/tutorial2_homepage-news.jpg) @@ -412,7 +413,7 @@ This function creates an RSS feed of all the news articles, and outputs it to th Depending on your browser, you should see something like the picture below. If your browser doesn't support RSS, you will most likely see the XML output instead. For more on RSS, see `[api:RSSFeed]` -![](_images/tutorial2_rss-feed.jpg) +![](/_images/tutorial2_rss-feed.jpg) Now all we need is to let the user know that our RSS feed exists. Add this function to *ArticleHolder_Controller*: @@ -479,12 +480,12 @@ We then add an `[api:UploadField]` in the *getCMSFields* function to the tab "Ro the *addFieldToTab* function will create it for us. The *UploadField* allows us to select an image or upload a new one in the CMS. -![](_images/tutorial2_photo.jpg) +![](/_images/tutorial2_photo.jpg) Rebuild the database ([http://localhost/your_site_name/dev/build](http://localhost/your_site_name/dev/build)) and open the CMS. Create a new *StaffHolder* called "Staff", and create some *StaffPage*s in it. -![](_images/tutorial2_create-staff.jpg) +![](/_images/tutorial2_create-staff.jpg) ### Creating the staff section templates @@ -517,7 +518,7 @@ This template is very similar to the *ArticleHolder* template. The *SetWidth* me will resize the image before sending it to the browser. The resized image is cached, so the server doesn't have to resize the image every time the page is viewed. -![](_images/tutorial2_staff-section.jpg) +![](/_images/tutorial2_staff-section.jpg) The *StaffPage* template is also very straight forward. @@ -538,10 +539,10 @@ The *StaffPage* template is also very straight forward. Here we use the *SetWidth* method to get a different sized image from the same source image. You should now have a complete staff section. -![](_images/tutorial2_einstein.jpg) +![](/_images/tutorial2_einstein.jpg) ## Summary In this tutorial we have explored the concept of page types. In the process of creating and extending page types we have covered many of the concepts required to build a site with SilverStripe. -[Next Tutorial >>](3-forms) +[Next Tutorial >>](/tutorials/forms) diff --git a/docs/en/01_Tutorials/03_Forms.md b/docs/en/01_Tutorials/03_Forms.md index 1049d25f0..cdf344752 100644 --- a/docs/en/01_Tutorials/03_Forms.md +++ b/docs/en/01_Tutorials/03_Forms.md @@ -1,18 +1,19 @@ +title: Forms summary: Capture and store user information through web forms. # Tutorial 3 - Forms ## Overview -This tutorial is intended to be a continuation of the first two tutorials ([first tutorial](1-building-a-basic-site), [second tutorial](2-extending-a-basic-site)). In this tutorial we will build on the site we developed in the earlier tutorials and explore forms in SilverStripe. We will look at custom coded forms: forms which need to be written in PHP. +This tutorial is intended to be a continuation of the first two tutorials ([first tutorial](/tutorials/building_a_basic_site), [second tutorial](/tutorials/extending_a_basic_site)). In this tutorial we will build on the site we developed in the earlier tutorials and explore forms in SilverStripe. We will look at custom coded forms: forms which need to be written in PHP. -Instead of using a custom coded form, we could use the [userforms module](http://silverstripe.org/user-forms-module). This module allows users to construct forms via the CMS. A form created this way is much quicker to implement, but also lacks the flexibility of a coded form. +Instead of using a custom coded form, we could use the [userforms module](http://addons.silverstripe.org/add-ons/silverstripe/userforms). This module allows users to construct forms via the CMS. A form created this way is much quicker to implement, but also lacks the flexibility of a coded form. ## What are we working towards? We will create a poll on the home page that asks the user their favourite web browser, and displays a bar graph of the results. -![tutorial:tutorial3_pollresults.png](_images/tutorial3_pollresults.jpg) +![tutorial:tutorial3_pollresults.png](/_images/tutorial3_pollresults.jpg) ## Creating the form @@ -162,7 +163,7 @@ Add the following code to the existing `form.css` file: All going according to plan, if you visit [http://localhost/your_site_name/home/?flush=1](http://localhost/your_site_name/home/?flush=1) it should look something like this: -![](_images/tutorial3_pollform.jpg) +![](/_images/tutorial3_pollform.jpg) ## Processing the form @@ -170,7 +171,7 @@ All going according to plan, if you visit [http://localhost/your_site_name/home/ Great! We now have a browser poll form, but it doesn't actually do anything. In order to make the form work, we have to implement the 'doBrowserPoll()' method that we told it about. First, we need some way of saving the poll submissions to the database, so we can retrieve the results later. We can do this by creating a new object that extends from `[api:DataObject]`. -If you recall, in the [second tutorial](2-extending-a-basic-site) we said that all objects that inherit from DataObject and have their own fields are stored in tables the database. Also recall that all pages extend DataObject indirectly through `[api:SiteTree]`. Here instead of extending SiteTree (or `[api:Page]`) to create a page type, we will extend `[api:DataObject]` directly: +If you recall, in the [second tutorial](/tutorials/extending_a_basic_site) we said that all objects that inherit from DataObject and have their own fields are stored in tables the database. Also recall that all pages extend DataObject indirectly through `[api:SiteTree]`. Here instead of extending SiteTree (or `[api:Page]`) to create a page type, we will extend `[api:DataObject]` directly: **mysite/code/BrowserPollSubmission.php** @@ -223,7 +224,7 @@ Change the end of the 'BrowserPollForm' function so it looks like this: If we then open the homepage and attempt to submit the form without filling in the required fields errors should appear. -![](_images/tutorial3_validation.jpg) +![](/_images/tutorial3_validation.jpg) ## Showing the poll results @@ -270,7 +271,7 @@ Although the form is not shown, you'll still see the 'Browser Poll' heading. We' Now that we're collecting data, it would be nice to show the results on the website as well. We could simply output every vote, but that's boring. Let's group the results by browser, through the SilverStripe data model. -In the [second tutorial](/tutorials/2-extending-a-basic-site), we got a collection of news articles for the home page by using the 'ArticleHolder::get()' function, which returns a `[api:DataList]`. We can get all submissions in the same fashion, through `BrowserPollSubmission::get()`. This list will be the starting point for our result aggregation. +In the [second tutorial](/tutorials/extending_a_basic_site), we got a collection of news articles for the home page by using the 'ArticleHolder::get()' function, which returns a `[api:DataList]`. We can get all submissions in the same fashion, through `BrowserPollSubmission::get()`. This list will be the starting point for our result aggregation. Create the function 'BrowserPollResults' on the *HomePage_Controller* class. @@ -347,10 +348,10 @@ and the poll results need to be displayed. We use the normal tactic of putting the data into an unordered list and using CSS to style it, except here we use inline styles to display a bar that is sized proportionate to the number of votes the browser has received. You should now have a complete poll. -![](_images/tutorial3_pollresults.jpg) +![](/_images/tutorial3_pollresults.jpg) ## Summary -In this tutorial we have explored custom php forms, and displayed result sets through Grouped Lists. We have briefly covered the different approaches to creating and using forms. Whether you decide to use the [userforms module](http://silverstripe.org/user-forms-module) or create a form in PHP depends on the situation and flexibility required. +In this tutorial we have explored custom php forms, and displayed result sets through Grouped Lists. We have briefly covered the different approaches to creating and using forms. Whether you decide to use the [userforms module](http://addons.silverstripe.org/add-ons/silverstripe/userforms) or create a form in PHP depends on the situation and flexibility required. -[Next Tutorial >>](4-site-search) +[Next Tutorial >>](/tutorials/site_search) diff --git a/docs/en/01_Tutorials/04_Site_Search.md b/docs/en/01_Tutorials/04_Site_Search.md index f575b43d0..af6223a5b 100644 --- a/docs/en/01_Tutorials/04_Site_Search.md +++ b/docs/en/01_Tutorials/04_Site_Search.md @@ -1,16 +1,17 @@ +title: Site Search summary: Enable website search. How to handle paged result sets and the SearchForm class. # Tutorial 4 - Site Search ## Overview -This is a short tutorial demonstrating how to add search functionality to a SilverStripe site. It is recommended that you have completed the earlier tutorials ([Building a basic site](1-building-a-basic-site), [Extending a basic site](2-extending-a-basic-site), [Forms](3-forms)), especially the tutorial on forms, before attempting this tutorial. While this tutorial will add search functionality to the site built in the previous tutorials, it should be straight forward to follow this tutorial on any site of your own. +This is a short tutorial demonstrating how to add search functionality to a SilverStripe site. It is recommended that you have completed the earlier tutorials ([Building a basic site](/tutorials/building_a_basic_site), [Extending a basic site](/tutorials/extending_a_basic_site), [Forms](/tutorials/forms)), especially the tutorial on forms, before attempting this tutorial. While this tutorial will add search functionality to the site built in the previous tutorials, it should be straight forward to follow this tutorial on any site of your own. ## What are we working towards? We are going to add a search box on the top of the page. When a user types something in the box, they are taken to a results page. -![](_images/tutorial4_search.jpg) +![](/_images/tutorial4_search.jpg) ## Creating the search form @@ -45,7 +46,7 @@ To add the search form, we can add `$SearchForm` anywhere in our templates. In t This displays as: -![](_images/tutorial4_searchbox.jpg) +![](/_images/tutorial4_searchbox.jpg) ## Showing the results @@ -151,10 +152,10 @@ class. Then finally add ?flush=1 to the URL and you should see the new template. -![](_images/tutorial4_search.jpg) +![](/_images/tutorial4_search.jpg) ## Summary This tutorial has demonstrated how easy it is to have full text searching on your site. To add search to a SilverStripe site add a search form, a results page, and you're done! -[Next Tutorial >>](5-dataobject-relationship-management) +[Next Tutorial >>](/tutorials/dataobject_relationship_management) diff --git a/docs/en/01_Tutorials/05_Dataobject-Relationship_Management.md b/docs/en/01_Tutorials/05_Dataobject_Relationship_Management.md similarity index 91% rename from docs/en/01_Tutorials/05_Dataobject-Relationship_Management.md rename to docs/en/01_Tutorials/05_Dataobject_Relationship_Management.md index 425ef9ff5..0c2ac88c0 100644 --- a/docs/en/01_Tutorials/05_Dataobject-Relationship_Management.md +++ b/docs/en/01_Tutorials/05_Dataobject_Relationship_Management.md @@ -5,7 +5,7 @@ summary: Learn how to create custom DataObjects and how to build interfaces for ## Overview -This tutorial explores the relationship and management of [DataObjects](/topics/datamodel#relations). It builds on the [second tutorial](2-extending-a-basic-site) where we learnt how to define +This tutorial explores the relationship and management of [DataObjects](/developer_guides/model/dataobject). It builds on the [second tutorial](/tutorials/extending_a_basic_site) where we learnt how to define additional fields on our models, and attach images to them. ## What are we working towards? @@ -61,8 +61,8 @@ Let's create the `Student` and `Project` objects. The relationships are defined through the `$has_one` and `$has_many` properties on the objects. The array keys declares the name of the relationship, -the array values contain the class name (see the ["database structure"](/reference/database-structure) -and ["datamodel"](/topics/datamodel) topics for more information). +the array values contain the class name (see the ["database structure"](/developer_guides/model/database_structure) +and ["datamodel"](/developer_guides/model/data_model_and_orm) topics for more information). As you can see, only the `Project` model extends `Page`, while `Student` is a plain `DataObject` subclass. @@ -106,7 +106,7 @@ as part of the normal page hierarchy in the CMS. Now that we have created our `ProjectsHolder` and `Project` page types, we'll add some content. Go into the CMS and create a `ProjectsHolder` page named **Projects**. -Then create one `Project` page for each project listed [above](#what-are-we-working-towards). +Then create one `Project` page for each project listed [above](/tutorials/dataobject_relationship_management#what-are-we-working-towards). ### Data Management Interface: GridField @@ -170,17 +170,17 @@ We call `setDisplayFields()` directly on the component responsible for their ren using the `[ModelAdmin](reference/modeladmin)` interface instead.
-![tutorial:tutorial5_project_creation.jpg](_images/tutorial5_project_creation.jpg) +![tutorial:tutorial5_project_creation.jpg](/_images/tutorial5_project_creation.jpg) Select each `Project` page you have created before, go in the tab panel called "Students", and add all students as required, by clicking on the link **Add Student** of your *GridField* table. -![tutorial:tutorial5_addNew.jpg](_images/tutorial5_addNew.jpg) +![tutorial:tutorial5_addNew.jpg](/_images/tutorial5_addNew.jpg) Once you have added all the students, and selected their projects, it should look a little like this: -![tutorial:tutorial5_students.jpg](_images/tutorial5_students.jpg) +![tutorial:tutorial5_students.jpg](/_images/tutorial5_students.jpg) ### Many-many relationships: Mentor @@ -250,18 +250,18 @@ In the CMS, open one of your `Project` pages and select the "Mentors" tab. Add all the mentors listed [above](#what-are-we-working-towards) by clicking on the **Add Mentor** button. -![tutorial:tutorial5_module_creation.jpg](_images/tutorial5_module_creation.jpg) +![tutorial:tutorial5_module_creation.jpg](/_images/tutorial5_module_creation.jpg) -To associate the mentor with a project, select one of the mentors, and click on the projects tab. Add all the projects a mentor is associated with (see the [list](#What_are_we_working_towards?)), by typing the name in "Find Projects by Page name" and clicking the "Link Existing" button. +To associate the mentor with a project, select one of the mentors, and click on the projects tab. Add all the projects a mentor is associated with (see the [list](/tutorials/dataobject_relationship_management#What_are_we_working_towards?)), by typing the name in "Find Projects by Page name" and clicking the "Link Existing" button. You will notice that you are able to select the same `Project` for multiple mentors. This is the definition of a **many-to-many** relation. -![tutorial:tutorial5_module_selection.jpg](_images/tutorial5_module_selection.jpg) +![tutorial:tutorial5_module_selection.jpg](/_images/tutorial5_module_selection.jpg) ## Website Display -Now that we have created all the *Page* and *DataObject* classes necessary and the relational tables to manage the [relations](/topics/datamodel#relations) between them, we would like to see these relations on the website. We will see in this section how to display all these relations, +Now that we have created all the *Page* and *DataObject* classes necessary and the relational tables to manage the [relations](/developer_guides/model/data_model_and_orm#relations) between them, we would like to see these relations on the website. We will see in this section how to display all these relations, but also how to create a template for a *DataObject*. For every kind of *Page* or *DataObject*, you can access to their relations thanks to the **control** loop. @@ -276,7 +276,7 @@ accessing a "has-many" and "many-many" relationship in the template loops: to the template, it's just a named list of object. -![tutorial:tutorial5_projects_table.jpg](_images/tutorial5_projects_table.jpg) +![tutorial:tutorial5_projects_table.jpg](/_images/tutorial5_projects_table.jpg) **themes/simple/templates/Layout/ProjectsHolder.ss** @@ -334,7 +334,7 @@ Creating the detail view for each `Project` page works in a very similar way. Given that we're in the context of a single project, we can access the "Students" and "Mentors" relationships directly in the template. -![tutorial:tutorial5_project.jpg](_images/tutorial5_project.jpg) +![tutorial:tutorial5_project.jpg](/_images/tutorial5_project.jpg) **themes/simple/templates/Layout/Project.ss** diff --git a/docs/en/01_Tutorials/index.md b/docs/en/01_Tutorials/index.md index 6683d8417..3c9079596 100644 --- a/docs/en/01_Tutorials/index.md +++ b/docs/en/01_Tutorials/index.md @@ -3,24 +3,14 @@ introduction: The tutorials below take a step by step look at how to build a Sil ## Written Tutorials - * [Tutorial 1: Building a basic site](1-building-a-basic-site): An introduction to building a site with -SilverStripe. - * [Tutorial 2: Extending a basic site](2-extending-a-basic-site): A tutorial that builds on "Building a basic -site". - * [Tutorial 3: Forms](3-forms): An introduction to forms in SilverStripe. - * [Tutorial 4: Site Search](4-site-search): Learn how to add search to your site. - * [Tutorial 5: Dataobject Relationship Management](5-dataobject-relationship-management): Learn how to create -simple data relationships. +[CHILDREN] ## Video tutorials -* [Installing on Linux](http://silverstripe.org/assets/screencasts/Tutorial-InstallingLinux-DM08.swf) -* [Installing on Mac OSX (using MAMP)](http://silverstripe.org/assets/screencasts/Tutorial-InstallingMAMP-SW08.swf) -* [Installing a module (e.g. a blog)](http://silverstripe.org/assets/screencasts/Tutorial-InstallingBlogModule-DM08.swf) -* [Customising the CMS (adding new fields)](http://silverstripe.org/assets/screencasts/Tutorial-ChangingFields-DM08.swf) +* [How to set up a local development environment in SilverStripe](https://vimeo.com/108861537) ## Help: If you get stuck - * [Common Problems](/installation/common-problems): Review some existing solutions to common problems. - * [SilverStripe Forums](http://www.silverstripe.com/silverstripe-forum/): Head over to the forums and ask the community + * [Common Problems](/getting_started/installation/common_problems): Review some existing solutions to common problems. + * [SilverStripe Community Forums](http://www.silverstripe.org/community/forums/): Head over to the forums and ask the community for help. diff --git a/docs/en/02_Developer_Guides/01_Templates/06_Themes.md b/docs/en/02_Developer_Guides/01_Templates/06_Themes.md index 1ba1ce5e1..02e9ef192 100644 --- a/docs/en/02_Developer_Guides/01_Templates/06_Themes.md +++ b/docs/en/02_Developer_Guides/01_Templates/06_Themes.md @@ -45,7 +45,7 @@ the Site Configuration panel (http://yoursite.com/admin/settings) A `theme` within SilverStripe is simply a collection of templates and other front end assets such as javascript and css. located within the `themes` directory. -![themes:basicfiles.gif](/_images/basicfiles.gif) +![themes:basicfiles.gif](//_images/basicfiles.gif) ## Submitting your theme to SilverStripe diff --git a/docs/en/02_Developer_Guides/03_Forms/How_Tos/Simple_Contact_Form.md b/docs/en/02_Developer_Guides/03_Forms/How_Tos/Simple_Contact_Form.md index 9b1c5a060..5b506a453 100644 --- a/docs/en/02_Developer_Guides/03_Forms/How_Tos/Simple_Contact_Form.md +++ b/docs/en/02_Developer_Guides/03_Forms/How_Tos/Simple_Contact_Form.md @@ -55,7 +55,7 @@ The reason it's standard practice to name the form function 'Form' is so that we If you now create a ContactPage in the CMS (making sure you have rebuilt the database and flushed the templates /dev/build?flush=all) and visit the page, you will now see a contact form. -![](../_images/howto_contactForm.jpg) +![](..//_images/howto_contactForm.jpg) Now that we have a contact form, we need some way of collecting the data submitted. We do this by creating a function on the controller with the same name as the form action. In this case, we create the function 'submit' on the ContactPage_Controller class. diff --git a/docs/en/02_Developer_Guides/14_Files/index.md b/docs/en/02_Developer_Guides/14_Files/index.md index ec0deaf5b..56535646e 100644 --- a/docs/en/02_Developer_Guides/14_Files/index.md +++ b/docs/en/02_Developer_Guides/14_Files/index.md @@ -21,19 +21,19 @@ All files, images and folders in the 'assets' directory are stored in the databa If you have the CMS module installed, you can manage files, folders and images in the "Files" section of the CMS. Inside this section, you will see a list of files and folders like below: -![](/_images/assets.png) +![](//_images/assets.png) You can click on any file to edit it, or click on any folder to open it. To delete a file or a folder, simply click the red 'X' symbol next to it. If you click to open a folder, you can go back up one level by clicking the 'up' arrow above the folder name (highlighted below): -![](/_images/assets_up.png) +![](//_images/assets_up.png) Once you click to edit a file, you will see a form similar to the one below, in which you can edit the file's title, filename, owner, or even change which folder the file is located in: -![](/_images/assets_editform.png) +![](//_images/assets_editform.png) You may also notice the 'Sync files' button (highlighted below). This button allows CMS users to 'synchronise' the database (remember, all files/folders are stored as database records) with the filesystem. This is particularly useful if someone has uploaded or removed files/folders via FTP, for example. -![](/_images/assets_sync.png) +![](//_images/assets_sync.png) ## Upload diff --git a/docs/en/02_Developer_Guides/15_Customising_the_Admin_Interface/03_CMS_Layout.md b/docs/en/02_Developer_Guides/15_Customising_the_Admin_Interface/03_CMS_Layout.md index 45929c356..ef9eceea2 100644 --- a/docs/en/02_Developer_Guides/15_Customising_the_Admin_Interface/03_CMS_Layout.md +++ b/docs/en/02_Developer_Guides/15_Customising_the_Admin_Interface/03_CMS_Layout.md @@ -39,7 +39,7 @@ example, the tab panels have be applied in the CMS form before the form itself i avoid incorrect dimensions. -![Layout variations](_images/cms-architecture.png) +![Layout variations](/_images/cms-architecture.png) ## Layout API diff --git a/docs/en/02_Developer_Guides/15_Customising_the_Admin_Interface/How_Tos/Customise_CMS_Tree.md b/docs/en/02_Developer_Guides/15_Customising_the_Admin_Interface/How_Tos/Customise_CMS_Tree.md index 64aefc98b..306871748 100644 --- a/docs/en/02_Developer_Guides/15_Customising_the_Admin_Interface/How_Tos/Customise_CMS_Tree.md +++ b/docs/en/02_Developer_Guides/15_Customising_the_Admin_Interface/How_Tos/Customise_CMS_Tree.md @@ -41,7 +41,7 @@ code like this: ... By applying the proper style sheet, the snippet html above could produce the look of: -![Page Node Screenshot](../_images/tree_node.png "Page Node") +![Page Node Screenshot](..//_images/tree_node.png "Page Node") SiteTree is a `[api:DataObject]` which is versioned by `[api:Versioned]` extension. Each node can optionally have publication status flags, e.g. "Removed from draft". @@ -76,6 +76,6 @@ __Example: using a subclass__ The above subclass of `[api:SiteTree]` will add a new flag for indicating its __'Scheduled To Publish'__ status. The look of the page node will be changed -from ![Normal Page Node](../_images/page_node_normal.png) to ![Scheduled Page Node](../_images/page_node_scheduled.png). The getStatusFlags has an `updateStatusFlags()` +from ![Normal Page Node](..//_images/page_node_normal.png) to ![Scheduled Page Node](..//_images/page_node_scheduled.png). The getStatusFlags has an `updateStatusFlags()` extension point, so the flags can be modified through `DataExtension` rather than inheritance as well. Deleting existing flags works by simply unsetting the array key. diff --git a/docs/en/04_Changelogs/2.2.0.md b/docs/en/04_Changelogs/2.2.0.md index 050ff61bb..80577b52c 100644 --- a/docs/en/04_Changelogs/2.2.0.md +++ b/docs/en/04_Changelogs/2.2.0.md @@ -48,7 +48,7 @@ Special attention will need to be given to custom sections on a case-by-case bas As we have changed the design of the CMS, the top bar for your custom sections is no longer needed. We've moved the buttons that it once held down to the bottom. -![](_images/cms22screenie.jpg) +![](/_images/cms22screenie.jpg) ### Classes added to 2.2 that may conflict diff --git a/docs/en/04_Changelogs/3.0.0.md b/docs/en/04_Changelogs/3.0.0.md index e310842ff..7c46cca84 100644 --- a/docs/en/04_Changelogs/3.0.0.md +++ b/docs/en/04_Changelogs/3.0.0.md @@ -403,8 +403,8 @@ We have also moved all fields from the "Metadata" tab into the "Main Content" ta $fields->addFieldToTab('Root.Main', $myField); $fields->addFieldToTab('Root.Main', $myOtherField); -![Tab paths in 2.4](_images/tab-paths-before.png) -![Tab paths in 3.0](_images/tab-paths-after.png) +![Tab paths in 2.4](/_images/tab-paths-before.png) +![Tab paths in 3.0](/_images/tab-paths-after.png) The old paths are rewritten automatically, but will be deprecated in the next point release. If you are working with tab objects directly in your `FieldSet`, you'll need to update @@ -421,7 +421,7 @@ to reduce UI clutter. You still need to address it through the usual tabset meth as the underlying object structure doesn't change. Once you add more tabs, e.g. to the "Root.Main" tab in `SiteTree`, the tab bar automatically shows. -![Tab paths in 3.0 with a custom tab](_images/tab-paths-customtab.png) +![Tab paths in 3.0 with a custom tab](/_images/tab-paths-customtab.png) ### New `SiteTree::$description` field to describe purpose of a page type [sitetree-description]### diff --git a/docs/en/_images/silverstripe-cms-book-front-cover-design-june2009preview.jpg b/docs/en/_images/silverstripe-cms-book-front-cover-design-june2009preview.jpg deleted file mode 100644 index 8b796c41c88b47b909eae422c8ba4a7420fad959..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5508 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