Advertisement
  1. Code
  2. Yii

Erstellen Sie Ihr Startup mit PHP: Planen der Verfügbarkeit und Auswahlmöglichkeiten

Scroll to top
Read Time: 15 min
This post is part of a series called Building Your Startup With PHP.
Building Your Startup With PHP: Scheduling a Meeting
Using the Mailgun Store(): A Temporary Mailbox for Your App's Incoming Email

() translation by (you can also view the original English article)

Final product imageFinal product imageFinal product image
What You'll Be Creating

Dieses Tutorial ist Teil der Reihe Building Your Startup With PHP auf Tuts+. In dieser Serie führe ich Sie durch den Start eines Startups vom Konzept zur Realität anhand meiner Meeting Planner-App als Beispiel aus dem wirklichen Leben. Bei jedem Schritt auf dem Weg werde ich den Meeting Planner-Code als Open Source-Beispiele veröffentlichen, aus denen Sie lernen können. Ich werde auch auf geschäftliche Probleme im Zusammenhang mit Startups eingehen, sobald diese auftreten.

Der gesamte Code für Meeting Planner ist im Yii2 Framework für PHP geschrieben. Wenn Sie mehr über Yii2 erfahren möchten, lesen Sie meine parallele Serie Programmieren mit Yii2 bei Tuts+. Vielleicht möchten Sie auch auf meiner Knowledge Base-Website nach Yii2-Fragen suchen, The Yii2 Developer Exchange.

Die Codierung für die Zeitplan-Besprechungsfunktion erstreckt sich über mindestens vier Episoden. Dies ist die zweite dieser vier Folgen, in der AJAX zur Planungsseite hinzugefügt wird, damit Benutzer ihre Verfügbarkeit festlegen und Orte, Daten und Zeiten auswählen können. Wenn Sie das vorherige Tutorial zum Planen eines Meetings verpasst haben, lesen Sie es bitte zurück, bevor Sie fortfahren.

Im nächsten Tutorial werden wir uns mit der Zustellung der Besprechungsanfrage per E-Mail befassen. Wir werden später zurückkehren, um die Benutzeroberfläche zu optimieren und zu verbessern, da dies für den Erfolg dieses Produkts von entscheidender Bedeutung ist.

Anzeigen der Verfügbarkeit aus der Datenbank

The Meeting Scheduling View PageThe Meeting Scheduling View PageThe Meeting Scheduling View Page

Die Ansicht des Besprechungsplans war relativ komplex zu codieren. Das visuelle Layout der Tabellenspalten hängt nicht direkt mit der Art und Weise zusammen, wie wir die zugehörigen Daten in unserer Datenbank und in unserem Schema speichern. Glücklicherweise verfügt jede Besprechung nicht über einen großen Datensatz mit Optionen für Ort und Datum und Uhrzeit, sodass dies kein besonderes Leistungsproblem darstellt.

In unserem Schema wird die Verfügbarkeit von Plätzen für Organisatoren und Teilnehmer (d. h. Ob ein Platz für diese Besprechung für sie akzeptabel ist) in der Tabelle MeetingPlaceChoice gespeichert. Unter Verwendung unseres relationalen Modells verfügt jedes Meeting über viele MeetingPlaces mit vielen MeetingPlaceChoices.

Verwechseln Sie die MeetingPlaceChoice-Tabelle nicht mit der endgültigen Auswahl für einen Ort, der im MeetingPlace->status gespeichert ist.

Die oben gezeigte Tabelle wird anders angezeigt, wenn der Veranstalter sie anzeigt:

  • Platz 1 | Veranstalter | Teilnehmer | MeetingPlace.choice
  • Platz 2 | Veranstalter | Teilnehmer | MeetingPlace.choice

Ab wann der Teilnehmer es sieht:

  • Platz 1 | Teilnehmer | Veranstalter | (kann vielleicht MeetingPlace.choice machen)
  • Platz 2 | Teilnehmer | Veranstalter | (kann vielleicht MeetingPlace.choice machen)

Lassen Sie uns nun diskutieren, wie diese Tabellen in den Ansichten implementiert werden.

Anzeigen einer Tabelle mit Bootstrap

