атрибут за редактиране на silverstripe на отношение has_one директно чрез текстово поле

Опитвам се да редактирам атрибут на свързан обект с данни директно чрез текстово поле. например имам обект за брояч, свързан с всяка страница. Ще ми бъде много удобно да редактирам стойността на обекта на брояча директно чрез текстово поле, вместо да отивам до свързания обект и да го редактирам там. това възможно ли е?

Мога поне да покажа текущата стойност в текстовото поле така: $fields->addFieldToTab('Root.Main', new TextField('ILikeCount.Count', 'ILikeCount', $this->ILikeCount()->Count), 'Content');

но запазването на нови стойности не работи. Много благодаря, Флориан


person spierala    schedule 28.10.2013    source източник


Отговори (1)


Може би бихте могли да хванете стойността на textField в куката onBeforeWrite()

$fields->addFieldToTab('Root.Main', new TextField('ILikeCountCount', 'ILikeCount', $this->ILikeCount()->Count), 'Content');

Името на textField може да бъде всяко, тук току-що премахнах обозначението с точки, за да улесня нещата. След това хванете стойността в onBeforeWrite() и актуализирайте релацията.

public function onBeforeWrite()
{
    if( $this->ILikeCountCount )
    {
        // check if a $has_on realtion exist
        if ( !$this->ILikeCountID )
        {
            // create new DataObject + relation
            $ILikeCount = ILikeCount::create();
            $ILikeCount->Count = $this->ILikeCountCount;
            $ILikeCount->write();

            $this->ILikeCountID = $ILikeCount->ID;
        }
        else{
            // update existing relation
            $ILikeCount = $this->ILikeCount();
            $ILikeCount->Count = $this->ILikeCountCount;
            $ILikeCount->write();
        }  

        $this->ILikeCountCount = false; // clear to avoid duplicate writes
    }
    parent::onBeforeWrite();
}
person colymba    schedule 29.10.2013
comment
Хей! това е готина идея! единственият проблем е достъпът до текстовото поле и неговата стойност. $this-›ILikeCountCount по някаква причина не съществува. Също така се опитах да съхраня текстовото поле в частна променлива... мога да повторя стойността му във функцията getCMSFields, но във функцията onBeforeWrite текстовото поле изглежда вече не е достъпно. - person spierala; 29.10.2013
comment
това е странно, използвал съм това доста пъти и нямах проблем. Имате ли нещо против да публикувате връзка към вашия getCMSFields()? - person colymba; 29.10.2013
comment
основният проблем, който открих, е, че във вашия код не можах да видя къде създавате релацията $has_one. Така че актуализирах кода, за да създам обекта ILikeCount, ако не съществува. Това работи добре при моята настройка. - person colymba; 29.10.2013
comment
страхотно, току-що поставих вашия код. който работи перфектно. единственото странно нещо е: без оператора if if( $this->ILikeCountCount ) не работи. мисля, че това беше проблема преди. Мерси - person spierala; 29.10.2013