简体   繁体   English

自动完成先前值的字段

[英]Auto complete fields of a previous values

I am doing a small application in Yii Framework for that my database is something like this 我正在Yii Framework中做一个小型应用程序,因为我的数据库是这样的

 === Invoices ===
  id (PK)
  customer_id
  invoice_title
  order_no
  invoice_issue_date
  due_date
  description

  === Customers ===
  id (PK)
  email_address
  customer_name
  address
  city
  state
  postal_code
  description

I have rendered the Customer model in Invoice model so that I can enter all the values for both models in a single Invoice form .But there is one problem,let us assume that I have a customer name xyz which I had saved before .Now when I am going to again fill the Customer name with xyz ,it should show all the fields of both models like invoice_title,order_no,invoice_issue_date,due_date,description,email_address,customer_name,address etc. in that input fields of the form so that I don't have to re-enter all the fields again .So how this can be achive in Yii framework.Any help and suggestions will be highly appreciable.More clarification on codes that I have done can be shared if needed. 我已经在Invoice model绘制了Customer model ,以便可以在一个single Invoice form输入两个模型的所有值。但是有一个问题,让我们假设我有一个以前saved before的客户名xyz 。我将again fill the Customer name with xyz ,它应该all the fields of both models like invoice_title,order_no,invoice_issue_date,due_date,description,email_address,customer_name,address etc. in that input fields of the form显示all the fields of both models like invoice_title,order_no,invoice_issue_date,due_date,description,email_address,customer_name,address etc. in that input fields of the form无需re-enter all the fields again 。因此如何在Yii框架中实现此目标。任何帮助和建议将非常可取。如有需要,可以分享我所做的代码的更多说明。 Please help me out.I am totally stuck here. 请帮帮我。我完全被困在这里。

