<?xml version="1.0"?>
<rss version="2.0"><channel><title>Invision Community Blog: Invision Community</title><link>https://invisioncommunity.com/news/invision-community/page/15/?d=34</link><description>Invision Community Blog: Invision Community</description><language>en</language><item><title>Black Friday and Cyber Monday Promotion</title><link>https://invisioncommunity.com/news/invision-community/9615-black-friday-and-cyber-monday-promotion/</link><description><![CDATA[<p>IPS is happy to offer 15% off starting now through Monday on all new purchases for both new and existing clients! This includes all software licenses and Community in the Cloud hosting. This is a great time to add on those extra Suite applications you're missing or to go ahead and try out IPS if you have always been considering us.<br><br>
Just use the coupon code <strong>HOLIDAY2013</strong> at checkout.<br><br><br><br><strong>Conversion Promotion Coming Soon...</strong><br><br>
Are you using another community software and thinking of switching to IPS? We will be posting a great conversion promotion on Tuesday for those wanting help in converting their community data to our format. So take advantage of the 15% coupon above to order your licenses or hosting services now and then stay tuned for our conversion promotion next week!<br><br></p>]]></description><guid isPermaLink="false">878</guid><pubDate>Fri, 29 Nov 2013 00:12:03 +0000</pubDate></item><item><title>4.0 - Advertisements</title><link>https://invisioncommunity.com/news/invision-community/9606-40-advertisements/</link><description><![CDATA[<p>In IP.Board 3.x, we have a setting group where you can specify some global advertisement HTML.  You can enable and disable advertisements, and you can specify code to insert into the header and footer of the page.  For the forum index, forum listings and topic view pages, you can override these header and footer ad codes, and you can specify advertisement code to insert into a couple of other areas specific to those pages.  If you install IP.Nexus, this setting group redirects you to the IP.Nexus advertisement control panel where you can effectively do the same thing, but with a few more options (including click and impression tracking, advertisement image uploading, automatic cutoffs for advertisements, and more).<br><br>
We felt that the entire system and process was too basic when IP.Nexus was not installed, and too disorienting once you do install IP.Nexus.  This setting group suddenly redirects you to another application and configuring the advertisements is an entirely different experience prior to installing this application.<br><br>
Subsequently, we have done the only logical thing and consolidated the two systems and improved the functionality.<br><br><em>(Please be aware that, as with all early screenshots of the 4.0 Social Suite, the interface displayed in the following screenshots is very much subject to change before release)</em><br><br><br><strong></strong><span style="font-size:18px"><strong>Advertisement Configuration</strong></span><strong></strong><br><br><a href="http://community.invisionpower.com/uploads/monthly_09_2013/blogentry-46197-0-24512700-1380310006.png"><img src="http://community.invisionpower.com/uploads/monthly_09_2013/blogentry-46197-0-24512700-1380310006_thumb.png" data-fileid="53834" loading="lazy"></a><br><br>
First and foremost, we have consolidated the functionality provided by IP.Board and IP.Nexus in previous software releases into one control panel.  Now, whether you install IP.Nexus or not, you can have powerful advertisement management at your fingertips.  Installing IP.Nexus still provides additional enhanced functionality, such as the ability to sell advertisements to your members.<br><br>
You can now have both HTML and image-based advertisements available, and you can create multiple advertisements for the same "location" (more on this in a minute).  There is a setting available to tell the software how to pick which advertisement to show if more than one is configured for a single area (options include picking one at random, showing the newest advertisement, showing the oldest advertisement, and showing the advertisement with the least number of impressions).<br><br>
You can configure start and end dates for advertisements, set them to cut off after a certain number of impressions (or clicks, in the case of image advertisements), and you can filter by status (and toggle the status from this page).  If IP.Nexus is installed, an additional status of "pending" is present and supported for advertisements that have been purchased but not yet approved.  Naturally once you reach any cut offs specified or the end date has passed, the advertisement will no longer be rotated.<br><br>
As you can see in the screenshot, javascript is removed from the preview for security reasons.<br><br>
If you have a <a href="http://community.invisionpower.com/blog/1174/entry-9605-40-file-storage/" rel="external nofollow">caching engine enabled</a>, advertisement data will be cached to improve performance.<br><br><br><strong></strong><span style="font-size:18px"><strong>Some new functionality</strong></span><strong></strong><br><br>
If you are already familiar with the feature set of the current release of IP.Nexus, the advertisement functionality you already know and love will be carried over to the 4.0 Suite.  You can still specify which groups are exempt from seeing advertisements, for example, to help you upsell subscription packages to users on your site.  In addition to the current functionality, however, we've made some great improvements.<br><br><br><strong>Ability to specify SSL advertisement code</strong><br>
Google Ads does not have an SSL version of its advertisement code, and including their advertisements on secure pages can lead to browser warnings for your visitors.  This is especially troublesome when you only use SSL for logins or for your store (IP.Nexus), as it gives an impression that the page is not secure.<br><br>
Now, you can specify an alternative secure page advertisement code if you wish, or choose not to show a specific advertisement on secure pages at all.<br><br><br><strong>Ability to specify multiple images</strong><br>
When uploading an image advertisement, you now have the option to also upload a small and/or medium version of the advertisement image.  The small and medium versions, if present, will be used on the responsive layout on the alternate views for mobile devices and tablets.  If not provided, the software will simply use the next best size available.<br><br>
We have NOT included the ability to specify alternate HTML for the different resolutions.  In our research, most advertisement partners either (1) already handle responsiveness with their own javascript code or (2) provide alternative instructions for responsive ads.<br><br><br>
If you use a <a href="http://community.invisionpower.com/blog/1174/entry-9605-40-file-storage/" rel="external nofollow">CDN such as Amazon S3 for your file storage</a> in the 4.0 Suite, your advertisement images will be served from the CDN.<br><br><br><strong>Extendable application support</strong><br>
As of 4.0, any and all applications that wish to support advertisements can do so via the extension system built into the software.  All an application will need to do is provide an extension for the advertisement system, and then call the advertisement location in the template where they feel the advertisement should display.  You can even add custom settings (so for example, the forum application can allow you to configure which forums an advertisement will be displayed in...).<br><br>
Skinners can move the advertisements around however they like in their skin templates simply by moving the appropriate custom tag.<br><br><br><strong>Custom locations</strong><br>
You can now define entirely custom locations for advertisements easily in the advertisement configuration page.  Once you have defined a custom location for the advertisement, defining where to show that advertisement in your themes is as simple as inserting a tag where you want the advertisement to be displayed.<br><br><br><strong></strong><span style="font-size:18px"><strong>Closing</strong></span><strong></strong><br><br>
We hope these small changes will help you better manage your advertisements and provide you with the options you need to capitalize upon your community.  If you have no use for advertisements, you can completely ignore this area of the software and no resources will be used by it, but if you do utilize advertisements on your community, the new tools should make it much easier to manage your site.</p>]]></description><guid isPermaLink="false">877</guid><pubDate>Thu, 31 Oct 2013 13:00:00 +0000</pubDate></item><item><title>IP.Board 3.4.6 + IP.Nexus 1.5.9 available for beta testing</title><link>https://invisioncommunity.com/news/invision-community/9609-ipboard-346-ipnexus-159-available-for-beta-testing/</link><description><![CDATA[<p>The following applications are available for beta testing:</p><ul><li>IP.Board 3.4.6
</li><li>IP.Nexus 1.5.9<br></li></ul><br><br>
This round of maintenance updates includes bug fixes for the listed applications.  We would like to encourage all interested users to perform as much testing of these apps as possible.<br><br>
As of the date of this post our company forums have been upgraded to these releases.<br><br>
Please report any bugs you find with the beta to our <a href="http://community.invisionpower.com/resources/bugs.html" rel="external nofollow">bug tracker</a>.<br><br>
Please pay particular attention to the following areas:<ul><li>The editor, both within IP.Board (topics/posts) and in other areas (such as IP.Content articles, IP.Blog entries, etc.).  Pay attention both to the editor itself (i.e. when typing out and formatting your post, and toggling the editor back and forth) and the final post that is submitted.
</li><li>URLs that are submitted with a post being automatically turned into a link correctly.
</li><li>Any IP.Nexus functionality that has to do with grouped renewals.<br></li></ul><br><br>
If you find a bug, please be certain to report it to the <a href="http://community.invisionpower.com/resources/bugs.html" rel="external nofollow">bug tracker</a>.  When doing so, be sure to include as much information as possible that will allow us to reproduce the issue, including what browser you are using, what version of PHP is running on your server, whether this was an upgrade or a fresh installation, and so on.  Screenshots are often helpful.<br>
As with all beta releases from IPS, these releases are not supported by our technicians until the official final releases are publicly available in our client center.  Please do not upgrade your live installation using these betas, as you may find no path between these builds and the final releases that we put out.  We recommended, instead, to create a copy of your live board as a test installation, and upgrade your test installation instead.<br><br>
All customers with active licenses can download the betas at: <a href="http://community.invisionpower.com/qa.php" rel="external nofollow">http://community.inv...ower.com/qa.php</a><br><br>
Thanks in advance!  We look forward to your feedback.
]]></description><guid isPermaLink="false">876</guid><pubDate>Mon, 21 Oct 2013 22:49:50 +0000</pubDate></item><item><title>ZendCon 2013</title><link>https://invisioncommunity.com/news/invision-community/9608-zendcon-2013/</link><description><![CDATA[<p>Last week I attended <a href="http://www.zendcon.com/index.php" rel="external nofollow">ZendCon 2013</a>, a prominent PHP developer-oriented conference designed to give industry professionals information on tools, practices and trends which will help them deliver enterprise-class software to customers.  During the conference, many sponsors set up booths in order to demonstrate new products and services, and many industry professionals hold tutorials and sessions that attendees can attend in order to learn more about our trade.  The conference was held in Santa Clara, CA (about an hour south of San Francisco, just outside of San Jose) from October 7th through October 10th.<br><br>
I spent a lot of time at the conference focusing on tutorials and sessions that I felt might provide the most value for our company, in order to deliver better, faster and more stable software for our clients.  One tutorial that I attended, for instance, focused entirely on best practices for implementing caching into software (and at the server level), and tuning settings in PHP, MySQL and Apache/NginX to deliver the highest possible performance. Another session I attended focused on Object-Oriented Javascript Programming and the future of Javascript (or, more specifically, <a href="http://www.ecma-international.org/publications/standards/Ecma-262.htm" rel="external nofollow">ECMAScript 6</a>).  By the very nature of the conference, all sessions were very technical in nature, so don't feel too bad if any of this sounds like Greek to you.  The point I want readers to take away is that we take our profession seriously, and IPS feels that an investment into continuing education is important for our clients.<br><br>
I had the pleasure of meeting many industry professionals in the PHP world, including Andi Gutmans (CEO and co-founder of Zend Technologies), Zeev Suraski (CTO and co-founder of Zend Technologies), Elizabeth Smith (very active contributor to the PHP project and various PHP extensions), Derick Rethans (creator of XDebug, MongoDB PHP extension, and other PHP project contributions), John Coggeshall (active lead for the PHP Tidy extension) and many other wonderful contributors to the PHP ecosystem.  The passion that these people share for the products and services is just amazing, and serves as a great role model for developers everywhere.<br><br>
I won't spend much time getting into the nitty gritty details of each session I attended.  Some were very technical in nature, while some focused on more abstract necessities of running a team of developers and managing day-to-day development duties (for example, discussing things like time management, gathering project requirements effectively, and so on).  All in all, every session I attended provided useful information that I feel we can make use of to better our processes and delivery of future software releases.<br><br>
As I said, here at IPS we take our profession very seriously.  We will always strive to deliver the best possible software, and are thankful for the contributions of our third party developer community as well as the rest of our clients, whom provide us with bug reports and feedback that help to improve our products.  We have many exciting things in store in the coming months, so stay tuned by subscribing to our company blog to be notified of changes and updates.</p>]]></description><guid isPermaLink="false">875</guid><pubDate>Sat, 19 Oct 2013 02:00:00 +0000</pubDate></item><item><title>4.0 Advanced Theming</title><link>https://invisioncommunity.com/news/invision-community/9587-40-advanced-theming/</link><description><![CDATA[<p>In a recent <a href="http://community.invisionpower.com/blog/1174/entry-9586-40-introducing-themes/" rel="external nofollow">blog entry</a>, we talked about theming in IPS Social Suite 4. More often than not, you'll want to upload a new logo, tweak a few colours, add some custom HTML or work on the global template to incorporate your existing site wrapper. <br><br>
For this blog entry, I want to talk about the tools we have for more in-depth theming that professional themers will want to use to create downloadable themes for others to use.<br><br><strong>Custom Settings</strong><br>
In 3.x, we have a number of system settings throughout the suite that control design decisions, such as displaying sidebars, or controlling the layout of items on a page. This isn't ideal, because we're limiting what themes can do themselves (and of course enforcing what they must support too). Instead, it would be better if these design decisions could be controlled by each individual theme, giving theme designers the freedom to be creative and display content in entirely new ways.<br><br>
In IPS Social Suite 4, we've added per-theme custom settings. This enables you to create settings that are configurable by administrators when editing a theme. Even if you're not creating a theme to sell, you may want to add settings to control areas of your theme that are managed without making template edits each time you wish to make a change. For example, the default theme will have an option to add a rounded border effect to user photos. This is something that would be unnecessary as a system setting, but makes sense as a custom theme setting. Or you might want to add a setting that allows admins to toggle between showing and hiding a sidebar. There are a lot of possibilities here that would have required extensive custom code in 3.x.<br><br>
When creating settings, you can choose which tab that they'll show in when editing a theme. This means you can group your settings by specific criteria such as "Colors", "Layout", etc.<br><br><a href="http://community.invisionpower.com/uploads/monthly_10_2013/blogentry-62-0-96108100-1382000662.png"><img src="http://community.invisionpower.com/uploads/monthly_10_2013/blogentry-62-0-96108100-1382000662_thumb.png" data-fileid="54062" loading="lazy"></a><br><br>
Once you have created a custom setting, you're then able to use it in a HTML template or CSS file simply by using the following syntax:<br></p>
<p></p>
<pre class="ipsCode">
{{if theme.rounded_photos}}
.ipsUserPhoto {
border-radius: 100px
}
{{endif}}
</pre>
<p><br><br>
Or, if you want to use it without an IF clause, then you can simple use this:<br></p>
<p></p>
<pre class="ipsCode">
&lt;div&gt;
{theme="rounded_photos"}
&lt;/div&gt;
</pre>
<p><br><br>
You can manage the custom settings from the theme edit form. In this screen shot, the tabs "Custom" and "Colors" are theme setting tabs.<br><br><a href="http://community.invisionpower.com/uploads/monthly_10_2013/blogentry-62-0-47186200-1382000658.png"><img src="http://community.invisionpower.com/uploads/monthly_10_2013/blogentry-62-0-47186200-1382000658_thumb.png" data-fileid="54061" loading="lazy"></a><br><br><strong>Version Check</strong><br>
We've added the ability for theme creators to include a URL that is checked multiple times a day. All you as the theme creator needs to do is return a simple JSON object like this example:<br></p>
<p></p>
<pre class="ipsCode">
{
    "version": "4.0.1",
    "longversion": 40001,
    "released": 1377688587,
    "updateurl": "http://www.exampleurl.com/announcement.php?theme=xeonblue"
}
</pre>
<p><br>
This is a great way to notify your customers about updates to your themes.<br><br><a href="http://community.invisionpower.com/uploads/monthly_08_2013/blogentry-62-0-23087900-1377686569.png"><img src="http://community.invisionpower.com/uploads/monthly_08_2013/blogentry-62-0-23087900-1377686569_thumb.png" data-fileid="53383" loading="lazy"></a><br><br>
More information is displayed when you mouse over the "Update available" badge.<br><br><strong>Designer's Mode</strong><br>
There are times when you want to change many template bits and CSS files using your own development tools. The new ACP template and CSS editor is great for making edits now that it supports full syntax highlighting but for more advanced work you'll want to work with your favourite IDE and make use of its tools such as file compare and searching.<br>
In IP.Board 3 we have the WebDav interface which allows you to work with plain .html and .css files but because it's sent over HTTP and each item needs recompiling to show changes, it's often a little sluggish and can be frustrating to work with if connection speeds start to suffer.<br><br>
In IPS Social Suite 4 you can work with plain .html and .css files locally; there's no need to fire up a WebDav client. You enable designer's mode by adding a constant into constants.php. This will automatically write out the HTML and CSS files into a directory called "themes" right in your suite's root folder. You can edit these files and the changes are instantly applied to the suite making working very fast indeed.<br><br><a href="http://community.invisionpower.com/uploads/monthly_08_2013/blogentry-62-0-49536100-1377686566.png"><img src="http://community.invisionpower.com/uploads/monthly_08_2013/blogentry-62-0-49536100-1377686566_thumb.png" data-fileid="53381" loading="lazy"></a><br><br>
Once you're done working in designer's mode, simply sync back the changes using the menu item on the theme's row and remove the constant.<br><br><a href="http://community.invisionpower.com/uploads/monthly_08_2013/blogentry-62-0-05740100-1377686568.png"><img src="http://community.invisionpower.com/uploads/monthly_08_2013/blogentry-62-0-05740100-1377686568_thumb.png" data-fileid="53382" loading="lazy"></a><br><br>
This will copy the changes back to the database and remove any stale compiled templates and CSS files.<br><br><strong>Diff</strong><br>
It's often very useful after upgrading to see which template bits have changed. The new "diff" tool instantly provides a list of changed, deleted or added template bits and CSS files. You can even download a copy as a stand-alone HTML file to distribute with your theme sets.<br><br><a href="http://community.invisionpower.com/uploads/monthly_09_2013/blogentry-62-0-37760400-1378219729.png"><img src="http://community.invisionpower.com/uploads/monthly_09_2013/blogentry-62-0-37760400-1378219729_thumb.png" data-fileid="53468" loading="lazy"></a><br><br>
These advanced tools will make creating themes for IPS Social Suite 4 easier than ever before. We look forward to seeing what you create with them!</p>]]></description><guid isPermaLink="false">874</guid><pubDate>Tue, 15 Oct 2013 20:30:00 +0000</pubDate></item><item><title>4.0 - File Storage</title><link>https://invisioncommunity.com/news/invision-community/9605-40-file-storage/</link><description><![CDATA[<p><strong>Introduction</strong><br><br>
The IPS Social Suite needs to store lots of different files - there's attachments and profile photos uploaded by members, CSS and JavaScript files, emoticons, etc.<br><br>
In IP.Board 3.x, various images got stored in different places:</p>
<ul><li>Files uploaded by users get put in the /uploads directory. If you have a complicated setup, it's difficult to handle these. If you have a load-balanced cluster you need to set up an environment whereby all files are stored on a single server, or all uploaded files are synched between servers, but serving these files over a high-performance CDN can be difficult.
</li>
<li>CSS, JavaScript files, images and emoticons get put in /style_* directories. If you want to serve these over a CDN, you can do so, but you need to copy the files over yourself.
</li>
<li>Other pieces of data are written to disk as a caching mechanism. This has the same issue with load-balanced environments as file uploads.
</li>
<li>Some applications had other methods - for example, IP.Downloads allows you to store files on a remote server using FTP.<br></li>
</ul><br><br>
In 4.0, we wanted to pull this all together and build a much better system for storing files and build the whole system with high-performance environments in mind.<br><br><br><strong>File Storage</strong><br><br>
In 4.0, you have several different ways to store files:<ul><li>On a local server
</li>
<li>On a remote server using FTP (which you can use to upload files to many CDN services)
</li>
<li>As binary data in the database
</li>
<li>On <a href="http://aws.amazon.com/s3/" rel="external nofollow">Amazon S3</a><br></li>
</ul><br>
You can set up different configurations and choose which configuration to use for different types of files. For example, if you want to store user's profile photos on Amazon S3, but you want attachments to be on the local server, or even a different Amazon S3 bucket - 4.0 can handle that. And if at any point you change your mind about which storage method you want to use, the system will automatically handle moving all the files for you.<br><br>
Everywhere that writes a file will use this central system - so IP.Downloads and IP.Gallery are included too.<br><br><a href="http://community.invisionpower.com/uploads/monthly_09_2013/blogentry-108264-0-99418100-1380206764.png"><img src="http://community.invisionpower.com/uploads/monthly_09_2013/blogentry-108264-0-99418100-1380206764_thumb.png" data-fileid="53823" loading="lazy"></a> <a href="http://community.invisionpower.com/uploads/monthly_09_2013/blogentry-108264-0-82653300-1380206769.png"><img src="http://community.invisionpower.com/uploads/monthly_09_2013/blogentry-108264-0-82653300-1380206769_thumb.png" data-fileid="53824" loading="lazy"></a><br><br><br><strong>Caching</strong><br><br>
There are lots of places throughout the suite where the same stuff needs to be retrieved or calculated over and over - for example, certain configuration settings, language data, information about the installed applications, etc. If this data can be cached, not only does it alleviate database load, it means the PHP code doesn't need to re-process the data.<br><br>
In IP.Board 3.x, some of this was stored in a particular database table and could be cached using a proper caching system - but it was difficult to configure, and not everything used it - compiled HTML templates, language strings and more were saved as files in the /cache directory, which causes difficulties for load-balanced cluster environments.<br><br>
In 4.0, we've overhauled all of this. For things that need cold storage (like compiled HTML templates) - you can choose either the file system or the database for storage. The data can then cached, along with anything else which might benefit from caching (like settings, application data, etc.) using one of 5 supported caching methods:<ul><li>APC
</li>
<li>eAccelerator
</li>
<li>Memcached
</li>
<li>Wincache
</li>
<li>XCache<br></li>
</ul><br><a href="http://community.invisionpower.com/uploads/monthly_09_2013/blogentry-108264-0-92390400-1380208888.png"><img src="http://community.invisionpower.com/uploads/monthly_09_2013/blogentry-108264-0-92390400-1380208888_thumb.png" data-fileid="53825" loading="lazy"></a>]]></description><guid isPermaLink="false">873</guid><pubDate>Mon, 07 Oct 2013 13:45:00 +0000</pubDate></item><item><title>4.0 - Application Management and Distribution</title><link>https://invisioncommunity.com/news/invision-community/9579-40-application-management-and-distribution/</link><description><![CDATA[<p>Building off of our previous <a href="http://community.invisionpower.com/blog/4445/entry-8810-40-developer-center/" rel="external nofollow">blog entry regarding the developer center</a>, application management and distribution has been fleshed out to a point where we are ready to reveal the changes coming with the 4.0 Social Suite.  Please keep in mind that while we are discussing some specific changes (and showing screenshots!) of changes you can expect to see in 4.0, everything in this blog entry is subject to change before final.  With that said, let's take a look.<br><br><a href="http://community.invisionpower.com/uploads/monthly_08_2013/blogentry-46197-0-99391100-1375732177.png"><img src="http://community.invisionpower.com/uploads/monthly_08_2013/blogentry-46197-0-99391100-1375732177_thumb.png" data-fileid="52899" loading="lazy"></a><br><br>
This screen represents the application overview screen.  First, a list of all of the applications that are currently installed is presented to you in a table, with another table following this one listing the applications which are uploaded but not currently installed.  You can easily install an application listed in this second table on the screen simply by clicking the install icon next to the application.  A multi-redirect process is triggered which handles the application installation painlessly for the administrator.<br><br>
Note that in the screenshot above, the "Create New" button is only presented because developer mode is enabled.  Administrators will not normally see this button.  Additionally, the gears icon next to the installed application allows you to access the <a href="http://community.invisionpower.com/blog/4445/entry-8810-40-developer-center/" rel="external nofollow">developer center</a>, and this button is only present when developer mode is enabled as well.<br><br>
When clicking on an installed application, you will be presented with a list of front-end modules, allowing you to set permissions for those modules and to specify which module is the default for that application, and to enable or disable individual modules.<br><br><a href="http://community.invisionpower.com/uploads/monthly_08_2013/blogentry-46197-0-90823000-1375732799.png"><img src="http://community.invisionpower.com/uploads/monthly_08_2013/blogentry-46197-0-90823000-1375732799_thumb.png" data-fileid="52901" loading="lazy"></a><br><br>
The lit up star icon indicates the default module - clicking the icon for any of the modules will specify that module as the default.  Clicking the lock icon will allow you to specify the permissions for that module, and clicking on "Enabled" in the screenshot will toggle the module between enabled and disabled status.<br><br><br><strong></strong><span style="font-size:18px"><strong>Building and Distributing Applications</strong></span><strong></strong><br><br>
Beginning with the 4.0 Social Suite, building and distributing applications has been made as simple as possible.  The concept of "building" an application refers to the process necessary to create all of the files distributed with the application in order to make it installable.  Examples include the language strings and the skin templates associated with the application.  While you work in developer mode, the software pulls these templates from files located on disk, however these skin templates and language strings need to be imported into the database for standard installations of the suite in order to be supported properly.  In 3.x the way you do this is to visit each various area of the ACP and use the appropriate developer tools to first import the data, and then to export the data.  This is no longer necessary with 4.0.<br><br>
In 4.0 when you add most database-stored data, you do so through the developer center.  This immediately puts the relevant data (such as a task or settings included with the application) into the database, as well as into the distributed files on the file system.  You don't have to be concerned with building this type of data for application distribution.<br><br>
Within the developer center there is a manual "Build for release" button which you can use at any time.  However, most developers will likely find that they do not need to use this button, because you are given the option to build your application for release right when you go to download it.  This brings us to application distribution.<br><br>
In 3.x to distribute an application, after you have exported all of the various files you need to distribute to disk you would copy over the application folder, as well as any other files from other folders (e.g. javascript files in /public/js/) and then zip these folders up in order to create an application distribution you upload to the marketplace.  4.x does away with this entire process.  Firstly, applications are now fully self-contained within their own directory, including javascript files, images, CSS files, skin templates, language files, and so forth.  Applications no longer need to have files contained within half a dozen folders to be recognized by the suite.<br><br>
Secondly, you can now directly download an application (with developer mode enabled) right from the ACP.  Behind the scenes, the <a href="http://php.net/manual/en/class.phardata.php" rel="external nofollow">PharData</a> class is utilized to build a .tar archive, and all of your application's files are pushed into this archive.  You are given the opportunity when you elect to download your application to choose whether you wish to build the application or not, which is useful in case you have just made a minor bug fix and don't need to bother with importing skin templates or language files since the last time you distributed your application.<br><br><br><strong></strong><span style="font-size:18px"><strong>Installing Applications</strong></span><strong></strong><br><br>
We wouldn't be content with just making application distribution this simple when we can make application installation just as simple for the end user administrators.  As of 4.x, while you can still extract the .tar archive you (as a developer) have distributed and manually upload the files, it is much easier to simply upload the entire application in the ACP and let the 4.0 Social Suite do it for you.  When you click the "Install" button on the application overview page and select an application to install, the archive is uploaded and extracted, and then the same install process automatically executes that happens if you are installing files from disk.<br><br><br><strong></strong><span style="font-size:18px"><strong>Centralized "Offline" Mode</strong></span><strong></strong><br><br>
Most nodes within the software have a notion of enabled or disabled, and applications are no exception.  Even in 3.x you can enable and disable applications without uninstalling them, which removes access to the application within the software.  On top of this, however, almost all applications have a custom notion of "offline mode" where-by an administrator can put the application in offline mode, define a custom message to show users who attempt to visit the application, and in most cases also specify which groups can still access the application even while it is offline.<br><br>
We have decided to consolidate and centralize this similar functionality, allowing for a more consistent and robust experience for the administrator.  You can now put applications in offline mode (unless they are "locked", such as the system application) and specify a message to show to users and which groups can still access the application.  This functionality replaces the basic enabled/disabled status, but still provides for the same end functionality.<br><br><br><span style="font-size:18px"></span><strong><span style="font-size:18px">Putting it all together</span></strong><span style="font-size:18px"></span><br><br>
Here is a quick video showing the process of installing an application, specifying a default module and the permissions for that module, and putting the application into an offline mode.<br><br>
You might notice a few quirks in the video, representative of pre-alpha software.  Firstly, this is an early application export and the module title was not exported with it, so the key is displayed when you see the listing.  Additionally, a full WYSIWYG editor will be presented in the popup to specify the offline message, however automatic javascript-dependency loading is something we are still working on.  Nevertheless, you can see the full functionality in the video below.<br><br><a href="http://screencast.com/t/2zK1L51Tp3I" rel="external nofollow">http://screencast.com/t/2zK1L51Tp3I</a><br><br><br>
Let us know your thoughts, and if there are any other application-management tasks that need some extra attention in 4.0, in the comments</p>]]></description><guid isPermaLink="false">872</guid><pubDate>Mon, 30 Sep 2013 16:00:00 +0000</pubDate></item><item><title>4.0 - Introducing Themes</title><link>https://invisioncommunity.com/news/invision-community/9586-40-introducing-themes/</link><description><![CDATA[<p>IPS Social Suite 4 is a modernization of our software line and rather than just refactor existing work, we are rewriting the code from scratch which gives us a chance to really evaluate the interface elements and labels. We felt that "themes" was a much more modern and better understood term than "skins". Of course, the name is just the start, here are some of the other improvements:<br><br><strong>Managing Themes in IPS Social Suite 4</strong><br>
As you would expect, the interface has been completely overhauled in IP.Social Suite 4. All the familiar elements are there but we've simplified areas and made it easier to manage your themes.<br><br><a href="http://community.invisionpower.com/uploads/monthly_08_2013/blogentry-62-0-29956100-1377680008.png"><img src="http://community.invisionpower.com/uploads/monthly_08_2013/blogentry-62-0-29956100-1377680008_thumb.png" data-fileid="53376" loading="lazy"></a><br><br>
As you can see from this screen shot, theme authors can now inform customers when they have an update available for them. The interface makes use of the <a href="http://community.invisionpower.com/blog/4445/entry-8812-40-trees/" rel="external nofollow">new IPS Social Suite 4 Trees model</a> which means you can quickly search for theme names and re-order themes.<br><br>
In IP.Board 3, you could change the logo of the suite. We've made this even easier in IP.Social Suite 4. The upload fields are easily accessible on the edit theme form. You can even upload a Facebook sharer image and favicon!<br><br><a href="http://community.invisionpower.com/uploads/monthly_08_2013/blogentry-62-0-66510200-1377680009.png"><img src="http://community.invisionpower.com/uploads/monthly_08_2013/blogentry-62-0-66510200-1377680009_thumb.png" data-fileid="53377" loading="lazy"></a><br><strong>Downloading and Uploading Themes</strong><br>
In IPS Social Suite 4, downloading and uploading a new version of a theme could not be easier. Just select the menu item and it's done. You no longer need to navigate to separate areas of the Admin CP to do this.<br><br><a href="http://community.invisionpower.com/uploads/monthly_08_2013/blogentry-62-0-99090000-1377680010.png"><img src="http://community.invisionpower.com/uploads/monthly_08_2013/blogentry-62-0-99090000-1377680010_thumb.png" data-fileid="53378" loading="lazy"></a><br><br><strong>Conflict Management</strong><br>
What happens if you upload a new version of a theme but it contains changes to templates you have also changed? You'll get a chance to review these changes and select which version to use on the conflict management page.<br><br><a href="http://community.invisionpower.com/uploads/monthly_08_2013/blogentry-62-0-13116300-1377680002.png"><img src="http://community.invisionpower.com/uploads/monthly_08_2013/blogentry-62-0-13116300-1377680002_thumb.png" data-fileid="53374" loading="lazy"></a><br><strong>Editing templates and CSS</strong><br>
The template and CSS editor should be familiar for any existing customers. The editor is now fully syntax highlighted which will make writing and editing code so much easier.<br><br><a href="http://community.invisionpower.com/uploads/monthly_09_2013/blogentry-62-0-92329600-1379500701.png"><img src="http://community.invisionpower.com/uploads/monthly_09_2013/blogentry-62-0-92329600-1379500701_thumb.png" data-fileid="53691" loading="lazy"></a><br><br>
The template syntax is now much more compact as you can see from the above screen shot. We've also added a few things to reduce the amount of template logic required.<br><br>
A common need is to load a template if a condition is matched:</p>
<p></p>
<pre class="ipsCode">
{{if member.isAdmin()}}
{template="admin_bar"}
{{endif}}</pre>
<p><br>
You can now put the conditional inside the template tag like so:</p>
<p></p>
<pre class="ipsCode">
{template="admin_bar" if="member.isAdmin()"}</pre>
<p><br>
This is much easier to read and reduces a lot of visual clutter. The combination of the better template syntax and HTML 5 mark-up results in a dramatic reduction in size and complexity of often edited templates such as the globalTemplate which is commonly used to add your own site chrome.<br><br>
The screenshot below shows all of the IPS Social Suite 4 globalTemplate and for comparison, part of the IP.Board 3.4 globalTemplate which is over 340 lines long!<br><br><a href="http://community.invisionpower.com/uploads/monthly_09_2013/blogentry-62-0-88290100-1379500698.png"><img src="http://community.invisionpower.com/uploads/monthly_09_2013/blogentry-62-0-88290100-1379500698_thumb.png" data-fileid="53690" loading="lazy"></a><br>
The CSS framework much like the <a href="http://community.invisionpower.com/blog/4445/entry-9554-40-javascript-framework/" rel="external nofollow">javascript framework</a> has been completely rewritten and is now modular. This means that most CSS files are very small which makes looking for specific selectors much easier. In addition, upgrades are less destructive to your themes. If you made edits to the button styles, then only that one style sheet is altered leaving the rest as default. Of course, IPS Social Suite combines and minifies these separate CSS into fewer files when saved.<br><br><em></em><strong><em>This blog entry is just an overview of the theme section in the Admin CP. We'll go into more detail in a later entry on the new tools available designed to make theme creation and management a breeze for theme authors. We know you will have a ton of questions but please be patient with us if we keep saying "wait for next blog entry" :smile:</em></strong><em></em><br></p>]]></description><guid isPermaLink="false">871</guid><pubDate>Thu, 26 Sep 2013 13:00:00 +0000</pubDate></item><item><title>4.0 - Sharelinks</title><link>https://invisioncommunity.com/news/invision-community/9600-40-sharelinks/</link><description><![CDATA[<p>We refer to the icons you can use to post to third party services such as Facebook, Twitter and Digg as "Sharelinks" in our software suite, and we consider these an important tool both for community promotion and for search engine optimization.  Not only can you get links to your community out there on other large, popular sites on the internet where you might be able to drive back more traffic to your own site, but search engines will also see these links to your site on the other large popular sites, follow them, and rank the pages they reach accordingly.<br><br>
Share links were supported in 3.x, however while planning 4.0 we felt that the implementation could be improved, and so we've done just that.  We have tidied up the interface to make managing the services easier for the average admin, provided more flexibility for third parties who wish to developer additional share link services, and we've made it much easier to use from a development stand point.<br><br><strong></strong><span style="font-size:18px"><strong>Managing Sharelinks</strong></span><strong></strong><br><br>
Within the admin control panel, you must be able to manage the sharelink services that are available.  You may only want to offer buttons to share to Facebook and Twitter, removing clutter that you don't feel your community is familiar with.  Or you may want to enable every share service link possible, because your community is full of technical-oriented users who will make use of them.  Wherever you fall within this spectrum, the process should be simple and straightforward.<br><br><a href="http://community.invisionpower.com/uploads/monthly_09_2013/blogentry-46197-0-26076900-1379381778.png"><img src="http://community.invisionpower.com/uploads/monthly_09_2013/blogentry-46197-0-26076900-1379381778_thumb.png" data-fileid="53676" loading="lazy"></a><br><br>
We have removed the ability to add and delete sharelinks, because the reality is most services require far more integration than simply specifying a URL.  Thus, we have made the system plugin-based, which allows developers who are familiar with the process far more control, while greatly simplifying the interface for the average administrator.  If you are comfortable with adding a link and an icon, building a plugin (see below) is a very simple process.  Otherwise, if you don't know what an "HTML" is, you will now be able to work with this page in a far easier manner.<br><br>
There is a generic settings button at the top, which allows you to globally enable and disable share links, as well as specify whether you want users to have the opportunity to automatically share links to new content with supported services.  When you choose to "Edit" a given service, you can specify which groups can access that share link, and specify any service-specific settings related to that service (for instance, to change the default Twitter hash tag used when sharing via Twitter, you would click to edit the Twitter service).<br><br><br><strong></strong><span style="font-size:18px"><strong>Integrating a New Service</strong></span><strong></strong><br><br>
While we ship with some of the most popular services already supported (<em>including support for LinkedIn sharing, new in 4.0!</em>), it is a very simple process to add support for new services.  When you build a new sharelink service and drop it into the appropriate folder, it will automatically be installed as soon as you visit the sharelinks management page in the ACP, where you can then choose to enable/disable the service and configure any available options.  If you delete a plugin file, the service will automatically be deleted again when you visit this page in the ACP.  No further interaction is required to install or uninstall a service, other than visiting the management page in the ACP.<br><br>
The basic template for a plugin file is as follows</p>
<p></p>
<pre class="ipsCode">
&lt;?php

