2016-07-17 34 views
0

Ich bin Anfänger, wenn es darum geht, Phalcon Rahmen und seine Volt-Engine, aber ich möchte es wirklich lernen. Ich befolge ihre Dokumentation und bin gerade bei ihrem INVO-Projekt.Holen Sie sich ein Element aus einem Formular

Und sie haben eine Datenbank von Produkten, und diese Produkte haben wie eine Art (5-Gemüse, 6-Frucht). Wenn ich also alle Produkte listet, werden alle Daten zu diesem Produkt angezeigt, und Sie erhalten den Link zum Bearbeiten der Daten für das jeweilige Produkt. Also, wenn ich auf "bearbeiten" klicke, möchte ich wie ein HTML-Formular öffnen, das bereits gefüllte Felder mit Daten von diesem spezifischen Produkt enthält.

Dies ist die Form-Klasse, die sie ein Formular für Produkte zu schaffen verwenden:

<?php 

use Phalcon\Forms\Form; 
use Phalcon\Forms\Element\Text; 
use Phalcon\Forms\Element\Hidden; 
use Phalcon\Forms\Element\Select; 
use Phalcon\Validation\Validator\Email; 
use Phalcon\Validation\Validator\PresenceOf; 
use Phalcon\Validation\Validator\Numericality; 

class ProductsForm extends Form 
{ 
    /** 
    * Initialize the products form 
    * 
    * @param null $entity 
    * @param array $options 
    */ 
    public function initialize($entity = null, $options = array()) 
    { 
     if (isset($options['edit'])) { 
      $element = new Text("id"); 
      $this->add($element->setLabel("Id")); 
     } else { 
      $this->add(new Hidden("id")); 
     } 

     $name = new Text("name"); 
     $name->setLabel("Name"); 
     $name->setFilters(array('striptags', 'string')); 
     $name->addValidators(
      array(
       new PresenceOf(
        array(
         'message' => 'Name is required' 
        ) 
       ) 
      ) 
     ); 
     $this->add($name); 

     $type = new Select(
      'profilesId', 
      ProductTypes::find(), 
      array(
       'using' => array('id', 'name'), 
       'useEmpty' => true, 
       'emptyText' => '...', 
       'emptyValue' => '' 
      ) 
     ); 
     $this->add($type); 

     $price = new Text("price"); 
     $price->setLabel("Price"); 
     $price->setFilters(array('float')); 
     $price->addValidators(
      array(
       new PresenceOf(
        array(
         'message' => 'Price is required' 
        ) 
       ), 
       new Numericality(
        array(
         'message' => 'Price is required' 
        ) 
       ) 
      ) 
     ); 
     $this->add($price); 
    } 
} 

Dies ist die Aktion von der Steuerung ist:

/** 
* Shows the view to "edit" an existing product 
*/ 
public function editAction($id) 
{ 
    if (!$this->request->isPost()) { 
     $product = Products::findFirstById($id); 
     if (!$product) { 
      $this->flash->error("Product was not found"); 
      return $this->forward("products/index"); 
     } 

     $this->view->form = new ProductsForm($product, array('edit' => true)); 
    } 
} 

Und das ist meine edit.volt View-Datei : Jetzt

{{ form("products/whatever") }} 

<h2>Search products</h2> 

<fieldset> 

    {% for element in form %} 
     <div class="control-group"> 
      {{ element.label(['class': 'control-label']) }} 
      <div class="controls">{{ element }}</div> 
     </div> 
    {% endfor %} 

    <div class="control-group"> 
     {{ submit_button("Edit", "class": "btn btn-primary") }} 
    </div> 

</fieldset> 

, wenn ich auf ein bestimmtes Produkt klicken ich dieses: Edit screen

Wie Sie sehen können ... ist alles außer dem Select-Tag bereits gefüllt und das funktioniert gut ... es ist nur diese eine Auswahl, die nicht ausgewählt wird. :( Ich meine, ich kann auf das Dropdown-Menü klicken und es zeigt mir die Daten ... aber ich möchte es bereits ausgewählt wie alles andere ist.

Also meine Frage ist, kann ich hinzufügen (und wie zu tue es, wenn es möglich ist) wie eine if-Anweisung in meinem edit.volt, die wie folgt lautet "Wenn das nächste Element ein ausgewähltes Element ist, wähle einfach den Wert, der bereits in der Datenbank ist", wie in diesem Bildschirm, wenn seine Paprika dann 5-Gemüse sollte bereits ausgewählt sein ... dann, wenn Sie möchten, dass Sie es und speichern Sie sie ändern können ... aber ich will es nur bereits ausgewählt.

ich für den langen Post entschuldigen.

+0

Ihr Code sieht gut aus. Der Name Ihrer ausgewählten Eingabe ('profilesId'), ist das auch der Name der Profilspalte in Ihrem' product' Modell? – Timothy

+0

@Timothy Nein, ist es nicht. In meinem Produktmodell heißt es $ product_types_id, und das ist ein Fremdschlüssel für ein anderes Modell namens ProductTypes ($ id) (dieses Modell enthält nur ID und Namen für Typen: wie zum Beispiel ID: 5 name: Vegetables).Ich habe Phalcon Dev Tools verwendet, um meine Modelle zu erstellen, und sie hat sie mit diesen Namen erstellt, weil diese Spalten in der Datenbank benannt sind (übrigens: aus dem Phalcon Dokumentations Tutorial ... ich benutze ihre Sachen, weil ich nur versuche lerne das, aber anscheinend bin ich sogar zu dumm :() – Blitva

+0

@Timothy, das einzige, was ich gemacht habe, war für edit.volt, weil sie den Code für diese Datei nicht zur Verfügung gestellt haben, also habe ich das einfach kopiert eine andere Datei Ich dachte, ich könnte es verwenden, da ich nur ein Formular brauche und es wird mit den Daten gefüllt – Blitva

Antwort

0

Wenn Sie möchten, dass Phalcon Daten automatisch zuweist Wenn Sie die Basiswerte für Ihr Formular verwenden, müssen Sie sicherstellen, dass Ihre Formularelemente denselben Namen haben wie Ihre Products Spalten (~ Datenbankspalten).
Andernfalls kann Phalcon nicht wissen, wie Sie Ihre Products Werte ihren korrekten Formularelementen zuordnen.

Controller:

$product = Products::findFirstById($id); 
// ... 
$this->view->form = new ProductsForm($product, array('edit' => true)); 

Form:

$type = new Select(
    'product_type_id', // was previously "profilesId" 
    ProductTypes::find(), 
    array(
     'using' => array('id', 'name'), 
     'useEmpty' => true, 
     'emptyText' => '...', 
     'emptyValue' => '' 
    ) 
); 

Wie Sie in den Kommentaren erwähnt, ist Ihr Products Modell nicht über eine profilesId Spalte, sondern eine product_type_id Spalte. Daher sollten Sie Ihr Select Element von profilesId in product_type_id umbenennen.

Verwandte Themen