Slide 1

Slide 1 text

DIVING DEEP INTO CRAFT PLUGINS CRAFT CMS SUMMIT - APRIL 22 2015

Slide 2

Slide 2 text

SUNNY ZONE - EPIPELAGIC PLUGIN LANDSCAPE 660 ft TWILIGHT ZONE - MESOPELAGIC PLUGIN BASICS 3300 ft DARK ZONE - BATHYPELAGIC PLUGIN STRUCTURE 13,200 ft ABYSS - ABYSSOPELAGIC PLUGIN CRUD 19,800 ft TRENCH - HADOPELAGIC PLUGIN TIPS AND TRICKS 36,000 ft

Slide 3

Slide 3 text

DOCKING - HOME BASE SEA LEVEL 0 ft HI, I’M ADAM I CRAFT

Slide 4

Slide 4 text

DOCKING - HOME BASE SEA LEVEL 0 ft PHOTOGRAPHER > DESIGNER > FRONTEND > BACKEND Unicorn/split brain/jack of all trades - master of none

Slide 5

Slide 5 text

DOCKING - HOME BASE SEA LEVEL 0 ft TAECHO GROUP taechogroup.com craftpl.us CRAFT PLUS (+ SUPER SECRET CRAFT PROJECT I CAN’T TALK ABOUT YET!)

Slide 6

Slide 6 text

DOCKING - HOME BASE SEA LEVEL 0 ft PUBLIC PRIVATE MY PLUGINS CASPER Blank slate plugin CRAFT NAV Flexible Navigation New version coming soon! LEMMINGS Plugin dev kick starter New version coming soon! 404 FINDER Record 404 errors STRIPE SUBSCRIPTIONS Monthly subscription service EVENT CHECKIN APP IP & Location recording VENDOR APPLICATIONS Approvals & Rejections EVENTBRITE SYNC User/data creation

Slide 7

Slide 7 text

SUNNY ZONE - EPIPELAGIC PLUGIN LANDSCAPE 660 ft 260+ CRAFT PLUGINS!* *KNOWN AND RELEASED https:/ /straightupcraft.com/craft-plugins

Slide 8

Slide 8 text

SUNNY ZONE - EPIPELAGIC PLUGIN LANDSCAPE 660 ft ADMIN HELPERS Extend your admin PUBLIC FACING Content helpers, forms etc. ECOMMERCE Quick overview

Slide 9

Slide 9 text

SUNNY ZONE - EPIPELAGIC PLUGIN LANDSCAPE 660 ft ADMIN HELPERS CONTROL PANEL CSS By: Double Secret Agency https:/ /github.com/lindseydiloreto/craft-cpcss/ Control panel CSS allows you to customize the control panel to your liking in a very clean way. You can change colors, show/hide elements and style the admin panel for clients.

Slide 10

Slide 10 text

SUNNY ZONE - EPIPELAGIC PLUGIN LANDSCAPE 660 ft ADMIN HELPERS https:/ /github.com/lindseydiloreto/craft-matrixcolors/ MATRIX COLORS By: Double Secret Agency Easily identify your matrix blocks, by assigning a different color for each block type...

Slide 11

Slide 11 text

SUNNY ZONE - EPIPELAGIC PLUGIN LANDSCAPE 660 ft ADMIN HELPERS https:/ /github.com/jmuspratt/craft-fieldguide/ FIELD GUIDE By: James Muspratt Field Guide adds a tab to your Dashboard that lists all your fields in a single page, grouped by section. Matrix sub-fields are displayed in indented rows and and all field names are linked to their editing pages.

Slide 12

Slide 12 text

SUNNY ZONE - EPIPELAGIC PLUGIN LANDSCAPE 660 ft ADMIN HELPERS https:/ /github.com/engram-design/FieldManager/ FIELD MANAGER By: Josh Crawford Field Manager is a Craft CMS plugin to help make it easy to manage your fields and field groups. ..functionality revolves around cloning fields and field groups

