2016-07-17 2 views
0

Я новичок, когда дело доходит до рамки Phalcon и его двигателя Volt, но я бы очень хотел его изучить. Я слежу за их документацией, и сейчас я нахожусь в их проекте INVO.Получить выбранный элемент из формы

И у них есть база данных продуктов, и эти продукты имеют тип (5-Овощи, 6-Фрукты). Поэтому, когда я перечисляю все продукты, он отображает все данные об этом продукте и дает ссылку на «редактирование» этих данных для этого конкретного продукта. Поэтому, когда я нажимаю «редактировать», я хочу открыть, как html-форму, которая будет содержать уже заполненные поля данными из этого конкретного продукта.

Это класс формы, которую они используют, чтобы создать форму для продуктов:

<?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); 
    } 
} 

Этого действие от контроллера:

/** 
* 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)); 
    } 
} 

И это мой файл вида edit.volt :

{{ 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> 

Теперь, когда я нажимаю на конкретный продукт я получаю это: Edit screen

Как вы можете видеть ... все, кроме тега select, уже заполнено, и это отлично работает ... его просто выбирают, который не выбирается. :( Я имею в виду, что я могу щелкнуть выпадающее меню, и он показывает мне данные ... но я хочу, чтобы он был уже выбран, как и все остальное.

Итак, мой вопрос: могу ли я добавить (и как сделайте это, если это возможно), как оператор if внутри моего edit.volt, который будет выглядеть как «если следующий элемент - это элемент выбора, просто выберите значение, которое уже находится в базе данных», как на этом экране, если его перец колокола затем 5-Овощи должны быть уже выбраны ... то, если вы хотите, вы можете изменить его и сохранить его ... но я просто хочу, чтобы быть уже выбран.

Прошу прощения за длинный пост.

+0

Ваш код выглядит хорошо. Имя вашего выбранного ввода ('profilesId') - это также имя столбца профиля в вашей модели' product'? – Timothy

+0

@ Тимоти Нет, это не так. В моей модели продуктов он называется $ product_types_id, и это внешний ключ для другой модели ProductTypes ($ id) (эта модель содержит только идентификатор и имя для типов: например, id: 5 name: Vegetables).Я использовал Phalcon Dev Tools для создания моих моделей и создал его с этими именами, потому что это то, как эти столбцы называются в базе данных (кстати, это из учебника документации Phalcon ... я использую их материалы, потому что им просто пытаются узнайте об этом, но, по-видимому, я слишком глуп даже для этого :() – Blitva

+0

@Timothy, единственное, что я сделал для edit.volt, потому что они не предоставили код для этого файла, поэтому я просто скопировал это из другой файл. Я решил, что смогу использовать его, так как мне просто нужна форма, и он будет заполнен данными, которые он дал – Blitva

ответ

0

Если вы хотите, чтобы Phalcon автоматически назначал данные базовые значения в вашу форму, вам нужно убедиться, что ваши элементы формы имеют то же имя, что и ваши столбцы Products (столбцы базы данных).
В противном случае Phalcon не может знать, как сопоставить ваши значения Products с их правильными элементами формы.

Контроллер:

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

Форма:

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

Как упоминалось в комментариях, ваша Products модель не имеет profilesId колонку но вместо product_type_id колонку. Поэтому вы должны переименовать свой элемент Select с profilesId в product_type_id.

Смежные вопросы