diff --git a/.travis.yml b/.travis.yml
index 512d222..05421d9 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -3,12 +3,31 @@ language: php
php:
- '7.1'
+branches:
+ only:
+ - master
+
cache:
directories:
- $HOME/.composer/cache
+ - $HOME/.npm
+
+before_install:
+ - nvm install 8
install:
- composer update --prefer-dist --no-interaction --prefer-stable --no-suggest
+ - npm update
script:
+ - php apprentice build
+ - npm run prod
- vendor/bin/phpunit
+
+deploy:
+ provider: pages
+ skip-cleanup: true
+ local-dir: .build
+ target-branch: gh-pages
+ on:
+ branch: master
diff --git a/assets/css/site.css b/assets/css/site.css
index fca5648..18ac72d 100644
--- a/assets/css/site.css
+++ b/assets/css/site.css
@@ -56,6 +56,9 @@ button {
button:hover {
color: $primary-color-dark;
}
+button:focus {
+ outline: 0;
+}
button .icon {
vertical-align: middle;
}
@@ -124,7 +127,7 @@ button:hover .icon svg {
.grid-toc {
display: grid;
grid-template-columns: 2fr 1fr;
- grid-column-gap: 3em;
+ grid-column-gap: 1em;
}
.navigate-links {
margin: 1em 0;
@@ -215,3 +218,22 @@ button:hover .icon svg {
from {left: -300px; opacity: 0}
to {left: 0; opacity: 1}
}
+.logo-404 {
+ max-width: 200px;
+ max-height: 200px;
+ margin: 0 auto;
+ display: block;
+}
+.logo-404 svg {
+ max-width: 200px;
+ max-height: 200px;
+}
+.toc-404 {
+ max-width: 250px;
+ margin: 0 auto;
+}
+.message-404 {
+ font-size: 2em;
+ margin: 0 auto;
+ text-align: center;
+}
diff --git a/assets/templates/404.phtml b/assets/templates/404.phtml
new file mode 100644
index 0000000..737b62d
--- /dev/null
+++ b/assets/templates/404.phtml
@@ -0,0 +1,11 @@
+ 'PHP Apprentice']) ?>
+
+
+
+
diff --git a/code/classes-visibility.php b/code/classes-visibility.php
index e69de29..24e1d90 100644
--- a/code/classes-visibility.php
+++ b/code/classes-visibility.php
@@ -0,0 +1,43 @@
+number = $number;
+ }
+}
+
+// We cannot set the number using "$phone->number = '123-456-7890'".
+// Instead, we can use the public method.
+$phone = new Phone();
+$phone->setNumber('123-456-7890');
+
+// Making an attribute or function private, gives you more control over the data in the object.
+// For example, we could prevent a number being set if it starts with a 7.
+class Phone2
+{
+ private $number;
+
+ public function setNumber($number)
+ {
+ if (substr($number, 0, 1) !== '7') {
+ $this->number = $number;
+ }
+ }
+}
+
+// The "protected" and "private" keywords work a little differently, but we
+// will learn more about "protected" when we discuss inheritance.
+// However, they both prevent functions and properties from being accessed outside an object.
+class Phone3
+{
+ private $number;
+ protected $caller;
+}
diff --git a/code/classes.php b/code/classes.php
index f568ce5..c3e6a19 100644
--- a/code/classes.php
+++ b/code/classes.php
@@ -24,9 +24,15 @@ $bike = new Bicycle();
$bike->color = 'Blue';
echo $bike->color . "\n";
+// An instance of a class is called an object. Congratulations!
+// You are now performing object-oriented development.
+$redBike = new Bicycle();
+$redBike->color = 'Red';
+echo $redBike->color . " Bike Object\n";
+
// A method is a function attached to the class. You can add a method
// to a class by using the "public" keyword followed by the function. A method
-// can access the attributes and methods of the instance using the "$this" variable.
+// can access the attributes and methods of an object instance using the "$this" variable.
class Tricycle
{
public $color;
diff --git a/config.php b/config.php
index a71f8d7..b77d917 100644
--- a/config.php
+++ b/config.php
@@ -10,6 +10,7 @@ return [
'pages' => [
Page::create('index', 'index.phtml'),
Page::create('credits', 'credits.phtml'),
+ Page::create('404', '404.phtml'),
Page::create('basics', null, 'basics.php', [
'title' => 'Basics',
'subtitle' => 'Getting started',
diff --git a/src/Build.php b/src/Build.php
index efe3fcb..50b8d5e 100644
--- a/src/Build.php
+++ b/src/Build.php
@@ -76,6 +76,10 @@ class Build
}
$output = $this->getOutput($template, $page->variables);
+ if (!file_exists(config('output_dir'))) {
+ mkdir(config('output_dir'));
+ }
+
file_put_contents(config('output_dir') . '/' . $page->name . '.html', $output);
return $output;