Cakephp динамически добавлять выпадающие меню для времени - PullRequest
0 голосов
/ 30 сентября 2010

У меня есть форма, которая включает добавление рабочего времени для ресторана.

operation_hours (день недели, open_time, close_time, restaurant_id)

Я использую это в форме

<div class="operation_hours">
<?php echo $this->Form->dateTime('RestaurantOperationHour.open_time', false, '12', null, array('interval' => 15, 'value' => '10:00:00')); ?>
<?php echo "<label> to </label>"; ?>
<?php echo $this->Form->dateTime('RestaurantOperationHour.close_time', false, '12', null, array('separator' => ' ', 'interval' => 15, 'value' => '23:00:00')); ?>
</div>

, который генерирует

http://pastebin.com/TDDesCRn

Я хочу добавить кратное из этого ... если все остальное работает как с 10 утра до 3 вечера, а затем с 7 вечера до 11 вечера.

мне нужно будет установить наборы на один день.

, что является лучшим способом добавить это динамически.

я пробовал что-то подобное

// JavaScript Document
$(function () {

    // Phone Number
    var i = $('div#phoneContainer div input').size();
    $('a#addPhone').click(function () {
        $('<div><input name="data[Restaurantphone][' + i + '][number]" type="text" value="" id="Restaurantphone' + i + 'Number" /></div>').appendTo('div#phoneContainer');
        i++;
    });


    // Restaurant Timing
    var j = $('div#timeContainer div').size();
    $('a#addTime').click(function () {

        open_hours = $('div#timeContainer div select#Restauranttiming0OpenHour').html();
        open_minutes = $('div#timeContainer div select#Restauranttiming0OpenMin').html();
        open_meridian = $('div#timeContainer div select#Restauranttiming0OpenMeridian').html();
        close_hours = $('div#timeContainer div select#Restauranttiming0CloseHour').html();
        close_minutes = $('div#timeContainer div select#Restauranttiming0CloseMin').html();
        close_meridian = $('div#timeContainer div select#Restauranttiming0CloseMeridian').html();

        tag1 = '<select id="Restauranttiming';
        tag2 = '" name="data[Restauranttiming][';
        tag3 = '</select>';
        open_hours = tag1 + j +'OpenHour' + tag2 + j + '][open][hour]">' + open_hours + tag3;
        open_minutes = tag1 + j +'OpenMin' + tag2 + j + '][open][min]">' + open_minutes + tag3;
        open_meridian = tag1 + j +'OpenMeridian' + tag2 + j + '][open][meridian]">' + open_meridian + tag3;

        close_hours = tag1 + j +'CloseHour' + tag2 + j + '][close][hour]">' + close_hours + tag3;
        close_minutes = tag1 + j +'CloseMin' + tag2 + j + '][close][min]">' + close_minutes + tag3;
        close_meridian = tag1 + j +'CloseMeridian' + tag2 + j + '][close][meridian]">' + close_meridian + tag3;


        content = '<div>\n' + open_hours + ':' + open_minutes + ' ' + open_meridian + '\n-\n' +close_hours + ':' + close_minutes + ' ' + close_meridian + '\n</div>';
        $(content).appendTo('div#timeContainer');
        j++;
    });

});

Я хочу знать, какой лучший способ сделать это с CakePHP и JQuery?

1 Ответ

1 голос
/ 30 сентября 2010

Другой подход заключается в использовании ajax-вызова метода контроллера, который возвращает требуемые входные данные формы, и вставляет их после существующих. Если вы создаете элемент для ваших представлений только с этой частью формы, вы можете повторно использовать этот элемент в ваших add() и edit() представлениях, а также для представления Ajax. Затем вы также можете использовать FormHelper для его генерации.

ОБНОВЛЕНИЕ Вот пример того, как это будет работать.

В вашем app_controller включите RequestHandler в ваши компоненты:

var $components = array('RequestHandler');

А также поместите это в ваш метод beforeFilter в app_controller:

if($this->RequestHandler->isAjax()){
    Configure::write('debug', 0); // forget debug messages
    $this->layout = 'ajax'; //and use ajax layout
}

Тогда у вас будет простой метод контроллера для вызова ajax:

function add_time() {
    $this->render('time');
}

time.ctp также может быть очень простым, и просто ссылаться на элемент:

echo $this->element('time_form');

Элемент с именем "time_form.ctp" (в этом примере), который имеет только часть формы, которую вы хотите (например, первый блок кода из вопроса). Затем в ваших представлениях add() и edit() в контроллере ресторана вызовите один и тот же элемент (фактически вам нужно будет передать данные, чтобы сообщить, какие значения уже были сохранены в представлении edit()):

<fieldset>
<legend>Times</legend>
    <div id="times">
        <?php echo $this->element('time_form'); ?>
    </div>
</fieldset>

Затем включите ссылку на запрос, которая вызовет ваш метод add_time() и поместите результаты в #times. Вы можете использовать JsHelper для этого:

http://book.cakephp.org/view/1593/Methods

Проверьте методы request() и link(). Это просто общая схема того, как это будет работать. Вам нужно выяснить, какие значения передать, чтобы определить ключи элемента формы и т. Д.

Надеюсь, это поможет.

...