How To Migrate CakePHP 1.x To 2.x

Today, we will focus on what we need to do to get CakePHP 1.3 application upgraded to CakePHP 2.2.3-the latest official stable release

Installation

This is pretty straight forward, same as CakePHP 1.3 version.
Download and unzip the CakePHP 2.2.3 and follow these below-mentioned instructions.

Configuration

  • core.php
  • Make sure to copy the security.salt and Security.cipher_seed from your old core.php
  • Take notice of how errors, sessions and caching have changed.
  • database.php
  • There is a minor change on this file,
  • CakePHP 1.3: ‘driver’ => ‘mysqli’
  • CakePHP 2.2.3: ‘datasource’ => ‘Database/Mysql’
  • routes.php
  • Don’t overwrite this file with your older one.
  • You can place your custom routes before or after CakePlugin::routes()
  • bootstrap.php
  • Copy all functions, constants and other code from your old bootstrap into the new one.

Folder Structure

  • The cake folder is now inside lib folder. There is nothing to do with this.
  • Files and folders are now CamelCased instead of lower_underscored
  • Example: The “users” folder inside the View becomes “Users”
  • The controller files are now UsersController.php instead of users_controller.php
  • project_user_controller.php becomes “ProjectUsersController.php”
  • The model files are now User.php instead of user.php
  • project_user.php model becomes “ProjectUser.php”
  • The components files are now FormatComponent.php instead of format.php
  • The helpers files are now DatetimeHelper.php instead of datetime.php

Moved APP files

  • The parent app_classes have been moved and renamed as well.
  • Instead of app_controller.php, app_model.php, and app_helper.php now become Controller/AppController.php, Model/AppModel.php, and View/Helper/AppHelper.php.

Auth Component and Login

  • Auth now supports multiple authorization adapters that can all be used together
  • Cake 1.3.x was automatically checking if user has correctly entered username/password inside your login () method of users_controller but in cake 2.x we need to manually call $this->Auth->login () this returns Boolean value based on successful login or failure.

If you are using “email” as your login field name
CakePHP 1.3: (inside AppController beforeFilter)