namespace IPSContentShareServices;


class _Servicename
{
    /**
     * @brief    URL to the content item
     */
    protected $url        = NULL;
    
    /**
     * @brief    Title of the content item
     */
    protected $title    = NULL;

    /**
     * Constructor
     *
     * @param    IPSHttpUrl    $url    URL to the content [optional - if omitted, some services will figure out on their own]
     * @param    string            $title    Default text for the content, usually the title [optional - if omitted, some services will figure out on their own]
     * @return    void
     */
    public function __construct( IPSHttpUrl $url=NULL, $title=NULL )
    {
        $this-&gt;url        = $url;
        $this-&gt;title    = $title;
    }

    /**
     * Add any additional form elements to the configuration form. These must be setting keys that the service configuration form can save as a setting.
     *
     * @param    IPSHelpersForm    $form    Configuration form for this service
     * @return    void
     */
    public function modifyForm( IPSHelpersForm &amp;$form )
    {
    }

    /**
     * Return the HTML code to show the share link
     *
     * @return    string
     */
    public function __toString()
    {
        return "&lt;b&gt;Some HTML&lt;/b&gt;";
    }
}</pre>
<p><br>
The class name "_Servicename" should be the same as the filename, minus the _ (the underscore is part of hooks and plugins system in 4.0, which you can read about in a later blog entry).  So this filename would be "Servicename.php" and would be located in /system/Content/ShareServices/.  The modifyForm() accepts a reference to the form object that is displayed when configuring the service.  Here, you can add new configuration options that will be saved automatically (the configuration options should be settings).  If you need to specify any HTML or CSS that needs to be manually loaded for the service, you can add assets to both the &lt;head&gt; of the document, or insert content right before the closing &lt;/body&gt; tag, depending upon the service's needs in the constructor.  The __toString() magic method should return the HTML necessary to generate the share service link.<br><br>
It is really that simple - there are no hidden "gotchas" to watch out for.<br><br>
As an aside, the built in ability to email a link has been greatly simplified for third party developers as well.  If you implement third party applications by extending the appropriate classes (which we will blog more about later), the ability to email a link to your page with permission checking built in will all be handled automatically for you.  You don't need any plugin files specifically to facilitate emailing links to your content items in 4.0.<br><br><br><strong></strong><span style="font-size:18px"><strong>Implementing Sharelinks in Applications</strong></span><strong></strong><br><br>
To implement the sharelinks in your third party applications is equally simple.  As mentioned above, assuming you extend the appropriate classes to generate content items (which will be blogged about in detail at a later date), you need only do two things to implement share service integration in your application.<br><br>
First, your class that extends IPSContentItem must implement the interface IPSContentShareable.  This automatically enables the share links in your application and adds support for any functionality the share services utilize.<br><br>
Second, your template should include the appropriate sharelinks template where-ever you wish to display the share links</p>
<p></p>
<pre class="ipsCode">
{template="sharelinks" group="global" location="front" params="$contentItem"}
</pre>
<p><br>
If you wish to render the share links in some manner beyond our default generic rendering, you can simply use whatever HTML you need to, however we feel that most content items can utilize our generic template just fine.<br><br><br><strong></strong><span style="font-size:18px"><strong>A Few Notes in Closing</strong></span><strong></strong><br><br>
We feel that these changes will make implementing share links as easy as possible while still providing you all the flexibility you may need to customize the interaction and display of the links at every level.<br><br>
We have also decided to remove the "print" and "download" share links at this time.  In researching their usage and their functionality, we feel that it is no longer worth maintaining these unnecessary links which simply add clutter to the page.  All browsers allow you to save a page (i.e. download it) already, and all browsers allow you to print a page already.  We will include a print stylesheet with 4.0, just as we did with 3.x, so when you choose to print a page the output will be better tailored for printed media.  We feel, however, that retaining the links adds no real value for the vast majority of users, and is more inline with what most users encounter on other similar websites.<br><br>
We hope that the improvements and decluttered interface, both on the front end and the ACP, make configuring and using these services (and adding support for others) much simpler than in previous versions.</p>]]></description><guid isPermaLink="false">870</guid><pubDate>Thu, 19 Sep 2013 18:30:00 +0000</pubDate></item><item><title>4.0 - Email templates</title><link>https://invisioncommunity.com/news/invision-community/9578-40-email-templates/</link><description><![CDATA[<p>In 3.x, we support HTML emails being sent by the software. However, due to constraints we had at the time, HTML emails use pretty much the same content as plain text emails, but wrapped in a simple HTML wrapper. Additionally, users had to explicitly decide whether they wanted to receive HTML or plain text emails via a preference setting - quite an anachronism. All in all, not a very satisfactory user experience.<br><br><strong>Email handling in 4.0</strong><br><br>
In 4.0, users no longer choose which type of email to receive. Our email handler sends both types in a single email, and the email client chooses the most appropriate to show based on its capabilities. If it can display a fancy HTML version, that's what they'll see by default, but plain text is used if not.<br><br><strong>Email template system</strong><br><br>
In 3.x, email content is defined by the language system, and each email has one language string which forms the content for both the plain text and HTML versions. Clearly, if we were going to improve the HTML templates we ship with, this would have to change.<br><br>
In 4.x, each type of email has two templates - one for HTML, one for plain text. This means a better display of content can be created for HTML emails, while keeping the plain text ones simple and to the point. Email templates make use of the skinning system foundation (which we'll reveal later), meaning they have full use of logic, template tags and more - so we can also customize the emails depending on the user they are being sent to (note though that email templates are not per-skin; they are global to the site). And, of course, email templates can be added and edited via an interface in the AdminCP. This isn't groundbreaking stuff, but a vast improvement on email handling in 3.x.<br><br><strong>Email template design</strong><br><br>
We also wanted to improve our email templates, so that each type of email sent was designed specifically for the purpose. The data shown in a registration email will be different to a topic digest, for example, and the email should reflect that.<br><br>
Coding email templates is not a trivial thing, unfortunately. The latest version of Microsoft Outlook uses the Microsoft Word rendering engine(!!), while GMail strips out all CSS included in style tags - and that's just the start of the gotchas. This makes designing email templates a tricky business, and one that requires lots of testing to ensure compatibility. For our first 10 templates alone, I reviewed 900 screenshots to spot problems.<br><br>
As a result, we've taken the approach of creating email templates which are simple in appearance and would work well for most sites, with the goal of hopefully avoiding the need of most sites to edit them at all (though you can, if you wish). The colors we've used are fairly neutral, for this reason.<br><br>
For those mail agents that are a little more... advanced, our email templates in 4.0 will be responsive. They will look great on mobile devices as well as desktop clients.<br><br>
I have included some examples of email templates, along with their mobile counterparts. I should note at this point that this <em>does not reveal the main skin design</em>. As discussed above, emails are intentionally separate in design.<br><br><strong>Admin-completed registration</strong><br><br><a href="http://community.invisionpower.com/uploads/monthly_08_2013/blogentry-1094-0-76874100-1375669939.png"><img src="http://community.invisionpower.com/uploads/monthly_08_2013/blogentry-1094-0-76874100-1375669939_thumb.png" data-fileid="52883" loading="lazy"></a><br><a href="http://community.invisionpower.com/uploads/monthly_08_2013/blogentry-1094-0-99812900-1375669930.png"><img src="http://community.invisionpower.com/uploads/monthly_08_2013/blogentry-1094-0-99812900-1375669930_thumb.png" data-fileid="52882" loading="lazy"></a><br><br><strong>Friend</strong> <strong>request</strong><br><br><a href="http://community.invisionpower.com/uploads/monthly_08_2013/blogentry-1094-0-32516700-1375669949.png"><img src="http://community.invisionpower.com/uploads/monthly_08_2013/blogentry-1094-0-32516700-1375669949_thumb.png" data-fileid="52885" loading="lazy"></a><br><a href="http://community.invisionpower.com/uploads/monthly_08_2013/blogentry-1094-0-12341200-1375669942.png"><img src="http://community.invisionpower.com/uploads/monthly_08_2013/blogentry-1094-0-12341200-1375669942_thumb.png" data-fileid="52884" loading="lazy"></a><br><br><strong>New personal message</strong><br><br><a href="http://community.invisionpower.com/uploads/monthly_08_2013/blogentry-1094-0-33328300-1375669968.png"><img src="http://community.invisionpower.com/uploads/monthly_08_2013/blogentry-1094-0-33328300-1375669968_thumb.png" data-fileid="52887" loading="lazy"></a><br><a href="http://community.invisionpower.com/uploads/monthly_08_2013/blogentry-1094-0-37202600-1375669958.png"><img src="http://community.invisionpower.com/uploads/monthly_08_2013/blogentry-1094-0-37202600-1375669958_thumb.png" data-fileid="52886" loading="lazy"></a><br><br><strong>New profile comment</strong><br><br><a href="http://community.invisionpower.com/uploads/monthly_08_2013/blogentry-1094-0-77897300-1375669971.png"><img src="http://community.invisionpower.com/uploads/monthly_08_2013/blogentry-1094-0-77897300-1375669971_thumb.png" data-fileid="52889" loading="lazy"></a><br><a href="http://community.invisionpower.com/uploads/monthly_08_2013/blogentry-1094-0-85372100-1375669969.png"><img src="http://community.invisionpower.com/uploads/monthly_08_2013/blogentry-1094-0-85372100-1375669969_thumb.png" data-fileid="52888" loading="lazy"></a></p>]]></description><guid isPermaLink="false">869</guid><pubDate>Sun, 15 Sep 2013 12:56:46 +0000</pubDate></item><item><title>4.0 - Introducing the new AdminCP</title><link>https://invisioncommunity.com/news/invision-community/9576-40-introducing-the-new-admincp/</link><description><![CDATA[<p>We've been hard at work on IPS 4.0 for some time now, and we're finally at a stage where we are ready to reveal the new AdminCP to you. I won't be showing you <em>everything</em> the ACP has to offer - some things will be revealed in more detail in later blog entries. But lets get to an overview.<br><br><strong>Background information</strong><br><br>
IPS4 brings with it a new CSS framework that aims to modularize our styles. This is something we started to work towards in IPB 3.2, but at that time we couldn't completely replace our structure. We no longer have a monolithic ipb_styles.css file. We now have a bunch of small CSS files, and each one handles something in particular. There's one each for forms, tables, pagination, buttons, layout and so on.<br><br>
This brings a few key benefits. Firstly, when we need to make a bug fix in, say, the forms CSS file, IPS4 will still be able to automatically upgrade all the other css files for you. In 3.x, one bug fix in ipb_styles.css could mean the whole file had to be manually upgraded. Secondly, it will be a lot more obvious for skinners where to look for particular things. Need to style a button? Look like buttons.css. Easy. And thirdly, if you're building pages in IP.Content, and you want to use our button styles, you can simply include that one CSS file without needing to include the entire CSS framework.<br><br>
CSS is of course concatenated and compressed before being delivered to the browser, but in a development environment, it exists as I described it above.<br><br>
In IPS4, both front end and AdminCP share the same CSS (and Javascript) framework. Skinners will be able to ship skins that work on both the front end and AdminCP with only a little extra work - and, of course, when we make bug fixes to the framework, it'll fix both areas.<br><br>
Before we go further, I want to make this part clear: <strong>The front-end and AdminCP look different</strong>. What you'll see shortly isn't what the front-end looks like. We will reveal that separately later. While the same framework is used, the AdminCP extends and overrides parts of it to suit its needs and style. <br><br><strong>Goals</strong><br><br>
What did we want to achieve with the AdminCP? Our current AdminCP is often regarded as the best out of the big forum software platforms, so redesigning is a big undertaking.<br></p>
<ul><li>
<strong>Better user of space</strong>. Our current ACP uses vertical space for the main menu, and horizontal space for the application menu. In an era of widescreen desktops being standard, this could be improved.
</li>
<li>
<strong>Get rid of dropdown menus.</strong> The main menu currently uses dropdowns for navigation, but this can be difficult to use - especially if you want access something in a 3rd party app, meaning you have to traverse the Other Apps menu.
</li>
<li>
<strong>More consistency across pages</strong>. Our current ACP has some interactive tables (e.g. the member list) - but not every table makes use of the functionality. We should be enhancing every page with similar functionality, if it makes sense.
</li>
<li>
<strong>Better styling.</strong> People aren't a fan of pink, it turns out. I guess it'll have to go. The blue gradients are showing their age too.
</li>
<li>And the big one: <strong>Better mobile support.</strong> You can't effectively use the AdminCP on a mobile device. It's time you were able to manage your entire community from your phone with all of the same functionality, right?<br></li>
</ul><br><br><strong>Responsive by default</strong><br><br>
That last one is what we're most excited about. The AdminCP in IPS4 is fully responsive, and allows you to do everything just on a phone or tablet. What is responsiveness? It means that the page automatically changes to better suit the device you're using. While a desktop user would see full navigation menus and tables of data, a mobile user will see a reduced view (but with all the same data present!). Whether you need to manage your members, change some settings, send a bulk email or run some diagnostics, it can all be done on the go. This is a first for the big community software platforms, as far as I'm aware.<br><br><br><strong>Preview</strong><br><br>
Here is a sample page from the new AdminCP, as seen on a desktop, with the same page shown at a mobile resolution:<br><br><a href="http://community.invisionpower.com/uploads/monthly_08_2013/blogentry-1094-0-20085200-1375651560.png"><img src="http://community.invisionpower.com/uploads/monthly_08_2013/blogentry-1094-0-20085200-1375651560_thumb.png" data-fileid="52867" loading="lazy"></a> <a href="http://community.invisionpower.com/uploads/monthly_08_2013/blogentry-1094-0-46026500-1375652991.png"><img src="http://community.invisionpower.com/uploads/monthly_08_2013/blogentry-1094-0-46026500-1375652991_thumb.png" data-fileid="52872" loading="lazy"></a><br><br>
Although I won't include it here, tablets will see an 'intermediate' view with a reduced menu on the left. So, let's go over some of the key features of the screenshots.<br><br><strong>Navigation</strong><br><br>
First, and perhaps most importantly, is the navigation. On a desktop, your applications are now arranged down the left-hand side, with their respective section menus available simply by hovering on the application - no dropdown menus to traverse. The application menu can be reordered per-admin, allowing each staff member to set the menu up to best suit their role.<br><br>
On a mobile, there's obviously not the space for a wide navigation menu. Therefore, the application/module menu is activated by clicking the top-right icon. This opens a sidebar, from which you can navigate:<br><br><a href="http://community.invisionpower.com/uploads/monthly_08_2013/blogentry-1094-0-85526600-1375654840.png"><img src="http://community.invisionpower.com/uploads/monthly_08_2013/blogentry-1094-0-85526600-1375654840_thumb.png" data-fileid="52873" loading="lazy"></a><br><br><strong>Tables</strong><br><br>
What you see in the screenshots are our new default way of displaying tables of data. On the desktop view, we have filters across the top, a search box (and advanced search popup), and table headers can be clicked to dynamically sort the data via ajax.<br><br>
On a mobile view, this all collapses down - filters and sorting become menus, while table rows collapse to show data in a more suitable view. Responsive tables are a tricky thing to do right and there's a few different approaches, but given the types of data our AdminCP tables typically show, we think this is the best approach for us.<br><br><strong>Forms</strong><br><br>
As has been discussed in some of our developer blogs, the IPS 4.0 framework supports a wide range of form field types - everything from text inputs to tree selectors to matrices. All of these field types work both on desktop and with a responsive mobile view.<br><br>
Here's a simple AdminCP form on both desktop and mobile:<br><br><a href="http://community.invisionpower.com/uploads/monthly_08_2013/blogentry-1094-0-01948000-1375666284.png"><img src="http://community.invisionpower.com/uploads/monthly_08_2013/blogentry-1094-0-01948000-1375666284_thumb.png" data-fileid="52878" loading="lazy"></a> <a href="http://community.invisionpower.com/uploads/monthly_08_2013/blogentry-1094-0-38359700-1375666776.png"><img src="http://community.invisionpower.com/uploads/monthly_08_2013/blogentry-1094-0-38359700-1375666776_thumb.png" data-fileid="52879" loading="lazy"></a><br><br><strong>Tabs</strong><br><br>
Tabs are used extensively, where appropriate. Here's a screenshot showing a typical tabbed page (and it also shows a tree view):<br><br><a href="http://community.invisionpower.com/uploads/monthly_08_2013/blogentry-1094-0-26958500-1375667467.png"><img src="http://community.invisionpower.com/uploads/monthly_08_2013/blogentry-1094-0-26958500-1375667467_thumb.png" data-fileid="52880" loading="lazy"></a> <a href="http://community.invisionpower.com/uploads/monthly_08_2013/blogentry-1094-0-24753400-1375667677.png"><img src="http://community.invisionpower.com/uploads/monthly_08_2013/blogentry-1094-0-24753400-1375667677_thumb.png" data-fileid="52881" loading="lazy"></a><br><br><strong>Video of the mobile view in action</strong><br><br>
I've taken a short video of the member section in action, showing filtering, live searching and the advanced search popup. I'm using the iOS simulator here, which has some display jitters and requires me to use the mouse, but it should give you a good idea of how the AdminCP will work on a phone.<br><br><a href="http://community.invisionpower.com/blogvideos/responsive-acp.swf" rel="external nofollow"></a><a href="http://community.invisionpower.com/uploads/monthly_08_2013/blogentry-1094-0-03418300-1375725291.png"><img src="http://community.invisionpower.com/uploads/monthly_08_2013/blogentry-1094-0-03418300-1375725291_thumb.png" data-fileid="52898" loading="lazy"></a><br><br><strong>Conclusion</strong><br><br>
So there we go - an overview of the new AdminCP. We still have more to show you. Individual features and pages that are noteworthy will be blogged about in due course in more detail, so keep an eye on this blog and our <a href="http://community.invisionpower.com/blog/4445-the-development-channel/" rel="external nofollow">developer blog</a> for more.<br><br>
Please do bear in mind that this is pre-alpha software, and everything you see is subject to change. We look forward to your feedback! 
]]></description><guid isPermaLink="false">868</guid><pubDate>Mon, 09 Sep 2013 20:30:00 +0000</pubDate></item><item><title>IPS 4.0: Plugins</title><link>https://invisioncommunity.com/news/invision-community/9581-ips-40-plugins/</link><description><![CDATA[<p><strong>Introduction</strong><br><br>
Modifications, add-ons, plugins, hooks - whatever your preferred name for them is - 3rd party code modifications are an important part of any successful web application. It wasn't that long ago that the way you did this was manually opening up files and copying and pasting bits of code in, or the really cool web applications had points scattered throughout the code for modifications to be injected into, or even scripts which opened up the files and made the changes for you (I'm not joking, that's seriously what used to go on!). In fact, IP.Board was one of the first web applications to, using OOP, support modifications in a more structured way.<br><br>
Currently, we largely have 2 types of modifications: <strong>applications</strong>, which add whole new areas and functionality to your site (all of our applications: IP.Blog, IP.Gallery, IP.Downloads, IP.Chat, IP.Content and IP.Nexus use this architecture) and <strong>hooks</strong> which modify or extend the functionality of the IPS Social Suite or of applications.<br><br>
Applications themselves are sort of self-governing so there isn't much to say about them, with one exception: applications will now be able to be downloaded and subsequently installed into your Admin CP as one file - you will not have to FTP upload application source files. The file will just be a regular .tar file, so course, if you were so inclined, you could open it and go old skool.<br><br>
For the rest of this blog entry, I'm going to focus on hooks. Though parts of this blog entry will be more technical in nature than our others, I've tried to keep it just to what everyone will be interested in, and leave the boring stuff until the end.<br><br><br><strong>Terminology</strong><br><br>
The term "hook" in 3.x is ambiguous. Sometimes it refers to the whole thing (e.g. "install a hook") and sometimes it refers to a specific technical part of that - the code which overloads other code (e.g. "skin hook", "library hook"), which are, even more confusingly, sometimes called "hook files".<br><br>
In 4.0, we've decided to rename hooks to <strong>plugins</strong>. The technical parts which make up a plugin will still be referred to as hooks.<br><br><br><strong>Sandboxing</strong><br><br>
Plugins, by their nature, extend functionality already present on your site. Up until now, if a plugin experiences a problem (for example, if a new version is installed which the plugin doesn't support) it can cause an error on your site, which disabling the plugin fixes.<br><br>
Starting in 4.0, plugins will be sandboxed. This means that if a plugin experiences an unexpected error (such as a database driver error), your site will automatically fallback to the default behaviour, and your users will never know anything went wrong.<br><br><br><strong>Simple (yet advanced) settings</strong><br><br>
In IP.Board 3.x, the Admin CP maintained a massive central area for managing most (though not all) settings. Plugins could add settings to this area, though there was no real standard to where to do that. Also, because this area was separate from the area where you install plugins, it could sometimes be confusing how to configure a plugin after installing it.<br><br>
In 4.0, each plugin is allocated a settings page which is accessed just by hitting the "Edit" button on the list of plugins. Plugin authors can manage this page how they like - rather than being confined to the strictly tabular layout and specific input types in 3.x.<br><br><br><strong>Versioning</strong><br><br>
In 3.x, unlike with applications, there was no particularly clear way to upgrade a plugin from one version to another. In 4.x, plugins now support full versioning, so you can just upload a new version, and an upgrader will take care of it.<br><br><br><strong>Hook Types</strong><br><br>
In 3.x, there were several different underlying types of hooks:</p><ul><li>Action overloaders - which allowed overloading the PHP class for any controller.
</li><li>Library hooks - which allowed overloading the PHP class for some (though not all) other classes.
</li><li>Data hooks - which allowed the modification of variables at specific, defined places in the code.
</li><li>Skin overloaders - which allowed overloading the compiled PHP class representing a group of templates.
</li><li>Template hooks - which allowed content to be inserted at specific points in templates.<br></li></ul><br><br>
For 4.0, we've made some quite radical changes:<br><br>
Code Hooks<br><br>
The first 3 have been merged into one concept we call "Code Hooks". Code Hooks can overload <strong>any</strong> class (even things which presently can't be overloaded like extensions) through a technique called monkey-patching (<a href="http://community.invisionpower.com/blog/4445/entry-8642-40-dev-introduction" rel="external nofollow">more details have been mentioned in the developer channel</a>). This, combined with the use of Active Record models for all content items (so "Topic", etc. is a class that can be overloaded) also makes data hooks obsolete.<br><br>
Theme Hooks<br><br>
The last 2 have also been merged into a concept called "Theme Hooks" (we're also renaming "skin" to "theme"). The way the current template hooks work is to insert content around certain pre-defined tags in the template. The problem is, not always is the point the plugin author needs available, also this is done in a way the content being inserted isn't aware of it's surroundings, which makes it difficult for things like adding a button to every post, which would need to know information about that post.<br><br>
After thinking for ages about a better way to facilitate theme hooks (I was halfway through a system which injected hook points automatically at compile time), our designer Rikki reminded us that a pretty well-known method for selecting HTML elements already exists... CSS selectors.<br><br><a href="http://community.invisionpower.com/blogvideos/ge78fg278vfg-themehooks.swf" rel="external nofollow">Video demonstration</a><br><br>
What's really cool about this is that the content used acts as if it was part of the template - if for example, it's inserted in a foreach loop, the variables created by that are available. It can also use template logic and everything else templates themselves can do.<br><br>
On the back-end, these are compiled into a file which behaves like a 3.x skin overloader - so if it is necessary (or just desired) to overload the compiled version of the template, that is still possible.<br><br>
Theme hooks work for the Admin CP as well as the front-end.<br><br><br><strong>Developer information</strong><br><br>
Developers no doubt would like to know the technical information of how this all works. Rather than write a blog entry covering all the different parts of plugins, we thought you might be interested to just see the developer documentation. We have 2 articles we can show you - <a href="https://www.invisionpower.com/support/guides/_/advanced-and-developers/4-0-developer-documentation/plugins-r283" rel="external nofollow">one covering all the technical details of plugins</a>, and <a href="https://www.invisionpower.com/support/guides/_/advanced-and-developers/4-0-developer-documentation/plugins-an-example-r284" rel="external nofollow">another which provides a step-by-step guide for how to create a plugin</a>.<br>]]></description><guid isPermaLink="false">867</guid><pubDate>Wed, 04 Sep 2013 11:00:00 +0000</pubDate></item><item><title>IPS Job Opening: Piracy Dept.</title><link>https://invisioncommunity.com/news/invision-community/9584-ips-job-opening-piracy-dept/</link><description><![CDATA[<p><strong>** We have enough applications to fill this position. Thank you for your interest! **</strong><br><br>
Piracy is something that all software companies face and IPS is no exception. Our losses due to credit card fraud and software piracy are significant and to minimize passing along costs to customers, we are seeking to expand our piracy department and take a harder stance against piracy and pursue those who engage in it.<br><br>
The position entails: <br><br>
- Identifying customers, using internal tools, that have inactive licenses and are using later versions of the software than their license allows and report to customer service for license termination.<br>
- Identifying customers, using internal tools, that have shared IPS products or marketplace purchases with illegal download sites and report to customer service for license termination. <br>
- Following up on usage piracy complaints. <br>
- Vigorously pursuing distribution hubs. <br>
- Working with web hosts, ISPs and law enforcement. <br><br>
To qualify you MUST: <br><br>
- Be at least 18 years old (for legal reasons, no exceptions to this policy can be made.) <br>
- Have excellent written communication skills. English is a must. <br>
- Be familiar with identifying the owner and host of a website (i.e.: Using WHOIS and other similar tools.)<br>
- Be familiar with the DMCA and associated procedures.<br>
- Reside in the United States.<br><br><strong>** We have enough applications to fill this position. Thank you for your interest! **</strong><br><br>
Thank you for your interest!</p>]]></description><guid isPermaLink="false">866</guid><pubDate>Sun, 18 Aug 2013 22:16:00 +0000</pubDate></item><item><title>IPS 4.0: Internationalization and Localization</title><link>https://invisioncommunity.com/news/invision-community/9556-ips-40-internationalization-and-localization/</link><description><![CDATA[<p>One of the things we wanted to focus on for IPS Social Suite 4.0 right from the beginning was providing better support for sites which do not use English or use multiple languages (or, as it was scribbled on my whiteboard, "++ i18n/L19n"). In this blog entry I'm going to cover some of those changes and new features.<br><br><br><strong>Translatable Everything</strong><br><br>
Currently when you create a forum, user group, custom profile field, etc. you have to give it a title and can only do this in one language. If you have more that one language installed, you might want to provide different titles for different languages.<br><br>
In 4.0 you can do exactly that - if you have only one language installed, these fields will continue to show as normal text boxes - however, if you have more than one installed you'll see several text boxes like this:<br><a href="http://community.invisionpower.com/uploads/monthly_07_2013/blogentry-108264-0-77513200-1372861493.png"><img src="http://community.invisionpower.com/uploads/monthly_07_2013/blogentry-108264-0-77513200-1372861493_thumb.png" data-fileid="52194" loading="lazy"></a><br><br><br><strong>Visual Language Editor</strong><br><br>
One feature that has been really popular in IP.Board is the Visual Skin Editor - a tool which allows you to browse your site, and click on elements to bring up a colour selector to change it. What if we could take this idea and apply it to translating as well? Allowing you to click on any word or phrase on your site and translate it there immediately. In 4.0, you can.<br><br><br><strong>Easier Language Management</strong><br><br>
In addition to the visual translation we've also made several improvements to the traditional translation method:</p>
<ul><li>As you search for a language string, results appear as you type.
</li>
<li>Editing a language string saves immediately without needing to click a save button.
</li>
<li>Filter tabs can show you words/phrases which have not yet been translated or the translation is out of date (meaning we've changed the default English value for the word/phrase since it was translated).<br></li>
</ul><br>
We've also made importing/exporting much faster and more reliable - no matter how large your language is (it will grow as you add more applications of course) there is now no risk of hitting an error importing/exporting (for those interested in the technical side of how this is achieved, see <a href="http://community.invisionpower.com/blog/4445/entry-9557-40-rethinking-xml-handling/" rel="external nofollow">this blog entry</a>).<br><br>
An exported language pack will also now maintain information on the version of each application it was exported from, so that the filter which shows outdated language strings is always accurate.<br><br><br><strong>Automatic Language Detection</strong><br><br>
Let's say you have Spanish and French languages installed on your site - up until now, you'd have to choose one default language, and users who want the other would have to manually choose it (which can be extremely difficult to find how to do when you're browsing a site in a foreign language).<br><br>
In 4.0, we automatically examine the information that the user's browser sends (which includes their preferred language) to choose the best one out of what's available, if that user hasn't already set an explicit preference.<br><br><strong>Pluralisation</strong><br><br>
In English, pluralisation is very simple - for most nouns, you just append "s" on the end, with some variation for certain words.<br><br>
This however, isn't the case in all languages - for example, I was speaking with the owner of a site in Slovak recently who was telling me that the word "records" changes depending on the number of records there are - for 2 records, it's "2 články", but for 5 records it's "5 <span style="color:rgb(40,40,40)"></span><span style="font-family:helvetica"><span style="color:rgb(40,40,40)">člán</span></span>kov". Currently, most language strings only have a singular and plural form (as is all that's needed in English) - meaning having the site show "2 články"/"5 <span style="color:rgb(40,40,40)"></span><span style="font-family:helvetica"><span style="color:rgb(40,40,40)">člán</span></span>kov" was impossible.<br><br>
In 4.0, we've introduced some really basic logic into language strings to accommodate this. Rather than having, for example, two language strings with the singular and the plural, there is now one with a value like this:<p></p>
<pre class="ipsCode">
{# [1:record][?:records]}
</pre>
<p><br>
The # indicates where the number will go, then each set of square brackets represents a possible value - the number before the : indicating the number which will cause that to show, and ? meaning "all other numbers".<br><br>
So for our Slovak example, we'd set the value to:</p>
<p></p>
<pre class="ipsCode">
{# [1:článok][5:článkov][?:články]}
</pre>
<p><br>
On display, it will automatically show the appropriate version.<br><br><br><strong>Lists</strong><br><br>
Along a similar thread to pluralisation, we've also made the way lists are formatted to be customised through a special language string. For example, a list in English looks like "one, two and three". However, in Japanese, it's "一、二、三。" (the comma symbol is different and there's no "and") - similarly Arabic, Thai and others have similar differences. In 4.0, simply by changing an example language string, this can be changed.<br><br>
In the default language, this language string is:</p>
<p></p>
<pre class="ipsCode">
a, b and c
</pre>
<p><br>
For our Japanese example, we'd just change it to:</p>
<p></p>
<pre class="ipsCode">
a、b、c
</pre>
<p><br><br><strong>UTF-8</strong><br><br>
Without wanting to get into too much technical detail - UTF-8 is the most common of many ways text can be encoded for storage and display on webpages. UTF-8 has been the default encoding in our software since IP.Board 3.0.<br><br>
Some sites which have been around for a long while though may not be using UTF-8. This can cause issues with some features where UTF-8 encoding is expected (for example, many features which rely on JavaScript require UTF-8 due to JSON only supporting it and nothing else). In addition, some sites may try to use UTF-8, but content is actually stored differently as the database is set to a different encoding, which can also cause issues.<br><br>
In 4.0, we're going all UTF-8. If you're not already on it, the upgrader will convert data. This means a much more reliable and compatible way of handling text.</p>]]></description><guid isPermaLink="false">865</guid><pubDate>Mon, 05 Aug 2013 20:00:00 +0000</pubDate></item><item><title>4.0 - Rethinking XML Handling</title><link>https://invisioncommunity.com/news/invision-community/9557-40-rethinking-xml-handling/</link><description><![CDATA[<p>The IPS Social Suite stores skin and language (and some other stuff) in xml files which are imported into the database at installation and upgrade. The reason we do it this way is so of course, you can export skins and languages and install them on other sites or distribute them via the IPS Marketplace.<br><br>
I'm not the biggest fan of PHP's XML handling at the best of times (it would seem whoever wrote the SimpleXML class and I would disagree on the definition of "simple") and had already changed some of the places we use XML to use JSON instead, but these skins and languages are particularly difficult because they can get <em>huge</em>. Handling these large files, especially when combined with sub-par servers can lead to memory exhaustion or maximum execution time timeouts. Our current method was taking both too much memory, and too much time in a single HTTP request.<br><br>
So we had to come up with something better. At first we considered splitting the XML file into several, but that would mean either requiring people installing a new skin/language to upload multiple files (which we deemed not acceptable) or compressing them in some way (which is another of PHP's weaknesses, and would have just created another problem). We also researched different markup languages, however found similar problems with everything. We also had to make sure that any solution didn't step on the toes of any of our other 4.0 goals, in particular we want to completely eliminate writing cache files to disk so as to better support cluster environments.<br><br>
The solution was two-fold. To resolve the memory problem, we decided to use the <a href="http://uk1.php.net/manual/en/book.xmlreader.php" rel="external nofollow">XMLReader</a> and <a href="http://uk1.php.net/manual/en/book.xmlwriter.php" rel="external nofollow">XMLWriter</a> classes - these are non-cached, forward-only classes for reading and writing XML. Rather than store the document in memory, you can only read/write one node at a time, and can only move forward, not backwards. Even with this approach though, we needed to account for the fact that importing is an intensive operation anyway, and one that needs to be staggered. To accommodate this, we wrote a simple AJAX-based "redirector", which continuously fires HTTP requests at a PHP controller until the controller reports the import is finished (it displays a fancy progress bar to the user while this is happening).<br><br><br><br>
We decided to make the AJAX redirector a helper class so that it can be used elsewhere and by third-party developers (rather than our current approach in some areas of making the user sit through loads of physical redirects). The code is really simple:</p><p></p><pre class="ipsCode">
IPSOutput::i()-&gt;output = new IPSHelpersMultipleRedirect(
	/* Query string which will take us back to this controller */
	'app=foo&amp;module=bar&amp;controller=baz&amp;do=process',
	/* Code to run for each HTTP request */
	function( $data )
	{
		// If we're not done yet...
		return array(
			$data,				// Data to get passed back to this function,
			"Processing...",	// Message to show (via AJAX) to the user
			50,					// [Optional] Number between 1 and 100 to indicate progess for progress bar
		);
		
		// If we're done
		return NULL;
	},
	/* Code to run when we're done */
	function()
	{
		// Code that runs when we're done
	}
);
</pre><p></p>]]></description><guid isPermaLink="false">864</guid><pubDate>Mon, 29 Jul 2013 12:30:00 +0000</pubDate></item><item><title>Community in the Cloud, New Support Package, and Transfer Promo</title><link>https://invisioncommunity.com/news/invision-community/9570-community-in-the-cloud-new-support-package-and-transfer-promo/</link><description><![CDATA[<p>We have a few updates to our services to share with you.<br><br><strong>Community in the Cloud</strong><br><br>
For over 11 years IPS has provided hosting services for clients that want a turn-key approach to their online community. Over time we have become more and more focused on community hosting solutions so it seemed like a good time to drop the older "hosting" term and adopt a new name for our service: Community in the Cloud. Granted it's the buzzword of the day but we were in the cloud before the cloud was a term :smile:.<br><br>
Right now it's all that you had before but presented in a much easier to understand format. Check out our new information page: <a href="http://www.invisionpower.com/cloud-pricing" rel="external nofollow">http://www.invisionpower.com/cloud-pricing</a><br><br>
This name and presentation change is just step one. We will soon be increasing our storage quotas and have some other great changes on the way!<br><br><strong>New Support Package</strong><br><br>
We often get clients who are looking for a higher level of support beyond just tickets. They want training, schedule upgrade service, consultations, and more. Of course offering that level of support is intensive and in the past we have always custom-quoted such services. Now to streamline we we have created a new Premium Support package that includes:<br><br><em>Implementation</em></p><ul><li>Scheduled installation time
</li><li>Initial training &amp; consultation by phone or live chat
</li><li>Post-deployment best practices training
</li><li>Custom migration from other platforms*
</li><li>Custom skin design*
</li><li>Custom single sign on (SSO)*<br></li></ul><br><em>Support</em><ul><li>Same business day ticket response
</li><li>Scheduled upgrade times
</li><li>Custom skin upgrades between versions*
</li><li>Security updates applied before public release<br></li></ul><br><em>Monthly Maintenance</em><ul><li>Logs checked for signs of problems
</li><li>Advise and schedule if upgrades are available
</li><li>Database maintenance
</li><li>Settings reviewed for optimal performance
</li><li>Best practices reviews<br></li></ul><br>
* Custom services may incur additional fees<br><br>
The new Premium Support package is $500 every 6 months and is available for purchase or upgrade today. If you have any questions feel free to email sales@invisionpower.com and we will be happy to help.<br><br><strong>Transfer Promotion</strong><br><br>
If you are interested in moving to IPS Community in the Cloud we are offering a promotion that should make now the best time to make the switch.<br><br>
From now until 1 September 2013 we will offer free transfers and free conversions. This means if you are already using IPS Community Suite on your own servers but want to switch to the CiC we will move your data for you. It also means that if you are using a different community software provider and are ready to upgrade to CiC we will both transfer your data and convert it using one of our <a href="http://www.invisionpower.com/convert" rel="external nofollow">pre-made converters</a>.
]]></description><guid isPermaLink="false">863</guid><pubDate>Thu, 25 Jul 2013 20:07:30 +0000</pubDate></item><item><title><![CDATA[4.0: Charts &#38; Graphs]]></title><link>https://invisioncommunity.com/news/invision-community/9560-40-charts-38-graphs/</link><description><![CDATA[<p>Charts and graphs are an essential tool in modern web applications. The API we use for displaying charts and graphs in IP.Board presently is something we wrote in-house during IP.Board 2.x - it uses the PHP GD library to generate an image representing a chart. At the time, it was pretty amazing, but as times have changed  a number of libraries for generating much more visually appealing and interactive graphs have emerged. For IPS Social Suite 4.0 we've decided to retire our GD-based charting library and embrace something a bit more modern and familiar for developers to work with.<br><br>
After looking at a number of different solutions, we decided to use <a href="https://google-developers.appspot.com/chart/" rel="external nofollow">Google Charts</a> (although wrapped with a simple gateway PHP class). Google Charts look great, have great features, are commonly used (so we figure any third-party developers who want to add charts to their apps will be able to do so easily) and is a service provided for free with no API limitations.<br><br><br>
I'll show you an example of how simple it is to create a chart in IPS Social Suite 4.0. Let's look at the code I might use to show a graph of the number of members registered over time:</p>
<p></p>
<pre class="ipsCode">
		/* Init Chart */
		$chart = new IPSHelpersChart;
		
		/* Specify headers */
		$chart-&gt;addHeader( "Date", 'date' );
		$chart-&gt;addHeader( "Members", 'number' );
		
		/* Add Rows */
		$stmt = IPSDb::i()-&gt;build( array(
			'select'	=&gt; "COUNT(*) AS count, DATE_FORMAT( FROM_UNIXTIME( joined ), '%Y-%m-%d' ) as joined_date",
			'from'		=&gt; 'core_members',
			'group'		=&gt; 'joined_date',
			'order'		=&gt; 'joined DESC',
		) );
		$stmt-&gt;execute();
		while ( $row = $stmt-&gt;fetch() )
		{
			$chart-&gt;addRow( array( new IPSDateTime( $row['joined_date'] ), $row['count'] ) );
		}
		
		/* Output */
		IPSOutput::i()-&gt;output = $chart-&gt;render( 'LineChart', array(
			'title'	=&gt; "Registrations",
		) );

</pre>
<p><br>
As you can see, the code is extremely simple to understand and use. This is what the output looks like:<br><a href="http://community.invisionpower.com/uploads/monthly_07_2013/blogentry-108264-0-78302900-1373641457.png"><img src="http://community.invisionpower.com/uploads/monthly_07_2013/blogentry-108264-0-78302900-1373641457_thumb.png" data-fileid="52352" loading="lazy"></a><br>
By hovering over any point I'll see a tooltip with the value at that point.<br><br>
All of the chart types and options available in Google Charts are available to us. Let's make some changes to make the lines curved, get rid of the legend and show titles on each axis - I just change the last line of the code to:</p>
<p></p>
<pre class="ipsCode">
		IPSOutput::i()-&gt;output = $chart-&gt;render( 'LineChart', array(
			'curveType' =&gt; 'function',
			'hAxis' =&gt; array(
				'title' =&gt; 'Date',
			),
			'legend' =&gt; array(
				'position' =&gt; 'none',
			),
			'title'	=&gt; "Registrations",
			'vAxis' =&gt; array(
				'title' =&gt; 'Number of registrations',
			)
		) );

</pre>
<p><br>
And now my chart looks like this:<br><a href="http://community.invisionpower.com/uploads/monthly_07_2013/blogentry-108264-0-17053300-1373641462.png"><img src="http://community.invisionpower.com/uploads/monthly_07_2013/blogentry-108264-0-17053300-1373641462_thumb.png" data-fileid="52353" loading="lazy"></a></p>]]></description><guid isPermaLink="false">862</guid><pubDate>Mon, 22 Jul 2013 14:41:42 +0000</pubDate></item><item><title>4.0 - Javascript framework</title><link>https://invisioncommunity.com/news/invision-community/9554-40-javascript-framework/</link><description><![CDATA[<p>Javascript is a key component of front-end web development - it's essential for a modern web app to provide a good user experience, and javascript is central to enabling that. Getting it right in 4.0 has been one of our goals from the start.<br><br><strong>Problems</strong><br><br>
To begin, let's summarize some of the issues with javascript in the current 3.x series:</p><ul><li><strong>Lack of file organization</strong> (a single JS directory that contains dozens of unrelated script files)
</li><li><strong>Different script types are bundled together </strong>(interface widgets, routes and full applications all in one place)
</li><li><strong>Lack of modularity</strong> (each JS file is pretty much a floating island in how it might implement functionality, with no formalized structure)
</li><li><strong>Simple things requiring code </strong>(how many times have you had to write half a dozen lines of JS just to launch a popup?)
</li><li><strong>New dom nodes aren't initialized automatically </strong>(load some new HTML via ajax, and your popups won't work without manually hooking them up)<br></li></ul><br><br>
Resolving these problems informed the javascript framework that we've built for 4.0. It all ultimately comes down to organizing code better and making the lives of developers easier (ours and yours!).<br><br><strong>The solution</strong><br><br>
Our solution has been to build a framework which is modularized and heavily event-driven. In most cases, modules never call each other directly, but instead communicate with events which may (or may not) be responded to by another module. More on this later.<br><br>
The framework breaks down into four types of module:<br><ul><li>Widgets - interface widgets like popups, tooltips and menus
</li><li>Utility modules - things like cookie handling or URL manipulation
</li><li>Controllers - modules which work on a particular dom node. More on these later.
</li><li>Models - modules which handle data. In the vast majority of cases this is simply fetching data from the server.<br></li></ul><br>
There's also 'interfaces', which are third party scripts like CKEditor, jQuery plugins and so forth. They aren't part of the framework, so I won't discuss them here.<br><br><br><strong>The groundwork</strong><br><br>
Before getting to specific types of modules, we needed to lay the groundwork. Javascript 4.0 is modularized, with only a single global variable (<em>ips</em>) being created in the page. All other scripts are defined as modules, whether they are interface widgets, utilities or anything else. A module is defined as a function which returns an object containing public methods (the <em>revealing module </em>pattern, if you're interested). Here's an example module:<p></p><pre class="ipsCode">
;( function($, _, undefined){
	"use strict";
	
	ips.createModule('ips.myModule', function () {

		// Private methods
		var _privateMethod = function () {

		};

		// Functions that become public methods
		var init = function () {

		},

		publicMethod = function () {

		};

		// Expose public methods
		return {
			init: init,
			publicMethod: publicMethod
		}
	});

}(jQuery, _));
</pre><p><br>
This pattern works well for our purpose, because it enables a module to contain private methods for doing internal work, while exposing only those methods which should be public to the outside world.<br><br>
This example module could then be used like so:</p><p></p><pre class="ipsCode">
ips.myModule.publicMethod();
</pre><p><br>
So this keeps everything neatly organized, and ensures variables don't leak into the global scope (which we want to avoid at all costs). When the document is ready, the module is automatically initialized (though you can also have functions that execute before DOMReady if necessary).<br><br><br><strong>Interface widgets</strong><br><br>
It's fair to say that interface widgets make up a large proportion of the JS used in our software - a web app such as ours has an intrinsic need for popups, menus, tooltips and so on. As mentioned above though, the big hinderance in 3.x is that these widgets have to be created manually (or, in a few simple cases, a special classname is added to an element to initialize it). This feels unnecessary when all the developer wants to do is show a simple widget that is otherwise standard.<br><br>
To alleviate this hassle, interface widgets in 4.0 all support a data API. What this means is that any widget can be created simply by adding some parameters to an HTML element, and specifying some options. Need a dialog box that loads a remote page? Simply do:</p><p></p><pre class="ipsCode">
&lt;a href='...' data-ipsDialog data-ipsDialog-title='My dialog' data-ipsDialog-url='http://...'&gt;Click me to open a dialog&lt;/a&gt; </pre><p><br>
Or if you need a hovercard, just do:</p><p></p><pre class="ipsCode">
&lt;a href='...' data-ipsHover&gt;This will launch a hovercard&lt;/a&gt; </pre><p><br>
We already have around two dozen widgets built, covering everything from dialogs, menus and tooltips, to keyboard navigation, tab bars and autocomplete - all supporting initialization with data attributes. <br><br>
Building your own widgets is easy - they are built as a module, and then simply define some settings to be accepted. The widget module does the rest. They can either be initialized when they're first seen in the dom (which you'd want for something like an image slider widget), or when an event occurs (such as hovering on a link, in the case of hovercards). Whenever new content is loaded into the page, widgets will be found and initialized automatically, too.<br><br>
Most widgets emit events when certain things occur - when we get to Controllers, you'll see why that is useful.<br><br><br><strong>Utilities</strong><br><br>
Utilities are simple modules that don't need much discussion. They simply provide methods which do something useful - for example, fetch/set a cookie, write to the user's local browser database, or handle timestamps. <br><br><br><strong>Controllers</strong><br><br>
Controllers are the meat of the application. Whereas interface widgets are used (and reused) as dumb tools on a page, controllers provide the logic for particular elements, sections and pages. They would, for example, handle the interactions in the topic listing, or the interactions with a post. Notice the word <em>interaction</em> - controllers are specifically designed to deal with events on the page. In fact, that's almost all they do!<br><br>
Controllers are initialized by specifying the controller name on an element, like so:</p><p></p><pre class="ipsCode">
&lt;div id='topic_list' data-controller='forums.topicList'&gt; &lt;/div&gt;
</pre><p><br>
This div becomes the controller's <em>scope</em>. The controller can manipulate content inside the div, watch for events, and so on.<br><br>
Controllers, in general, should be as specific and succinct - so simply specifying a page-wide controller then handling <em>everything</em> inside it is discouraged. If we take the topic list in forum view as an example:</p><p></p><pre class="ipsCode">
&lt;div id='topic_list' data-controller='forums.topicList'&gt; 
	&lt;ul&gt;
		&lt;li data-controller='forums.topicRow'&gt;
			...
		&lt;/li&gt;
		&lt;li data-controller='forums.topicRow'&gt;
			...
		&lt;/li&gt;
		&lt;li data-controller='forums.topicRow'&gt;
			...
		&lt;/li&gt;
	&lt;/ul&gt;
