2016-04-20 4 views
1

Ich arbeite an einer Seite für eine SilverStripe-Website, die Artikel auflistet. Ich habe ein Dropdown mit den verfügbaren Jahren hinzugefügt, um bestimmte Artikel zurückzugeben. Das Problem, das ich habe, ist eine Möglichkeit, das ausgewählte Datum aus dem Dropdown mit dem Datenbankwert für das Feld Datum für das Artikeldatenobjekt zu verbinden.Inhalt nach Auswahl des Datums aus Dropdown mit PHP und jQuery aktualisieren

Hier die Artikeldaten Objektklasse mit einer Funktion, die das Jahr für jeden Artikel in einer Funktion getYearCreated genannt speichert:

class RecentCoverageDoc extends DataObject { 

    private static $db = array(
     'Title' => 'varchar(250)', 
     'Publisher' => 'varchar(250)', 
     'Date' => 'date', 
    ); 

    private static $has_one = array(
     'ArticleDoc' => 'File', 
    ); 

    private static $summary_fields = array(
     'Title' => 'Title', 
     'Publisher' => 'Publisher', 
     'Date' => 'Date' 
    ); 

    public function getYearCreated() { 
     return date('Y', strtotime($this->Date)); 
    } 

} 

In page.php, das ist die Funktion, die ich auf den Aufbau gerade arbeite, dass gemeint ist der ausgewählte Wert aus dem Jahr Drop-Down-Liste zu nehmen und es verwenden, die richtige Liste der Artikel mit diesem Jahr verbunden zu bekommen:

public function getDocsByYear(){ 
     //Get the year selected by the dropdown 
     $docYear = $this->getRequest()->param('ID'); 

     //Group together all docs that are associated with that selected year 
     $documents = GroupedList::create(RecentCoverageDoc::get()->sort('Date')); 

     $return = array(); 

     //put the articles into the array that match the selected year 
     foreach($documents as $document){ 
      $docDate = date("Y", strtotime($document->Date)); 
      $selectedDate = date("Y",strtotime($docYear)); 
      if($docDate == $selectedDate){ 
       $return[] = array(
        'title' => $document->Title, 
        'date' => $document->Date, 
        'publisher' =>$document->Publisher 
       ); 
      } 
     } 

     return json_encode($return); 

    } 

und schließlich, die jQuery-Code, der den Wert des Jahres Drop-Down wird immer und Senden Sie es an die getDocsByYear Funktion:

(function($) { 
    $(document).ready(function() { 

     var SelectYear = $('#SelectYear'); 

     SelectYear.change(function() { 
      if (SelectYear.val() != "" && SelectYear.val() != null) { 
       sendYear(); 
      } 
     }); 

     function sendYear(){ 
      var year = SelectYear.find('option:selected').attr('value'); 
      $.ajax({ 
       type: "POST", 
       url: "/home/getDocsByYear/"+year, 
       dataType: "json" 
      }).done(function (response) { 
       var list = ''; 
       var docSection = $('.RecentDocs'); 

       for (var i=0;i<response.length;i++){ 
        list += response[i].date + ', ' + response[i].publisher + ', ' + '<a href="' + response[i].title + ' target="_blank">"' + response[i].title +"</a> <br />"; 
       } 
       docSection.empty(); 
       docSection.append(list); 
      }); 
     } 

    }); 
}(jQuery)); 

Ich versuche, die beste Art und Weise zu denken, die Liste der Artikel zu erhalten, bezogen auf das Jahr aus der Dropdown ausgewählt. Das Jahr Drop-Down-Liste und die Liste der Artikel auf der Seite unter Verwendung der GroupedList Funktion bevölkern:

<select id="SelectYear"> 
    <% loop $GroupedDocsByDate.GroupedBy(YearCreated) %> 
     <option value="$YearCreated">$YearCreated</option> 
    <% end_loop %> 
</select> 
<br /><br /> 
<div class="RecentDocs"> 
    <% loop $getAllRecentCoverageDocs %> 
     $Date, <a href="$ArticleDoc.URL" target="_blank">$Title</a>, $Publisher<br /><br /> 
    <% end_loop %> 
</div> 

Ich vermute, dass etwas ähnliches verwendet für funktionieren würde Artikel immer für Jahr, aber ich bin fest, wie zu Beenden Sie die Funktion, damit ich die korrekte Liste der Artikel basierend auf dem Jahr habe, das von der Dropdown-Liste ausgewählt wird. Im Moment, mit dem was ich habe, bekomme ich nur einen Artikel zurück, egal welches Jahr gewählt wurde, und das ist nicht korrekt. Irgendwelche Vorschläge wären hilfreich!

Antwort

2

Ok, endlich fertig!

 public function getDocsByYear(){ 
     //Get the year selected by the dropdown 
     $docYear = $this->getRequest()->param('ID'); 

     //Group together all docs that are associated with that selected year 
     $documents = RecentCoverageDoc::get(); 
     $return = array(); 

     //put the articles into the array that match the selected year 
     foreach($documents as $document){ 
      $docDate = date("Y", strtotime($document->Date)); 

      if($docDate == $docYear){ 
       $return[] = array(
        'title' => $document->Title, 
        'date' => $document->Date, 
        'publisher' =>$document->Publisher 
       ); 
      } 
     } 

     return json_encode($return); 

    } 

Ich habe keinen GroupedList brauchen. Ich habe es zu kompliziert gemacht. Diese Methode scheint zu funktionieren. Nicht sicher, ob es die beste Methode ist, aber ich sehe auch nichts falsch.

+0

fühlen Sie sich frei, Ihre eigene Antwort zu akzeptieren. Es sieht gut aus für mich. – wmk

Verwandte Themen