Tag Archives: cakephp

Cakephp 3 – using uuid as primary key

In addition to use an auto-increment key as the primary key, you may also use UUID columns. CakePHP will create a unique 36 character UUID (Cake\Utility\Text::uuid()) whenever you save a new record using the Table::save() method.

From the book;
https://book.cakephp.org/3.0/en/intro/conventions.html#model-and-database-conventions

So if you create your primary key field as char(36) , cakePHP3 will generate unique uuids rather than the stand auto-incremented 1,2,3 4 keys

Credit to stackoverflow again;
http://stackoverflow.com/questions/34519770/cakephp-3-save-function-not-generating-primary-key-for-database

 

Install a new Cakephp3 Project with composer

  1. You need the php tool composer which you can get from composer.org
  2. Simply run the following command in the windows command prompt  while in your “c:\xampp\htdocs\” folder;
    composer create-project --prefer-dist cakephp/app mywebapp

    3.In your htdocs folder you should see a new folder called “my_app_name”

    Example:
    If you wanted to create an application called  “mywebapp” simply enter;

    composer create-project --prefer-dist cakephp/app mywebapp

CakePHP3 Cache Example – Using Curl to get a Web page contents


Heres a simple example of using the cache feature of cakephp. We want to grab a webpage contents from the web but we only want to do this once otherwise its going to be slow and waste resources.

The basic idea is that we check if the url is saved in cache, if it is then we read it in otherwise we must use curl to grab it.

CakePHP3’s Cache settings are in the config/app.php file;

/**
* Configure the cache adapters.
*/
'Cache' => [
'default' => [
'className' => 'File',
'path' => CACHE,
'url' => env('CACHE_DEFAULT_URL', null),
'duration' => '+60 minutes',//the duration object should cached for
/*'prefix' => 'mycacheprefix_',*/
],

 

 

CakePHP 3 Cache:
https://book.cakephp.org/3.0/en/core-libraries/caching.html

Cakephp 3 Plugin – Changelogs

Ive finally gotten around to releasing this little app i was working on for Cakephp3.  I decided a while ago to abandon Cakephp 2 and go with the new version 3.

Its been a steep learning curve so i wanted to learn as much as i could.  So thats where this app/plugin came in.

The Aim:
The goal of the plugin was to allow a way to simply log tasks, changes or articles about the cakephp project your working on.

If your working on a website/project on your own you need a way to record your changes and tasks so i thought this would be an ideal way to learn and release something. Sure you could do the same with Github and better but i think its better to have something like this integrated into your application.

Screenshot: Version 1
2016-05-25

 

 

 

 

 

Version 2 Screenshot:
changelogseditv2

 

 

 

 


Github & Source:

https://github.com/gerrymcdonnell/cakephp-changelog

Cakephp 3- How to read a remote Xml file

23666One of the great things about CakePHP is that it has a lot of built in librarys.  Heres an example of how to read a remote XML file.

 

 

 

use Cake\Utility\Xml;
use Cake\Network\Http\Client;

//XML file you want to read in
$url="http://store.steampowered.com/feeds/newreleases.xml";

//read a remote xml file
$http = new Client();
$response = $http->get($url);
$xml = Xml::build($response->body());


//Method 1 using SimpleXMLElement Object
//loop the item elements array of xml file
foreach($xml->channel->item as $item){
	//need to cast to string
	debug ((string)$item->title);
	debug ((string)$item->link);
}


//Method 2 convert xml to array
$xml = Xml::toArray($xml);

//loop elements of array
foreach($xml['rss']['channel']['item'] as $item){
	debug ('Title:'.$item['title']);
	debug ('Link:'.$item['link']);
}

The result will print out the list of items from the feed;
http://store.steampowered.com/feeds/newreleases.xml

cakexml

 

 

 

 

 

 

More info here;
http://book.cakephp.org/3.0/en/core-libraries/xml.html#importing-data-to-xml-class

CakePhp3 – Date Formating and Timezone

23666Quite simply this is a pain to set right, as it seems to default to the american time zone despite several efforts to configure it to european time in both Cakephp3 and the Php.ini file.

But you can display the needed time format as follows in your view action;

Below the field “created” is a date field in a MySQL Database.

echo $order->created->i18nFormat('dd-MMMM-YYYY HH:mm');

Edit;

To set the timezone of your application you need to go to the config/app.php

Change below as follows;

'defaultLocale' => env('APP_DEFAULT_LOCALE', 'en_US'),
to
'defaultLocale' => env('APP_DEFAULT_LOCALE', 'en_IE'),

This wont change the default display of dates but will set the dates to be displayed in the locale you desire.

edit;

MORE here

cakephp3 – fixing the index method for admin and normal user

23666Say for example you dont want normal users being able to see a list of items in this example lets say its questions.  But at the same time you want an “admin” user to be able to see them.

The following function might help;

 public function index(){
        
		$user_id=$this->Auth->user('id');
		$role=$this->Auth->user('role');
		
		//check users role and show all questions if admin or just their questions of normal user
		
		if($role=='admin'){
			//show all questions
			$this->paginate = [
				'limit' =>20,
				'order' => ['Questions.modified' => 'desc'],
				'contain' => ['Users', 'Questionscategories']
			];
		}
		elseif($role=='user'){
			//show only the users stuff
			//set the pagnate options
			$this->paginate = [
				'limit' =>10,
				'order' => ['Questions.modified' => 'desc'],
				'contain' => ['Users', 'Questionscategories'],
				'conditions'=>['questions.user_id'=>$user_id]
			];
		}
		

		
		
		$questions = $this->paginate($this->Questions);


        $this->set(compact('questions'));
        $this->set('_serialize', ['questions']);
    }

What it does:
basically if does a different pagnate depending in the user’s role.

Cakephp3-Creating custom queries

23666In your object table;

public function findArtistBy(Query $query, array $options)
{
$artist = $options['search'];

return $query->where(['artist LIKE ' => $artist])
->orwhere(['title LIKE ' => $artist])
->contain(['Mp3files'])
->order(['title' => 'DESC']);
}

In your controller method;

$options['search']=$search;
$query=$this->Mp3filesTags->find('ArtistBy',$options);

$this->Flash->success(__('Search complete'));

$this->set('results', $query);
$this->set('count',$count);

So what does it do?
It will return the results where the artist field is like eg.”U2″ and where the title is like “U2”.
It also has an order clause in there and will contain the related records set “mp3files”.

Reference:
http://book.cakephp.org/3.0/en/orm/query-builder.html