Лучший способ использовать flash() в CFWheels?

Использование flash() в CFWheels довольно прямолинейно, но я нахожусь в точке, когда мне нужно вставить больше, чем одно простое сообщение. Если я сделаю 3 вызова flashInsert(), только последний будет показан в выводе flash().

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

public void function index() {

        local.messages = [];

        arrayAppend(local.messages, { message="Test message 1.", type="ok" } );
        arrayAppend(local.messages, { message="Test message 2.", type="ok" } );
        arrayAppend(local.messages, { message="Test message 3.", type="ok" } );

        flashInsert( local.messages );

        WriteDump(var=flash(), abort=true);

    }

Таким образом, я могу затем зациклить flash() как массив в своем объекте... получая доступ к сообщению и набирая ключ для каждого.

Но вы знаете, что? Это кажется грязным! И, повторяя это для каждого действия, в котором мне это нужно, кажется, что я нарушаю этот святой СУХОЙ принцип.

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

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

Буду признателен за ваши мысли по этому поводу...

Майки.


person Michael Giovanni Pumo    schedule 24.07.2013    source источник


Ответы (2)


Flash - это структура, а не массив. Так что, если вы сделаете это...

flashInsert(message="Hi!");
flashInsert(message="Bye!");

...тогда ключ message в структуре флэш-памяти будет перезаписан вторым вызовом flashInsert.

Наиболее очевидным решением было бы использование разных имен клавиш, если вам нужно несколько флэш-сообщений.

Есть ли причина, по которой им всем нужно использовать одно и то же имя ключа (в данном случае message)?

person Chris Peters    schedule 25.07.2013
comment
Флэш отлично подходит для базового обмена сообщениями, но с более сложным контроллером, который запускает несколько вещей на основе пользовательского ввода, было бы неплохо иметь несколько динамически размещаемых сообщений. Тогда я мог бы просто зацикливать сообщения. У меня есть обходной путь, который я опубликую выше... но он все еще кажется немного "грязным". В моем цикле я не хочу угадывать имена ключей, я просто хочу зациклить его и оставить. - person Michael Giovanni Pumo; 25.07.2013
comment
Я только что представил свой собственный ответ - посмотрите и посмотрите, что вы думаете ?! - person Michael Giovanni Pumo; 25.07.2013
comment
flashMessages как бы делает то, что вы ищете. Вы смотрели на это? cfwheels.org/docs/1-1/function/flashmessages Обратите внимание, что первый аргумент является необязательным. - person Chris Peters; 25.07.2013
comment
Это почти похоже на то, что мне нужно! Однако я еще не проверял это, но я предполагаю, что вы не можете указать 2 ключа с одинаковым именем? Будет ли он перезаписан? - person Michael Giovanni Pumo; 26.07.2013
comment
Если бы это был массив структур! Чего, я думаю, я и пытаюсь достичь. В любом случае, мой метод работает хорошо. Просто лучше использовать CFWheels можно, но в данном случае это невозможно. Спасибо за вашу помощь, хотя Крис! - person Michael Giovanni Pumo; 26.07.2013

Я так и не нашел ничего встроенного, чтобы делать то, что я хочу, но я накатил свое собственное решение.

Не уверен, что здесь есть потенциальные проблемы, но, похоже, он отлично работает. Было бы неплохо узнать мнение людей о том, как это сделать.

Контроллер.cfc

component extends="Wheels" output="false" {

    messages = [];

    public any function init() { }


    public void function addMessage(object) {

        arrayAppend(messages, arguments.object);

    }


    public void function insertMessages() {

        local.messages = messages;
        flashInsert( messages = local.messages );

        return;

    } 

}

User.cfc

component extends="Controller" output="false" {     

        public void function index() {

            super.addMessage({ message="Example message 1.", type="ok" });
            super.addMessage({ message="Example message 2.", type="info" });
            super.addMessage({ message="Example message 3.", type="error" });
            super.insertMessages();

        }

}

Просмотр (повторяет вспышку)

<cfset variables.flash = flash() />

<cfif not structIsEmpty(variables.flash)>

    <div id="messages">

        <cfoutput>

            <cfloop array="#variables.flash.messages#" index="variables.i">
                <p class="alert alert-#variables.i.type#">
                    #variables.i.message#
                </p>
            </cfloop>

        </cfoutput>

    </div>

</cfif>

Есть идеи, как это сделать с помощью этой техники?

:)

person Michael Giovanni Pumo    schedule 25.07.2013