Showing posts with label CakePHP. Show all posts
Showing posts with label CakePHP. Show all posts

Thursday, 14 July 2011

CakePHP preg_match Error

Warning (2): preg_match() [function.preg-match]: Delimiter must not be alphanumeric or backslash...
If you have met a warning similar with above, you will have to check on the $pattern of the preg_match() function. According to php manual:

When using the PCRE functions, it is required that the pattern is enclosed by delimiters. A delimiter can be any non-alphanumeric, non-backslash, non-whitespace character. 

So if your $pattern is a pure alphanumeric string,you will need to enclose the $pattern with delimiters such as / , or # or etc.

Monday, 27 June 2011

CakePHP Update ACL

Let's say we have created new controller(s). For authentication and security purposes, we will need to update the acl. If we are lazy to go through the bake cake console, we can try the following steps:

1. In initDb() function under controllers/acls_controller.php, defined the user groups properly. (the actions allowed/denied for each user group) Save the file.
2. Comment all functions/variables besides the Auth-related, in app/app_controller.php. (To make sure that initDb() will be executed).
3. In the web browser, type the url and launch it:
{address}/acls/initdb
4. Uncomment functions/variables in app/app_controller.php, if they were commented just now.

Wednesday, 22 June 2011

CakePHP - Parse Data From Controller To View

Let's say $a = '123', in index() in users_controller.
If we want to use the $a in users/index, we can use set() and compact():

$this->set(compact('a'));

*set() : Send data from controller to view.
**compact() : Creates an array containing variables and their values.
***Note that we need to remove the dollar($) sign when using compact().

Reference:
1. Stupid CakePHP Controller Tricks
2. Interacting with Views

Monday, 20 June 2011

CakePHP Trap: findAllBy() and find('all', ...)

I have a variable $productId. Comparing these two functions:


1. $pricelists = $this->PricesProduct->find('all',array('conditions'=>array('PricesProduct.id'=>$productId)));
$pricelists = $this->paginate('PricesProduct',$pricelists);


2. $pricelists = $this->PricesProduct->findAllByProductId($productId);
$pricelists = $this->paginate('PricesProduct',$pricelists);






If $productId = 1, the 2nd function will generate error but not for the 1st function.


Warning (512): SQL Error: 1054: Unknown column 'PricesProduct' in 'where clause' [CORE/cake/libs/model/datasources/dbo_source.php, line 684] 
Warning (2): Invalid argument supplied for foreach() [APP/views/...] 






Why?
I dont know the reason, but from the logs, two similar functions generated different sql codes:






For the 1st function:
1.  SELECT ... WHERE `PricesProduct`.`id` = 1,
which then generate normal sql code:
SELECT COUNT(*) AS ...  WHERE 1 = 1


