CakePHP Dynamisch Add-Drop-Down-Menü für Time
-
26-09-2019 - |
Frage
Ich habe eine Form, die operting Zeit für ein Restaurant beinhaltet das Hinzufügen.
operation_hours (Wochentag, open_time, close_time, restaurant_id)
Ich verwende diese in der Form
<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>
, die erzeugt
http://pastebin.com/TDDesCRn
Ich will dieses Add mehr .. Incase die restlichen Arbeiten wie diese von 10.00 Uhr bis 15.00 Uhr dann von 19.00 bis 11.00 Uhr.
ich werde für einen einzigen Tag zu Sets benötigt.
, die die beste Art und Weise ist es, diese dynamisch hinzuzufügen.
Ich habe versucht, einige etwas wie dieses
// 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++;
});
});
Ich möchte wissen, was der beste Weg, es zu tun mit CakePHP und jQuery?
Lösung
Ein weiterer Ansatz wäre einen Ajax-Aufruf zu einer Controller-Methode zu verwenden, dass kehrt die Formulareingaben Sie wollen, und setzen Sie sich nach den bestehenden. Wenn Sie ein Element für Ihre Ansichten mit nur diesem Teil des Formulars erstellen, können Sie dieses Element in Ihren add()
und edit()
Ansichten sowie für die Ajax-Ansicht wiederverwenden. Dann können Sie auch die Formhelper verwenden, um es zu erzeugen.
UPDATE Hier ist ein Beispiel dafür, wie es funktionieren würde.
In Ihrem app_controller umfasst Request in Ihren Komponenten:
var $components = array('RequestHandler');
Und setzen diese auch in Ihrer before Methode im app_controller:
if($this->RequestHandler->isAjax()){
Configure::write('debug', 0); // forget debug messages
$this->layout = 'ajax'; //and use ajax layout
}
Sie würden dann eine einfache Controller-Methode für den Ajax-Aufruf haben:
function add_time() {
$this->render('time');
}
time.ctp
auch sehr einfach sein könnte, und beziehen sich nur auf ein Element:
echo $this->element('time_form');
Das Element namens „time_form.ctp“ (in diesem Beispiel), die nur den Teil der Form hat Sie (zum Beispiel der erste Codeblock von der Frage) wollen. Dann in Ihren add()
und edit()
Ansichten im Restaurant Controller, das gleiche Element bezeichnen (tatsächlich müssen Sie Daten zu übergeben darin zu sagen, welche Werte werden bereits in der edit()
Ansicht gespeichert):
<fieldset>
<legend>Times</legend>
<div id="times">
<?php echo $this->element('time_form'); ?>
</div>
</fieldset>
sind dann eine Anfrage Link, der Ihre add_time()
Methode aufrufen wird und die Ergebnisse in #times
platzieren. Sie konnten die JsHelper für diese verwenden:
http://book.cakephp.org/view/1593/Methods
Überprüfen Sie die request()
und link()
Methoden. Dies ist nur eine allgemeine Übersicht, wie es funktionieren würde. Sie müssen in die Werte, um herauszufinden, passieren Sie Ihre Formularelement Schlüssel, um zu bestimmen, etc.
Hope, das hilft.