CakePhp - كيفية تطبيق ترجمة السلوك إلى قاعدة البيانات الموجودة؟

StackOverflow https://stackoverflow.com/questions/2024407

سؤال

لدي وتطبيق موجود في CakePhp مع قاعدة بيانات. المهمة هي تطبيق ترجمة السلوك إلى نماذجها. المشكلة هي أن البرنامج النصي i18n.php فقط ينشئ جدول _i18n ولكنه لا ينطبق البيانات الموجودة على هذا الجدول. لا تعرف أي برنامج نصي يمكن أن يفعل ذلك؟ شكرا على اي مساعدة.

هل كانت مفيدة؟

المحلول

بقدر ما أعرف، لا توجد طريقة للقيام بذلك. علاوة على ذلك، نظرا للطريقة التي تم تكوين جدول I18N للعمل، أعتقد أن هناك حلا أفضل. منذ فترة رجوع، كتبت تصحيحا ل TranslateBehavior الذي سيبقيك من الاضطرار إلى نسخ البيانات الموجودة في جدول I18N (الذي شعرت بوعب جائزة لي وكان عائقا كبيرا لتنفيذ I18N). إذا لم يكن هناك سجل لهذا النموذج موجود في جدول I18N، فسيؤدي ذلك ببساطة إلى قراءة النموذج نفسه كعطاس.

لسوء الحظ، يبدو أن فريق الكيك قد نقل كل شيء إلى أنظمة جديدة، لذلك لم أعد أستطيع أن أجد إما التذكرة أو التصحيح الذي قدمته. نسخة مصححة من TranslateBehavior في مستودع قوتي المشمش في http://codaset.com/robwilkerson/scratchpad/source/master/blob/cakephp/behaviors/translatable.php..

كما تتوقع، تنطبق جميع التحذيرات المعتادة. تم تطوير الملف المرصح لمدة 1.2.x ويعمل لاحتياجاتي، بواسطة YMMV.

نصائح أخرى

مددت الإجابات من عزيز وماركوب وخلقت أكثر من cakeshell عام أكثر من ذلك.

في الطريقة _execute() ببساطة اضبط شيء مثل:

$this->_regenerateI18n('BlogPosts', array('title'), 'deu');

وسيتم إنشاء جميع إدخالات BlogPosts النموذجية لعنوان العمود في اللغة DEU في جدول I18N.

هذا هو cakephp 2.4 متوافق!

<?php 

class SetuptranslationsShell extends AppShell {

    public function main() {
        $selection = $this->in('Start to create translated entries?', array('y', 'n', 'q'), 'y');
        if (strtolower($selection) === 'y') {
            $this->out('Creating entries in i18n table...');
            $this->_execute();
        }
    }

    function _execute() {
        $this->_regenerateI18n('BlogPosts', array('title'), 'deu');
        $this->_regenerateI18n('BlogTags',  array('name'),  'deu');
    }

    /**
     * See http://stackoverflow.com/q/2024407/22470
     * 
     */
    function _regenerateI18n($Model, $fields = array(), $targetLocale) {

        $this->out('Create entries for "'.$Model.'":');

        if (!isset($this->$Model)) {
            $this->{$Model} = ClassRegistry::init($Model);
        }

        $this->{$Model}->Behaviors->disable('Translate'); 
        $out = $this->{$Model}->find('all', array(
                                                    'recursive' => -1, 
                                                    'order'     => $this->{$Model}->primaryKey, 
                                                    'fields'    => array_merge(array($this->{$Model}->primaryKey), $fields))
                                                    );

        $this->I18nModel = ClassRegistry::init('I18nModel');

        $t = 0;
        foreach ($out as $v) {

            foreach ($fields as $field) {
                $data = array(
                    'locale'        => $targetLocale,
                    'model'         => $this->{$Model}->name,
                    'foreign_key'   => $v[$Model][$this->{$Model}->primaryKey],
                    'field'         => $field,
                    'content'       => $v[$Model][$field],
                );


                $check_data = $data;
                unset($check_data['content']);
                if (!$this->I18nModel->find('first', array('conditions' => $check_data))) {
                    if ($this->I18nModel->create($data) AND $this->I18nModel->save($data)) {
                        echo '.';
                        $t++;
                    }
                }
            }
        }
        $this->out($t." entries written");
    }
}

حاول استخدامه

function regenerate()
{
    $this->Article->Behaviors->disable('Translate'); 
    $out = $this->Article->find('all', array('recursive'=>-1, 'order'=>'id'));
    $t = $b = 0;
    foreach($out as $v){
        $title['locale'] = 'aze';
        $title['model'] = 'Article';
        $title['foreign_key'] = $v['Article']['id'];
        $title['field'] = 'title';
        $title['content'] = $v['Article']['title'];
        if($this->Article->I18n->create($title) && $this->Article->I18n->save($title)){
            $t++;
        }
        $body['locale'] = 'aze';
        $body['model'] = 'Article';
        $body['foreign_key'] = $v['Article']['id'];
        $body['field'] = 'body';
        $body['content'] = $v['Article']['body'];
        if($this->Article->I18n->create($body) && $this->Article->I18n->save($body)){
            $b++;
        }
    }
}

شكرا عزيز. قمت بتعديل التعليمات البرمجية الخاصة بك لاستخدامها داخل cakeshell
(CakePhp 2.3.8)

function execute() {
    $this->out('CORE_PATH: '. CORE_PATH. "\n");
    $this->out('CAKEPHP_SHELL: '. CAKEPHP_SHELL. "\n");

    $this->out('Migrate BlogPosts');
    $this->regenerateI18n('BlogPost', 'title', 'BlogPostI18n');
}
/**
 * @param string $Model 
 * @param string $Field
 * @param string $ModelI18n
 */
function regenerateI18n($Model = null, $Field = null, $ModelI18n = null)
{
    if(!isset($this->$Model))
        $this->$Model = ClassRegistry::init($Model);
    if(!isset($this->$ModelI18n))
        $this->$ModelI18n = ClassRegistry::init($ModelI18n);

    $this->$Model->Behaviors->disable('Translate'); 
    $out = $this->$Model->find('all', array('recursive'=>-1, 'order'=>'id'));
    $t = 0;
    foreach($out as $v){
        $data = array(
            'locale' => 'deu',
            'model' => $this->$Model->name,
            'foreign_key' => $v[$Model]['id'],
            'field' => $Field,
            'content' => $v[$Model][$Field],
        );
        if($this->$ModelI18n->create($data) && $this->$ModelI18n->save($data)){
            echo '.';
            $t++;
        }
    }
    $this->out($t." Entries written");
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top