Im Moment habe ich mich dafür entschieden, jeden Bereich anzuzeigen, z. Ort oder Datum und Uhrzeit in einem eigenen Bootstrap-Bereich mit Tabellen.

In \frontend\views\meeting\view.php sehen Sie die Aufnahme für das Places-Bedienfeld wie folgt:

1
<?= $this->render('../meeting-place/_panel', [
2
    'model'=>$model,
3
    'placeProvider' => $placeProvider,
4
]) ?>       

Hier ist ein Teil der Panel-Ansichtsdatei für den meeting-place. Dies richtet das Tabellenraster ein und enthält ein Listenansicht-Widget zum Anzeigen der Zeilen:

1
<?php
2
use yii\helpers\Html;
3
use yii\widgets\ListView;
4
?>
5
<div class="panel panel-default">
6
  <!-- Default panel contents -->
7
  <div class="panel-heading">
8
    <div class="row">
9
      <div class="col-lg-6"><h4><?= Yii::t('frontend','Places') ?></h4></div>
10
      <div class="col-lg-6" ><div style="float:right;"><?= Html::a('', ['meeting-place/create', 'meeting_id' => $model->id], ['class' => 'btn btn-primary glyphicon glyphicon-plus']) ?></div>
11
    </div>
12
  </div>
13
  </div>
14
15
  <?php
16
   if ($placeProvider->count>0): 
17
  ?>
18
  <table class="table">
19
     <thead>
20
     <tr class="small-header">
21
       <td></td>
22
       <td ><?=Yii::t('frontend','You') ?></td>
23
        <td ><?=Yii::t('frontend','Them') ?></td>
24
        <td >
25
          <?php
26
           if ($placeProvider->count>1) echo Yii::t('frontend','Choose');
27
          ?>    </tr>
28
    </thead>
29
    <?= ListView::widget([ 
30
           'dataProvider' => $placeProvider, 
31
           'itemOptions' => ['class' => 'item'], 
32
           'layout' => '{items}',
33
           'itemView' => '_list',
34
           'viewParams' => ['placeCount'=>$placeProvider->count],
35
       ]) ?>
36
  </table>
37
    
38
  <?php else: ?>
39
  <?php endif; ?>
40
41
</div>

Schauen wir uns die Listenansicht des meeting-place genauer an.

Anzeigen der Zeilen mit Bootstrap-Switch-Widgets

In der Yii-Listenansicht wird für jeden Ort eine Datenzeile angezeigt. Der Code funktioniert für Datums- und Uhrzeitangaben nahezu identisch.

Ich verwende Krajees Yii2 Switch Input Widget für den Bootstrap Switch anstelle langweiliger Kontrollkästchen und Kombinationsfelder:

Examples of The Bootstrap Switch InputExamples of The Bootstrap Switch InputExamples of The Bootstrap Switch Input

Ich mag die Art und Weise, wie die Drei-Status-Option es uns ermöglicht, den Teilnehmern einen eindeutigen Status anzuzeigen, bevor sie eine Auswahl treffen. Außerdem können wir dem Veranstalter zeigen, dass der Teilnehmer noch keine Auswahl getroffen hat.

Lassen Sie uns Spalte für Spalte durch den Code gehen. Hier ist das Place-Panel und die Tabelle, die wir implementieren:

The Place PanelThe Place PanelThe Place Panel

Die Platzspalte

In der ersten Spalte verwende ich den Yii-HTML-Link-Helfer, um den Namen des Ortes mit seiner eigenen Ansichtsseite zu verknüpfen. Beachten Sie, wie wir den Orts-Slug verwenden.

1
<?php
2
use yii\helpers\Html;
3
use yii\helpers\BaseUrl;
4
use \kartik\switchinput\SwitchInput;
5
6
?>
7
8
<tr > 
9
  <td style >
10
        <?= Html::a($model->place->name,BaseUrl::home().'/place/'.$model->place->slug) ?>
11
  </td>

Die Organizer-Spalte

Um die Auswahl des Organisators zu finden, durchlaufen wir das Array von MeetingPlaceChoices und ordnen user_id der meeting->owner_id zu:

1
  <td style>
2
      <?
