cfwheels — обновление вложенных свойств с помощью составной таблицы ключей

Я пытаюсь улучшить настройку для обновления модели с вложенными свойствами.

Прямо сейчас в моем представлении редактирования я определяю textFieldTag вручную, чтобы создать структуру параметров, установив имя как "myModel[myNestedProperty][#modelID#,#key2id#][name]"

в действии обновления...

если я просто использую myModel.update(params.myModel), я не могу заставить обновление работать, если есть какие-либо элементы, требующие удаления

поэтому я уничтожаю все модели вложенного свойства, которые имеют тот же идентификатор, что и myModel, и в этом случае это работает.

Недостатком является то, что в случае сбоя обновления все вложенные свойства исчезают.

Я пытался сначала захватить все модели, прежде чем удалять их и .saveing их, но по какой-то причине это не работает.

Похоже, что cfwheel настроен для такого рода отношений с флажками, но мне нужно, чтобы он работал с текстовым полем и выбирал элементы в моей форме.


Обновить

Я понял, что у меня другая проблема. По сути, я хотел бы расширить это, чтобы иметь возможность использовать его для нескольких вложенных свойств и отношений.

проблема в том, как я устанавливаю имя, особенно для выпадающих списков выбора:

name="myModel[myNestedProperty][#modelID#, ][nestedID]"

проблема в том, что второй идентификатор не может быть объявлен, потому что он будет назначен как идентификатор, а не с использованием значения, которое я выбираю.

Честно говоря, это единственная проблема, с которой я боролся все свое время. Я справляюсь с этим, регенерируя модели в контроллере, я просто забыл, что еще не решил эту проблему.

Есть ли способ, которым я могу вообще не использовать эти значения и динамически заполнять их из структуры?

скажем, у меня есть (усеченное) имя tcat[34,0][catID] или tcat[34,][catID] (где идентификатор кошки должен быть вторым идентификатором).

сгенерированная структура tcat params

[34,0]{catID = 12,14,18}

or

[34,]{catID = 12,14,18}

Я бы хотел, чтобы структура tcat params имела несколько структур, таких как:

[34,12]{tID = 34; catID = 12}
[34,14]{tID = 34; catID = 14}
[34,18]{tID = 34; catID = 18}

Это можно обойти?

Я работаю с большим количеством вложенных свойств составного ключа, и если бы я мог работать только с этой частью, это сделало бы это намного проще. Я знаю, что один из способов - обновить имя с помощью javascript, но я думаю, что это будет (очень, очень) последнее средство.


person Daniel    schedule 04.05.2012    source источник
comment
Даниил, мне жаль, что вы еще не получили ответа на свой вопрос. Я свяжусь с парнем из CF Wheels за пределами Stack Overflow и посмотрю, смогу ли я получить от него подсказку. Ваш вопрос довольно сложный, хотя :)   -  person Mark A Kruger    schedule 06.05.2012
comment
Как пользователь указывает на удаление? Через флажок? Какой элемент интерфейса вы используете? Нужно больше примеров именно вашей ситуации.   -  person Chris Peters    schedule 07.05.2012
comment
если поле оставлено пустым EQ '' то оно не добавляется   -  person Daniel    schedule 08.05.2012


Ответы (1)


Можешь попробовать?

Настройте обратный вызов в родительской модели, который проверяет, является ли name пустым, и помечает для удаления, если он пуст.

<cffunction name="init">
    ...

    <!--- This could also be `beforeValidation` if you want to make `name` required for the child model --->
    <cfset beforeSave("$provisionMyNestedProperty")>
</cffunction>

<cffunction name="$provisionMyNestedProperty">
    <cfscript>
        if (StructKeyExists(this, "myNestedProperty") && IsArray(this.myNestedProperty))
        {
            for (local.i = 1; local.i <= ArrayLen(this.myNestedProperty); local.i++)
            {
                if (!StructKeyExists(this.myNestedProperty[local.i], "name") || !Len(Trim(this.myNestedProperty[local.i].name)))
                    this.myNestedProperty[local.i]._delete = true;
            }
        }
    </cfscript>
</cffunction>

Я буду редактировать свой ответ, пока мы не найдем решение. Надеюсь, это даст вам хороший старт.

person Chris Peters    schedule 18.05.2012
comment
Привет, Крис, спасибо, что помог мне с моей проблемой. Я начал внедрять предложенное решение, но оказалось, что у меня есть другая связанная проблема, которая предшествует этой, я обновил свой вопрос. - person Daniel; 18.05.2012