1

I am new to Laravel and have been trying to figure out the best way of handling a simple task. I have a View that has a form used to either add or edit an event (for this example). When the form will be used to add an event, all input fields are blank. When it is used to edit an event, the inputs are filled by columns from MySQL.

The tricky bit I have run into is figuring out the best way to tell the View that I want to either use the old form input if validation fails or to use the MySQL data if we're opening the form for the first time for an edit.

This is what I have for the moment in the Controller, it is very long and I am sure there is a better way, just not sure what it would be.

Essentially, I assign each form value to a multidimensional array and then return that array to the View. Each array value is conditional - if there is an old Input value, use that. Otherwise, use the value from the table.

public static function action_edit_event($id, $slug) {
    $eventDetails = Calendar::find($id);
    $event['id'] = $id;
    $event['slug'] = $slug;
    $event['title'] = (Input::old('admin_events-form-title')) ?
    Input::old('admin_events-form-title') : $eventDetails->title;
    $event['type'] = (Input::old('admin_events-form-type')) ?
    Input::old('admin_events-form-type') : $eventDetails->calendartype_id;
    $event['date_start'] = (Input::old('admin_events-form-date-start')) ?
    Input::old('admin_events-form-date-start') : $eventDetails->start_date;
    $event['allDay'] = (Input::old('admin_events-form-all-day')) ?
    Input::old('admin_events-form-all-day') : $eventDetails->day;
    $event['time-start_hour'] = (Input::old('admin_events-form-time-start_hour')) ?
    Input::old('admin_events-form-time-start_hour') : (($eventDetails->start_time != null) ?
                                    date("H", strtotime($eventDetails->start_time)) : '');
    $event['time-start_minute'] = (Input::old('admin_events-form-time-start_minute')) ?
    Input::old('admin_events-form-time-start_minute') : (($eventDetails->start_time != null) ?
                                    date("i", strtotime($eventDetails->start_time)) : '');
    $event['date_end'] = (Input::old('admin_events-form-date-end')) ?
    Input::old('admin_events-form-date-end') : $eventDetails->end_date;
    $event['time-end_hour'] = (Input::old('admin_events-form-time-end_hour')) ?
    Input::old('admin_events-form-time-end_hour') : (($eventDetails->end_time != null) ?
                                    date("H", strtotime($eventDetails->end_time)) : '');
    $event['time-end_minute'] = (Input::old('admin_events-form-time-end_minute')) ?
    Input::old('admin_events-form-time-end_minute') : (($eventDetails->end_time != null) ?
                                    date("i", strtotime($eventDetails->end_time)) : '');
    $event['description'] = (Input::old('admin_events-form-description')) ?
    Input::old('admin_events-form-description') : $eventDetails->description;
    return View::make('admin.event-post')->with('event', $event);
}

And the form in the View..

{{ Form::open('admin/events/event', 'POST', array('id' => 'admin_events-form')) }}
    <fieldset>
        <legend>Event Details</legend>
        <p>
            {{ Form::label('admin_events-form-title', 'Event Title:')}}
            {{ Form::text('admin_events-form-title', isset($event) ? $event['title'] : '') }}
            {{ $errors->first('title', '<span class="ui-state-error">:message</span>') }}
        </p>
        <p>
            {{ Form::label('admin_events-form-type', 'Event Type:') }}
            {{ Form::select('admin_events-form-type', $select_event_types, isset($event) ? $event['type'] : '') }}
        </p>
        <p>
            {{ Form::label('admin_events-form-date-start', 'Start Date:') }}
            {{ Form::text('admin_events-form-date-start', isset($event) ? $event['date_start'] : '', array('id' => 'date_start')) }}
            {{ Form::checkbox('admin_events-form-all-day', '1', (isset($event) && $event['allDay'] == 1) ? true : false, array('id' => 'allDay')) }}
            {{ $errors->first('start_date', '<span class="ui-state-error">:message</span>') }}
        </p>
        <p>
            {{ Form::label('admin_events-form-time-start_hour', 'Start Time:') }}
            {{ Form::select('admin_events-form-time-start_hour', $select_hours, (isset($event) && $event['time-start_hour'] != null) ? $event['time-start_hour'] : '', array('id' => 'start-time_hour')) }} :
            {{ Form::select('admin_events-form-time-start_minute', $select_minutes, (isset($event) && $event['time-start_minute'] != null) ? $event['time-start_minute'] : '', array('id' => 'start-time_minute')) }}
            {{ $errors->first('start-time-hour', '<span class="ui-state-error">:message</span>') }}
            {{ $errors->first('start-time-minute', '<span class="ui-state-error">:message</span>') }}
        </p>
        <p>
            {{ Form::label('admin_events-form-date-end', 'End Date:') }}
            {{ Form::text('admin_events-form-date-end', isset($event) ? $event['date_end'] : '', array('id' => 'date_end')) }}
            <a href="#" id="admin_events-clear-date-end" class="button" title="Clear End Date">X</a>
            <span class="ui-state-highlight">(if different from start date)</span>
        </p>
        <p>
            {{ Form::label('admin_events-form-time-end_hour', 'End Time:') }}
            {{ Form::select('admin_events-form-time-end_hour', $select_hours, (isset($event) && $event['time-end_hour'] != null) ? $event['time-end_hour'] : '', array('id' => 'end-time_hour')) }} :
            {{ Form::select('admin_events-form-time-end_minute', $select_minutes, (isset($event) && $event['time-end_minute'] != null) ? $event['time-end_minute'] : '', array('id' => 'end-time_minute')) }}
            {{ $errors->first('end-time-hour', '<span class="ui-state-error">:message</span>') }}
            {{ $errors->first('end-time-minute', '<span class="ui-state-error">:message</span>') }}
        </p>
        <p>
            {{ Form::label('admin_events-form-description', 'Event Description:') }}
            {{ Form::textarea('admin_events-form-description', isset($event) ? $event['description'] : '', array('rows' => '5')) }}
        </p>
        <p class="center">
            {{ $errors->first('description', '<span class="ui-state-error">:message</span>') }}
        </p>
    </fieldset>
    {{ Form::hidden('mode', isset($event) ? 'edit' : 'add') }}
    @if (isset($event))
    {{ Form::hidden('slug', $event['slug']) }}
    {{ Form::hidden('id', $event['id']) }}
    @endif
{{ Form::close() }}

Any advice would be greatly appreciated. Thanks!

4

1 に答える 1

3

イベントを実際に検証して保存するためのコードは、コントローラーの別のメソッド (つまり、action_save_event) にあると思いますか?

検証が失敗した場合は、そのメソッドからの入力データと一緒にビューを返すだけです。

例えば:

public function action_edit_event($id, $slug)
{
  $eventDetails = Calendar::find($id);
  $event['id'] = $id;
  $event['slug'] = $slug;
  return View::make('admin.event-post')->with('event', $event);
}

public function action_store_event($id, $slug)
{
  // Validate the input data
  // If valid store to the database
  // Else, assemble $event from the old input data
  $event['id'] = $id;
  $event['slug'] = $slug;
  $event['title'] = Input::old('admin_events-form-title');
  $event['type'] = Input::old('admin_events-form-type');
  // ...
  // Return the view with $event
  return View::make('admin.event-post')->with('event', $event);
}
于 2013-02-01T21:26:37.913 に答える