2

こんにちは、私は zend フレームワーク (ただし、これは無関係だと思います) と php5 を使用しており、オブジェクトのオブジェクトを変更したいだけです。

  public function saveSite($post) {
    $form = new Diff_Form_Download();
    $subform = new Diff_Form_DownloadSubform();
    $form = $this->view->form;
    $newSite = 0;
    $sitesRecord = new Diff_Model_Sites();
    $debugString = null;

    if (is_array($post)) {
        $subform = $this->getSubformByPost($post);
        $debugString = $subform->getContent();
        echo $debugString;

        //new site instertion
        if (is_null($subform)) {
            $subform = $form->getSubForm('NewSite');
            $newSite = 1;
        }

        $values = reset($subform->getValues());

       $sitesRecord = Doctrine_Core::getTable('Diff_Model_Sites')->findOneBy('idSite', $values['idSite']);
        if ($sitesRecord) {
            $sitesRecord->idSite = $values['idSite']; //useless but necessary to make Doctrine understand to use update?
        } else { //if the record is not present instantiate a new object (otherwise save() will not work
            $sitesRecord = new Diff_Model_Sites();
        }

        $sitesRecord->content = $subform->getContent(); //$values['content'];
        $sitesRecord->newHtml = $subform->getContent();
        $sitesRecord->url = $values['url'];
        $sitesRecord->shortName = $values['shortName'];
        $sitesRecord->lastChanged = date("Y-m-d H:i:s");
        $sitesRecord->pollingHours = $values['pollingHours'];
        $sitesRecord->minLengthChange = $values['minLenghtChange'];

        if (Zend_Auth::getInstance()->hasIdentity()) { //save the owner
            $sitesRecord->idOwner = Zend_Auth::getInstance()->getIdentity()->idOwner; //retrieve the owner
            $sitesRecord->save();
        } else {
            throw new Exception("your session have expired: \n please login again");
        }
    }
}

/**
 * return the calling subform
 * @param type $post
 * @return type 
 */
public function getSubformByPost($post) {
    $form = new Diff_Form_Download();
    $form = $this->view->form;
    $subform = new Diff_Form_DownloadSubform();
    $subformName = "site" . $post['idSite'];
    $subform = $form->getSubForm($subformName);

    return $subform;
}

public function refreshOneDiff($post) {
     $debugString;
    if (is_array($post)) {
        $form = new Diff_Form_Download();
        $form = $this->view->form;

        $subform = new Diff_Form_DownloadSubform();
        $subform = $this->getSubformByPost($post);

        if (!$subform)
            $subform = $this->view->form->getSubformByPost('NewSite');
        $url = $subform->getUrl();
        $idSite = $subform->getIdSite();

        $crawler = new Crawler();
        $newpageContent = $crawler->get_web_page($url);
        $siteRecord = new Diff_Model_Sites();
        $siteRecord = $subform->getSiteRecord();
        if ($siteRecord) //check if the record is not null
            $oldpageContent = $siteRecord->get('content');
        else
            $oldpageContent = null;

        $differences = $this->getDiff($oldpageContent, $newpageContent);

        if (!is_null($differences)) {
            $siteRecord->content = $newpageContent;
            $subform->setContent($newpageContent);
            $subform->setContentDiff($differences);
            $subform->setSiteRecord($siteRecord);
            $subform = $this->getSubformByPost($post);
            $debugString = $subform->getContent();
        }

            //echo $debugString;

        $sitePresence = Doctrine_Core::getTable('Diff_Model_Sites')->findOneBy('idSite', $idSite);
        if ($sitePresence) {
            //$this->saveSite($post);
            $this->debugtry($post);
        }
    } else {

    }
}

基本的に私がここでやっていることは次のとおりです: 1) ビューからフォームを取得します 2) フォームからサブフォームを取得します (SubformX と呼びましょう) 3) SubformX からオブジェクト "siteRecordX" を取得します 4) "siteRecordX" の値を変更します" 5) 関数 saveRecord() を呼び出します 6) この関数で、同じ SubformX を再取得し、オブジェクト siteRecordX の値をエコーし​​ます

驚くべきことに、SubformX の変数を変更してもそのままで、SubformX のオブジェクトの変数を変更しても変更されません (SubformX を取得した場合)。SubformX が参照によって渡されたとしても、値によって渡されるサブオブジェクトとは同じではないため、関数のコンテキストを変更して消えます。手伝ってくれませんか?ありがとう

EDIT私はまだこの問題を解決することも理解することもできません:これはサブフォームのコンストラクタです:

    public function __construct($site = null, $options = null) {
    if ($site instanceof Diff_Model_Sites) {
        $this->_shortName = $site->get('shortName');
        $this->_url = $site->get('url');
        $this->_content = $site->get('content');
        $this->_idSite = $site->get('idSite');
        $this->_siteRecord = $site;
        $this->_lastChanged = $site->get('lastChanged');
    }parent::__construct($options);}

これはSubformXの機能ですが、値を設定するために使用します。

public function setContent($contentText) {
    $this->_siteRecord->content = $contentText;
    $this->_content = $contentText;
}

これは、値を取得するために呼び出すサブフォームの関数です

    public function getContent() {
    if (isset($this->_siteRecord)) {
        //return $this->_content;
        return $this->_siteRecord->content;
    }
}

コメント行を使用すると、2 番目の行ではなく、更新された値を取得できます。まったく同じポイントでまったく同じ方法で設定および取得し、違いを理解できないため、これは私にとって本当の謎です。

4

2 に答える 2

0

みんなありがとう。それは Doctrine キャッシングでした。問題をこれ以上調査していませんが、Doctrine を削除した後はすべて正常に動作します。この問題の後、丸一日無駄になりました。さらに、今日は Doctrine に関連する別の興味深い問題で 1 日を失いました。データベースからデータを収集するたびに、Doctrine がそれらをデコードするようです (php 関数の utf8_decode($data) のように)。もちろん、データを取得してから再度データベースに戻すと、合計になります。コーディングとデコーディングの混乱. これで十分です. ORM は優れたプログラミング ツールだと今でも思いますが、Doctrine はそうではありません. プログラムから削除するので安心はできません. 代わりに Zend_Db ライブラリを使用します.私は後悔することなく、上記のDoctrineの問題に直面することなく、すでにほとんどのことを行ってきました。

于 2012-08-09T16:00:02.937 に答える
0

あなたの_siteRecordプロパティはORMオブジェクトです(Doctrine、表示されます)。したがって、そのデータには、参照型オブジェクトの標準ではない動作が含まれる場合があります。確かに と のオーバーライドが__getあり__setます。また、キャッシングも採用しています。これらは、データベースとモデルの相互作用を適切に機能させるために必要ですが、参照型と値型であるべきものを混乱させる可能性があります。(参照: http://www.codinghorror.com/blog/2006/06/object-relational-mapping-is-the-vietnam-of-computer-science.html )

PS:コンストラクターでは、次を使用します。

$this->_content = $site->get('content');
$this->_siteRecord = $site;

ただし、 getContent() では次を使用します。

$this->_siteRecord->content;

その違いが問題の一部かもしれません。

于 2012-08-07T22:45:02.530 に答える