0

我正在做一个小应用程序。为此,我有两个表,例如 sles 和 stores 销售表看起来像这样

============
  Sales
============
id
store_id


Stores
=============
id
store_name
store_location
store_code
description

我已经为这两个表完成了模型和 CRUD。在商店表中,我根据表输入了一些值。现在在销售控制器中,我已经呈现了销售和商店。所以在这里我的动作创建看起来像这样

public function actionCreate()
  {
    $model=new Sales;
    $stores = new Stores;

    // Uncomment the following line if AJAX validation is needed
    // $this->performAjaxValidation($model);

    if(isset($_POST['Sales'], $_POST['Stores']))
    {
      $model->attributes=$_POST['Sales'];
      $stores->attributes=$_POST['Stores'];
      $valid = $model->validate();
      $valid = $stores->validate();
      if($valid)
      {
        $stores->save(false);
        $model->store_id = $stores->getPrimaryKey();
        $model->save(false);
        $this->redirect(array('view','id'=>$model->id));
      }
    }

    $this->render('create',array(
      'model'=>$model,
      'stores'=>$stores,
    ));
  }

在 sales(_form.php) 中是这样的

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

  <div class="row">
    <?php echo $form->labelEx($stores,'store_location'); ?>
    <?php echo $form->textField($stores,'store_location',array('size'=>45,'maxlength'=>45)); ?>
    <?php echo $form->error($stores,'store_location'); ?>
  </div>

  <div class="row">
    <?php echo $form->labelEx($stores,'store_code'); ?>
    <?php echo $form->textField($stores,'store_code',array('size'=>45,'maxlength'=>45)); ?>
    <?php echo $form->error($stores,'store_code'); ?>
  </div>

现在,当我进行销售时,我希望当我通过输入键输入一个商店名称时,它将开始显示相关stores names的,store_location并且store_code将自动填充。现在有人可以告诉我该怎么做吗?任何帮助和建议都将不胜感激。非常感谢。

编辑只有一个字段可以自动完成 。但我希望所有其他相关字段也应该自动完成。

4

1 回答 1

0

首先是一些想法,然后是对您问题的一般性回答。

首先,一个小问题,您实际上只是在验证商店模型,因为您$valid在检查销售后立即重新分配。相反,验证逻辑应该更像这样:

$valid = $model->validate() && $stores->validate();

如果其中任何一个无效,它将返回 false。

其次,我认为这段代码不会做你想做的事。如果您根据现有数据自动完成商店信息并将其提交回创建操作,那么您的代码将尝试根据该信息创建一个全新的商店条目,从而在您的数据库中引入重复的商店。如果你总是同时创建一个全新的销售和一个全新的商店,这会起作用,但我很确定你不想要这样。

相反,为了简单起见,这应该是一个专门用于创建销售对象的操作。不要尝试创建新的商店对象,只需开始将详细信息自动填充到 HTMLspandiv标签中,而不是填写到表单字段中。唯一的表单字段将是商店 ID 字段,它将添加到您的销售对象以指示外键关系。

现在,为了在几个字段上进行自动填充,我将为您提供一个大纲并让您填写详细信息。您将需要在控制器中添加一个新操作,并在页面上使用一些 Javascript 来处理自动填充。

public function actionGetStoreDetails($id) {
    // Get the Store model associated with $id
    // Create a JSON object based on this model. Hint, check out CJSON::encode()
    // Return the result of the above function call.
}

现在,您将在视图页面上有一段 Javascript,它执行以下操作,使用 jQuery 作为示例,因为它已经在 Yii 中了。

$(function () {
    $('your-store-id-field-html-id-here').keyup(function () {
        // Get the current value of the form field
        // Make a $.get() request to the new action defined above, passing the ID
        // In the callback function, you'll get a JSON object
        // Take the elements of the JSON object, like store.store_name, and assign them to <span id="store_name"></span> type fields in your HTML.
    });
});

我意识到这不是复制粘贴代码,但我希望它能给你一个很好的启动板。如果您花时间填写空白并弄清楚如何完全做到这一点,您将学到很多东西。

于 2013-07-16T20:44:30.587 回答