3
      foreach ($model->meetingPlaceChoices as $mpc) {
4
        if ($mpc->user_id == $model->meeting->owner_id) {
5
            if ($mpc->status == $mpc::STATUS_YES)
6
              $value = 1;
7
            else
8
              $value =0;              
9
            echo SwitchInput::widget([
10
            'type'=>SwitchInput::CHECKBOX,
11
            'name' => 'meeting-place-choice',
12
            'id'=>'mpc-'.$mpc->id,          
13
            'value' => $value,
14
            'pluginOptions' => ['size' => 'mini','onText' => '<i class="glyphicon glyphicon-ok"></i>','offText'=>'<i class="glyphicon glyphicon-remove"></i>','onColor' => 'success','offColor' => 'danger',],
15
            ]);          
16
        }
17
      }      
18
      ?>
19
     </td>

Zur Auswahl Ihrer Verfügbarkeit an einem bestimmten Ort verwenden wir den Kontrollkästchenmodus des Schaltereingangs, d. H. Dieser Ort funktioniert für Sie (ein) oder nicht (aus).

Die value-Eigenschaft setzt den Schalter beim Laden. Die ID, die der MeetingPlaceChoice->id entspricht, wird für AJAX unten verwendet, um diesen bestimmten Switch zu identifizieren.

Möglicherweise stellen Sie auch fest, dass wir anstelle von Beschriftungen Glyphicons für Ja und Nein verwenden.

Die Teilnehmerspalte

Der Code für den Teilnehmer implementiert Drei-Zustands-Schalter. d.h. dieser Ort funktioniert für Sie (ein), er funktioniert nicht (aus) oder Sie haben noch nicht angegeben (unbestimmt):

1
<td style>
2
    <?
3
  foreach ($model->meetingPlaceChoices as $mpc) {
4
    if (count($model->meeting->participants)==0) break;    
5
    if ($mpc->user_id == $model->meeting->participants[0]->participant_id) {
6
        if ($mpc->status == $mpc::STATUS_YES)
7
          $value = 1;
8
        else if ($mpc->status == $mpc::STATUS_NO)
9
          $value =0;
10
        else if ($mpc->status == $mpc::STATUS_UNKNOWN)
11
          $value =-1;
12
        echo SwitchInput::widget([
13
          'type'=>SwitchInput::CHECKBOX,         
14
          'name' => 'meeting-place-choice',
15
          'id'=>'mpc-'.$mpc->id,          
16
          'tristate'=>true,
17
          'indeterminateValue'=>-1,
18
          'indeterminateToggle'=>false,
19
          'disabled'=>true,
20
          'value' => $value,
21
          'pluginOptions' => ['size' => 'mini','onText' => '<i class="glyphicon glyphicon-ok"></i>','offText'=>'<i class="glyphicon glyphicon-remove"></i>','onColor' => 'success','offColor' => 'danger'],
22
      ]);          
23
    }
24
  }
25
    ?>
26
  </td>

Wenn wir Unterstützung für Besprechungen hinzufügen, bei denen der Teilnehmer Orte und Datums- und Uhrzeitangaben vorschlagen kann, fügen wir der Organisator-Spalte auch Widgets mit drei Status hinzu.

Anzeigen des Schalters "Ort und Datum auswählen"

Wenn der Veranstalter das Meeting anzeigt, können er den endgültigen Ort und die Uhrzeit des Meetings auswählen. In Kürze werden wir auch Unterstützung für Besprechungen hinzufügen, damit der Teilnehmer diese auswählen kann.

In diesem Fall trifft der Benutzer eine zeilenübergreifende Auswahl (Auswahl einer der aufgelisteten Stellen). Dies erfordert, dass wir den Schaltereingang im Optionsfeldmodus verwenden. Bei den AJAX-Ereignissen für die Auswahl können wir nur die Eigenschaft name abhören - es wird keine ID benötigt, da nur eine Auswahl für das Panel möglich ist.

Ich wollte auch, dass der Auswahlschalter anders aussieht als die Verfügbarkeitsschalter, also habe ich sie breiter gemacht und verschiedene Farben verwendet.

1
  <td style>    
2
      <?
