1

私はYiiFrameworkで小さなアプリケーションを実行しています。そのため、私のデータベースは次のようなものです。

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

両方のモデルのすべての値を入力できるようにCustomer modelinをレンダリングしました。しかし、1つの問題があります。私が持っていた顧客名を持っていると仮定します。これで、に行くときに、次のように表示されます。私はそうする必要はありません。だから、これがYiiフレームワークでどのように達成できるか。どんな助けや提案も非常に高く評価されます。私が行ったコードの詳細は、必要に応じて共有できます。私を助けてください。私は完全にここで立ち往生しています。Invoice modelsingle Invoice formxyzsaved beforeagain fill the Customer name with xyzall 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 formre-enter all the fields again

4

3 に答える 3

1

誰もがすでに述べているようにこれを行うには、ajaxといくつかのjavascriptが必要です。ロジックは次のようなものです。

  1. 顧客名のドロップダウンで値が選択されたら、ajax呼び出しをトリガーして、そのユーザーに関する情報を取得します。これは、clientChangeの一部としてCHtmlの一部のhtml要素ヘルパーの追加のhtmlOptionとして利用できるajaxオプションを使用して簡単に実行できます。

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

    上記のajaxオプションのドキュメントは、jqueryのajaxドキュメントで確認できます。

  2. 次に、サーバー側で特定の顧客を見つけて、ブラウザーに応答を送信します。例:

    // 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. サーバー応答を受信したら、それぞれのフィールドに入力します。これは、ajaxのsuccess関数コールバックで実行できます。上記のコードでは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
        }
    ');
    

注:顧客は多くの請求書を持っている可能性があるため、顧客名を指定してどの請求書を選択するかが問題になります。それはあなたが処理しなければならないものです、私は私の答えがあなたを動かすのに十分なコードを持っていると思います。

入力フィールドIDを知るには、生成されたhtmlを確認するだけです。

于 2012-07-06T16:35:30.827 に答える
0

Yiiオートコンプリートウィジェットを確認しましたか?そして、AJAXの実装について心配する必要はありません。それはあなたのためにそれをします。

Yiiフレームワーク:CJuiオートコンプリート

このリンクのよりカスタマイズされたオートコンプリートソリューション。

Yiiフレームワーク:カスタムオートコンプリート表示と値の送信

于 2012-06-30T12:39:49.067 に答える
0

これは2段階で行うことができるため、次のようになります。

  1. email addressビューが最初に表示されるときに、顧客はまたはを求められますcustomer_name

  2. email addressフォームが送信されるコントローラーアクションは、送信されたまたはcustomer_name(以下の例で使用します)の顧客モデルからデータを取得しますemail_address。取得すると、利用可能な場合は顧客用に事前入力されたデータを含む単一の請求書フォームビューを表示できます。

この概念は、次のように実装できます。

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

必要に応じて、これを2つの個別のコントローラーアクションに分割できます。

ステップ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 -->

ステップ2のビューでは、すでに持っているもののように見える可能性があります。多分次のようなものです:

<!-- 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 -->
于 2012-07-01T07:18:12.853 に答える