Slide 13

Slide 13 text

SUNNY ZONE - EPIPELAGIC PLUGIN LANDSCAPE 660 ft ADMIN HELPERS https:/ /github.com/focuslabllc/craft-field-cheat-sheet CRAFT FIELD CHEAT SHEET By: Erik Reagan The Craft Field Cheat Sheet brings code samples into context to the site you're actually working on. The code you're shown actually uses your custom field names rather than sample field names.

Slide 14

Slide 14 text

SUNNY ZONE - EPIPELAGIC PLUGIN LANDSCAPE 660 ft ADMIN HELPERS https:/ /straightupcraft.com/craft-plugins/cp-nav CONTROL PANEL NAV By: Josh Crawford Control Panel Nav is a Craft CMS plugin to help manage your Control Panel navigation.

Slide 15

Slide 15 text

SUNNY ZONE - EPIPELAGIC PLUGIN LANDSCAPE 660 ft ADMIN HELPERS https:/ /github.com/davist11/craft-reroute/ REROUTE By: Trevor Davis Manage 301/302 redirects in the control panel.

Slide 16

Slide 16 text

SUNNY ZONE - EPIPELAGIC PLUGIN LANDSCAPE 660 ft ADMIN HELPERS https:/ /dukt.net/craft/analytics ANALYTICS By: Dukt Analytics plugin connects to Google Analytics and displays colorful report widgets of your website's activity. The widget lets you explore most of your Google Analytics statistics, track your visitors in real-time, and pin the important data that you want to keep under your eyes.

Slide 17

Slide 17 text

SUNNY ZONE - EPIPELAGIC PLUGIN LANDSCAPE 660 ft PUBLIC FACING https:/ /craftpl.us/plugins/smart-map/ SMART MAP By: Double Secret Agency Easily manage geographic points & maps!- Render a Google map of your locations - Sort your locations from closest to farthest- Add marker info bubbles - Completely customize your maps- Automatically detect your user's location - And much more good stuff!

Slide 18

Slide 18 text

SUNNY ZONE - EPIPELAGIC PLUGIN LANDSCAPE 660 ft PUBLIC FACING http:/ /sprout.barrelstrengthdesign.com/craft-plugins/forms SPROUT FORMS By: Barrelstrengthdesign Use Sprout Forms to create forms for Contacts, Projects, Leads, Surveys, Contests, Registration, RSVPs, or whatever else you need. Add any number of fields to your forms and create as many forms as you want.

Slide 19

Slide 19 text

SUNNY ZONE - EPIPELAGIC PLUGIN LANDSCAPE 660 ft PUBLIC FACING https:/ /github.com/xodigital/Formerly/ FORMERLY By: Marty Wallace Allow users to build their own forms and view form submissions

Slide 20

Slide 20 text

SUNNY ZONE - EPIPELAGIC PLUGIN LANDSCAPE 660 ft PUBLIC FACING https:/ /github.com/ehousestudio/craft_hacksaw/ HACKSAW By: Ryan Shrum A migrated (and improved) version (for Craft CMS) of Brett DeWoody's Hacksaw for ExpressionEngine. This plugin adds a Twig filter to take your entry's content and whittle it down to a more manageable size. It strips the HTML and limits the excerpts by character count, word count or cutoff marker.

Slide 21

Slide 21 text

SUNNY ZONE - EPIPELAGIC PLUGIN LANDSCAPE 660 ft PUBLIC FACING https:/ /craftpl.us/plugins/pic-puller-for-instagram PIC PULLER FOR INSTAGRAM By: John F Morton Integrates Instagram into your Craft site. Easily add image and video feeds for your site. Use the Instagram Image Browser Fieldtype to add images and video into your Craft entries.

Slide 22

Slide 22 text