3
      if ($placeCount>1) {
4
        if ($model->status == $model::STATUS_SELECTED) {
5
            $value = $model->id;
6
        }    else {
7
          $value = 0;        
8
        } 
9
        echo SwitchInput::widget([
10
          'type' => SwitchInput::RADIO,
11
          'name' => 'place-chooser',
12
            'items' => [
13
                [ 'value' => $model->id],
14
            ],
15
            'value' => $value,
16
            'pluginOptions' => [  'size' => 'mini','handleWidth'=>60,'onText' => '<i class="glyphicon glyphicon-ok"></i>','offText'=>'<i class="glyphicon glyphicon-remove"></i>'],
17
            'labelOptions' => ['style' => 'font-size: 12px'],
18
        ]);              
19
      }
20
      ?>
21
  </td>
22
</tr>

Jetzt werde ich Ihnen zeigen, wie wir die AJAX-Unterstützung für all diese Wähler implementiert haben.

Implementierung der AJAX-Unterstützung

Natürlich wollte ich vermeiden, dass Benutzer Änderungen an diesen Formularen speichern müssen. Stattdessen wollte ich, dass die Switches den Status über AJAX ohne Seitenaktualisierung ändern.

Der Code ist unterteilt in das Einrichten von Ereignis-Listenern, um auf Statusänderungen zu reagieren, und Controller-Aktionen, um die Änderungen in unserer Datenbank aufzuzeichnen. Es ist auch etwas anders für die Kontrollkästchenschalter als für die Funkschalter.

Erstellen von Ereignis-Listenern

Wir erstellen Ereignis-Listener, um Code auszuführen, wenn der Status einer Schaltfläche geändert wird. Das Listen-Ereignis ist JavaScript-Code, der von PHP in der Bedienfeldansicht generiert wird (für die gesamte Optionstabelle).

Hier ist der Code am Ende von \frontend\views\meeting-place\_panel.php:

1
<?php
2
$script = <<< JS
3
  
4
// allows user to set the final place

5
$('input[name="place-chooser"]').on('switchChange.bootstrapSwitch', function(e, s) {
6
//  console.log(e.target.value); // true | false

7
  $.ajax({
8
     url: '/mp/meetingplace/choose',   
9
     data: {id: $model->id, 'val': e.target.value},
10
     // e.target.value is selected MeetingPlaceChoice model 

11
     success: function(data) {
12
       return true;
13
     }
14
  });  
15
});  
16
...
17
JS;
18
$position = \yii\web\View::POS_READY;
19
$this->registerJs($script, $position);
20
?>

Übrigens, wenn mir jemand den Namen der JS-Blockkürzel für PHP sagen kann, posten Sie ihn im Kommentarbereich. Ich würde gerne wissen. Einige Dinge sind schwer zu suchen.

Die Funktion registerJs in Yii rendert das Skript für eine bestimmte $position auf der Seite. In diesem Fall handelt es sich um ein On-Ready-Ereignis.

Der obige Code richtet Listener-Ereignisse für alle Optionsfelder zur Ortsauswahl für alle Orte mit der Eigenschaft name ein. Der Zielwert der Veranstaltung repräsentiert die gewählte Treffpunkt-ID. Ich werde gleich mehr über die AJAX-Funktion sprechen.

Mit anderen Worten, die Switch-Radio-Ereignisse reagieren darauf, dass der Organisator (im Allgemeinen) einen Ort oder eine Uhrzeit auswählt, um die Besprechung abzuschließen, und die Besprechungsort- oder Besprechungszeit-ID überträgt.

Hier ist der Code zum Abhören von Verfügbarkeitsänderungen mit den Kontrollkästchen für die Schaltereingabe:

1
// users can say if a place is an option for them

2
$('input[name="meeting-place-choice"]').on('switchChange.bootstrapSwitch', function(e, s) {
3
  //console.log(e.target.id,s); // true | false  

4
  // set intval to pass via AJAX from boolean state

5
  if (s)
6
    state = 1;
7
  else
8
    state =0;  
9
  $.ajax({
10
     url: '/mp/meetingplacechoice/set',   
11
     data: {id: e.target.id, 'state': state},
12
     success: function(data) {
13
       return true;
14
     }
15
  });  
16
});

Der Listener ist für alle Eigenschaften des Namens für die meeting-place-choice eingerichtet, muss jedoch die ID übergeben, um genau anzugeben, welche MeetingPlaceChoice geändert wird.

