Hello,
I just have moved my project on CakePHP 1.3.8 from MySQL to PostgreSQL
8.3 and then Translate stopped working correctly.

Instead of:

[0] => Array
        (
            [Category] => Array
                (
                    [id] => 3
                    [parent_id] =>
                    [lft] => 1
                    [rght] => 2
                    [locale] => pol
                    [name] => Start
                    [description] => Tutaj opis
                )
           ...

I have received:

[0] => Array
        (
            [Category] => Array
                (
                    [id] => 3
                    [parent_id] =>
                    [lft] => 1
                    [rght] => 2
                    [locale] => pol
                    [name] =>
                    [description] =>
                )

            [I18n] => Array
                (
                    [name] => Start
                    [description] => Tutaj opis
                )
        ...

SQL code generated by Cake:

SELECT
   "Category"."id" AS "Category__id",
   "Category"."parent_id" AS "Category__parent_id",
   "Category"."lft" AS "Category__lft",
   "Category"."rght" AS "Category__rght",
   "I18n__name"."content" AS "I18n__name__content",
   "I18n__description"."content" AS "I18n__description__content"
FROM "cms_categories" AS "Category"
LEFT JOIN "i18n" AS "I18n__name"
   ON ("Category"."id" = "I18n__name"."foreign_key"
      AND "I18n__name"."model" = 'Category'
      AND "I18n__name"."field" = 'name')
LEFT JOIN "i18n" AS "I18n__description"
   ON ("Category"."id" = "I18n__description"."foreign_key"
      AND "I18n__description"."model" = 'Category'
      AND "I18n__description"."field" = 'description')
WHERE "I18n__name"."locale" = 'pol'
   AND "I18n__description"."locale" = 'pol'
ORDER BY "Category"."lft" ASC

After some debug work I found reason in method
DboPostgres::resultSet(). Name of the column for "description" field
translation is "I18n__description__content". DboPostgres::resultSet()
method incorrectly parses table name and field name from this string
as "I18n" and "description" instead of "I18n__description" and
"content". In the end, method creates invalid result array and
TranslateBehavior does not detect the translation.

Code:
...
if (strpos($columnName, '__')) {
   $parts = explode('__', $columnName);
   $this->map[$index++] = array($parts[0], $parts[1]);
} ...

I propose the following solution:
...
$pos = strrpos($columnName, '__');
if ($pos !== false) {
   $table_name = substr($columnName, 0, $pos);
   $column_name = substr($columnName, $pos+2, strlen($columnName));
   $this->map[$index++] = array($table_name, $column_name);
} ...

Solution is to split $columnName at the last occurrence of __
separator, not every like in original code.

-- 
Our newest site for the community: CakePHP Video Tutorials 
http://tv.cakephp.org 
Check out the new CakePHP Questions site http://ask.cakephp.org and help others 
with their CakePHP related questions.


To unsubscribe from this group, send email to
cake-php+unsubscr...@googlegroups.com For more options, visit this group at 
http://groups.google.com/group/cake-php

Reply via email to