&lt;/div&gt;
</pre><p><br>
Each topic row might specify the <em>forums.topicRow</em> controller which handles locking, pinning, or marking that topic. The topic list itself might specify the <em>forums.topicList </em>controller, which handles sorting and loading more topics. By doing it this way, controllers become responsible only for a specific portion of the functionality, which keeps them lean and simple.<br><br><br>
Controllers are entirely decoupled and cannot reference each other - which is by design, given that a controller is only interested and responsible for its own scope. To communicate, events are used. A controller can trigger events on the page, which other controllers, widgets and models might respond to (and in turn emit their own events).<br><br>
Continuing the example above, let's assume one of our topic rows is being deleted. The <em>forums.topicRow</em> controller handles removing the HTML from the DOM, but it doesn't care what happens after that - it's not its responsibility. However, it emits a <em>deletedTopic</em> event to let the page know. The <em>forums.topicList</em> controller sees this event, and because it <em>does</em> care, it loads a new topic entry into the list. By using events like this, we can build interfaces that respond fluidly to user interactions while still maintaining separation of concerns.<br><br>
So, how does a controller deal with events? Because we're using jQuery, event handling in controllers piggy-backs with the <em>on </em>and <em>trigger</em> methods. In the controller's <em>initialize </em>method (which is specifically for setting up event handlers), you simply do:</p><p></p><pre class="ipsCode">
this.on( 'menuItemSelected', '#menuid', this.handleMenuClick );
</pre><p><br>
Usually when setting up events in an object using jQuery, you need to use $.proxy to properly control the scope of <em>this</em>, but in controllers, this is handled for you automatically - you just specify the method name.<br><br>
Notice the event we're observing here - <em>menuItemSelected</em>. This is an event that the ui.menu widget emits, and it illustrates how widgets and controllers can interact. Controllers can watch for events from widgets, then do something with the information given, all without ever directly referring to each other.<br><br>
Triggering an event is similar:</p><p></p><pre class="ipsCode">
this.trigger( 'doSomething', {
    color: 'yellow',
    size: 'big'
});

