Archive for category PHP

PHP Redirect 301 Permanently

Sometimes you might want to redirect your visitors to a new URL address. This article will show you how to make a PHP redirect using the 301 “moved permanently” redirection. This is the one you should use as it is the most search engine friendly. Like the name suggests, PHP redirect tells the browser (or a search engine bot) that the page has been permanently moved to a new location.

PHP Redirect Code

To redirect people and robots to a new location use this PHP redirecting code:

header("HTTP/1.1 301 Moved Permanently");
header("Location: http://www.New-Website.com");

You could skip the 301 Moved Permanently tag and use just:

header("Location: http://www.New-Website.com");

But this would result in a “302 Moved Temporarily” redirect instead of a 301 one. This should be avoided as permanent redirects are more search engine friendly and should be used where possible.

You can enter any sub-page for the location, this PHP code will redirect users to the test.php sub-page of your website:

header("HTTP/1.1 301 Moved Permanently");
header("Location: http://www.New-Website.com/test.php");

It is important that you don’t have any other code (including empty rows and spaces) before the above PHP redirect code. If you do you will get a nice headers already sent notice from PHP and the redirect will not work.

That’s it! Enjoy redirecting PHP pages.

No Comments

Compressing Stylesheets with PHP

If you wonder what else you can do to compress your files, I found a PHP code of which is written by a German coder that is shared on another blog. Basicaly it removes spaces and back slashes to minify the included files and compress them using ob_gzhandler.

  header('Content-type: text/css');
  ob_start("compress");
  function compress($buffer) {
    /* remove comments */
    $buffer = preg_replace('!/\*[^*]*\*+([^/][^*]*\*+)*/!', '', $buffer);
    /* remove tabs, spaces, newlines, etc. */
    $buffer = str_replace(array("\r\n", "\r", "\n", "\t", '  ', '    ', '    '), '', $buffer);
    return $buffer;
  }

  /* your css files */
  include('master.css');
  include('typography.css');
  include('grid.css');
  include('print.css');
  include('handheld.css');

  ob_end_flush();

No Comments

Compressing Web Site Contents, Scripts and Stylesheets

Today I wonder how I could minify my javascript files and do a server side compression to minimize the cost of loading web site requred javasript and stylesheet files. Where to begin… I’ll start from Apache Server configuration information for server side compression and finish with YUI Compressor that helps you to minify your script files as you should have seen those files ending with “your_script_file.min.js”. If you are using Apache Server, you might have Deflate Module installed with your Apache installation. What you need to load this module while your your server starts is to configure your apache configuration file.

LoadModule deflate_module modules/mod_deflate.so

And if you have access to the httpd.conf then you can add following lines to it.

<Location />
    AddOutputFilterByType DEFLATE text/html text/plain text/xml text/x-js text/css
</Location>

If not; you should specify the initialization line into your htaccess file.

<IfModule mod_deflate.c>
AddOutputFilterByType DEFLATE text/html text/css text/plain text/javascript text/xml application/xhtml+xml application/x-httpd-php
</IfModule>

You might have problems to compress javascript files which has different mime types. Then, you can use followig configuration.

AddOutputFilterByType DEFLATE application/x-javascript

That will do. Now, I will introduce YUI Compressor. YUI Compressor is one of Yahoo developer team product that you can download from here. If you have dowloaded the YUI Compressor built from the site that I shared above, what you should do to compress your file is:

java -jar yuicompressor-x.y.z.jar myfile.js -o myfile-min.js --charset utf-8

Where, x, y and z are the version number of the YUI Compressor download. Also you can find more information about YUI Compressor at http://developer.yahoo.com/yui/compressor/#work

Thank you for reading, I hope this will help some of you guys.

No Comments

CakePHP : Translate Behaviour : Fixing Nested Translation Problem

If you ever tried to use Translation Behaviour of CakePHP you should realize that Translate Behavior does not support nested translations for the model relations. I’ve found one article that shows how to fix a similar translation problem on related models at http://groups.google.com/group/cake-php/browse_thread/thread/9b7e60900269643b%29.

Unfortunately it was not a complete solution that you can implement easily but it gave me a good approach to help the model to request nested queries to make Translate Behaviour work.

I need to warn you that this solution is not a really good one but until CakePHP team fix this issue on one of the future releases of CakePHP this would help you a lot.

Here is the code:

class AppModel extends Model {

    var $_findMethods = array('all' => true, 'first' => true, 'count' => true,
		'neighbors' => true, 'list' => true, 'threaded' => true, 'translated' => true);

    function _findTranslated($state, $query, $results = array()) {
        if ($state == 'before') {
            return array_merge($query, array(
                //'fields' => array('id', 'name'),
                //'recursive' => -1
            ));
        } elseif ($state == 'after') {
            if (empty($results)) {
                return $results;
            }

            // get the model's belongs to relation model names
            $belongsTo = Set::extract($this->belongsTo, '/@*');

            if(!empty($belongsTo) && isset($belongsTo[0]) && is_array($belongsTo[0]))
                $belongsTo = $belongsTo[0];

            if(!empty($belongsTo))
                foreach($results as &$result)
                {
                    foreach($belongsTo as $modelName)
                    {
                        if(isset($result[$modelName]) &&
                            isset($result[$modelName]['id']) &&
                            !empty($result[$modelName]['id']))
                        {

                            $data = $this->$modelName->find('first', array(
                                'conditions' => array(
                                    $modelName.'.id' => $result[$modelName]['id']
                                ),
                                'recursive' => -1
                            ));

                            if(!empty($data))
                                $result[$modelName] = $data[$modelName];
                        }
                    }
                }

            return $results;
        }
    }
}

