CandyCane v0.9 beta release (CakePHP2 version of Redmine)

We are on CakePHP2.1 now

Download CandyCane on GitHub

After more than 200 of commits, CandyCane has become CakePHP2 based application. This migration was very tough, but it also gave us increasing performance, more flexibility for expansion and many new eager developers. Let’s see this commit log from git.

$ git shortlog -sn v0.8.6..v0.9-beta
106 Yusuke Ando
101 ialbors
19 Dima
11 kiang
10 hamaco
8 Kaz Watanabe
4 mzdakr
1 Ignacio Albors

They are AWESOME. Each developers have done great job by thier creativity. Especially ialbors made huge amounts of commits to migrate to Cake2.

New features, Plugin

However this release is focussing CakePHP2 migration, There are some new features and Plugin.

Emoji Plugin

Click to enlarge.

Do you like “Emoticons” on GitHub? This plugin allows to use same code on your CandyCane installation. This just first release of this. but icon sizing and input support may be done by Plugin update. This Plugin is NOT done by me. Yes this is a first plugin code from community! To use Emoticon, install this plugin from admin page, and write emoticon code like:

:smile: :+1: :octocat:

Polar Bear Installer and Postgres support

Quick installation is very strong point of CandyCane. This quick installer got 2 more great changes. First one is obvious. Cute Polar Bear will watch you while your 30 secondes installation. And seconde is more technical, it doesn’t appear on interface, but CandyCane and Installer now support PostgreSQL internally.


This is another JOKE plugin on CandyCane. But it also shows how to create CandyCane plugin and Plugin works really fine on CakePHP2 version of CandyCane.

Next Release

We are still fixing some issues on migration. And some more new features on plan. If you found some issue, Please tell us on our tracker.

Download CandyCane on GitHub

Change Log

  • Bug #255: replace codeBlock method.
  • Bug #258: replace aa function and a function to array function
  • Bug #259: Html helper escape image tag
  • Bug #260: change how to access request parameter
  • Bug #262: Tags definition became protected property
  • Bug #264: headers of issue seems strange.
  • Bug #265: Capitalize directories
  • Bug #266: Can not edit or delete issue category.
  • Bug #267: Bad links: id as a named parameter.
  • Bug #268: ユーザ名の表示書式が設定通りに表示しない。
  • Bug #272: Incorrect version
  • Bug #273: Can’t save user query
  • Bug #274: can’t create wiki page
  • Bug #275: Error comment news
  • Bug #278: Issue statuses not work
  • Bug #279: can’t create custom field
  • Bug #280: Problem with workflow
  • Bug #281: Problem with delete and edit roles
  • Bug #284: Can’t delete project
  • Bug #288: Error roadmap filter
  • Bug #289: Can’t create issue category from issue/add page.
  • Bug #290: ElementHook can’t work on Cake2
  • Bug #291: Issues context menu
  • Bug #292: Visible link “administration” for guest
  • Enhancement #254: CakePHP2.1 migration.

CandyCane v0.8.6 is available now.

Download section on github

3 months have passed from last release. Finally I published zip and tar ball of latest CandyCane. This release fixes various bugs. Particularly account management section got better email support for account activation.
Many new contributors made these progress. They are really great supporter of CandyCane. I will buy a beer each next time I meet them.

git shortlog -sn v0.8.5...v0.8.6
    26  Yusuke Ando
     7  Mindiell
     5  okonomi
     3  ialbors
     2  Shogo Kawahara
     1  Òscar Casajuana
     1  Ignacio Albors
     1  Sebastien pencreach
     1  Hisateru Tanaka

I’m focusing on migration to CakePHP2.1 for next release. CakePHP2.1 will bring huge productivity for CandyCane. Cherry trees may be cerebrating our release I guess.

  • Bug #215: ユーザー追加画面にアクセスするとPHPのNoticeメッセージが表示される
  • Bug #216: DBの初期データでユーザーの言語設定値が間違っている
  • Bug #217: Email notifications
  • Bug #219: チケット一覧に期限日を表示すると開始日が表示される
  • Bug #223: Projects can’t be removed
  • Bug #227: Unable to set admin user
  • Bug #231: Administration / Informations
  • Bug #233: Preview of a wiki page
  • Bug #234: Number format in help text when creating a new project
  • Bug #238: Number of issues
  • Bug #239: Creating a role with a name length greater than 10 characters
  • Bug #240: Forbidden characters in user name ?
  • Bug #241: No notifications to admin when a new user subscribe
  • Bug #243: Trying to unarchive a project : url not found
  • Bug #249: Unable to uninstall the cc_like_it plugin
  • Enhancement #226: configuration of a project
  • Enhancement #232: Modifying version

Now you can make your plugin for CakePHP based Redmine.

As you know CandyCane is CakePHP based Redmine clone. We have released CandyCane v0.8.4 just a hour ago. From now CandyCane is ready to plug your plugin! Making perfect product for everyone should be too far goal. But plugin system give you ability to change CandyCane as you like. I really wish you make your plugin for missing features like beautiful charting, more agile like dashboard. YOU CAN MAKE IT ON CAKEPHP WAY!
Let’s get walk through the overview of plugin system for CandyCane.

Basic of plugin for CandyCane

CandyCane plugin is actually CakePHP plugin. You can put CakePHP MVC based codes as plugin. Also you can interact with Models, Helpers, Components of CandyCane. For example, you can pull ticket data, project data or any other data from CandyCane model classes. Pages you made need to be integrated with CandyCane. CandyCane has some API for that. You will call those API from init.php in your plugin.

