SaveAll kullanırken Davranış BeforeSave Model verileri değiştirme

1 Cevap php

Ben üzerinde çalışıyorum bir proje için bir Meta davranışı yazmaya çalışıyorum bana özel değişkenleri atamak için izin verir / Bir wordpress yazı içinde özel alanlar yaratmak nasıl benzer bir modele bağlıyor.

Ben üzerinde davranmaktadır modele meta modeli bağlar ve aynı zamanda modeller, veri değişken aracılığıyla döngüler ve meta diziye model adını koyar BeforeSave geriçağırımına sahiptir Meta davranış oluşturduk.

Her şey tasarruf edilir ama veritabanını kontrol modeli alan boş geri geliyor.

Meta için veritabanı yapısı

id - A unique if for the meta
model - The name of the model that this meta entry is associated with
foreign_id - The id of the above model that this meta entry is associated with
key - Name of the meta variable
value - Value of the meta variable

Formdan SaveAll fonksiyon söz konusu veri

Array
(
    [Page] => Array
        (
            [id] => 12
            [name] => Test
            [slug] => a/b/c/d
            [layout] => 0
            [body] => Test multilevel
        )

    [Meta] => Array
        (
            [0] => Array
                (
                    [id] => 1
                    [key] => page_title
                    [value] => About Us
                )

            [1] => Array
                (
                    [id] => 6
                    [key] => test4
                    [value] => test
                )

            [2] => Array
                (
                    [key] => test3
                    [value] => lala
                )

        )

)

ve o BeforeSave bu davranışı ile çalıştırmak sonra

Array
(
    [Page] => Array
        (
            [id] => 12
            [name] => Test
            [slug] => a/b/c/d
            [layout] => 0
            [body] => Test multilevel
            [modified] => 2010-05-04 15:56:54
        )

    [Meta] => Array
        (
            [0] => Array
                (
                    [id] => 1
                    [key] => page_title
                    [value] => About Us
                    [model] => Page
                )

            [1] => Array
                (
                    [id] => 6
                    [key] => test4
                    [value] => test
                    [model] => Page
                )

            [2] => Array
                (
                    [key] => test3
                    [value] => lala
                    [model] => Page
                )

        )

)

Davranış kodu

<?php
/**
 * Meta Model Behavior
 * 
 * Adds custom variables to models
 *
 **/
class MetaBehavior extends ModelBehavior {

/**
 * Contains configuration settings for use with individual model objects.
 * Individual model settings should be stored as an associative array, 
 * keyed off of the model name.
 *
 * @var array
 * @access public
 * @see Model::$alias
 */
    var $__settings = array();

    var $__defaults = array(
        'class' => 'Meta',
        'foreign_key' => 'foreign_id',
        'dependent' => true,
        'auto_bind' => true
    );

/**
 * Initiate Meta Behavior
 *
 * @param object $model
 * @param array $config
 * @return void
 * @access public
 */
    function setup(&$model, $settings = array()) {
        $default = $this->__defaults;
        $default['conditions'] = array('Meta.model' => $model->alias);

         if (!isset($this->__settings[$model->alias])) {
            $this->__settings[$model->alias] = $default;
        }

        $this->__settings[$model->alias] = array_merge($this->__settings[$model->alias], ife(is_array($settings), $settings, array()));

        if ($this->__settings[$model->alias]['auto_bind']) {
            $hasManyMeta = array(
                'Meta' => array(
                    'className' => $this->__settings[$model->alias]['class'],
                    'foreignKey' => $this->__settings[$model->alias]['foreign_key'],
                    'dependent' => $this->__settings[$model->alias]['dependent'],
                    'conditions' => $this->__settings[$model->alias]['conditions']
                )
            );
            $metaBelongsTo = array(
                $model->alias => array(
                    'className' => $model->alias,
                    'foreignKey' => $this->__settings[$model->alias]['foreign_key']
                )
            );
            $model->bindModel(array('hasMany' => $hasManyMeta), false);
            $model->Meta->bindModel(array('belongsTo' => $metaBelongsTo), false);
        }
    }

    function beforeSave(&$model) {
        foreach($model->data[$this->__settings['class']] as $key => $value) {
            $model->data[$this->__settings['class']][$key]['model'] = $model->alias;
        }
        return true;
    }

} // End of MetaBehavior

?>

I have a çünkü ilişkilerin olabilir duygu ve dernekler kaydederken SaveAll (orijinal) iletilen veriyi kullanıyor.

Bunu yaparken düşündüm diğer tek yolu ilişkileri kaldırmak ve tasarruf işlemek için davranış afterSave işlevi bazı kod koymak ve sonra onları almak için afterFind içine diğer bazı kod koymak olacaktır.

Herhangi bir fikir?

Cheers, Dean

1 Cevap

I () tüm) (BeforeSave çağrı gelmez Model :: SaveAll ile bu gibi herhangi bir şans olacak inanmıyorum. Aslında, o zaman bu-> save () $ çağırmadan önce dernekler yükler.

Line 1652 Model kaynağının dernekler öncesinde Model gerçek bir çağrı :: __save () sadece verileri doğrulamak değil yüklenmiş olarak gösterir.

Bunun anlamı ilk bakışta, bu () sizin MetaBehavior aramak sihirli BindModel gibi görünüyor herhangi bir etkisi olmayacaktır, değildir. Sizin Page Model sınıf tanımı dernek kurmak için sadece basit olduğu gibi Dürüst olmak gerekirse, ben gerçekten böyle bir şey ile rahatsız ediyorum.

Tabii ki, olabilir:

  • Meta Model veri veya tasarruf kolaylaştıran sizin MetaBehavior bir afterSave oluşturma,
  • Bağlayıcı eklemek için model SaveAll () geçersiz kılmak ve daha sonra ebeveyn :: SaveAll çağrı ()

Sonuçta, ben Model :: SaveAll () kullanmak ve yine sizin Modeli sınıf tanımının gerçek bir ilişki kurmak için daha aklı başında hissediyorum. KURU uygulamaları teşvik etmek için davranışları yararlanan çok soylu ama siz veya başka bir kişi şöyle bir geliştirme metodolojisi parçası gibi şeyler daha az önemsiz yapmak gerekir anlamına gelmez

TLDR; Zaten aynı dosyanın içindeki kod sadece bir kaç satır bir dernek olduğunu ekleyerek, davranışlar dizisine Meta ekledik.