SUNNY ZONE - EPIPELAGIC PLUGIN LANDSCAPE 660 ft ECOMMERCE http:/ /craftcms.stackexchange.com/questions/299/what-is-the-current- landscape-regarding-e-commerce-plugins-for-craft/301#301 WHAT IS THE CURRENT LANDSCAPE REGARDING E-COMMERCE PLUGINS FOR CRAFT?

Slide 23

Slide 23 text

SUNNY ZONE - EPIPELAGIC PLUGIN LANDSCAPE 660 ft ECOMMERCE http:/ /sprout.barrelstrengthdesign.com/craft-plugins/commerce SPROUT ECOMMERCE By: Barrelstrengthdesign Manage your products with a clean, intuitive interface and all the power of Craft Sections and custom fields. Your products and orders exist right alongside your web content, giving you fine-grained control over how you integrate your e-commerce needs with your content. IN BETA

Slide 24

Slide 24 text

SUNNY ZONE - EPIPELAGIC PLUGIN LANDSCAPE 660 ft ECOMMERCE http:/ /squarebit.co.uk/software/craft/charge CHARGE By: Squarebit Charge is the best way to add Stripe payments to your Craft site. Sell your digital products direct on your Craft site. After successful payment you can deliver any digital files to the user safely and securely.

Slide 25

Slide 25 text

SUNNY ZONE - EPIPELAGIC PLUGIN LANDSCAPE 660 ft ECOMMERCE http:/ /buildwithmarket.com/ MARKET By: Market Market seeks to grow into the most sophisticated and easy to use commerce plugin. Currently in beta, we have a fantastic platform to build on. From simple products, to complex products with variations and options, Market can handle it all. IN BETA

Slide 26

Slide 26 text

SUNNY ZONE - EPIPELAGIC PLUGIN LANDSCAPE 660 ft ECOMMERCE https:/ /github.com/snipcart/snipcart-craft-webhooks-plugin SNIPTCART By: Charles Ouellet Sample plugin to allow inventory management in a Craft application using Snipcart. 3RD PARTY SERVICE

Slide 27

Slide 27 text

SUNNY ZONE - EPIPELAGIC PLUGIN LANDSCAPE 660 ft ECOMMERCE https:/ /github.com/FoxyCart/foxycart-craft FOXYCART By: Charles Ouellet This plugin adds in a number of FoxyCart features to Craft to make it easier for you to add a FoxyCart powered checkout to your site 3RD PARTY SERVICE

Slide 28

Slide 28 text

SUNNY ZONE - EPIPELAGIC PLUGIN LANDSCAPE 660 ft ECOMMERCE https:/ /github.com/lindseydiloreto/craft-moltin MOLTIN PLUGIN By: Double Secret Agency Moltin is a cutting-edge eCommerce solution. While relatively young, it's built upon a single, brilliant concept: a comprehensive eCommerce API. All of the front-end components are left for you to design at will. 3RD PARTY SERVICE

Slide 29

Slide 29 text

TWILIGHT ZONE - MESOPELAGIC PLUGIN BASICS 3300 ft buildwithcraft.com/docs/plugins/introduction Plugin Basics PRIMARY PLUGIN CLASS The primary plugin class lets you install and enable your plugin.
 Start here 1 VARIABLES Public facing info or actions {{ craft.pluginName.variable }} 2 3 SERVICES Core functionality of your plugin craft()->serviceHandle->methodName() CONTROLLERS 4 HTTP Requests
 Middle man between actions & services MODELS 5 Models represent your stored data RECORDS 6 Install and record data inside the Craft database

Slide 30

Slide 30 text

TWILIGHT ZONE - MESOPELAGIC PLUGIN BASICS 3300 ft buildwithcraft.com/docs/plugins/introduction Other plugin types Not happy with the 18 different fields craft gives you out of the box? 
 Build your own. _ [ ] FIELD TYPES DASHBOARD WIDGETS Provide overview data to the dashboard that you can see when you first login. Keep it simple.

Slide 31

