Редактировать атрибут 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