Zur Verdeutlichung können Benutzer mithilfe der Ereignis-Listener für Schalter-Eingabekästchen angeben, ob sie für einen Ort oder eine Uhrzeit verfügbar sind oder nicht. Sie senden eine ID zur meeting-place-choice oder eine ID zur meeting-place-time.

Schauen wir uns nun genauer an, wie die AJAX-Ereignisse unsere PHP-basierten Controller-Aktionen aufrufen, um Statusänderungen in der Datenbank aufzuzeichnen.

Erstellen der Controller-Aktionen

Hier ist noch einmal der Code für die Auswahl des Optionsfelds für den meeting-place:

1
$.ajax({
2
     url: '/mp/meetingplace/choose',   
3
     data: {id: $model->id, 'val': e.target.value},
4
     // e.target.value is selected MeetingPlaceChoice model 

5
     success: function(data) {
6
       return true;
7
     }
8
  });  

Die URL gibt den Pfad zur Auswahlaktion des MeetingPlace-Controllers an:

1
public function actionChoose($id,$val) {
2
      // meeting_place_id needs to be set active

3
      // other meeting_place_id for this meeting need to be set inactive

4
      $meeting_id = intval($id);
5
      $mtg=Meeting::find()->where(['id'=>$meeting_id])->one();
6
      if (Yii::$app->user->getId()!=$mtg->owner_id) return false;
7
      // to do - also check participant id if participants allowed to choose

8
      foreach ($mtg->meetingPlaces as $mp) {
9
        if ($mp->id == intval($val)) {
10
          $mp->status = MeetingPlace::STATUS_SELECTED;          
11
        }
12
        else {
13
          $mp->status = MeetingPlace::STATUS_SUGGESTED;          
14
        }
15
        $mp->save();
16
      }
17
      return true;
18
    }

Die eingehende $id repräsentiert die meeting_id. Der Wert repräsentiert die ausgewählte MeetingPlace-ID. STATUS_SELECTED zeigt an, dass der Ort ausgewählt wurde, während STATUS_SUGGESTED nur angibt, dass er vorgeschlagen wurde (nicht ausgewählt).

Dieser Code durchläuft die Treffpunkte jedes Meetings und aktualisiert den Status des ausgewählten Ortes.

Schauen wir uns noch einmal den Code für die Kontrollkästchen für die Schaltereingabe an, mit denen festgestellt wird, ob jemand für einen bestimmten Ort verfügbar ist:

1
$.ajax({
2
     url: '/mp/meetingplacechoice/set',   
3
     data: {id: e.target.id, 'state': state},
4
     success: function(data) {
5
       return true;
6
     }
7
  });  

Diese Ereignisse rufen die festgelegte Aktion des MeetingPlaceChoice-Controllers mit einer Zeichenfolge auf, deren Suffix die ID des MeetingPlaceChoice-Datensatzes enthält, der aktualisiert werden muss:

1
public function actionSet($id,$state)
2
    {
3
      // caution - incoming AJAX type issues with val

4
      $id=str_replace('mpc-','',$id);      
5
      $mpc = $this->findModel($id);      
6
      if (Yii::$app->user->getId()!=$mpc->user_id) return false;        
7
      if (intval($state) == 0 or $state=='false')
8
        $mpc->status = MeetingPlaceChoice::STATUS_NO;
9
      else
10
        $mpc->status = MeetingPlaceChoice::STATUS_YES;
11
      $mpc->save();
12
      return $mpc->id;
13
    }

Sichern von AJAX-Anfragen

Aus Sicherheitsgründen müssen wir überprüfen, ob die AJAX-Anforderung vom tatsächlichen Benutzer initiiert wurde, der diese Änderungen vornehmen kann. Dieser Code macht das:

1
 if (Yii::$app->user->getId()!=$mtg->owner_id) return false;

und

1
if (Yii::$app->user->getId()!=$mpc->user_id) return false;        

Ohne diese Überprüfungen wäre es für einen Hacker einfach, ein Skript zu schreiben, um die Besprechungseinstellungen für jedermann zu ändern.

Der AJAX-Code zum Anzeigen der Verfügbarkeit für Datums- und Uhrzeitangaben und zum Treffen von Auswahlmöglichkeiten ist nahezu identisch.

Unterstützung der Verfügbarkeitseinstellungen