Slide 31 text

TWILIGHT ZONE - MESOPELAGIC PLUGIN BASICS 3300 ft Choose a name that’s easy to remember Plugin names should be 1 word or an abbreviation

Slide 32

Slide 32 text

TWILIGHT ZONE - MESOPELAGIC PLUGIN BASICS 3300 ft Lets get some things out of the way. 1. Plugins must have unique names (folder names and handles) 2. Plugins must have a primary Plugin Class before they can be installed or enabled 3. Plugins can run functions on init() or after events happen in Craft 4. Plugins can be used to embed custom variables like {{ craft.pluginName.variable }} 5. Plugins utilize their own templates to build out custom areas in the Craft Admin area 6. Plugins can act as field types and dashboard widgets 7. Plugins run custom actions that can be triggered manually or upon hooks and events Plugin Basics

Slide 33

Slide 33 text

TWILIGHT ZONE - MESOPELAGIC PLUGIN BASICS 3300 ft Building a Craft Plugin Download or follow along at 
 github.com/mccombs/Craft-Plugin-Sample

Slide 34

Slide 34 text

TWILIGHT ZONE - MESOPELAGIC PLUGIN BASICS 3300 ft

Slide 35

Slide 35 text

TWILIGHT ZONE - MESOPELAGIC PLUGIN BASICS 3300 ft If so your plugin should be display below. (Admin area -> Settings -> Plugins) Are things working?

Slide 36

Slide 36 text

DARK ZONE - BATHYPELAGIC PLUGIN STRUCTURE 13,200 ft Things so different yet so the same Traditional MVC vs. Craft The brains of the operation.
 Organize data for output. CONTROLLER Ready for the world to see. Templates & HTML VIEW Data storage, data queries
 Manipulation and control. MODEL TRADITIONAL MVC DATABASE BROWSER

Slide 37

Slide 37 text

DARK ZONE - BATHYPELAGIC PLUGIN STRUCTURE 13,200 ft Things so different yet so the same Traditional MVC vs. Craft THE CRAFT WAY Install and recording RECORD 1 to 1 with records MODEL Typically point to services VARIABLE Always accessible SERVICE Grab actions and call services CONTROLLER Forms & actions ACTION URLS Embed your variables PUBLIC TEMPLATES Work with your plugin ADMIN TEMPLATES

Slide 38

Slide 38 text

DARK ZONE - BATHYPELAGIC PLUGIN STRUCTURE 13,200 ft Things so different yet so the same Traditional MVC vs. Craft THE CRAFT WAY Install and recording RECORD 1 to 1 with records MODEL Typically point to services VARIABLE Always accessible SERVICE Grab actions and call services CONTROLLER Forms & actions ACTION URLS Embed your variables PUBLIC TEMPLATES Work with your plugin ADMIN TEMPLATES MODEL CONTROLLER VIEW

Slide 39

Slide 39 text

DARK ZONE - BATHYPELAGIC PLUGIN STRUCTURE 13,200 ft

Slide 40

Slide 40 text

DARK ZONE - BATHYPELAGIC PLUGIN STRUCTURE 13,200 ft Give your plugin life within the Craft Admin panel Building an Admin Template Step 1) - Add “hasCpSection()” to your primary plugin class

Slide 41

Slide 41 text

DARK ZONE - BATHYPELAGIC PLUGIN STRUCTURE 13,200 ft Give your plugin life within the Craft Admin panel Building an Admin Template Step 1) - Add “hasCpSection()” to your primary plugin class Step 2) - Create a “templates” folder with an “index.html” file

Slide 42

Slide 42 text