Adding new page to top menu

On your want to run your page as a application wide page, your page should be added into top left menu. To adding link to your page there, use MenuContainer object from init.php in your plugin.

$menuContainer = ClassRegistry::getObject('MenuContainer');
		'url' => '/cc_nyancat/nyan/index',
		'class' => 'nyan-cat',
		'caption' => 'Nyan Cat',
		'logged' => false,
		'admin' => false

Adding new page in project level tab

Usually pages works as an item under some project. In that case, your page should be added as project level item. to do that, use MenuContainer class again. Also route setting must be added to determine which is the current project.

          'plugin' => 'cc_nyancat',
          'controller' => 'cc_nyancat_chart',
          'action' => 'index',
          'class' => '',
          'caption' => 'Nyan Down Chart',
          'params' => 'project_id',
          '_allowed' => true // for bypassing permmission system.
// make sure put new route setting which includes project_id
Router::connect('/projects/:project_id/nyanchart/:action', array('plugin' => 'cc_nyancat','controller' => 'cc_nyancat_chart'));

Injecting HTML piece to various places

When you want to change existing pages in CandyCane, you can interrupt page rendering based on template. You can hook specific template by HookContainer class. As long as templates are separated well, you can inject your code into existing page. In this example, Nyan Cat will be shown after the template of related issues.

$hookContainer = ClassRegistry::getObject('HookContainer');
	'issues/relations', // target element name.
	'../../plugins/cc_nyancat/views/elements/nyancat', // additional template you want to inject.
	false // it should be true when you want to inject before the target template.

Installing plugin

Installing plugin requires manual step currently. It should be automated some time in future. But actual step is just unpack plugin and place it under app/plugins. All candycane plugin must be named starting with “cc_”. CandyCane will find init.php under the directory like “app/plugins/cc_*”.

To see detail, please try cc_nyancat plugin on my github page.
I hope you enjoying CandyCane and making your cool plugin on that.


PHP Matsuri was awesome!

PHP Matsuri is biggest php hackathon event which happens in Japan. About hundred of php hackers were around there. And they wrote their code, attended workshops and saw authors of frameworks. The venue was hotel and this event has been continuing about 30-hours. All people got fantastic time which is not able to explain in text. See the picture above. Can you see everybody seem tired and smiling? That is the proof of fantastic time.
I was one of organizers. Also I made a hack for CandyCane while this hackathon. Before writing post about the hack, I would explain what was PHP Matsuri.

Great Sessions


We’ve been inviting speakers from various framework communities. We had five of great guest speakers:

Each session were really impressive and provide latest information of web programming. We recorded those sessions. Now those are online at Vimeo.

24-hours hackathon

The hackspace was lines of big table located backside of venue. It opened at noon of first day and closed at noon of second day. It kept open over night. Almost 30-peoples kept developing over night. People spent lot of beers, energy drinks,snacks, musics, ninja costume, Angry Birds on big screen and their passion. Those things made us really productive.

41-demos at 2nd day

After the hack time, 41-peoples applied their hack to demo sessions. Each presenter had 3-minutes appealing time. Having 40 of lightning talks is bad idea under the normal circumstance. But PHP Matsuri made it special. We really enjoyed those talks and We hoped it doesn’t end. This part is most important element of this event. And this moment shows up only for people who participated 24-hours hackathon.

This post is too short to explain how was it exciting event. If you feel something from this post, I hope you will join us this event on next time. See you there!

Introducing CakePHP version of Redmine.

Redmine is a popular bug tracking system which is built on Ruby on Rails. It has great functionality – managing bugs, organizing multiple project, customizability from administrator dashboard. But sometimes rails based application requires extra care for versioning of Ruby and related gems.

If Redmine is built on PHP, it would be easy to use.

On April,2009 we were inspired from this simple idea, and named this project as “CandyCane”. Now we released CandyCane v0.8.1.

Easy install

CandyCane has more than 130 action converted to CakePHP code. Project is focusing on basic issue management and WordPress like 3-minutes install. You can setup CandyCane very quick. Just upload files under document root, navigate to index and follow the instruction. if you don’t like it, just delete the folder and database tables. CandyCane doesn’t require any command line operation or administrator privilege.
CandyCane is also internationalized with gettext based locale file. It already supports 8-languages(chi,deu,eng,fre,jpn,rum,rus,tha). As we receive more translations, we make them available for immediate use within CandyCane. If you want to assist with translation, please feel free to send a pull request via Github.



16-developers contributed to CandyCane project already. On April 2009, eight Japanese CakePHP developers had 100-hours hackathon to start this project. Although 100 hours is not short, we were unable to finish in this time. Project has been continuing on internet. I, yando had a presentation about CandyCane on official CakePHP event “CakeFest 2011”. After that more developers started contributing project. It is including Graham Weldon (predominant) who is a core developer of CakePHP framework. Project keeps going on and it’s getting more active than before.


CandyCane is not supporting repository viewer, gant chart, documents and forum feature. In CandyCane, those features will be implemented as plugin. We are going to work on code clean up including migration to newer version of CakePHP. After that build structure for plugin system. We will appreciate any bug report, translation, documenting and sending pull request!

Other Materials

Project on github.

Live demo and bug tracking of CandyCane itself.

presentation slide from CakeFest 2011.

screen cast of issue tracking. (early edition)