Um alle oben genannten Funktionen zu unterstützen, müssen wir auch Code hinzufügen, der den Tabellen MeetingPlaceChoice und MeetingTimeChoice-Datensätze hinzufügt, wenn Teilnehmer, Orte und Datumszeiten hinzugefügt werden. Dafür verwenden wir die AfterSave-Ereignisse von Yii.

Wenn ein Teilnehmer hinzugefügt wird, müssen wir für jeden MeetingPlace neue MeetingPlaceChoice-Zeilen und für jede MeetingTime neue MeetingTimeChoice-Zeilen hinzufügen. Hier ist der Code im Participate-Modell, der dies automatisch für uns erledigt:

1
    public function afterSave($insert,$changedAttributes)
2
    {
3
        parent::afterSave($insert,$changedAttributes);
4
        if ($insert) {
5
          // if Participant is added

6
          // add MeetingPlaceChoice & MeetingTimeChoice this participant

7
          $mt = new MeetingTime;          
8
          $mt->addChoices($this->meeting_id,$this->participant_id);
9
          $mp = new MeetingPlace;          
10
          $mp->addChoices($this->meeting_id,$this->participant_id);
11
        } 
12
    }

Wenn ein neuer Ort hinzugefügt wird, werden für jeden Teilnehmer neue MeetingPlaceChoices benötigt:

1
public function afterSave($insert,$changedAttributes)
2
    {
3
        parent::afterSave($insert,$changedAttributes);
4
        if ($insert) {
5
          // if MeetingPlace is added

6
          // add MeetingPlaceChoice for owner and participants

7
          $mpc = new MeetingPlaceChoice;
8
          $mpc->addForNewMeetingPlace($this->meeting_id,$this->suggested_by,$this->id);
9
        } 
10
    }

Wenn eine neue Datums- und Uhrzeitangabe hinzugefügt wird, werden für jeden Teilnehmer neue Einträge für MeetingTimeChoice benötigt:

1
public function afterSave($insert,$changedAttributes)
2
    {
3
        parent::afterSave($insert,$changedAttributes);
4
        if ($insert) {
5
          // if MeetingTime is added

6
          // add MeetingTimeChoice for owner and participants

7
          $mtc = new MeetingTimeChoice;
8
          $mtc->addForNewMeetingTime($this->meeting_id,$this->suggested_by,$this->id);
9
        } 
10
    }
11
    

Es wird davon ausgegangen, dass der Organisator eines Meetings, wenn er einen Ort oder eine Uhrzeit hinzufügt, zunächst für ihn funktioniert.

Auswahl des endgültigen Ortes, Datums und der Uhrzeit

Sobald mindestens ein Teilnehmer, ein Ort und eine Zeit eingeladen ist, kann der Organisator des Meetings das Meeting abschließen. In Zukunft können die Teilnehmer das Meeting auch abschließen.

Während sich dieser Code in Zukunft etwas ändert, gibt es im Besprechungsmodell eine Funktion, die der Ansicht mitteilt, ob die Schaltfläche Finalize aktiviert werden soll:

1
public function canFinalize() {
2
        // check if meeting can be finalized by viewer

3
        if ($this->canSend()) {
4
          // organizer can always finalize

5
          if ($this->viewer == Meeting::VIEWER_ORGANIZER) {
6
            $this->isReadyToFinalize = true;
7
          } else {
8
            // viewer is a participant

9
            // has participant responded to one time or is there only one time

10
            // has participant responded to one place or is there only one place

11
            
12
          }          
13
        }    

Hier ist der Ansichtscode:

1
<?= Html::a(Yii::t('frontend', 'Finalize'), ['finalize', 'id' => $model->id], ['class' => 'btn btn-success '.(!$model->isReadyToFinalize?'disabled':'')]) ?>

Sobald das Meeting abgeschlossen ist, ändert MeetingPlanner den Modus von der Unterstützung der Planung zur Erleichterung der Teilnahme der Teilnehmer durch eine Vielzahl cooler Funktionen, die wir in zukünftigen Tutorials behandeln werden.

Codierungsprobleme, auf die ich gestoßen bin

Ich wollte einige Probleme erwähnen, auf die ich beim Schreiben des Codes für diesen relativ komplizierten Abschnitt gestoßen bin.

AJAX-Typen

Die SwitchInput-Zustände wurden über JavaScript als boolesche Typen gesendet, z. wahr oder falsch, aber ich musste diese in ganzzahlige Werte konvertieren, um sie erfolgreich über AJAX an die Controller zu übertragen.

1
// users can say if a place is an option for them

2
$('input[name="meeting-place-choice"]').on('switchChange.bootstrapSwitch', function(e, s) {
3
  //console.log(e.target.id,s); // true | false  

4
  // set intval to pass via AJAX from boolean state

5
  if (s)
6
    state = 1;
7
  else
8
    state =0;  

Überlappende IDs

Die numerischen IDs der Widgets MeetingPlaceChoice und MeetingTimeChoice überlappen sich. Es dauerte eine Weile, bis ich herausgefunden hatte, warum die Switch-Widgets für mich nicht mehr richtig gerendert wurden, als ich die Auswahlfunktionen hinzufügte. Da es überlappende IDs gab, wurden die Switch-Widgets nur für das erste Objekt gerendert.

Es war notwendig, Präfixe wie mpc- oder mtc- zu den IDs hinzuzufügen und diese in den Controller-Aktionen zu entfernen.

1
 echo SwitchInput::widget([
2
          'type'=>SwitchInput::CHECKBOX,         
3
          'name' => 'meeting-place-choice',
4
          'id'=>'mpc-'.$mpc->id,          
5
          'tristate'=>true,

Hier entfernen wir das Präfix im Controller, um das Modell zu laden:

1
    public function actionSet($id,$state)
2
    {
3
      // caution - incoming AJAX type issues with val

4
      $id=str_replace('mpc-','',$id);      
5
      $mpc = $this->findModel($id);      

Swith Input Widget Optionsfeld Ladezustand

Es dauerte eine Weile, bis ich herausgefunden hatte, wie der anfängliche Ladezustand / -wert für das Weicheingabe-Widget im Optionsfeldmodus eingestellt werden konnte. Es gab keine Dokumentation, die zeigte, wie das geht. Ich habe hier endlich einen Erklärer für andere geschrieben: Einstellen des Status des Optionsfelds "Switch Input Widget".

Was kommt weiter?

Nachdem die gesamte AJAX vorhanden ist und funktioniert, ist es an der Zeit, einige der verbleibenden Bereiche der Besprechungsplanungsansicht fertigzustellen, um Einladungen vorzubereiten, die zugestellt wurden und von den Teilnehmern angezeigt werden müssen.

Beispielsweise unterscheidet sich die Ansicht des Besprechungsplans, die die Teilnehmer sehen, im Layout vom Veranstalter und hängt davon ab, welche Befugnisse der Veranstalter delegiert hat.

Beispielsweise müssen sich die Spalten "Sie" und "Sie" gegenüber ihrer aktuellen Implementierung ändern. Die Einstellungen des Besprechungsmodells müssen erweitert werden, um zu bestimmen, ob die Teilnehmer Orte und Datumsangaben vorschlagen und die Besprechung abschließen können.

In der Zukunft möchte ich wahrscheinlich mehrere Teilnehmer zulassen und muss mehr Verfügbarkeitsspalten für die Organisationsansicht anzeigen. Diese Funktionalität ist nicht Teil unseres Minimum Viable Product (MVP).

Ich muss auch die Implementierung des MeetingLog abschließen, in dem jede Änderung aufgezeichnet wird, die während des Planungsprozesses an einem Meeting vorgenommen wurde. Dies liefert eine Art Planungsverlauf für jedes Meeting. Ich kann auch afterSave()-Ereignisse dafür verwenden.

Achten Sie auf bevorstehende Tutorials in unserer Reihe Erstellen Sie Ihr Startup mit PHP. Eine Liste der bevorstehenden Themen finden Sie jetzt in unserem Inhaltsverzeichnis.

Bitte zögern Sie nicht, Ihre Fragen und Kommentare unten hinzuzufügen; Ich nehme in der Regel an den Diskussionen teil. Sie können mich auch auf Twitter @reifman erreichen oder mir direkt eine E-Mail senden.

Ähnliche Links

Advertisement
Did you find this post useful?
Want a weekly email summary?
Subscribe below and we’ll send you a weekly email summary of all new Code tutorials. Never miss out on learning about the next big thing.
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.