DARK ZONE - BATHYPELAGIC PLUGIN STRUCTURE 13,200 ft Give your plugin life within the Craft Admin panel Building an Admin Template Step 1) - Add “hasCpSection()” to your primary plugin class Step 2) - Create a “templates” folder with an “index.html” file Step 3) - Inside “index.html” include the following {% extends '_layouts/cp' %} {% set tabs = { index: { 
 label: “Index"|t, url: url('sample/') }, } %} {% set title = "Sample Plugin" %} {% set selectedTab = 'index' %} {% set content %}

h1 Heading

{% endset %}

Slide 43

Slide 43 text

DARK ZONE - BATHYPELAGIC PLUGIN STRUCTURE 13,200 ft The url follows the plugin name and folder structure /admin/sample Admin index page

Slide 44

Slide 44 text

DARK ZONE - BATHYPELAGIC PLUGIN STRUCTURE 13,200 ft Give your plugin life within the Craft Admin panel Building an Admin Template {% extends '_layouts/cp' %} {% set tabs = { index: { 
 label: “Index"|t, url: url('sample/') }, } %} {% set title = "Sample Plugin" %} {% set selectedTab = 'index' %} {% set content %}

h1 Heading

{% endset %} Link to within other plugin pages you create Set tabs (array) Give your template page a name Set title Which tab should be identified as selected? Set selectedTab Your amazing content Set content This tells Craft which template to load Extends ‘_layout’

Slide 45

Slide 45 text

DARK ZONE - BATHYPELAGIC PLUGIN STRUCTURE 13,200 ft Run your own layouts with this vacation Admin Template - Variation {% extends "sample/_layout" %} {% set title = "Sample Plugin" %} {% set selectedTab = 'index' %} {% set content %}

h1 Heading

{% endset %} Inside “index.html”

Slide 46

Slide 46 text

DARK ZONE - BATHYPELAGIC PLUGIN STRUCTURE 13,200 ft Run your own layouts with this vacation Admin Template - Variation {% extends '_layouts/cp' %} {% set tabs = { dashboard: { label: “Dashboard"|t, url: url('casper/') }, } %} // Add Plugin resources here Inside “_layout.html”

Slide 47

Slide 47 text

ABYSS - ABYSSOPELAGIC PLUGIN CRUD 19,800 ft RECORD > MODEL > SERVICE > CONTROLLER > VARIABLE We’re going to create a quick CRUD Plugin


Slide 48

Slide 48 text

ABYSS - ABYSSOPELAGIC PLUGIN CRUD 19,800 ft Time to start recording some data Creating a record Create a records folder with a “SampleRecord.php” file inside array( AttributeType::String, 'required' => true), 'desc' => array( AttributeType::String, 'column' => ColumnType::Text), ); } } This will do two things 1) Upon Plugin install Craft will create this new table 2) The table created will create the defined attributes

Slide 49

Slide 49 text

ABYSS - ABYSSOPELAGIC PLUGIN CRUD 19,800 ft Matching up with our records Creating a model AttributeType::String, 'desc' => AttributeType::String ); } }

Slide 50

Slide 50 text

ABYSS - ABYSSOPELAGIC PLUGIN CRUD 19,800 ft We need to access our data Creating a service db->createCommand() ->select('*') ->from('sample') ->where('') ->queryAll(); return $samples; } } Return all of our samples so we can display a for loop samples()

Slide 51

Slide 51 text

ABYSS - ABYSSOPELAGIC PLUGIN CRUD 19,800 ft We need to access our data Creating a service record ->findByPk($sampleId)) { return SampleModel:: populateModel($record); } } } Grab a single sample using a provided sample ID getSample($sampleId)

Slide 52

Slide 52 text

ABYSS - ABYSSOPELAGIC PLUGIN CRUD 19,800 ft We need to access our data Creating a service setAttributes($attributes); return $model; } Simple. Create a Sample using the attributes we provide create($attributes = array())

Slide 53

Slide 53 text