</pre><p><br>
This is the same syntax as jQuery's own <em>trigger</em>, except that the controller will ensure the parameters object is passed between different event handlers in the same chain. This will hopefully be clearer when you get your hands on it.<br><br><br><strong>Models</strong><br><br>
Models are quite similar to controllers (they also use the special <em>on</em> and <em>trigger</em> methods), but their only purpose is to handle data. By decoupling data handling from controllers, we can centralize data getting/setting so that <em>any</em> controller can use it.<br><br>
Let's say we have a <em>user </em>model, which handles data for the current user. It might have event handlers for adding a friend, for example, so when it sees the event <em>addFriend</em>, it handles it appropriately. Let's also assume we have a controller on each post in a topic, there's three posts, and that the controllers are observing the click event on the 'add friend' button. Here's the sequence of events:<br><br><span style="font-family:'courier new'">(controller1) click 'add friend button'</span><br><span style="font-family:'courier new'">
(controller1) emit 'addFriend' event</span><br><span style="font-family:'courier new'">
(user model)  adds a friend via ajax</span><br><span style="font-family:'courier new'">
(user model)  emits 'addedFriend' event</span><br><span style="font-family:'courier new'">
(controller1) updates friend icon</span><br><span style="font-family:'courier new'">
(controller2) updates friend icon</span><br><span style="font-family:'courier new'">
(controller3) updates friend icon</span><br><br>
Even though it was controller1 that requested that the model adds a friend, <em>all</em> controllers respond to the event the model emits and updates the friend icon in its own post. This again shows the power of using events as the primary communication system - anyone can respond, and the caller doesn't have to deal with maintaining associations.<br><br><br><br><strong>Conclusion</strong><br><br>
So that's about it - the new JS framework in IPS4. Hopefully this in-depth post has covered everything you need to know at this stage. You'll be pleased to know that most of the framework and widgets are already documented, and that will be available when IPS4 hits beta.<br><br>
Do note that everything covered here is subject to change or removal, as usual in our development blogs.<br><br>
If you have any questions, feel free to ask!<br><br></p>]]></description><guid isPermaLink="false">861</guid><pubDate>Thu, 11 Jul 2013 14:30:00 +0000</pubDate></item><item><title>4.0 - Handling email</title><link>https://invisioncommunity.com/news/invision-community/9553-40-handling-email/</link><description><![CDATA[<p>Sending email is an important part of almost any web software available today.  Social Suite applications have varying needs for sending email.  Examples include allowing users to confirm their email address during registration, advising users when there are updates regarding content they are following, and bulk mailing your member base to alert them to something important regarding your site.  While functionally the email handler has not significantly changed in 4.0, the process has been vastly simplified, allowing you to send more consistent emails with far less code than in the past.<br><br><strong></strong><span style="font-size:18px"><strong>Building and sending emails</strong></span><strong></strong><br><br>
When sending email in the Social Suite, there are two primary types of email you might need to send: an email based on a pre-existing template that you swap out variables in, and a completely custom email where you define the body specifically for the current email being sent.  Both of these scenarios are accounted for.  First, let's take a look at the simpler and more common scenario where you send an email based on a template.</p><p></p><pre class="ipsCode">
IPSEmail::buildFromTemplate( 'core', 'admin_spammer', array( $this ) )-&gt;send( IPSSettings::i()-&gt;email_in );
</pre><p><br>
Here, we are building an email from a template ("admin_spammer" in the "core" application, more on that in a moment), passing the current object in for purposes of replacing out variables in the template, and then calling the send method to actually send the email, passing the recipient to it.  The buildFromTemplate() method is a factory method that will create a new object of type IPSEmail.  When calling the send() method, you can optionally pass a single email address to send the email too, an array of email addresses to send the email to, or a single instance of IPSMember or an array of IPSMember instances to send the email to.  The library takes care of the rest.<br><br><br>
The other type of email you may need to send is a completely custom email where you define the entire body without using a template.  Bulk mails are a good example of this type of email.  You can easily send these types of emails as well.</p><p></p><pre class="ipsCode">
$email		= IPSEmail::buildFromContent( $subject, $htmlBody, $plaintextBody );
$email-&gt;from	= "john@doe.com";
$email-&gt;send( "jane@doe.com" );
</pre><p><br>
Here we call the factory method buildFromContent(), passing in the email subject, the HTML email body, and the plain text email body.  You can optionally omit the plain text email body and it will be generated for you automatically.<br><br>
We then specify the from address (which defaults to the suite's outgoing email address), and finally we call the send() method, passing in an email address. <br><br>
While it is not recommended, you can create an email object without specifying either email body parameter, and specify these later if you have a need.<br><br><br><strong></strong><span style="font-size:18px"><strong>Further control and options</strong></span><strong></strong><br><br>
Beyond what is outlined above, you have fine-grain control over the details of the email being sent.  The following example outlines more of the possible values you can specify when necessary</p><p></p><pre class="ipsCode">
$email			= IPSEmail::buildFromContent( "Hello world" );
$email-&gt;from		= "john@doe.com";
$email-&gt;fromName	= "John Doe";
$email-&gt;subject		= "Changed my mind to hello planet";
$email-&gt;useWrapper	= FALSE;

$email-&gt;headers['X-Mailer']	= "My cool app";
$email-&gt;headers['Priority']	= 3;

$email-&gt;setBody( array( 'html' =&gt; "&lt;html&gt;&lt;body&gt;&lt;b&gt;My email&lt;/b&gt;&lt;/body&gt;&lt;/html&gt;", 'plain' =&gt; "My email" ) );

$email-&gt;send( array( "jane@doe.com", "janet@doe.com" ), array( "abc@abc.com" ), array( "test@test.com" ) );
</pre><p><br>
Most of the above should be self-explanatory.  Just a few quick notes:</p><ul><li>You can set the $useWrapper property to FALSE if you do not wish for the email to be wrapped in the standard default HTML and plaintext email wrappers.  The wrappers primarily define the HTML structure (doctype, html tag, etc.) and also allow for automatic definition of the unsubscribe link.
</li><li>You can call the $unsubscribe property to manually define an unsubscribe link and the text to display.  Alternatively, you can call the "buildUnsubscribe()" method (see below) to do this automatically and consistently.  There is no point in doing this if you do not use the wrapper, however, which is why it is omitted in the example above (in this case you should manually include an unsubscribe link if appropriate).
</li><li>The first parameter passed to the send() method is the to addresses.  The second is the CC addresses, and the third is the BCC addresses, if necessary.<br></li></ul><br><br><br><strong></strong><span style="font-size:18px"><strong>Automatically handling an unsubscribe link</strong></span><strong></strong><br><br>
Links to handle unsubscribing from emails can be accommodated automatically with emails sent through the email handler.  For bulk emails, the following method is called<p></p><pre class="ipsCode">
$email-&gt;buildUnsubscribe( 'bulk', IPSMember::loggedIn() );
</pre><p><br>
The first parameter is the 'type', which is 'bulk' in this case.  The second parameter when specifying an unsubscribe link for a bulk email should be the member who is being emailed, as their personal details are used to generate a unique key allowing one-click unsubscribing.<br><br>
When sending notification emails, you still call buildUnsubscribe() with the following parameters</p><p></p><pre class="ipsCode">
$email-&gt;buildUnsubscribe( 'notification', 'my_notification_key' );
</pre><p><br>
Instead of a one-click unsubscribe link being included, a link pointing to the user's notification preferences area will be included instead, highlighting the notification preference that caused the email to be sent.<br><br>
Unsubscribe links are only automatically included in the outgoing email if you (1) call this method, and (2) use the default wrappers.<br><br><br><strong></strong><span style="font-size:18px"><strong>Email templates</strong></span><strong></strong><br><br>
While we will touch on this further in a future blog entry, email templates are now defined in a similar manner to HTML templates, and there is one template for the HTML version of the email and one template for the plaintext version of the email.  This allows us to better tailor the email being sent dependent upon the content-type in order to provide the nicest experience for the user.  The email subject is a language string based upon the email template name and is determined automatically by the email library when buildFromTemplate() is called.<br><br><br><strong></strong><span style="font-size:18px"><strong>Wrapping Up</strong></span><strong></strong><br><br>
While the email library still provides plenty of control to accomodate almost any scenario encountered within the Social Suite, for day to day needs the interface to send emails has been vastly simplified in order to provide a more consistent experience for both the user and the developers integrating applications within the Suite.  We hope you find these small changes will make your jobs easier, without losing the control you have presently.</p>]]></description><guid isPermaLink="false">860</guid><pubDate>Wed, 03 Jul 2013 18:40:00 +0000</pubDate></item><item><title>Introducing Projects and Developer Profiles</title><link>https://invisioncommunity.com/news/invision-community/9545-introducing-projects-and-developer-profiles/</link><description><![CDATA[<p>I'd like to introduce two new areas we've been working on. These new areas are designed to support our developer community, while making it easier for our clients to get their custom projects taken care of.<br><br><strong>Projects</strong><br><a href="http://community.invisionpower.com/resources/projects" rel="external nofollow">http://community.invisionpower.com/resources/projects</a><br><br>
The first new area is Projects. When you have a custom project for which you need a developer/designer, this new area will allow you to gather responses from developers interested in working with you.<br><br>
Post your project details, choose an approximate budget and date, if applicable, and developers can then register their interest in the project. From there, you can contact developers to help you decide which to go with.<br><br>
Projects you post will be open for responses for 30 days, after which they'll be closed. If you agree to work with a developer before that time, you can mark it as completed by clicking the Accept link next to the chosen developer's response. You'll be notified when new developers respond to your project, too.<br><br>
IPS won't be involved in the communication between you and a developer in any way, so it's up to you to agree project details and exchange payment, if necessary, before work starts.<br><br>
We hope this will become a handy tool to help match up customers and developers on custom projects. In time we'll add more features, such as the ability to review customers/developers when a project is complete.<br><br><br><strong>Developer Profiles</strong><br><a href="http://community.invisionpower.com/resources/developers" rel="external nofollow">http://community.invisionpower.com/resources/developers</a><br><br>
The second new area is Developer Profiles. This new area gives developers a place to present themselves to potential customers. When a developer creates a profile, we'll automatically build a page for them that pulls in their Marketplace information, and gives them a way of highlighting one of their contributed files and a place to write about themselves.<br><br>
As a customer, you can browse the listings to check out the developers in our community. If you've worked with a developer or just like their files, you can Recommend them by clicking the link on their page.<br><br>
If a developer with a profile responds to a Project, we'll link their name to their developer profile so that you can find out more about them.<br><br><br><br>
We hope these two new features will help foster more growth in the development community, making it easier for customers to find developers, and giving developers a central place to find potential work.<br><br>
Check them out - and if you have any feedback, please do feel free to share it. We've already made many changes based on the feedback from our preview to developers, so now it's your turn  :smile:<br></p>]]></description><guid isPermaLink="false">859</guid><pubDate>Thu, 13 Jun 2013 16:06:04 +0000</pubDate></item><item><title>Spam Service Updates</title><link>https://invisioncommunity.com/news/invision-community/9536-spam-service-updates/</link><description><![CDATA[<p>Our proprietary <a href="http://www.invisionpower.com/products/spammonitor/" rel="external nofollow">Spam Service</a> which was launched in 2009 has been a very popular feature for IP.Board license holders.  This service (which is included at no additional cost for all active license holders) is queried during account registration on your IP.Board installation and will respond to the query with a flag to indicate the likelihood that the registration might be a spammer.  You can control how your site should react to the various responses the service may return in the admin control panel, and combined with other anti-spam tools in IP.Board you can help prevent spam registrations from occurring on your site.<br><br>
While the system is constantly "learning" and blocking new spam signups, we have performed some updates to the service recently that we feel will help the system respond even quicker and more reliably to spam account registrations.<br><br><br><span style="font-size:18px"></span><strong><span style="font-size:18px">First, Some Stats</span></strong><span style="font-size:18px"></span><br><br>
For those interested, we have some interesting statistics to share with you.<br><br>
To date, the spam service has responded to over 58 million requests!  The service has responded to almost 163,000 requests in the last 24 hours alone, and the service continues to respond to between 5,000 and 10,000 more requests day over day.<br><br>
A total of over 23 million user registrations have been blocked (i.e. a status code of 3 or 4 was returned by the spam service) to date.  That's 23 million spammers we've helped you prevent from disrupting your community.<br><br><br><strong></strong><span style="font-size:18px"><strong>Quicker Responses</strong></span><strong></strong><br><br>
With the recent updates we performed, the system will more quickly respond to new spammer accounts than it did previously.  It is important that the system do not treat a single report of a spammer as a permanent block on that account of course, however we identified several areas where the algorithms used could be tweaked to more quickly identify potential spammers and have performed these changes.  Additionally, by use of decaying flags (treating newer reports with a higher priority than older accounts), the system can more quickly respond to new spammer threats.<br><br><br><span style="font-size:18px"></span><strong><span style="font-size:18px">Project Honeypot Integration</span></strong><span style="font-size:18px"></span><br><br>
We have integrated our spam service with the popular <a href="https://www.projecthoneypot.org" rel="external nofollow">Project Honeypot service</a>.  This means that all account registrations are checked through Project Honeypot, and the threat score that is returned from this service is used to help determine the likelihood of the IP address being associated with a spammer.<br><br><br><strong></strong><span style="font-size:18px"><strong>Stop Forum Spam Integration</strong></span><strong></strong><br><br>
In addition to integration with Project Honeypot, we have integrated the IPS Spam Service with <a href="http://www.stopforumspam.com/" rel="external nofollow">Stop Forum Spam</a>.  Our spam service will check the Stop Forum Spam email address and IP address databases and use any information found here to help weight and score the likelihood that the registration is coming from a spammer.<br><br>
It is important to note that we do not rely directly on the Stop Forum Spam data to determine a spammer status, but are instead using the data from this service to help weight the overall score based on all of the flags we have available.<br><br><br><strong></strong><span style="font-size:18px"><strong>Enterprise Spam Mitigation</strong></span><strong></strong><br><br>
If you are in a load balanced or cloud environment, you may wish to take advantage of this new offering which allows calls to the spam service from multiple origins using the same license key. Additionally, this service allows greater control over your spam mitigation service including weighting algorithm preferences and customized blacklists and whitelists. This addon service is available for $100/6 months. For more information, please contact our sales department. <br><br><br><br>
Collectively we feel the changes we have made to the service will benefit all IPS customers who are making use of our IPS Spam Service.  We hope these changes help your community fight the threat of spam more rigorously and more reliably than ever before.</p>]]></description><guid isPermaLink="false">858</guid><pubDate>Wed, 12 Jun 2013 12:07:00 +0000</pubDate></item><item><title>IPS 4.0: Editor - Part 4: Special Features</title><link>https://invisioncommunity.com/news/invision-community/9540-ips-40-editor-part-4-special-features/</link><description><![CDATA[<p>To round up our <a href="http://community.invisionpower.com/blog/1174/entry-9537-ips-40-editor-part-1-content/" rel="external nofollow">previous</a> <a href="http://community.invisionpower.com/blog/1174/entry-9538-ips-40-editor-part-2-uploads/" rel="external nofollow">blog</a> <a href="http://community.invisionpower.com/blog/1174/entry-9539-ips-40-editor-part-3-customisation-and-bbcode/" rel="external nofollow">entries</a> on the post editor in IPS Social Suite 4.0, there's just a few extra features not previously mentioned to show off.<br><br><br><br><strong>@mentions</strong><br><br>
@mentions are a common feature on social media sites like Twitter and Facebook. If you type an @ symbol and then start typing the name of a friend, an autocomplete menu shows so you can quickly then click on the user and they'll receive a notification that they've been mentioned. In 4.0 you can do exactly this to mention any user.<br><br><a href="http://community.invisionpower.com/uploads/blogentry-108264-0-03594400-1370524265.png"><img src="http://community.invisionpower.com/uploads/blogentry-108264-0-03594400-1370524265_thumb.png" data-fileid="51481" loading="lazy"></a><br><br><br><strong>Automatic Saving</strong><br><br>
Currently, when you're typing a post, every 2 minutes the content of the post is saved, so that if you accidentally navigate away from the page, your post content can be recovered. The content is saved by making an AJAX request.<br><br>
In 4.0, we've rewritten this to use HTML5 web storage. This unloads this work to the browser, meaning no call needs to be made to the server. Because this is much more efficient, the save can be done much more frequently (every few seconds). This makes the autosave feature much more useful.<br><br>
In addition, we've expanded the feature to support attachments. So if you've uploaded files, these too will be automatically recovered. Essentially if you're in the middle of typing a post and you refresh the page, everything will reappear exactly as you left it.<br><br><br><strong>HTML Posting</strong><br><br>
If you allow some users (like administrators) to post arbitrary HTML, they will see an additional "Source" button on the editor. When clicked, this will show them the raw HTML for the post and they can manipulate it here<br><br><a href="http://community.invisionpower.com/uploads/blogentry-108264-0-92110700-1370524446.png"><img src="http://community.invisionpower.com/uploads/blogentry-108264-0-92110700-1370524446_thumb.png" data-fileid="51483" loading="lazy"></a></p>]]></description><guid isPermaLink="false">857</guid><pubDate>Tue, 11 Jun 2013 11:55:54 +0000</pubDate></item><item><title>IPS 4.0: Editor - Part 3: Customisation and BBCode</title><link>https://invisioncommunity.com/news/invision-community/9539-ips-40-editor-part-3-customisation-and-bbcode/</link><description><![CDATA[<p><strong>Introduction</strong><br><br>
Joining my previous entries about <a href="http://community.invisionpower.com/blog/1174/entry-9537-ips-40-editor-part-1-content/" rel="external nofollow">content</a> and <a href="http://community.invisionpower.com/blog/1174/entry-9538-ips-40-editor-part-2-uploads/" rel="external nofollow">uploading</a> features in post editor in IPS Social Suite 4.0, I'd like to take you through the customisation features on the editor.<br><br><br><strong>Toolbar layout</strong><br><br>
The buttons that appear on the toolbar are completely customisable in 4.0 and you can set different layouts for desktop, tablet and mobile (so that you don't show more buttons than the device can show).<br><br>
This is what the management screen looks like:<br><a href="http://community.invisionpower.com/uploads/blogentry-108264-0-66004800-1370525136.png"><img src="http://community.invisionpower.com/uploads/blogentry-108264-0-66004800-1370525136_thumb.png" data-fileid="51487" loading="lazy"></a><br>
(This is an unfinished design - the tabs won't be be like that in the final version.)<br><br>
To move a button you just drag and drop. The buttons on the right allow you to add more rows or separators.<br><br><br>
Clicking on a button brings up a dialog where you can adjust where and to whom it shows:<br><a href="http://community.invisionpower.com/uploads/blogentry-108264-0-62663400-1370525133.png"><img src="http://community.invisionpower.com/uploads/blogentry-108264-0-62663400-1370525133_thumb.png" data-fileid="51485" loading="lazy"></a><br><br><br><strong>Adding Buttons</strong><br><br>
There are two ways to add a button to the editor.<br><br>
The easiest way is to install a CKEditor plugin. CKEditor has loads of plugins, and installing is as easy as uploading the zip file from their site. Here's a screenshot of the <a href="http://ckeditor.com/addon/symbol" rel="external nofollow">symbol</a> plugin being used:<br><a href="http://community.invisionpower.com/uploads/blogentry-108264-0-25860900-1370525135.png"><img src="http://community.invisionpower.com/uploads/blogentry-108264-0-25860900-1370525135_thumb.png" data-fileid="51486" loading="lazy"></a><br><br>
The second way is similar to how custom BBCode currently works, you specify the HTML code to be added when the user clicks on the button. Manually created buttons can optionally have a dialog popup to ask for an option.<br><br><br><strong>Design</strong><br><br>
Just as you can install CKEditor plugins by uploading the zip file, you can do exactly the same with CKEditor skins to change the design of the editor.<br>
You then simply set for each skin on your community which CKEditor skin to use for it.<br><br><br><strong>BBCode</strong><br><br>
Though no features in IPS4 insert BBCode-style tags into the editor (like is currently done for attachments, etc.) users can still type BBCode into the editor and it will work fine.<br><br>
We've rewritten how BBCode is parsed to be much more secure and reliable and produce more standards-compliant HTML (for those who are interested, it parses the post content into a DOM Document and examines only the text nodes for BBCode tags, then either splits the nodes surrounding it and inserts one for block-level elements, or wraps all subsequent text nodes in the appropriate formatting element until the end BBCode is found).<br><br>
The benefit to this is that there now no longer needs to be a "BBCode mode" - you can type BBCode straight into the editor, even complicated stuff like lists spanning multiple lines, and it comes out looking great.<br><br>
The downside to this approach is that custom BBCodes can no longer be added through the Admin CP. However, as mentioned above, we now have the ability to add custom buttons to the editor which work in a much more intuitive way, and can do everything that custom BBCodes could and more. For those who really want to be able to add the ability for custom BBCode, we've isolated the method that returns the supported BBCode (and information needed to parse them) into a specific method so that custom BBCode can be added with a very simple hook specific to that purpose.<br><br><br><strong>Conclusion</strong><br><br>
There's still one more blog entry to go in our series on the editor. To finish up I'll be showing off some cool special features including how you can post using regular HTML.</p>]]></description><guid isPermaLink="false">856</guid><pubDate>Mon, 10 Jun 2013 12:00:00 +0000</pubDate></item><item><title>IPS 4.0: Editor - Part 2: Uploads</title><link>https://invisioncommunity.com/news/invision-community/9538-ips-40-editor-part-2-uploads/</link><description><![CDATA[<p><strong>Introduction</strong><br><br>
In the <a href="http://community.invisionpower.com/blog/1174/entry-9537-ips-40-editor-part-1-content/" rel="external nofollow">last blog entry</a> I introduced some of the features in the post editor in IPS Social Suite 4.0. In this blog entry I'd like to show you the uploading features in the editor.<br><br><br><strong>Using the "Image" and "Attachment" dialogs</strong><br><br>
Along the bottom of the editor there are two buttons that deal with uploading files: image and attachments. Both present a dialog which looks like this:<br><a href="http://community.invisionpower.com/uploads/blogentry-108264-0-46639300-1370524502.png"><img src="http://community.invisionpower.com/uploads/blogentry-108264-0-46639300-1370524502_thumb.png" data-fileid="51484" loading="lazy"></a><br>
We decided to keep both an images and an attachments dialog as users wanting to insert an image will naturally look for the "Image" button - if however, you upload an image to the attachments dialog, it will work completely as expected.<br><br>
The upload panel here is based on HTML5 which supports drag and drop uploading, if your browser doesn't support this, it will use Flash, Silverlight or Google Gears if you have any of those installed, and if not it will fallback to a HTML4 &amp; JavaScript implementation (none of these support drag and drop, but instead you click the "Choose Files" button just as you do now - the label in the box will change to reflect this).<br><br>
Uploaded files then show below the box (images will get a preview), and you can click on any to add them into the editor, or click the "Insert All" button. When you insert an attachment into the editor, it displays either the image if it's an image, or a link if it's anything else, just as it will actually appear in the post (rather than the current "[attach=XXX]" tag).<br><br>
You can also of course delete the attachment, which will automatically remove it from the editor if you've already inserted it.<br><br><a href="http://community.invisionpower.com/blogvideos/images-and-attachments.swf" rel="external nofollow">Video Demonstration</a><br><br><br><strong>Quick drag-and-drop</strong><br><br>
In addition to interacting with the panels, if you're using a supported browser, you can drag and drop straight into the editor. It will automatically figure out whether the uploaded file(s) are images or other files and add them to the appropriate panel automatically.<br><br><a href="http://community.invisionpower.com/blogvideos/quick-dad.swf" rel="external nofollow">Video Demonstration</a><br><br><br><strong>Image URLs</strong><br><br>
In the image panel, there is an additional "From URL" tab which allows you to insert an image from a URL, as you type the URL a preview is shown, and you can optionally link to the image.<br><br><a href="http://community.invisionpower.com/blogvideos/Image-from-URL.swf" rel="external nofollow">Video Demonstration</a><br><br><br><strong>My Files</strong><br><br>
In IP.Board currently, there is a "My Media" button which allows you to insert content submitted either in other posts or elsewhere in the community (images in IP.Gallery or files in IP.Downloads for example) into the editor. In 4.0, this feature is found in the images and attachments dialogs.<br><br>
Just with normal attachments, the content is inserted as it will be shown rather than the current "[sharedmedia=XXX]" tag.<br><br><br><strong>Conclusion</strong><br><br>
Please let us know what you think of the uploading features in the comments. Remember though that we're only half way through our series on the 4.0 editor. In my next blog entry I'll be talking about customising the editor and the place of BBCode. </p>]]></description><guid isPermaLink="false">855</guid><pubDate>Fri, 07 Jun 2013 13:30:00 +0000</pubDate></item></channel></rss>
