我正在做一个小应用程序。为此,我有两个像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 names
和store_location
以及store_code
将自动填充。现在有人可以告诉我该怎么做吗?任何帮助和建议都会很明显。非常感谢。
修改 使用this,只有一个字段可以自动完成。但我希望所有其他相关字段也应该自动完成。
答案 0 :(得分:0)
首先考虑一些问题,然后对您的问题进行一般性回答。
首先,一个小小的问题,您实际上只是验证商店模型,因为您在检查销售后立即重新分配$valid
。相反,验证逻辑应该是更像这样的东西:
$valid = $model->validate() && $stores->validate();
如果其中一个无效,则返回false。
其次,我认为这段代码不会按照你的意愿去做。如果您根据现有数据自动填充商店信息并将其提交回Create操作,那么您的代码将尝试根据该信息创建一个全新的商店条目,在您的数据库中引入重复商店。如果你总是在同一时间创建一个全新的销售和一个全新的商店,这将有效,但我很确定你不希望这样。
相反,为了简单起见,这应该是专门用于创建销售对象的操作。不要尝试创建新的商店对象,只需开始将详细信息自动填充到HTML span
或div
标记中,而不是表单字段中。唯一的表单字段将是作为商店标识的字段,该字段将添加到您的销售对象以指示外键关系。
现在,要在几个字段上进行自动填充,我将为您提供一个大纲,让您填写详细信息。您将需要在控制器中执行新操作,并在页面上使用一些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.
});
});
我意识到这不是复制粘贴代码,但我希望它能给你一个非常好的启动板。如果你花时间填补空白并弄清楚如何完全做到这一点,你将学到很多。