CFWheels — Как я могу проверить форму в модели, затем выполнить поиск и вывести другое сообщение?

В моей модели «ссылки» у меня есть базовая проверка, одна из которых — проверить, находится ли ссылка, которую отправляет пользователь, уже в базе данных.

Если ссылка уже отправлена ​​​​в базу данных, я хочу сообщить им об этом и перенаправить их на ссылку, которая была отправлена ​​​​ранее (в основном на URL-адрес).

Как я могу это сделать? Моя модель пока выглядит так:

<cfcomponent extends="Model" output="true">

    <cffunction name="init">

        <cfset validatesPresenceOf( property='linkURL') />
        <cfset validatesFormatOf( property='linkURL', type='url', message="Your link isn't a valid URL.") />
        <cfset validatesUniquenessOf( property='linkURL') />

    </cffunction>

</cfcomponent>

Очень простой. Функция validatesUniquenessOf() отлично работает, но я хотел бы сделать немного больше в своей логике проверки. Если бы я делал это без фреймворка... Я бы, конечно, использовал стандартную логику, но я хотел бы работать так, как мне нужны колеса.

Еще раз спасибо CFWEELS!


person Michael Giovanni Pumo    schedule 18.04.2012    source источник
comment
Нет необходимости помещать output="true" ни в одну из ваших моделей или контроллеров CFC. CFWheels обрезает дополнительное пространство, которое они могут выводить.   -  person Chris Peters    schedule 19.04.2012


Ответы (2)


Это выпадает из общего варианта использования validatesUniquenessOf(), но есть способы обойти это, используя addError и errorsOn.

Я бы сделал это в модели:

<cfcomponent extends="Model">

    <cffunction name="init">
        <cfset validatesPresenceOf( property='linkURL') />
        <cfset validatesFormatOf( property='linkURL', type='url', message="Your link isn't a valid URL.") />
        <cfset validate("validateUniqueUrl") />
    </cffunction>

    <cffunction name="validateUniqueUrl" access="private">
        <cfscript>
            if (this.exists(where="linkURL='#this.linkURL#'")) {
                this.addError(property="linkURL", name="linkExists", message="The link you entered already exists.");
            }
        </cfscript>
    </cffunction>

</cfcomponent>

Причина, по которой я бы это сделал, заключается в том, что у вас будет именованная ошибка для проверки в контроллере (называется linkExists).

Затем в вашем контроллере:

<cfcomponent extends="Controller">

    <cffunction name="create">
        <cfscript>
            link = model("link").new(params.link);

            local.linkExistsErrors = link.errorsOn(property="linkURL", name="linkExists");

            if (link.save()) {
                // Whatever you want to do on success
            }
            else if (ArrayLen(local.linkExistsErrors)) {
                flashInsert(error=local.linkExistsErrors[1].message);
                Location(url=link.linkURL, addToken=false); // Need to use Location or cflocation for hard-coded URLs
            }
            else {
                // Whatever you want to do on other types of validation failures
            }
        </cfscript>
    </cffunction>

</cfcomponent>

Ресурсы API

person Chris Peters    schedule 19.04.2012
comment
Огромное спасибо, это действительно помогло! Я думаю, что половина проблемы в этом заключается не в кодировании, а в изучении фреймворка. Ваш пример показал мне, как именно это может работать... спасибо :) - person Michael Giovanni Pumo; 20.04.2012
comment
Нет проблем. Фреймворк самый простой для 80% того, что вы собираетесь сделать. Этот конкретный вопрос определенно относится к другим 20%, когда вам нужно выяснить, как работать в рамках ограничений, которые предлагает фреймворк. - person Chris Peters; 20.04.2012

Не могли бы вы указать отправленный URL-адрес в качестве ссылки в атрибуте сообщения validatesUniquenessOf()? Таким образом, пользователь получит сообщение об ошибке и сможет перейти по ссылке в сообщении. В противном случае, я думаю, вам нужно будет использовать cflocation для отправки пользователя на значение linUrl, если функции validatesUniquenessOf() возвращают false.

person John Sieber    schedule 19.04.2012