2

Cake 2.x で動作するトリミング ツール コンポーネントとヘルパーがありますが、このトリミング ツールを CakePHP 1.3 の古いプロジェクトの 1 つに使用する必要があります。どうすればいいですか?

コンポーネント:

<?php
    App::uses('Component', 'Controller');
    class JcropComponent extends Component {

        public $components = array('Session');

        public $options = array(
            'overwriteFile' => true,
            'boxWidth' => '940'
        );

        /**
         * Constructor
         */
        public function __construct(ComponentCollection $collection, $options = array()) {
            parent::__construct($collection,$options);
            $this->options = array_merge($this->options, $options);
        }
?>

ヘルパー

<?php
App::uses('AppHelper', 'View/Helper');

class JcropHelper extends AppHelper {
    public $helpers = array('Html','Form','Js');

    public $options = array(
        'tooltip' => true,
        'boxWidth' => '940'
    );


    public function __construct(View $view, $options = null) {
        parent::__construct($view,$options);
        $this->options = array_merge($this->options, $options);
    }
?>

これに変更しようとしましたが、画像を表示できますが、オプション配列をマージするにはどうすればよいですか? __construct ($options = array()) の場所

<?php
    class JcropComponent extends Component {

        var $components = array('Session');

        public $options = array(
            'overwriteFile' => true,
            'boxWidth' => '940'
        );

    //public function initialize(&$controller, $settings = array()) {
    //  $this->controller =& $controller;
        //parent::__construct($collection,$options);
        //$this->options = array_merge($this->options, $options);
    //}
?>


<?php
class JcropHelper extends AppHelper {
    var $helpers = array('Html','Form','Js');

    public $options = array(
        'tooltip' => true,
        'boxWidth' => '940'
    );


    public function __construct($settings = null) {
        //parent::__construct($view,$options);
        //$this->options = array_merge($this->options, $options);
    }
?>
4

1 に答える 1

2

1.3 のコンポーネントは設定にコンストラクターを使用しません

最初の重大な問題は、メジャー バージョン間で変更された設定をコンポーネントが受け取る方法です。

1.3で

//Component(Collection) Class
$component->initialize($controller, $settings);

2.x で:

//ComponentCollection class
new $componentClass(ComponentCollectionObject, $settings);

したがって、コンポーネントを 1.3 で同じように動作させる方法は、initialize メソッドを定義することです。

ヘルパーには異なるコンストラクターがあります

ヘルパーにも同様の変更が加えられました。

1.3 では:

//View class
new $helperCn($options);

2.x の場合:

//HelperCollection class
new $helperClass(ViewObject, $settings);

この場合、より明白なはずです。オーバーライドされたメソッドは、親クラスと同じメソッド シグネチャを持つ必要があります。したがって、コンストラクターで同じ予想される引数を持つようにヘルパーを変更します

警告: コンポーネントを拡張します

1.3 では、コンポーネントはComponent を拡張するのではなく、Object を拡張します。Component は、1.3 でコレクションとして機能するクラスです。これを拡張すると、予期しない望ましくない動作が発生します (つまり、予期しない「ランダムな」警告と致命的なエラーが発生する可能性があります)。そのため、コンポーネント クラスを他のすべてのコンポーネントに類似するように変更し、Object を拡張する必要があります (または、単純にコンポーネントを拡張しない)。

このクラスをさまざまなプロジェクトで使用および維持する場合は、主要な機能をスタンドアロン クラスに抽出し、シン ラッパー クラス (コンポーネント/動作) のみを実装してそれとやり取りすることをお勧めします。このようにして、主要な機能に加えられた変更は、使用されている Cake (または他のフレームワーク) のバージョンに関係なく活用できます。

于 2013-11-05T10:16:37.390 に答える