For the 2nd function:
1. SELECT ... WHERE `PricesProduct`.`product_id` = 1,
which then generate the following problematic sql code:
SELECT COUNT(*) AS ... WHERE ((PricesProduct IN ('28', '1', '13' .....






I guess that findAllBy() is unable to generate a key for the find result, causing all data to be fed into the coming functions.


Therefore, it is advised to avoid using findAllBy() although it may have saved some programming time, yet it increase the risk of having to waste more time on debugging.
 
Sorry, it's my mistake that i myself is confused with two different functions that cause different result.
So, there is currently no trap in cakephp!

Monday, 13 June 2011

CakePHP Login Redirection

Let's said we want page to be redirected to Reservation index page after a User's login to the website, we can therefore create the login redirection in the beforeFilter() function in UsersController:
 
$this->Auth->loginRedirect = array('controller'=>'reservations', 'action'=>'index');
 
And, i really need to shout at CakePHP for having such a lousy documentation.

Thursday, 9 June 2011

CakePHP Drop Down List - Same value for 'keys' and 'values'

By default, when we use the form helper to generate a [select] drop down list, the [value] of each [option] is the [id] of the particular table. However, we sometimes need to have [value] which is the same as the content of the [option], therefore we will need to use array_combine() function.

We can do in such a way:
 $array1=array_combine($array1, $array1)
$array1 is an array of data. The first parameter will go to be the [key] of the new array and the second parameter will go to be the [value] of the new array, thus making both the [key] and the [value] of the new array having the same value.

Let's said :
$array1(
[1] => a
[3] => b
[4] => c
)

After using the array_combine() function, the $array1 becomes:
$array1(
[a] => a
[b] => b
[c] => c
)

Reference:
1. FormHelper - Setting Option Value in Select Dropdown
2. php.net - array-combine

Monday, 23 May 2011

Disabling CakePHP Auto Escape In Helpers

As we know, CakePHP will automatically escape special characters to sanitize the data.
Sometimes we do not want to escape the special characters, for example "Textarea" inputs, or some inline javascript (eg: onclick= "return function ('xxxx')" when we are using form/html helpers.
For these reasons, we can declared
'escape'=>false

in the $options (or $attribute ??) array.
As a result, the special characters in html code will be preserved.

Example:
echo $html->tableCells    (array    (array    ($form->checkbox('Checkbox1', array    ('escape'=>false,'onlick'=>'return checkbox(\'CheckboxCheckbox1\')')) ..... 


Reference:
Look for the first reply of the article.

Thursday, 19 May 2011

CakePHP - Matching Multiple Checkbox Inputs With Join/Cross Tables Without Magic

Given the situation: A `trainee` wants to select available time for courses. We have Table `days` and Table `sessions`, having a join table `days_sessions`. Each `days` may have 3 `sessions`, and  can select multiple `days` in the form. In the end, we end up with another join table like `trainees_days_sessions`

1. We have predefined data in `days_sessions`, e.g. Monday morning - 'MonM', Tuesday night - 'TueN', etc.
2. In the form we have checkboxes for each `days_sessions`. We may code it as

Input type='checkbox' id='data[DaySession][DaySession][]' name='data[DaySession][DaySession][]' value='*'/

Note that the `id` must be coded in such a way of data[model_name][model_name][] (as defined in your model), while the value (* sign) must be the `id` column in `days_sessions` table.

Thursday, 12 May 2011

Bake Cake MySQL error

If you have come across to warnings like
Warning: mysql_connect(): [2002] No connection could be made because the target machine actively in ...cake\libs\model\datasources\dbo\dbo_mysql.php on line...
PHP Warning: mysql_connect(): No connection could be made because the target machine actively refused it. in ...cake\libs\model\datasources\dbo\dbo_mysql.php on line ... 
And etc. Can try the following solution below:

1. Open php.ini
2. Look for the mysql.default_port, set it to the number accordingly, e.g.
mysql.default_port = 3306 

Fatal Error While Baking Cakes

Fatal error: Call to undefined function mysql_connect() in C:\...\cake\libs\model\datasources\dbo\dbo_mysql.php on line 600'
If you are using easyphp and have met this fatal error when baking cakes, can try this:
1. Copy php.ini from [easyphp]\apache to [easyphp]\php.

Reference:
Look for reply from andrej

Bake Cake with PHP in windows

In my case, i am using Windows 7.

1. Open cmd
2. CD to php directory
e.g. c:\program files\easyphp\php
3. Bake the cake using php.exe.
e.g. c:\program files\easyphp\php\php.exe "c:\[your localhost+project name]\cake\console\cake.php" bake
4. Start baking the cake!

Reference:
http://kodegeek.wordpress.com/2009/06/13/how-to-bake-on-windows-xampp-environment/

Tuesday, 10 May 2011

First Attempt With CakePHP

Currently learning from the IBM tutorial:
Cook up Web sites fast with CakePHP, Part 1: Getting started

I am using easyphp, and is go to set up the new cake as a production installation.

Several important steps:
1. In httpd.conf, set document root to:
DocumentRoot "${path}/www/cakephp/app/webroot" 


2. Also in httpd.conf, also set document root directory to
Directory "${path}/www/cakephp/app/webroot" 
...
 AllowOverride All
...


3. Setting up the database configuration:
Copy and rename the "app/config/database.php.default" into "app/config/database.php" and edit accordingly.


4. Create a user model:
 Create the file as "app/model/user.php" (or whatever name, as long as know how to handle)


5. Create a register view:
Create the file as "app/views/users/register.ctp" 


6. Create a controller and register action:
Create the file as "app/controller/users_controller.php". 



7. Bake it:
Go to the url: "http://localhost/users/register". 

Monday, 9 May 2011

CakePHP, EasyPHP and mod_rewrite

For a standard EasyPHP package, mod_rewrite is off in httpd.conf.
As using CakePHP requires the mod_rewrite, we will need to modify the httpd.conf of EasyPHP by just, uncomment it.

#LoadModule rewrite_module modules/mod_rewrite.so -> remove the hash