What you need to do is just implement the _findTranslated method on your model or on AppModel for general usage with the $_findMethods private variable and instead of using regular find methods for example:

$this->Post->find('all');

You should use:

$this->Post->find('translated');

And the result will look as the same above but with translated inner relations.

Not: I have not implement all types of the relations yet but if you find hard to add such relations let me know, I’ll do my best.

I hope this could help you. Please leave me some responses to make sure is helpful.

Thank you for reading this article.

No Comments

Building the Best SQL Manager With PHP (Part 2)

After a long day work on a complicated class I finally finished my requiered querying algorithm. The final output of my SQL Manager class is like

select
 `adproperties`.*, `properties`.*
 FROM `adproperties`
 left join (select
 *
 FROM `advertisementproperties`
  WHERE ((`advertisementproperties`.`advertisement_id` = '113'))) `properties` on (`properties`.`adproperty_id` = (`adproperties`.`id`))
  WHERE ((`adcategory_id` = (select
 `advertisements`.`adcategory_id` as adcategory
 FROM `advertisements`
  WHERE (((`advertisements`.`id` = '113') and (`advertisements`.`account_id` = '1'))))))

This worked for me perfectly. Even I add some more conditions on it. Later I’ll have time to fix the paranthesis problem but for the beginning, I’ll keep using this code instead of the old one.
I must finaly point that, I have not tried it with other kind of configuration array but after I finish the whole it will be the perfect SQL Manager Class written in PHP ever.

No Comments

Building the Best SQL Manager With PHP

Today I decided to improve one of my developed SQL Manager class to be able to create easy sql queries but complicated enough not to be able ease work on defining the complicated queries. With my old solution I could not be able to complete a query like below.

SELECT 
`adproperties`.*,
`properties`.* 
FROM `adproperties`
LEFT JOIN (SELECT * 
                FROM 
                `advertisementproperties` 
                WHERE `advertisementproperties`.`advertisement_id` = 110) `properties`
ON `properties`.`adproperty_id` = `adproperties`.`id`  
WHERE 
`adcategory_id` = (SELECT 
                           `advertisements`.`adcategory_id` as `adcategory` 
                           FROM `advertisements` 
                           WHERE `advertisements`.`id` = 110)

It is something right? So, what I need to do is adding inner queries up on my old manager even on the Joining phrases and Where clauses. It is not easy to build a complete solution for SQL because you would always think on the current problem to be fixed not the whole. Even though, I could have been able to build a generalization to create search queries on the relational queries of which is also used in many projects of mine.

Now what I can do with it is like:

SELECT
`advertisementproperties`.`id`,
`advertisementproperties`.`advertisement_id`,
`advertisementproperties`.`value`,
`adproperties_rel`.`options`,
`adproperties_rel`.`type`,
`adproperties_rel`.`adcategory_id`,
`adproperties_rel`.`id` as `adproperty_id`,
`adproperties_rel`.`name`
FROM `advertisementproperties`
RIGHT JOIN `adproperties` `adproperties_rel`
ON `adproperties_rel`.`id` = `advertisementproperties`.`adproperty_id`
WHERE (
(`adproperties_rel`.`account_id` = '1') or ISNULL
(`adproperties_rel`.`account_id`)) and (
(`advertisement_id` = 113) or ISNULL
(`advertisement_id`)) and
(`adproperties_rel`.`adcategory_id` = '22')

This code above is not able to do what I needed and it is not a good SQL query either. What I really need to do is to create better querying solution for it.

I started from the end to internal core of the code and firstly defined the object that I would like it to create my query:

$sqlMgr = new SQLManager(array(
    "method" => "select",
    "selections" => array("adproperties"  => "*", "properties"  => "*"),
    "tableName" => "adproperties",
    "relations" => array(
        "properties" => array(
            "join" => "left",
            "tableName" => array(
                "query" => true,
                "method" => "select",
                "tableName" => "advertisementproperties",
                "conditions" => array("advertisementproperties" => "advertisement_id", "=" => 113)
            ),
            "conditions" => array("properties" => "adproperty_id", "=" => array("adproperties" => "id"))
        )
    ),
    "conditions" => array(
        "adcategory_id", 
        "=" => array(
            "query" => true,
            "method" => "select",
            "tableName" => "advertisements",
            "selections" => array("advertisements" => "adcategory_id"),
            "fieldAliases" => array(
                array(
                    "table" => "advertisements", 
                    "name" => "adcategory_id",
                    "alias" => "adcategory"
                )
            ),
            "conditions" => array(array("advertisements" => "id", "=" => 113), "and" => array("advertisements" => "account_id", "=" => 1))
        )
    )
));

This code should definitely do what I would like to do with my SQL Manager Class. Now is the time to get this configuration in to action.
With my old SQL Helper I’m no where close :)

SELECT `*`.*, `*`.*, `l_rel`.`l` as `l`, `adproperties`.`_rel`
 FROM `adproperties`
 L JOIN `l` `l_rel` ON `l_rel`.`l` = `adproperties`.`l` 
  JOIN `` `_rel` ON `_rel`.`` = `adproperties`.`` 
 WHERE (
(`advertisements`.`adcategory_id`) and 
(`_rel`.`Array`)) and ()

Some of the generated query is right how it supposed to be. I’ll start from the selections.

No Comments