ABYSS - ABYSSOPELAGIC PLUGIN CRUD 19,800 ft We need to access our data Creating a service getAttribute('id')) { if (null === ($record = 
 $this->record->findByPk($id))) { throw new Exception(
 Craft::t('Can\'t find a sample with ID 
 "{id}"', array('id' => $id))); } } else { $record = new SampleRecord(); } $record->setAttributes($model->getAttributes()); if ($record->save()) { // update id on model (for new records) $model->setAttribute('id', $record->getAttribute('id')); return true; } else { $model->addErrors($record->getErrors()); return false; } } Save (or update if you prefer) save(SampleModel &$model)

Slide 54

Slide 54 text

ABYSS - ABYSSOPELAGIC PLUGIN CRUD 19,800 ft We need to access our data Creating a service findByPk($id); if ($record) { $record->delete(); } } Simple. Delete a Sample. delete($id)

Slide 55

Slide 55 text

ABYSS - ABYSSOPELAGIC PLUGIN CRUD 19,800 ft Lets catch those actions Creating a controller Catch our save action and go actionSave() request->getPost('sampleId')) { $model = craft()->sample->getSample($id); } else { $model = craft()->sample->create(); } $data = craft()->request->getPost(); $model->name = $data['name']; $model->desc = $data['desc']; if($model->validate()) { craft()->sample->save($model); craft()->userSession->setNotice(
 Craft::t('Sample saved.')); return $this->redirectToPostedUrl(); } else { craft()->userSession->setError(
 Craft::t('There was a problem with 
 your submission, please check the 
 form and try again!')); craft()->urlManager->
 setRouteVariables(array('sample' => $model)); } }

Slide 56

Slide 56 text

ABYSS - ABYSSOPELAGIC PLUGIN CRUD 19,800 ft Lets catch those actions Creating a controller Grab our Sample ID from our post and delete actionDelete() requirePostRequest(); $id = craft()->request->
 getRequiredPost('id'); craft()->sample->delete($id); craft()->end(); } }

Slide 57

Slide 57 text

ABYSS - ABYSSOPELAGIC PLUGIN CRUD 19,800 ft Interacting with our Samples Updating our variables sample->samples(); } 
 // Grab an individual Sample public function getSample($sampleId) { return craft()->sample->
 getSample($sampleId); } } Will return ‘Hello world!’ when using {{ craft.sample.hello }}
 We’re keeping this because it’s cool hello() Links over to services and grabs an array of our samples samples() Links over to services and grabs a single sample getSample()

Slide 58

Slide 58 text

ABYSS - ABYSSOPELAGIC PLUGIN CRUD 19,800 ft Interacting with our Samples Our templates View all of our samples. 
 Links to create, edit and delete samples. index.html {% set samples = craft.sample.samples() %} {% if samples %}

Your Samples

{% for sample in samples %} {% endfor %} Name Description Create Date Last Updated Actions
{% else %}

Oops you don't have any samples yet

Why don't you create one?


 Create Sample
 {% endif %}

Slide 59

Slide 59 text

ABYSS - ABYSSOPELAGIC PLUGIN CRUD 19,800 ft Not this again Primary Plugin Class This also allows you to pass in the dynamic values like sampleID Also know as a hook. You must set Dynamic CP Routes - exclusively \d+)' => 'sample/build', ); } }

Slide 60

Slide 60 text

ABYSS - ABYSSOPELAGIC PLUGIN CRUD 19,800 ft Interacting with our Samples Our templates Create and update our samples build.html {% if sampleId is not defined %}{% set sampleId = null %}{% endif %} {% if sample is not defined %} {% if sampleId %} {% set sample = craft.sample.getSample(sampleId) %} {% if not sample %}{% exit 404 %}{% endif %} {% else %} {% set sample = null %} {% endif %} {% endif %} {% set content %}

Build a new sample

{{ forms.textField({ label: 'Sample Name'|t, required: true, name: 'name', id: 'name', value: sample ? sample.name : null, instructions: 'What should this sample be named?' }) }} {{ forms.textareaField({ label: 'Sample Description'|t, required: false, id: 'desc', name: 'desc', rows: '5', value: sample ? sample.desc : null, instructions: 'Provide a short write up about this sample' }) }}
{% endset %}