To do this as everyone has already mentioned you need ajax, and some javascript. 要做到这一点,因为每个人都已经提到过,您需要ajax和一些javascript。 The logic is something like this: 逻辑是这样的:

  1. When a value is selected in the dropdown for customer name, trigger an ajax call to retrieve the information about that user. 在客户名称的下拉列表中选择一个值后,触发ajax调用以检索有关该用户的信息。 This can be easily done with the ajax option, which is available as an additional htmlOption for some html element helpers in CHtml, as part of clientChange . 这可以通过ajax选项轻松完成,作为clientChange的一部分,它可以作为CHtml中某些html元素助手的附加htmlOption来使用

     echo $form->dropDownList($model,'customer_name',CHtml::listData(Customers::model()->findAll(),'id','customer_name'), array(// htmlOptions 'ajax'=>array(// special htmlOption through clientChange, for ajax 'type'=>'GET', 'url'=>$this->createUrl('controllername/customerdetails'),// action that will generate the data 'data'=>'js:"id="+$(this).val()',// this is the data that we are sending to the action in the controller 'dataType'=>'json',// type of data we expect back from the server 'success'=>'js:updateFields'// a javascript function that will execute when the request completes successfully ) ) ); 

    The documentation for the above options for ajax can be seen in jquery's ajax documentation . 可以在jquery的ajax文档中查看上述有关ajax选项的文档

  2. Then in the server side find the particular customer, and send a response to the browser. 然后在服务器端找到特定的客户,并将响应发送到浏览器。 Example: 例:

     // in the controllername code an action that will return the values as json public function actionCustomerdetails($id){ $var=Customers::model()->findByPk($id); echo CJSON::encode($var); } 
  3. When you receive the server response populate the respective fields. 收到服务器响应后,将填写相应的字段。 This can be done in the success function callback for ajax, in the above code it was updateFields: 这可以在ajax的成功函数回调中完成,在上面的代码中是updateFields:

     Yii::app()->clientScript->registerScript('update',' function updateFields(data, textStatus, jqXHR){ // select each input field by id, and update its value $("#Customers_postal_code").val(data.postal_code); $("#Customers_city").val(data.city); $("#Customers_address").val(data.address); // similarly update the fields for the other inputs } '); 

Notes: Your customer can have many invoices, so the question will be which invoice to select given a customer name. 注意:您的客户可以有许多发票,因此问题是给定客户名称时应选择哪个发票。 That's something you'll have to handle, i think my answer has enough code to get you going. 那是您必须处理的事情,我认为我的答案有足够的代码来帮助您前进。

To know the input field ids, you can simply check the generated html. 要了解输入字段ID,您只需检查生成的html。

Have you checked the Yii Autocomplete widget? 您是否检查过Yii自动完成小部件? And you wouldn't have to worry about AJAX implementation. 而且您不必担心AJAX的实现。 It does it for you. 它为你做。

Yii Framework: CJui AutoComplete Yii框架:CJui AutoComplete

A more customized autocomplete solution in this link. 此链接中的更自定义的自动完成解决方案。

Yii Framework: custom-autocomplete-display-and-value-submission Yii框架:自定义自动完成显示和值提交

You could do this in two stages, so that: 您可以分两个阶段进行操作,以便:

  1. When the view is initially displayed, the customer is asked for their email address or customer_name . 最初显示视图时,要求客户提供其email addresscustomer_name

  2. The Controller Action that the form is submitted to then retrieves data from the Customer model for the submitted email address or customer_name (I'll use email_address in my example below). 提交表单的Controller Action然后从Customer模型中检索提交的email addresscustomer_name (在下面的示例中,我将使用email_address )。 Once retrieved, you can display your Single Invoice Form View with the data pre-populated for the customer if available. 检索后,您可以显示“单个发票表单”视图,其中包含为客户预先填充的数据(如果有)。

This concept could then be implemented as follows: 然后可以按以下方式实现此概念:

<?php
// file: controllers/InvoiceController.php
class InvoiceController extends CController
{
  // ... other controller functions

  public function actionCreate($step = null)
  {
    $invoice  = new Invoice;
    $customer = new Customer;

    # Form has been submitted:
    if ( isset($_POST['Customer']) )
    {
      # The submitted form was Step 1:
      if ( $step == 1 )
      {
        # make sure the submitted email address is valid
        $customer->setAttributes($_POST['Customer']);
        if ( $customer->validate(array('email_address')) )
        {
          # retrieve the customer by email_address
          $customer = Customer::model()->findByAttributes(array('email_address' => $_POST['Customer']['email_address']));
        }

        $this->render('createstep2', array('invoice' => $invoice, 'customer' => $customer));
      }

      # The submitted form was Step 2:
      elseif ( $step == 2 )
      {
        $income->setAttributes($_POST['Invoice']);
        $customer->setAttributes($_POST['Customer']);

        # save the data
        if ( $customer->save() )
        {
          $invoice->customer_id = $customer->id;
          if ( $invoice->save() )
          {
            $this->redirect(array('view', 'id' => $invoice->id));
          }
        }

        # display any errors
        $this->render('createstep2', array('invoice' => $invoice, 'customer' => $customer));
      }
    } 

    $this->render('createstep1', array('invoice' => $invoice, 'customer' => $customer));
  }

  // ... other controller functions
}
?>

You could split that to two separate Controller Actions if you wish. 如果愿意,可以将其分为两个单独的Controller Action。

For Step 1 View, you could then have the following: 对于“第1步视图”,您将具有以下内容:

<!-- file: views/invoice/createstep1.php -->
<h1>Create Invoice: Step 1</h1>

<div class="form">

<?php
$form = $this->beginWidget('CActiveForm', array(
  'id'=>'invoice-form',
  'enableAjaxValidation'=>false,
  'action'=>array('invoice/create','step' => 1)
)); 
?>

  <?php echo $form->errorSummary($customer); ?>

  <div class="row">
    <?php echo $form->labelEx($customer,'email_address'); ?>
    <?php echo $form->textField($customer,'email_address', array('size'=>60,'maxlength'=>255)); ?>
    <?php echo $form->error($customer,'email_address'); ?>
  </div>

  <div class="row buttons">
    <?php echo CHtml::submitButton('Next'); ?>
  </div>

<?php $this->endWidget(); ?>

</div><!-- form -->

Step 2 view, you could then look like what you already have. 在第2步视图中,您可能会看起来像已经拥有的东西。 Maybe something like: 也许像这样:

<!-- file: views/invoice/createstep2.php -->
<h1>Create Invoice: Step 2</h1>

<div class="form">

<?php
$form = $this->beginWidget('CActiveForm', array(
  'id'=>'invoice-form',
  'enableAjaxValidation'=>false,
  'action'=>array('invoice/create','step' => 2)
)); 
?>

  <?php echo $form->errorSummary($invoce); ?>
  <?php echo $form->errorSummary($customer); ?>

  <h2>Customer Details</h2>
  <div class="row">
    <?php echo $form->labelEx($customer,'email_address'); ?>
    <?php echo $form->textField($customer,'email_address', array('size'=>60,'maxlength'=>255)); ?>
    <?php echo $form->error($customer,'email_address'); ?>
  </div>

  <!-- If the customer already exists, these field should be pre-populated: -->

  <div class="row">
    <?php echo $form->labelEx($customer,'customer_name'); ?>
    <?php echo $form->textField($customer,'customer_name', array('size'=>60,'maxlength'=>255)); ?>
    <?php echo $form->error($customer,'customer_name'); ?>
  </div>

  <div class="row">
    <?php echo $form->labelEx($customer,'address'); ?>
    <?php echo $form->textField($customer,'address', array('size'=>60,'maxlength'=>255)); ?>
    <?php echo $form->error($customer,'address'); ?>
  </div>

  <div class="row">
    <?php echo $form->labelEx($customer,'city'); ?>
    <?php echo $form->textField($customer,'city', array('size'=>60,'maxlength'=>255)); ?>
    <?php echo $form->error($customer,'city'); ?>
  </div>

  <div class="row">
    <?php echo $form->labelEx($customer,'state'); ?>
    <?php echo $form->textField($customer,'state', array('size'=>60,'maxlength'=>255)); ?>
    <?php echo $form->error($customer,'state'); ?>
  </div>

  <div class="row">
    <?php echo $form->labelEx($customer,'postal_code'); ?>
    <?php echo $form->textField($customer,'postal_code', array('size'=>60,'maxlength'=>255)); ?>
    <?php echo $form->error($customer,'postal_code'); ?>
  </div>

  <div class="row">
    <?php echo $form->labelEx($customer,'description'); ?>
    <?php echo $form->textField($customer,'description', array('size'=>60,'maxlength'=>255)); ?>
    <?php echo $form->error($customer,'description'); ?>
  </div>


  <h2>Order Details</h2>

  <div class="row">
    <?php echo $form->labelEx($invoice,'invoice_title'); ?>
    <?php echo $form->textField($invoice,'invoice_title', array('size'=>60,'maxlength'=>255)); ?>
    <?php echo $form->error($invoice,'invoice_title'); ?>
  </div>

  <div class="row">
    <?php echo $form->labelEx($invoice,'order_no'); ?>
    <?php echo $form->textField($invoice,'order_no', array('size'=>60,'maxlength'=>255)); ?>
    <?php echo $form->error($invoice,'order_no'); ?>
  </div>

  <div class="row">
    <?php echo $form->labelEx($invoice,'invoice_issue_date'); ?>
    <?php $form->widget('zii.widgets.jui.CJuiDatePicker', array(
        'model'     => $invoice,
        'attribute' => 'invoice_issue_date',
        'value'     => $invoice->invoice_issue_date,
        'options'   => array(
          'showButtonPanel' => false,
          'changeYear'      => true,
          'dateFormat'      => 'yy-mm-dd',
        ),
      )); ?>
    <?php echo $form->error($invoice,'invoice_issue_date'); ?>
  </div>

  <div class="row">
    <?php echo $form->labelEx($invoice,'due_date'); ?>
    <?php $form->widget('zii.widgets.jui.CJuiDatePicker', array(
        'model'     => $invoice,
        'attribute' => 'due_date',
        'value'     => $invoice->due_date,
        'options'   => array(
          'showButtonPanel' => false,
          'changeYear'      => true,
          'dateFormat'      => 'yy-mm-dd',
        ),
      )); ?>
    <?php echo $form->error($invoice,'due_date'); ?>
  </div>

  <div class="row">
    <?php echo $form->labelEx($invoice,'description'); ?>
    <?php echo $form->textField($invoice,'description', array('size'=>60,'maxlength'=>255)); ?>
    <?php echo $form->error($invoice,'description'); ?>
  </div>


  <div class="row buttons">
    <?php echo CHtml::submitButton('Create'); ?>
  </div>

<?php $this->endWidget(); ?>

</div><!-- form -->

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM