Yii自动填充相关值

时间:2013-07-16 08:48:07

标签: php yii yii-extensions

我正在做一个小应用程序。为此,我有两个像sles和商店的桌子 销售表看起来像这样

============
  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,
    ));
  }

和销售(_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 namesstore_location以及store_code将自动填充。现在有人可以告诉我该怎么做吗?任何帮助和建议都会很明显。非常感谢。

修改 使用this,只有一个字段可以自动完成。但我希望所有其他相关字段也应该自动完成。

1 个答案:

答案 0 :(得分:0)

首先考虑一些问题,然后对您的问题进行一般性回答。

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

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

如果其中一个无效,则返回false。

其次,我认为这段代码不会按照你的意愿去做。如果您根据现有数据自动填充商店信息并将其提交回Create操作,那么您的代码将尝试根据该信息创建一个全新的商店条目,在您的数据库中引入重复商店。如果你总是在同一时间创建一个全新的销售和一个全新的商店,这将有效,但我很确定你不希望这样。

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

现在,要在几个字段上进行自动填充,我将为您提供一个大纲,让您填写详细信息。您将需要在控制器中执行新操作,并在页面上使用一些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.
    });
});

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