Tải bản đầy đủ (.pdf) (368 trang)

SilverStripe 2.4 Module Extension, Themes, and Widgets Beginner''''s Guide potx

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (10.21 MB, 368 trang )

www.it-ebooks.info


SilverStripe 2.4 Module Extension,
Themes, and Widgets
Beginner's Guide

Create smashing SilverStripe applications by extending
modules, creating themes, and adding widgets

Philipp Krenn

BIRMINGHAM - MUMBAI

www.it-ebooks.info


SilverStripe 2.4 Module Extension, Themes, and Widgets
Beginner's Guide

Copyright © 2011 Packt Publishing

All rights reserved. No part of this book may be reproduced, stored in a retrieval system,
or transmitted in any form or by any means, without the prior written permission of the
publisher, except in the case of brief quotations embedded in critical articles or reviews.
Every effort has been made in the preparation of this book to ensure the accuracy of the
information presented. However, the information contained in this book is sold without
warranty, either express or implied. Neither the author, nor Packt Publishing, and its dealers
and distributors will be held liable for any damages caused or alleged to be caused directly or
indirectly by this book.
Packt Publishing has endeavored to provide trademark information about all of the


companies and products mentioned in this book by the appropriate use of capitals. However,
Packt Publishing cannot guarantee the accuracy of this information.

First published: May 2011

Production Reference: 1260411

Published by Packt Publishing Ltd.
32 Lincoln Road
Olton
Birmingham, B27 6PA, UK.
ISBN 978-1-849515-00-9
www.packtpub.com

Cover Image by Filippo ()

www.it-ebooks.info


Credits
Author
Philipp Krenn
Reviewers
Aaron Carlino

Project Coordinator
Michelle Quadros
Proofreader
Dan McMahon


Ingo Schommer
Sigurd Magnusson

Indexer
Tejal Daruwale

Acquisition Editor
Tarun Singh

Production Coordinator
Aparna Bhagat

Development Editor
Meeta Rajani

Cover Work
Aparna Bhagat

Technical Editors
Aaron Rosario
Hithesh Uchil

www.it-ebooks.info


About the Author
Philipp Krenn studies software engineering at the University of Technology, Vienna. At the
moment, he is writing his thesis on current database trends. Besides that, he's working as a
freelance IT trainer and web developer, mostly using SilverStripe, but also Drupal, CakePHP,
and Smarty.

He started using SilverStripe in 2007 as one of the Google Summer of Code students
improving the project, beginning with the effort to support multiple databases (besides
MySQL). During this, he got a detailed insight into the inner workings of the project. Since
then he's been in love with SilverStripe...
Philipp is currently employed at the University of Technology, Vienna as diplomate for an
industry project and as IT training manager at Splendit IT Consulting GmbH. When doing
freelance work he's frequently working for men on the moon GmbH, on SilverStripe projects,
or as IT trainer for SPC GmbH.
Even when working on something inspiring, writing a book is actually hard
work—lo and behold ;-).
Therefore a huge THANK YOU to the people making it possible!
Packt Publishing for channeling my enthusiasm into something useful,
while helping wherever they could. "Danke" to Michelle Quadros for
making our schedule work out, and also Tarun Singh, Meeta Rajani,
Hithesh Uchil, and Aaron Rosario for keeping me on the right track.
Ingo Schommer from SilverStripe Ltd. lent more than one helping hand
in the creation of this book. Additionally he and my other two reviewers
Sigurd Magnusson (SilverStripe Ltd.) and Aaron Carlino (Bluehouse Group)
provided crucial input—without you the book would only be half as good.
Last but not least my girl, family, and friends, who lost me for months to
writing this book. Without you providing the right background this would
have been impossible!

www.it-ebooks.info


About the Reviewers
Aaron Carlino is a web developer who is better known in the SilverStripe community by
his whimsical pseudonym "Uncle Cheese". He has been doing web development since 2005,
and has found his niche in SilverStripe programming after an exhaustive search for a content

management solution that was welcoming to developers and would stay out of his way.
Since then, he has established a strong reputation in the SilverStripe community as a mentor,
support provider, and, most notably, a contributor of some of the application's most popular
modules including DataObjectManager, ImageGallery, and Uploadify.
During the day, he is employed full-time at Bluehouse Group as lead SilverStripe developer,
surrounded by a team of talented designers, programmers, and HTML developers. At
Bluehouse Group, he has worked on several sophisticated web applications built on
SilverStripe, including All Earth Renewables, ISI, and Yestermorrow. In his spare time, he
keeps his SilverStripe thirst quenched by entertaining a variety of freelance projects which
range from ad-hoc support work for his modules to full-featured web applications, including
Xetic.org. In addition, he has almost always worked on new open-source contributions to the
SilverStripe CMS, because, quite frankly, he can't get enough of it.
When he is not coding, he usually thinks about what he'd like to code, and when he's not
doing that, he enjoys cooking (and subsequently photographing) all kinds of delicious foods.
He is also a talented guitar player and French speaker, as well as a connoisseur of all things
Elvis Costello. He lives a blessed and charmed life in beautiful northwestern Vermont with his
wife and shih-tzu, Oscar.

Ingo Schommer is a senior developer at SilverStripe Ltd. in Wellington, New Zealand. He
is responsible for large scale web application development. Not entirely by chance, he is
also a core team member and release manager for the SilverStripe project. Originally hailing
from Germany, he was co-author of the first SilverStripe book in his native tongue, quickly
followed by an English translation. He's always keen to spread the word about his favorite
CMS, and hence thrilled to see a Packt publication on this topic.

www.it-ebooks.info


Sigurd Magnusson is one of the three co-founders of SilverStripe Ltd (http://
silverstripe.com/). He has been in this business for more than ten years and currently


focuses on sales and marketing. He's been living and breathing the Internet since 1995, when
his city council provided the only local internet service, entirely text-based at the time. The
potential of the Internet piqued his interest and he began learning computer programming.
While his days at SilverStripe are no longer spent propgramming, he continues to be deeply
interested in the technology advances of the Web. Sigurd is an evangelist for the principles
and technology of the Web, and is an avid supporter of open source, open data, and the
Web as a modern software platform.
He is very familiar with both the commercial and open source segments of the web content
management industry, and he influences the direction of the open source SilverStripe CMS
and Sapphire framework.
Off the Web, he enjoys spending time with his family, cross-country mountain biking in New
Zealand, and experiencing foreign cultures.

www.it-ebooks.info


www.PacktPub.com
Support files, eBooks, discount offers and more

You might want to visit www.PacktPub.com for support files and downloads related to
your book.
Did you know that Packt offers eBook versions of every book published, with PDF and ePub
files available? You can upgrade to the eBook version at www.PacktPub.com and as a print
book customer, you are entitled to a discount on the eBook copy. Get in touch with us at
for more details.
At www.PacktPub.com, you can also read a collection of free technical articles, sign up
for a range of free newsletters and receive exclusive discounts and offers on Packt books
and eBooks.




Do you need instant solutions to your IT questions? PacktLib is Packt's online digital book
library. Here, you can access, read and search across Packt's entire library of books. 

Why Subscribe?


Fully searchable across every book published by Packt



Copy and paste, print and bookmark content



On demand and accessible via web browser

Free Access for Packt account holders
If you have an account with Packt at www.PacktPub.com, you can use this to access
PacktLib today and view nine entirely free books. Simply use your login credentials for
immediate access.

www.it-ebooks.info


www.it-ebooks.info


Table of Contents

Preface
Chapter 1: Principles and Concepts

1
7

Why SilverStripe
CMS and framework
Openness and interoperability
Getting your job done
The file structure
assets/
cms/
googlesitemaps/
mysite/
sapphire/
themes/
SilverStripe's ecosystem
The company behind SilverStripe
Documentation

8
8
9
9
10
10
10
11
11

11
11
11
12
12

User help
Developer documentation wiki
API documentation

13
14
14

Community

15

Forum
IRC chat
Development mailing list
Bug tracker
Twitter

15
16
16
16
17


Summary

17

Chapter 2: Customizing the Layout
Templates and themes
Switching between themes
Time for action – change the default theme
Getting more themes

www.it-ebooks.info

19
20
20
20
22


Table of Contents

Template engine
Another template engine?
Taking a look at BlackCandy
CSS

22
22
23
23


editor.css
layout.css, form.css, and typography.css
ie6.css

23
24
24

Templates

24

Learning the very basics
Starting to use templates

24
25

Time for action – using site title and slogan
Layout
Includes
Page control overview
More placeholders
Casting placeholders
Security
Date formatting

25
26

27
27
28
30
30
31

Users
Control structures

32
33

Handle with care
Embedding and linking files
Comments and base tag
Conditional statements
Control statements

33
34
34
35
36

BlackCandy revisited
Creating our own theme
Time for action – files and folders for a new theme
Basic layout
File themes/bar/templates/Page.ss

Time for action – the base page
File themes/bar/templates/Layout/Page.ss
Time for action – the layout page
The includes: BasicInfo.ss, Menu.ss, and Footer.ss
Time for action – the includes
What's next?
Not finding the #*?~^ error?
Adding interactive features
Time for action – let users share our page on Facebook and Twitter
Taking care of search engines
Semantic HTML
Meaningful URLs
Broken links
[ ii ]

www.it-ebooks.info

38
40
40
40
41
42
43
44
44
44
46
47
49

49
51
51
52
52


Table of Contents

Duplicate content
Meta tags
Validation
Sitemap
Summary

53
53
53
53
54

Chapter 3: Getting "Control" of Your System
Model View Controller (MVC)
Why the big fuss?
View: Presenting your content
Model: Managing your data
Controller: Providing your logic
Taking a look at an example
Structure of a Page
Page.php: Your initial start

Convention over configuration revisited
Extending classes is key
Coding conventions
Using the Controller
Path constants
The default page class
Setting up CSS
Including CSS files

57
57
58
59
59
59
60
60
60
61
62
62
65
65
66
66
67

Time for action – adding a print style

67


Combining CSS files

68

Time for action – reducing HTTP requests for CSS files
Adding custom CSS
Taking care of Internet Explorer

68
69
70

Time for action – add your own head tags
Setting up JavaScript
Including Google Analytics

70
71
71

Time for action – adding custom JavaScript in the Controller
Blocking files

71
72

Time for action – removing JavaScript in the Controller
Where to include CSS and JavaScript
Coding conventions

Coding
Indentation
Curly braces
Check before looping
Keeping the Controller clean
Comments

72
73
73
73
73
74
74
74
74

Methods

76

Static methods

76
[ iii ]

www.it-ebooks.info


Table of Contents

Action handler methods
Template methods
Object methods

76
77
77

Variables
Element order
Spam protecting e-mail addresses
Controller
Template
CMS
URL variables and parameters
Activating changes
Debugging

78
78
78
79
79
80
80
80
81

Template
Controller

Request
Debug

81
81
82
82

Performance
Debugging the code
Adding an Intro page
Summary

82
83
84
90

Chapter 4: Storing and Retrieving Information
DBPlumber
Your new best friend: DBPlumber
Time for action – installing DBPlumber
From a database's point of view
Adding custom fields to a page
Time for action – putting content into the database
More data types and their form fields
Global custom fields
Configuration
Code
Database fields

Accessing properties in the CMS

91
91
92
93
94
96
96
100
102
102
102
103
103

Template
Synchronize the database and you're ready to go
How database values are fetched
Pushing
Pulling
Taking the Model further
Removing unused Page types
Showing the Page type in the Page Tree
Adding an image

104
105
106
106

107
107
108
109
109

[ iv ]

www.it-ebooks.info


Table of Contents
Don't change the file ending
Using constants

110
110

More SiteTree magic
Cleaning up content fields
Setting a meta title prefix
Managing relations
Time for action – linking pages together
Definition
Adding relationships to the CMS
Using it in the template
Complex relationships
Queries
Security


111
111
113
113
113
115
115
115
116
117
118

Casting
Escaping

118
119

Debugging queries
Visible or invisible?
In the Model
In the Controller
Summary

119
120
120
120
121


Chapter 5: Customizing Your Installation
Configuration in general
Default settings
Environment
dev
test
live
Defining a development server
Server-wide configurations
Logging
Logging information

123
123
124
125
125
126
126
127
127
128
129

Error levels
SilverStripe and PHP errors
Website errors

130
130

131

Notification of errors
Securing the logs
Templates
Security
Customizing the CMS
Removing tabs
Rebranding the CMS
Loading add-ons

133
133
133
135
135
135
136
136
[]

www.it-ebooks.info


Table of Contents

WYSIWYG
Switching to HTML
Removing buttons
Adding buttons

Configuring plugins
Options
Comments and spam
Math questions
Akismet
Other measures
E-mail
Miscellaneous settings
Accessing and advertising content
Allowing file extensions
Customizing Breadcrumbs
Image quality
JavaScript validators
Defines
Time for action – building our own configuration
Managing your code
Version control system
VCS basics
Using Git in your project
Manual upgrade of core files
Automatic upgrade of core files
Contributing back

136
137
137
137
138
138
139

139
139
139
140
140
140
141
141
141
141
141
142
143
143
144
145
146
147
147

Summary

148

Chapter 6: Adding Some Spice with Widgets and Short Codes
Widget or short code?
Creating our own widget
Time for action – embracing Facebook
Widgets in general
Facebook graph API

Connecting pages and widgets

149
150
150
151
156
156
157

$SideBar
What about the intro page?

157
157

Facebook feed widget

158

Facebook output
The logic in general
Taking a look at the details
The template
The other template

158
160
162
164

164
[ vi ]

www.it-ebooks.info


Table of Contents

More widgets
Text parser
Time for action – doing it "right"
Caching
Partial caching
Static publisher
Static exporter
Restful service
Partial caching
Example
Time for action – caching

165
166
166
167
167
168
168
168
169
169

169

Configuration
Controller
Template
General considerations

170
170
170
171

More on partial caching
Carefully test your cache settings
Cache directory
Performance gains

173
173
175
176

Server-side
Client-side

176
177

Creating our own short code
Time for action – how to find us

What do we want to achieve?
Configuration
Model

178
178
182
182
183

General composition
Example-specific code

183
183

Template
Common pitfalls
Go forth and build your own
Summary

184
184
185
186

Chapter 7: Advancing Further with Inheritance and Modules
Enhancing the intro page
Time for action – adding the required modules
Time for action – extending the backend functionality

Introducing the DataObject class
SiteTree
DataObject
DataObjectDecorator

187
187
188
190
194
194
194
195

Making DataObjects sortable
Adding our DataObject to the intro page

195
195

Storing required information in the database

195

[ vii ]

www.it-ebooks.info


Table of Contents

Providing a field in the CMS

196

Time for action – integrating our changes into the frontend
Working with images
Image functions
Images in the Controller
Images in the View

197
198
199
200
200

Image galleries
Time for action – creating our own image gallery in the CMS
A single gallery image
Image gallery container
Time for action – our image gallery in the frontend
Image gallery template
Transforming our code into a module
Creating a module
Required changes
Time for action – adapting the module
Time for action - integrating the module into our page
Contribute back to the community
Summary


Chapter 8: Introducing Forms

202
203
206
207
207
210
211
211
212
212
217
218
219

221

Building a contact form
Time for action – creating a basic contact form
The backend
Including our form in the frontend
Creating an e-mail template
The frontend
The e-mail template
The Model
The Controller
Setting up the form
Processing the input
Sending the e-mail

Handling the success page
Convention of method names

222
222
223
226
226
228
229
229
230
230
232
233
233
234

Renting a table
Going "abstract"
Time for action – extending our form with abstraction
The backend
Changes in the template file
Update the e-mail template
Abstract
Model

235
235
236

236
240
240
242
242

[ viii ]

www.it-ebooks.info


Table of Contents
Controller

242

Implementation
Adding client-side validation
Default client-side validation
Enhanced client-side validation
Time for action – using jQuery's Validation plugin on the contact page
jQuery's Validation plugin

242
243
243
244
244
247


Time for action – using jQuery's Validation plugin on the rent page
Setting up the Datepicker

248
253

Should you add JavaScript to the Controller?
Tougher server-side validation
Time for action – better server-side validation
Summary

Chapter 9: Taking Forms a Step Further
Searching our pages
Time for action – adding search functionality to our page
The Controller part of the code
The View part of the code
Customizing forms even further
Overwriting the global template
Handcrafting forms with SilverStripe
Saving data to the database
Time for action – extending the member card form
The Model part of the code
Setting up the fields
New arguments for TextField
OptionsetField
CheckboxField
DateField options

254
255

255
258

259
259
260
265
266
267
267
269
271
271
279
279
279
280
280
281

Checking for invalid data and duplicate e-mail addresses
Saving a new entry to the database
Field types overview
ConfirmedPasswordField
HiddenField
More
Checking the e-mail address for uniqueness
Time for action – checking the e-mail's uniqueness with Ajax
Doing more with sessions
Time for action – using the session in forms

How to store members in the database
Summary
[ ix ]

www.it-ebooks.info

281
282
283
284
284
284
285
285
288
288
289
290


Table of Contents

Chapter 10: Targeting the Whole World
Globalization in general
Globalization in the CMS
Time for action – configuring the CMS for globalization
Globalization in the code
Localizing and internationalizing the templates
Starting our globalization efforts


291
291
293
293
297
299
300

Time for action – globalizing the intro page
Generating locale files

300
304

Localizing and internationalizing the PHP code
Time for action – translating the rent form
Localizing and internationalizing JavaScript
Time for action – translating the rent form's JavaScript
Getting the right content
Time for action – switching the locale
Where to go from here
More modules
Adding more ideas and features to your page
Summary

Pop Quiz Answers

305
305
311

312
317
317
320
320
323
323

325

Chapter 2, Customizing the Layout
Pop quiz—placeholders
Pop quiz—say hello to the current user
Chapter 3, Getting "Control" of Your System
Pop quiz—duplication or not?
Pop quiz—basic principles
Chapter 5, Customizing Your Installation
Pop quiz—environment types
Chapter 6, Adding Some Spice with Widgets and Short Codes
Pop quiz—too many options?
Chapter 7, Advancing Further with Inheritance and Modules
Pop quiz—SiteTree, DataObject, or DataObjectDecorator
Chapter 8, Introducing Forms
Pop quiz—true or false
Chapter 9, Taking Forms a Step Further
Pop quiz—advanced forms
Chapter 11, Targeting the Whole World
Pop quiz—if / when should you globalize

Index


325
325
325
326
326
327
327
327
328
328
329
329
329
329
330
330
331
331

333

[]

www.it-ebooks.info


Preface
SilverStripe CMS is an open source web content management system used by governments,
businesses, and non-profit organizations around the world. It is a powerful tool for professional

web development teams, and web content authors rave about how easy it is to use.
This book is a beginner-friendly introduction to SilverStripe and the only printed
documentation for the current 2.4 release. While it starts off nice and easy, we progress fast,
covering both SilverStripe's intuitive CMS and powerful framework. We'll show you how to
easily extend the core system with your own themes, widgets, and modules by gradually
building and extending a graphic example. This unique book helps both frontend designers
and backend programmers to make the most of SilverStripe.

What this book covers

Chapter 1, Principles and Concepts introduces the software's distinct features, namely
being both a framework and a CMS. Additionally, the general approach and structure are
described, as well as the ecosystem supporting both developers and users.
Chapter 2, Customizing the Layout takes an in-depth look at SilverStripe's template engine.
It explains how to build and customize your own layout. The code created here will be
extended over the later chapters, providing a simple but already useful introduction. Finally,
the chapter teaches how to optimize your search engine ranking with the help of the CMS.
Chapter 3, Getting "Control" of Your System explains the underlying architecture of the
framework: Model View Controller (MVC). Building on the View role from the previous
chapter, this one covers the Controller. Specifically how to create your own page types.
Chapter 4, Storing and Retrieving Information explores the Model, the third and final MVC
role. SilverStripe provides custom database abstraction, allowing developers to focus on
object-oriented code only. Building on this knowledge, you'll learn how to add custom
data to the example project.

www.it-ebooks.info


Preface


Chapter 5, Customizing Your Installation introduces the most important configuration
options. These include settings both for the CMS and the underlying framework, for example
configuring the rich-text editor, logging, security, and much more.
Chapter 6, Adding Some Spice with Widgets and Short Codes covers SilverStripe's widget
system. Specifically it shows how to automatically fetch data from Facebook and how to
integrate it into the example project, allowing content editors simply to drag-and-drop
content into different pages.
Chapter 7, Advancing Further with Inheritance and Modules takes a look at (object-oriented)
inheritance and how to make the most of it in combination with modules. A very popular
module is used and you'll further extend it, teaching you how to modularize and reuse code.
Chapter 8, Introducing Forms makes our site more interactive. It introduces forms and how
to easily handle them in SilverStripe. This covers both server and client side validation, how
to process inputs and the built-in e-mail capabilities.
Chapter 9, Taking Forms a Step Further broadens the concepts from the previous chapter. It
adds a general search functionality and then focuses on storing user provided inputs in the
database. Additionally validation concepts are explored further.
Chapter 10, Targeting the Whole World introduces SilverStripe's powerful globalization
features. You'll learn how to take advantage of them in the framework and the CMS,
removing language barriers while still keeping it simple.
Chapter 11, Creating an Application turns the focus from the public facing website to a
fully featured application in the background. Specifically you'll learn how to easily manage
data in the CMS and you'll delve deeper into architectural decisions impacting the whole
development. This chapter is available along with the code download for this book.
Appendix A, Installing SilverStripe introduces beginners to SilverStripe's installation process.
You'll learn how to install SilverStripe itself, as well as how to set up development and live
environments for your sites. This chapter is available along with the code download for
this book.

Who this book is for


If you are a SilverStripe developer and want to learn the nooks and crannies of developing
fully-featured SilverStripe web applications, then this book is for you. Building upon your
knowledge of PHP, HTML, and CSS, this book will take you to the next level of SilverStripe
development. The book assumes basic experience with SilverStripe.

[]

www.it-ebooks.info


Preface

Conventions

In this book, you will find a number of styles of text that distinguish between different
kinds of information. Here are some examples of these styles, and an explanation of
their meaning.
Code words in text are shown as follows: "To include a JavaScript file, instead of plain HTML,
you can use <% require javascript(sapphire/thirdparty/jquery/jquerypacked.js) %>."
A block of code is set as follows:
public static $has_one = array(
'SideBar' => 'WidgetArea',
);
public function getCMSFields(){
$fields = parent::getCMSFields();
$fields->addFieldToTab(
'Root.Content.Widgets',
new WidgetAreaEditor('SideBar')
);
return $fields;

}

When we wish to draw your attention to a particular part of a code block, the relevant lines
or items are set in bold:
public static $has_one = array(
'SideBar' => 'WidgetArea',
);
public function getCMSFields(){
$fields = parent::getCMSFields();
$fields->addFieldToTab(
'Root.Content.Widgets',
new WidgetAreaEditor('SideBar')
);
return $fields;
}

Any command-line input or output is written as follows:
pear upgrade --alldeps

[]

www.it-ebooks.info


Preface

New terms and important words are shown in bold. Words that you see on the screen, in
menus or dialog boxes for example, appear in the text like this: "clicking the Next button
moves you to the next screen".
Warnings or important notes appear in a box like this.


Tips and tricks appear like this.

Reader feedback

Feedback from our readers is always welcome. Let us know what you think about this
book—what you liked or may have disliked. Reader feedback is important for us to
develop titles that you really get the most out of.
To send us general feedback, simply send an e-mail to , and
mention the book title via the subject of your message.
If there is a book that you need and would like to see us publish, please send us a note in the
SUGGEST A TITLE form on www.packtpub.com or e-mail
If there is a topic that you have expertise in and you are interested in either writing or
contributing to a book, see our author guide on www.packtpub.com/authors.

Customer support

Now that you are the proud owner of a Packt book, we have a number of things to help you
to get the most from your purchase.

Downloading the example code for this book

The author mantains an updated repository for this title's code bundle, downloadable
from You can also visit
for additional support.

[]

www.it-ebooks.info



Preface

Errata
Although we have taken every care to ensure the accuracy of our content, mistakes do
happen. If you find a mistake in one of our books—maybe a mistake in the text or the
code—we would be grateful if you would report this to us. By doing so, you can save other
readers from frustration and help us improve subsequent versions of this book. If you
find any errata, please report them by visiting />selecting your book, clicking on the errata submission form link, and entering the details of
your errata. Once your errata are verified, your submission will be accepted and the errata
will be uploaded on our website, or added to any list of existing errata, under the Errata
section of that title. Any existing errata can be viewed by selecting your title from
/>
Piracy
Piracy of copyright material on the Internet is an ongoing problem across all media. At Packt,
we take the protection of our copyright and licenses very seriously. If you come across any
illegal copies of our works, in any form, on the Internet, please provide us with the location
address or website name immediately so that we can pursue a remedy.
Please contact us at with a link to the suspected
pirated material.
We appreciate your help in protecting our authors, and our ability to bring you
valuable content.

Questions
You can contact us at if you are having a problem with any
aspect of the book, and we will do our best to address it.

[]

www.it-ebooks.info



www.it-ebooks.info


×