$this->Auth->fields = array('username' => 'email', 'password' => 'passw

CakePHP 2.2.3: (inside AppController beforeFilter)

$this->Auth->authenticate = array('Form' => array('fields' => array('username' => 'email', 'password' => 'password')));

Auth Login

CakePHP 2.2.3: (inside UsersController login function)

if (!empty($this->request->data)) {
if ($this->Auth->login()) {
$this->redirect($this->Auth->redirect());
} else {
//$this->Session->setFlash('Your Email or Password was incorrect.');
}
}

CakePHP 2.x auth automatically hashes the password on login but not on save.

We can add a beforeSave() method on the User model to hash the password.

public function beforeSave($options = array())
{
$this->data['User']['password'] = AuthComponent::password($this->data['User']['password']); return true;
}

Request Data

  • CakePHP 2.0 has done some request related changes.
  • The Request Object does not have “form” element any longer.
  • You will need to replace $this->params[‘form’] with $this->request[‘data’] or $this->request->data.
  • $this->data needs to be replaced with $this->request->data
  • So, now we can use $this->request->data on both form submit and AJAX post.
  • Now, we need to check !empty($this->request->data) instead of “!empty($this->data)” while saving a form.

Views Changes

  • Use $this->Html->link() instead of $html->link()
  • Use $this->Form-> instead of $form->
  • Use $this->Session-> instead of $session->
  • Use $this->Paginator-> intead of $paginator ->
  • For JavaScript inclusion use $this->Html->script(“”) instead of $javascript->link()

Moved Email Elements

  • Email elements have been moved from views/elements to View/Emails.

Helpers

  • The Ajax, Javascript, and XML helpers have been removed. You will need to replace these helper calls with appropriate alternatives
  • Helpers can no longer be called with “$helper->function()”. You need to update your helper calls to use $this->Helper->function()
  • If you are loading or importing your helpers inside another custom helper or component,
  • $myhelper = new DatetimeHelper() becomes $myhelper = new DatetimeHelper($this->_View) or $myhelper = new DatetimeHelper(new View(null))

Components

  • All component files should be extended by Component Class instead of Object

DB and Code Caution

  • There is no Enum Support in cakephp2.x as sql server doesnt have similar datatype.
  • You can change enum to tinyint(2)
  • In cake 1.3 used tinyint(1) for is_active database fields.
  • While retrieveing from database it returns 0/1
  • But, cakePHP2.x no longer returns as 0. This will return bool(true) /bool(false)
  • Boolean column values will be casted to php native boolean type automatically.

__() Function and Pagination

  • The __() function no longer has the option to echo. It always returns
  • Change the Pagination code,

CakePHP 1.3:

echo $this->Paginator->counter(array( 'format' => __('Page %page% of %pages%, showing %current% records out of %count% total, starting on record %start%, ending on %end%'', true)));

CakePHP 2.2.3:

echo $this->Paginator->counter(array( 'format' => __('Page %page% of %pages%, showing %current% records out of %count% total, starting on record %start%, ending on %end%'')));

How to use ActiveRecord Callbacks in Rails

Rails3Callbacks are a great technique for achieving simplicity and flexibility. A callback allows you to run some code (usually a method) automatically when another piece of code runs. In Rails, you’ll commonly see callbacks that run before, after or even around other bits of code. Callback functions are minimizing the length of codes in controllers.

Implementing Callbacks

There are four types of callbacks accepted by the callback macros:

  • Method references (symbol)
  • Callback objects
  • Inline methods (using a proc)
  • Inline eval methods (using a string) – deprecated

Here is the list of some useful callback functions while saving AcriveRecord objects

  • before_save
  • after_save

before_save:

This method is called before an ActiveRecord object is saved.

class Post < ActiveRecord::Base before_save :update_slug protected def update_slug self[:slug] = [year, season_slug, season_type_slug].compact.join '/' end end

after_save:
Once the active record object saved some method will be fired in that scenario we have to use the after_save callback.

class Post < ActiveRecord::Base after_save :handle_status_changed protected def handle_status_changed Setting.create(:post_id=>self.id , :status => true) end end

Creating an Engine on Refinery CMS

Refinerycms

‘Engines’ are nothing but ‘plug-ins’ which adds up extended functionality to the existing Refinery application. Engines installs in the “vendor/extensions” folder in a refinery app.

Engines will create a tab in the Admin panel of the Refinery CMS to control the information on the engine.This example demonstrates creating an engine in an existing refinery app. The environments used are Ruby 1.9.3, Rails 3.2.8 & Refinery cms 2.0.8.

Step#1

To create an engine, just execute the below command

rails generate refinery:engine engine_name attribute:type attribute:name

NB: The engine name should be in singular which will generate the structure in plural form.
For example we want a FAQ engine for our CMS which will be controlled by CMS admin

rails generate refinery:engine MyFaq question:string answer:text

Running the above command will create a new folder “extensions” under “vendor” directory and in the “extensions” the new engine “my_faqs” will be created.

Step#2

After that run the below commands to make it executable

bundle install
rails generate refinery:my_faqs
rake db:migrate
rake db:seed

Step#3

Restart the server to get the effect. You will find the new tab “My Faqs” has been added both in the menu section of the user section and admin section.

Login as Admin to manage your FAQs

How to customize an engine during creation?

Creating the engine with a namespace

rails g refinery:engine MyFaq title description:text --namespace FAQ

Creating the engine by skipping the frontend pages

It will add menu and form page in the admin section only. User section will be omitted

rails g refinery:engine MyFaq title description:text --skip-frontend

How to cut down Amazon Web Services (AWS) billing?

Amazon_S3_online_servicesAndolasoft is specialized in providing Cloud Computing services to its customers. Here we have a huge team of skilled personnel to provide monitoring and support services for 24×7 across the world.

As a technology partner with Amazon Web Services, we would like to share some features as well as some useful tips about controlling the AWS billing cost.

What is Cloud Computing?

Integrating computing resources with World Wide Web to provide remote IT Infrastructure facilities is Cloud Computing. It’s an option to replace traditional IT infrastructures with virtual networking for faster job processing and higher productivity at lower costs.

What is AWS?

Amazon is providing similar IT infrastructure services as a web service, popularly known as Amazon Web Services or AWS. Currently it is providing services to millions of businesses in more than 190 countries.
Features that makes AWS unique in public cloud

  • Auto Scaling

Number of Amazon EC2 instances can be scaled dynamically or by user defined schedule to increase or decrease them automatically depending on the demand. You will receive notifications to initiate Auto Scaling actions, or when Auto Scaling completes an action. Auto scaling feature can be used via APIs or Command Line Tools with no additional fees.

  • Amazon Cloud Front and it’s Functionalities

Amazon Cloud Front is a web service to distribute contents to end users at high speed .Here you can store the original version of your files on one or more origin servers and configure them by using URL pattern matches to specify which origin has what contents. You can use distribution’s domain name in your web pages or application so when users request an object using this domain name, they are automatically routed to the nearest location to deliver your contents.

  • AWS Identity and Access Management (IAM)

Manage IAM users and their access- Identity and Access Management (IAM) offers greater security, flexibility, and control when using AWS. IAM enables you to create users in AWS and manage access to AWS services and resources for your users. It also enables you to grant access to users managed outside AWS. You can assign individual security credentials (access keys, password, Authentication devices) or request temporary security credentials to provide users access to AWS services.

Manage IAM roles and their permissions- You can create roles in IAM and manage permissions to grant specific operations to the entities.Manage access for federated users- You can enable identity federation to allow users to access the AWS Management Console, without creating an IAM user for each identity. It is done by requesting temporary security credentials. This temporary security credentials are comprised of short lived access keys and session tokens associated with them. Users can use the access keys the same way as before, but they also have to pass the token . They can further be restricted by specifying explicit permissions while creating them. Any number of temporary security credentials can be issued.

  • IAM provides the following access controls:

Fine-grained access control to your AWS resources: IAM enables you to add specific conditions to control how a user can use AWS, such as time of day, their IP address, by using SSL, or authenticating with a Multi-Factor Authenticationdevice.Identity federation between your enterprise and AWS services: IAM can be used to grant employees, and applications access to AWS Management Console and AWS service APIs, using existing identity systems.

Mobile and browser-based applications: Mobile and browser-based applications can also be enabled to access specific AWS resources using temporary security credentials for a configurable period of time.

Tips to cut down AWS Billing:

  • Use AWS reserved instance for long running projects and spot instances for short term projects.
  • Use AWS private IP for data transfer between instances.
  • Use AWS Rout53 DNS to reduce Elastic IP usages.
  • Use Linux based Instances.
  • AWS recently lunched Glacier which offers $0.01 per GB / month only. Use Glacier for data storage instead of S3 to reduce the price of S3.

Planning anything on AWS? Talk to our Experts

Creation of a New Rails App using Refinery CMS

Refinery CMSRefineryCMS is a powerful Ruby on Rails CMS. Here I have created a blog-cms application using Ruby 1.9.3 and Rails 3.2.8

Step#1
Install the RefineryCms gem version 2.0.8 from the terminal

gem install refinerycms

Create a new rails application with ‘MySQL’ database using the command line in the terminal

refinerycms myblog -d mysql

It will automatically run the following commands

bundle install</div>
<div>rake  db:create db:migrate</div>
<div>rake  db:seed

Step#2
Go to the app on the terminal

cd myblog

Step#3
Start the rails server in the terminal

rails s

Step#4
Open a browser window and navigate to “http://localhost:3000/”
The signup window pops up to prompt you to create your first Refinery user. This is the Superuser of Refinery, which has the ability to create other users.
That’s it!
The application runs now.
Other useful information to customize Refinery CMS application

  • You can change the “Site Name” to a name of your choice currently displaying in the home page

In “config/initializers/refinery/core.rb”
config.site_name = “Company Name”

  • You can customize the design or functionality

To override files from refinerycms to the existing app we have to use the below commands

rake refinery:override view=file_name

Here are some examples:

rake refinery:override view=pages/home</div>
<div>rake refinery:override view=refinery/pages/home</div>
<div>rake refinery:override view=**/*menu</div>
<div>rake refinery:override view=_menu_branch</div>
<div>rake refinery:override javascript=admin</div>
<div>rake refinery:override javascript=refinery/site_bar</div>
<div>rake refinery:override stylesheet=home</div>
<div>rake refinery:override stylesheet=refinery/site_bar</div>
<div>rake refinery:override controller=pages</div>
<div>rake refinery:override model=page</div>
<div>rake refinery:override model=refinery/page</div>
<div>rake refinery:override presenter=refinery/page_presenter

Implementation of other refinerycms engines are also available

For example:

Add the gem to your applications Gemfile

  • gem ‘refinerycms-page-images’, ‘~> 2.0.0′
  • Execute bundle install
  • rails generate refinery:engine name

Example:

  • rails generate refinery:page_images
  • rake db:migrate

The Orangescrum Feature Summary

Constant updates to Orangescrum takes place as the engineers keep on adding new features almost every day. With these new features, your project management will now be simpler, faster, and transparent. Here are a few added:

Case Templates: Create templates for repetitive cases and choose them while posting cases.

Project wise Case Search: Search cases project-wise for effective easy case tracking & project management.

Case Glide Chart: A graphical chart to track bugs, enhancements, development, R & D, Quality Assurance, Maintenance and upgradations during a certain period in the project timeline.

Case Glide Chart

File or Case Archiving: You can archive files or cases not used anymore and also restore them back when needed.

Image Viewer and Direct Image Links: View attached images in your projects through the pop-up image viewer. Also, view images on Orangescrum from direct mail links and download them.

Image Viewer and Direct Image Links

Improved Email Notifications: You can now set preferences for receiving email notifications to admin or team members regarding projects/milestones etc.

Improvised Milestones Management: Keep track of overdue and upcoming milestones.

Improvised Milestones Management

(OPTIONAL)

We’re on the process of adding some new features like calendars, Improved Time Tracking, and Project Report Generation to our future updates.

Keep visiting the space for more updates.