Slide 61

Slide 61 text

ABYSS - ABYSSOPELAGIC PLUGIN CRUD 19,800 ft Here’s what it looks like now Updated template views - Index

Slide 62

Slide 62 text

ABYSS - ABYSSOPELAGIC PLUGIN CRUD 19,800 ft Here’s what it looks like now Updated template views - Build

Slide 63

Slide 63 text

ABYSS - ABYSSOPELAGIC PLUGIN CRUD 19,800 ft Here’s what it looks like now Updated template views - Index (v2)

Slide 64

Slide 64 text

ABYSS - ABYSSOPELAGIC PLUGIN CRUD 19,800 ft index.html Lots of files - lots of possibilities Here’s a quick recap {% set samples = craft.sample.samples() %} Install Created “sample” table based off SampleRecord.php or empty message build.html New Sample or update an existing Sample Action: Delete -> Controller (ajax) Action: Save -> Controller

Slide 65

Slide 65 text

TRENCH - HADOPELAGIC PLUGIN TIPS AND TRICKS 36,000 ft Finally to the fun stuff! Bet you thought we’d never get here.

Slide 66

Slide 66 text

TRENCH - HADOPELAGIC PLUGIN TIPS AND TRICKS 36,000 ft Tap into that craft power! Hooks & events Events Events let you piggy back on actions happening within craft. Hooks Customize Craft even further than what comes out of the box. modifyEntrySortableAttributes() Modify the attributes that entries can be sorted by in the Control Panel addUserAdministrationOptions() Add additional admin options to the Edit User page, which will show up when clicking on the gear icon menu at the top-right of the page. email.onSendEmail() Trigger an action every time an email is sent. users.onSaveUser Trigger an action when a user is saved entries.onSaveEntry Trigger an action when a entry is saved

Slide 67

Slide 67 text

TRENCH - HADOPELAGIC PLUGIN TIPS AND TRICKS 36,000 ft Advanced Layouts Checkout Craft-> App -> Templates -> Layouts -> cp.html

Slide 68

Slide 68 text

TRENCH - HADOPELAGIC PLUGIN TIPS AND TRICKS 36,000 ft Advanced Layouts Checkout Craft-> App -> Templates -> Layouts -> cp.html

Slide 69

Slide 69 text

TRENCH - HADOPELAGIC PLUGIN TIPS AND TRICKS 36,000 ft Advanced Layouts Take Craft Data and graph it! - http://www.chartjs.org/

Slide 70

Slide 70 text

TRENCH - HADOPELAGIC PLUGIN TIPS AND TRICKS 36,000 ft Advanced Layouts Do what works for your plugin and keep it in the Craft family!

Slide 71

Slide 71 text

TRENCH - HADOPELAGIC PLUGIN TIPS AND TRICKS 36,000 ft Garnish Garnish is the built in JS modal that powers Craft Start here - http://craftcms.stackexchange.com/search?q=garnish

Slide 72

Slide 72 text

TRENCH - HADOPELAGIC PLUGIN TIPS AND TRICKS 36,000 ft Garnish Garnish is the built in JS modal that powers Craft Start here - http://craftcms.stackexchange.com/search?q=garnish var $div = $(''); var myModal = new Garnish.Modal($div);

Slide 73

Slide 73 text

TRENCH - HADOPELAGIC PLUGIN TIPS AND TRICKS 36,000 ft A word on Commercial Plugins We need you! SEO Events eCommerce Publishing workflows Social Sharing Social Sharing Digital Product Downloads Advanced Tagging Image Optimization Filterable entries Memberships & Subscriptions

Slide 74

Slide 74 text

Signing off from the bottom of the plugin ocean! Follow me on twitter: @adammccombs https:/ /craftpl.us/plugins/dev-form Join Craft Plus as a dev!