<div class="create-job-form">
<?php
Modal::begin([
'header' => '<h4>Job Created</h4>',
'id' => 'jobPop',
'size' => 'modal-lg',
]);
echo "<div id='modalContent'></div>";
Modal::end();
?>
<table width="5">
<?php $form = ActiveForm::begin(); ?>
<fieldset>
<legend>Order Details</legend>
<td>
<tr> <?= Html::activeHiddenInput($model, 'job_code', ['value' => rand(1, 10000)]) ?> </tr>
</td>
<td>
<tr><?= $form->field($model, 'job_description')->textInput(['maxlength' => true]) ?></tr>
</td>
<td>
<tr>
<?= $form->field($model, 'approved_date')->widget(
DatePicker::className(), [
// inline too, not bad
'inline' => true,
// modify template for custom rendering
'template' => '{input}',
'clientOptions' => [
'autoclose' => false,
'format' => 'dd-M-yyyy'
]
]); ?>
</tr>
</td>
<td>
<tr><?= $form->field($model, 'estimated_time')->dropDownList(['24hrs' => '24 Hours', '48hrs' => '48 Hours', '2-3d' => '2-3 Days', '3-4d' => '3-4 Days', '4-5d' => '4-5 Days', '5-6d' => '5-6 Days'], ['prompt' => 'Select Time']) ?></tr>
</td>
</fieldset>
</table>
<div class="form-group">
<?= Html::submitButton($model->isNewRecord ? 'Create' : 'Update', ['class' => $model->isNewRecord ? 'btn btn-success' : 'btn btn-primary', 'id' => 'jobPop']) ?>
</div>
<?php ActiveForm::end(); ?>
</div>
<?php
$script = <<< JS
$(function() {
$('#jobPop').click(function () {
$('#modal').modal('show')
.find('#modalContent')
.load($(this).attr('value'));
});
});
JS;
$this->registerJs($script);
?>
This is my form, I'm trying to get Modal when click on create button, so that View will be on Modal. what i'm doing wrong?
I need on form submit Modal should pop up and ask user Job has created do you want to send this information to client if user click yes then sms and email with above details should be send to client if user says no it should return to edit mode and the created job code should be flushed
How to achieve this in Yii2?
Ideal Situation:
have the modal in your layout file.
yii\bootstrap\Modal::begin([
'headerOptions' => ['id' => 'modalHeader'],
'id' => 'modal',
'size' => 'modal-lg',
'closeButton' => [
'id'=>'close-button',
'class'=>'close',
'data-dismiss' =>'modal',
],
//keeps from closing modal with esc key or by clicking out of the modal.
// user must click cancel or X to close
'clientOptions' => ['backdrop' => false, 'keyboard' => true]
]);
echo "<div id='modalContent'><div style='text-align:center'>"
. Html::img('#web/img/radio.gif')
. "</div></div>";
yii\bootstrap\Modal::end();
Add have a js file - with js code to load modal -
$(function() {
$(document).on('click', '.showModalButton', function() {
if ($('#modal').hasClass('in')) {
$('#modal').find('#modalContent')
.load($(this).attr('value'));
document.getElementById('modalHeader').innerHTML = '<h4>' + $(this).attr('title') + '</h4>';
} else {
$('#modal').modal('show')
.find('#modalContent')
.load($(this).attr('value'));
document.getElementById('modalHeader').innerHTML = '<h4>' + $(this).attr('title') + '</h4>';
}
});
});
Include the js file in your application. assets/AppAsset.php :
public $js = ['js/ajax-modal-popup.js'];
Add the the css class: 'showModalButton' to all buttons that content in the modal.
...
'class'=>'btn showModalButton',
...
Modify you controller action to render content via ajax if request was done via ajax:
if(Yii::$app->request->isAjax) {
return $this->renderAjax('your-view-file', [
'model' => $model,
]);
}
Change Modal id from jobPop to modal.
e.g.
<?php
Modal::begin([
'header'=>'<h4>Job Created</h4>',
'id'=>'modal',
'size'=>'modal-lg',
]);
echo "<div id='modalContent'></div>";
Modal::end();
?>
Bootsrap 4: https://www.yiiframework.com/extension/yiisoft/yii2-bootstrap4/doc/api/2.0/yii-bootstrap4-modal
Modal::begin([
'title' => 'Hello world',
'toggleButton' => ['label' => 'click me'],
]);
echo 'Say hello...';
Modal::end();
Related
I try enable payment gateway Przelewy24 with Omnipay library for Codeigniter 3.
For this I install via composer both libraries.
Library:
https://github.com/mysiar-org/omnipay-przelewy24v1
and
https://github.com/thephpleague/omnipay
Then I create controller
Cart_contoller.php I add function
use Omnipay\Omnipay;
/**
* Payment with Przelewy24
*/
public function przelewy24_payment_post()
{
$przelewy24 = get_payment_gateway('przelewy24');
if (empty($przelewy24)) {
$this->session->set_flashdata('error', "Payment method not found!");
echo json_encode([
'result' => 0
]);
exit();
}
/** #var \Omnipay\Przelewy24\Gateway $gateway */
$gateway = Omnipay::create('Przelewy24');
$gateway->initialize([
'merchantId' => 'xxxx',
'posId' => 'xxxx',
'crc' => 'xxxxxxxxxxxx',
'testMode' => true,
]);
$params = array(
'sessionId' => 2327398739,
'amount' => 12.34,
'currency' => 'PLN',
'description' => 'Payment test',
'returnUrl' => 'www.xxxxxx',
'notifyUrl' => 'www.xxxxxxxxxxx',
'card' => array(
'email' => 'info#example.com',
'name' => 'My name',
'country' => 'PL',
),
);
$response = $gateway->purchase($params)->send();
if ($response->isSuccessful()) {
$response->redirect();
} else {
echo 'Failed';
}
}
in view page I add:
<?php echo form_open('cart_controller/przelewy24_payment_post'); ?>
<div class="payment-icons-container">
<label class="payment-icons">
<?php $logos = #explode(',', $payment_gateway->logos);
if (!empty($logos) && item_count($logos) > 0):
foreach ($logos as $logo): ?>
<img src="<?php echo base_url(); ?>assets/img/payment/<?= html_escape(trim($logo)); ?>.svg" alt="<?= html_escape(trim($logo)); ?>">
<?php endforeach;
endif; ?>
</label>
</div>
<button id="submit" class="btn btn-primary" id="card-button">
<span class="spinner-border spinner-border-sm" role="status" aria-hidden="true"></span>
<?= trans("pay"); ?> <?= price_formatted($total_amount, $currency); ?>
</button>
<?php echo form_close(); ?><!-- form end -->
On button submit I get:
Type: Omnipay\Common\Exception\InvalidRequestException
Message: The email parameter is required
What I do wrong? Can anyone help me with this code how to correct integrate this gateway?
I am creating a form with dynamic fields in which 2 fields have unique indexes in the database table. 1st 'Landline' and 2nd 'Address'. If there is no duplicate value in any of the dynamically added fields then the form submits without any error, but if I enter Address or Landline which matches any previously added field then shows constraint violation instead of showing error message even when I have already added rules in the model.
For example: I have 1 record with address = 'address', landline = 123 and I create a new record with the address = 'address' or landline = 123 then there is no error but when I submit it shows:
Exception (Integrity constraint violation) 'yii\db\IntegrityException' with message 'SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '15-address' for key 'unique_doctors_id__address'
If I remove the indexes from the table then data saves successfully.
I have tried to submit this normally and via ajax but same problem every time, my main interest is submitting the form via ajax.
I already have googled for this issue, but couldn't find any solution, please help.
model/DoctorClinics
class DoctorClinics extends \yii\db\ActiveRecord
{
public function rules()
{
return [
[['name', 'incharge', 'landline', 'address'], 'required', 'message' => "'{attribute}' can not be empty."],
[['name', 'incharge', 'address', 'landline', 'landmark'], 'string', 'max' => 255],
['status', 'required', 'message' => "'{attribute}' can not be unselected"],
['status', 'in', 'range' => Common::get_array('range_active_inactive'), 'message' => "'{attribute}' has an invalid value"],
['status', 'string', 'max' => 1],
[['doctors_id', 'landline'], 'unique', 'targetAttribute' => ['doctors_id', 'landline'], 'message' => 'The combination of Doctors and Landline has already been taken.'],
[['doctors_id', 'address'], 'unique', 'targetAttribute' => ['doctors_id', 'address'], 'message' => 'The combination of Doctors ID and Address has already been taken.'],
[['token'], 'string', 'max' => 50],
[['token'], 'unique'],
[['doctors_id'], 'exist', 'skipOnError' => true, 'targetClass' => Doctors::className(), 'targetAttribute' => ['doctors_id' => 'id']],
[['doctors_id', 'created_at', 'updated_at'], 'integer'],
];
}
public static function createMultiple($modelClass, $multipleModels = [])
{
$model = new $modelClass;
$formName = $model->formName();
$post = Yii::$app->request->post($formName);
$models = [];
if (! empty($multipleModels))
{
$keys = array_keys(ArrayHelper::map($multipleModels, 'id', 'id'));
$multipleModels = array_combine($keys, $multipleModels);
}
if ($post && is_array($post))
{
foreach ($post as $i => $item)
{
if (isset($item['id']) && !empty($item['id']) && isset($multipleModels[$item['id']]))
{
$models[] = $multipleModels[$item['id']];
}
else
{
$models[] = new $modelClass;
}
}
}
unset($model, $formName, $post);
return $models;
}
}
controller
class DoctorsController extends Controller
{
...
public function actionCreate()
{
# models
$modelDoctors = new Doctors();
$modelDoctorClinics = [new DoctorClinics];
# scenario
$modelDoctors->scenario = Doctors::SCENARIO_CREATE;
$transaction = Yii::$app->db->beginTransaction();
# checking post method
if(($arrayPost = \Yii::$app->request->post()) != null)
{
$modelDoctorClinics = DoctorClinics::createMultiple(DoctorClinics::classname());
// $modelDoctorClinics->scenario = Doctors::SCENARIO_CREATE;
DoctorClinics::loadMultiple($modelDoctorClinics, Yii::$app->request->post());
# loading posted data to model
$modelDoctors->load($arrayPost);
# setting data
$modelDoctors->token = Common::generate_token();
$modelDoctors->added_by = \Yii::$app->user->identity->id;
$modelDoctors->auth_key = \Yii::$app->security->generateRandomString();
$modelDoctors->password_hash = \Yii::$app->security->generatePasswordHash(Common::DEFAULT_PASSWORD);
$modelDoctors->created_at = time();
# validate all models
$valid = $modelDoctors->validate();
$valid = DoctorClinics::validateMultiple($modelDoctorClinics) && $valid;
if($valid)
{
try
{
if ($flag = $modelDoctors->save(false))
{
foreach ($modelDoctorClinics as $modelDoctorClinic)
{
$modelDoctorClinic->token = Common::generate_token();
$modelDoctorClinic->doctors_id = $modelDoctors->id;
$flag = $modelDoctorClinic->save(false) && $flag;
if(!$flag)
{
$transaction->rollBack();
break;
}
}
}
if ($flag)
{
$transaction->commit();
Yii::$app->session->setFlash('success', 'Doctor\'s details saved successfully');
# setting response format
\Yii::$app->response->format = Response::FORMAT_JSON;
return true;
}
}
catch (Exception $e)
{
$transaction->rollBack();
Yii::$app->response->format = Response::FORMAT_JSON;
return ArrayHelper::merge(
ActiveForm::validateMultiple($modelDoctorClinics),
ActiveForm::validate($modelDoctors)
);
}
}
else
{
Yii::$app->response->format = Response::FORMAT_JSON;
return ArrayHelper::merge(
ActiveForm::validateMultiple($modelDoctorClinics),
ActiveForm::validate($modelDoctors)
);
}
}
else
{
# returning data
return $this->render('create', [
'model_doctors' => $modelDoctors,
'model_doctor_clinics' => (empty($modelDoctorClinics)) ? [new DoctorClinics] : $modelDoctorClinics
]);
}
}
public function actionValidations($scenario)
{
# fetching posted data
$arrayPost = \Yii::$app->request->post();
# models
if(empty($scenario) || !in_array($scenario, [Doctors::SCENARIO_CREATE, Doctors::SCENARIO_UPDATE]))
{
$modelDoctors = new Doctors(['scenario' => Doctors::SCENARIO_CREATE]);
}
else
{
if($scenario == Doctors::SCENARIO_UPDATE)
{
$modelDoctors = Doctors::find()
->where(['token' => $arrayPost['Doctors']['token']])
->one();
}
else
{
$modelDoctors = new Doctors();
}
# scenario
$modelDoctors->scenario = $scenario;
}
if(!empty($arrayPost) && \Yii::$app->request->isAjax)
{
# setting response format
\Yii::$app->response->format = Response::FORMAT_JSON;
# loading posted data to model
$modelDoctors->load($arrayPost);
return ActiveForm::validate($modelDoctors);
}
}
...
}
form
<?php
$form = ActiveForm::begin([
"enableAjaxValidation" => true,
"validateOnSubmit" => true,
'validationUrl' => \Yii::$app->urlManager->createUrl('doctors-validation/' . (($model_doctors->isNewRecord) ? 'create' : 'update')),
'options' => [
'id' => $model_doctors->formName(),
'class' => 'forms'
]
]);
?>
<div class="boxBody">
<div class="row form-page-image">
<div class="image mb10">
<div class="col-sm-12 thumbnail">
<?php
if(!empty($model_doctors->image) && file_exists(\Yii::getAlias('#uploads') . "/{$model_doctors->image}"))
{
echo Html::img(\Yii::$app->urlManagerFrontend->createUrl('/thumbnails') . '/' . $model_doctors->image, [
'alt' => $this->title,
'class' => 'js-thumbnail'
]);
}
else
{
echo Html::img(\Yii::$app->urlManager->createUrl('/images') . '/' . Yii::getAlias('#staff-no-image'), [
'alt' => $this->title,
'class' => 'js-thumbnail'
]);
}
?>
<div class="button-section">
<?php
echo Html::a('<i class="'. Common::ICON_IMAGE .'"></i> ' . Yii::t('app', 'Picture'), [
'images/upload-avatar',
'token' => $model_doctors->token
], [
'class' => "js-popup buttons tiny " . Common::LINK_IMAGE
]);
?>
</div>
</div>
</div>
<div class="image-form">
<div class="col-sm-12">
<div class="row">
<div class="col-xs-12 col-sm-6">
<?php
echo $form
->field($model_doctors, 'first_name')
->textInput([
'autofocus' => true,
'maxlength' => true
])
?>
</div>
<div class="col-xs-12 col-sm-6">
<?php
echo $form
->field($model_doctors, 'last_name')
->textInput([
'maxlength' => true
])
?>
</div>
</div>
<div class="row">
<div class="col-xs-12 col-sm-6">
<?php
echo $form
->field($model_doctors, 'email')
->textInput([
'maxlength' => true
])
?>
</div>
<div class="col-xs-12 col-sm-6 selectBox">
<?php
echo $form
->field($model_doctors, 'status')
->dropDownList(Common::get_array('active_inactive'), [
'prompt' => '- Status -'
])
?>
</div>
</div>
</div>
</div>
</div>
<div class="section">
<h3 class="heading">Residence Details</h3>
<div class="res-details">
<div class="col-sm-9">
<?php
echo $form
->field($model_doctors, 'residence_address')
->textArea(['maxlength' => true]);
?>
</div>
<div class="col-sm-3">
<?php
echo $form
->field($model_doctors, 'residence_telephone')
->textInput(['maxlength' => true]);
?>
</div>
<div class="col-sm-3">
<?php
echo $form
->field($model_doctors, 'mobile')
->textInput(['maxlength' => true])
?>
</div>
</div>
</div>
<div class="section">
<?php
DynamicFormWidget::begin([
'widgetContainer' => 'jsDoctorsClinics', // required: only alphanumeric characters plus "_" [A-Za-z0-9_]
'widgetBody' => '.clinics-container', // required: css class selector
'widgetItem' => '.js-clinic-clonable', // required: css class
// 'insertPosition' => 'top',
'limit' => 5, // the maximum times, an element can be cloned (default 999)
'min' => 1, // 0 or 1 (default 1)
'insertButton' => '.clinic-add-item', // css class
'deleteButton' => '.clinic-remove-item', // css class
'model' => $model_doctor_clinics[0],
'formId' => $model_doctors->formName(),
'formFields' => [
'name',
'incharge',
'address',
'landline',
'landmark',
'status'
]
]);
?>
<h3 class="heading">Clinics (max. 5)</h3>
<div class="doctor-clinics">
<div class="clinics-container">
<?php
foreach ($model_doctor_clinics as $i => $clinic)
{
?><div class="col-sm-12 clinic js-clinic-clonable clonable">
<div class="row">
<div class="col-md-8 col-sm-12">
<?php
// necessary for update action.
if(!$clinic->isNewRecord)
{
echo Html::activeHiddenInput($clinic, "[{$i}]id");
}
echo $form
->field($clinic, "[{$i}]name")
->textInput(['maxlength' => true]);
?>
</div>
<div class="col-md-4 col-sm-12">
<?php
echo $form
->field($clinic, "[{$i}]incharge")
->textInput(['maxlength' => true]);
?>
</div>
</div>
<div class="row">
<div class="col-sm-8">
<?php
echo $form
->field($clinic, "[{$i}]address")
->textArea(['maxlength' => true]);
?>
</div>
<div class="col-sm-4">
<?php
echo $form
->field($clinic, "[{$i}]landline")
->textInput(['maxlength' => true]);
?>
</div>
<div class="col-sm-4">
<?php
echo $form
->field($clinic, "[{$i}]landmark")
->textInput(['maxlength' => true])
?>
</div>
</div>
<div class="row">
<div class="col-sm-4 selectBox">
<?php
echo $form
->field($clinic, "[{$i}]status")
->dropdownList(Common::get_array("active_inactive"), [ 'prompt' => ' - Select - ' ])
?>
</div>
<div class="col-sm-4 col-sm-offset-4">
<div class="form-group">
<label class="hidden-480 control-label"> </label>
<button type="button" class="clinic-remove-item width-100 buttons <?php echo Common::LINK_CLOSE; ?>"<?php
if($clinic->isNewRecord || (!$clinic->isNewRecord && (count($model_doctor_clinics) > 1) && ($i == 0)))
{
echo ' style="display: none;"';
}
?>><i class="<?php echo Common::ICON_DELETE; ?>"></i> Delete</button>
</div>
</div>
</div>
</div>
<?php
}
?>
</div>
<div class="col-sm-12 mt-auto mb-auto js-clinic-add-more">
<div class="form-group col-md-4 col-md-offset-4 mb0">
<i class="<?php echo Common::ICON_ADD; ?>"></i> Add more clinics
</div>
</div>
</div>
<?php DynamicFormWidget::end(); ?>
</div>
</div>
<div class="boxFooter">
<?php
if(!$model_doctors->isNewRecord)
{
echo $form
->field($model_doctors, 'token', [
'options' => [ 'tag' => false ]
])->hiddenInput([
'readonly' => 'readonly'
])->label(false);
}
else
{
echo $form
->field($model_doctors, 'token', [
'options' => [ 'tag' => false ]
])->hiddenInput([
'value' => Common::generate_token()
])->label(false);
}
echo $form
->field($model_doctors, 'uploaded_files', [
'options' => [ 'tag' => false ]
])->hiddenInput([
'readonly' => 'readonly'
])->label(false);
echo $form
->field($model_doctors, 'password_hash', [
'options' => [ 'tag' => false ]
])->hiddenInput([
'readonly' => 'readonly',
'value' => Common::generate_token()
])->label(false);
echo $form
->field($model_doctors, 'auth_key', [
'options' => [ 'tag' => false ]
])->hiddenInput([
'readonly' => 'readonly',
'value' => Common::generate_token()
])->label(false);
?>
<?php
echo Html::submitButton('<i class="' . Common::ICON_SUBMIT . '"></i> ' . Yii::t('app', 'Submit'), [
'class' => 'buttons mini default pull-right'
])
?>
<?php
echo Html::button('<i class="' . Common::ICON_CLOSE . '"></i> ' . Yii::t('app', 'Cancel'), [
'class' => 'js-cancel buttons mini pull-left ' . Common::LINK_CLOSE
])
?>
</div>
<?php ActiveForm::end(); ?>
I think that $model->save(false) skip unique index validation.
when I use the kartik\date\DatePicker within Modal,but it's report error that like https://******.com/assets/d9620747/css/bootstrap-datepicker3.css.map Failed to load resource: the server responded with a status of 404 (Not Found).plz help me;
My Controller's code:
public function actionBook($id = null)
{
$ticket = $this->findModel($id);
$model = new TicketOrder();
if (Yii::$app->request->isPost && $model->load(Yii::$app->request->post())) {
// userCreate scenario
$model->scenario = 'create';
} else {
return $this->renderAjax('book', [
'ticket' => $ticket,
'model' => $model,
]);
}
}
My View's code:
<?php
Modal::begin([
'id' => 'create-modal',
'header' => '<h4 class="modal-title">订票</h4>',
'size' => 'modal-lg',
// 'footer' => 'Close',
]);
Modal::end();
?>
<?php
$js = <<<JS
$(function(){
$(".modal-wraper").click(function(){
var id = $(this).attr('data-id');
var url = "/sights/product-ticket/book?id=" + id;
$.get(url,{},function(data){
$(".modal-body").html(data);
});
$('#create-modal').on('shown.bs.modal', function(){
$('[data-toggle="popover"]').popover();
});
$("#create-modal").modal('show');
});
});
JS;
$this->registerJs($js);
My ajaxRender view's code:
<?php
use kartik\form\ActiveForm;
use kartik\date\DatePicker;
?>
<h3>由于资源方过多,建议一个手机号只购买一张票。</h3>
<?php
$form = ActiveForm::begin([
'type' => ActiveForm::TYPE_HORIZONTAL,
]);
?>
<?= $form->field($model, 'fullname')->textInput() ?>
<?= $form->field($model, 'mobile')->textInput() ?>
<?= $form->field($model, 'plantime')->widget(DatePicker::className(), [
'type' => DatePicker::TYPE_COMPONENT_APPEND,
]) ?>
<?= $form->field($model, 'comment')->textarea() ?>
<div class="button-group">
<?= \yii\helpers\Html::a('关闭', ['#'], ['class' => "btn btn-primary", 'data-dismiss' => "modal"]) ?>
<?= \yii\helpers\Html::button('购买', ['class' => 'btn btn-success pull-right', 'type' => 'submit']) ?>
</div>
<?php
$form->end();
?>
Like this:
image
I got error when I click the DatePicker Button.
[Error] Failed to load resource: the server responded with a status of 404 (Not Found) (bootstrap-datepicker3.css.map, line 0)
This issue has been already resolved. See it on GitHub.
Upgrade datepicker to version 1.4.2.
Problem: I want to update GridView in pjax style but it redirect to the form creation page.
What the code below does:
Having an index page with GridView to display data list and open a form in a modal window to create new record. The form code is added into the modal dynamically.
When click on "Create Country" button on index page, it calls country/create to get the HTML code of the form and insert it into the modal, then it shows the modal window.
When click on the "Create" button on the form, it submit the form to country/create. This will return the HTML code of the index page, and I want it to update the GridView part, but it does not.
The code:
Controller CountryController.php
class CountryController extends Controller
{
public function actionIndex()
{
return $this->renderIndex();
}
public function actionCreate()
{
$model = new Country();
if ($model->load(Yii::$app->request->post()) && $model->save()) {
return $this->renderIndex();
} else {
return $this->renderAjax('_form', [
'model' => $model,
]);
}
}
private function renderIndex()
{
$searchModel = new CountrySearch();
$dataProvider = $searchModel->search(Yii::$app->request->queryParams);
return $this->render('index', [
'searchModel' => $searchModel,
'dataProvider' => $dataProvider,
]);
}
}
View index.php
<?php
use yii\helpers\Html;
use yii\grid\GridView;
use yii\widgets\Pjax;
use yii\web\View;
$this->title = Yii::t('app', 'Countries');
$this->params['breadcrumbs'][] = $this->title;
yii\bootstrap\Modal::begin(['id' => 'modal']);
yii\bootstrap\Modal::end();
?>
<div class="country-index">
<h1><?= Html::encode($this->title) ?></h1>
<div>Current Time: <?= date('Y/m/d H:i:s') ?></div>
<p><?= Html::a(Yii::t('app', 'Create Country'),
['create'],
['class' => 'btn btn-success show-modal']) ?>
</p>
<?php Pjax::begin(['id' => 'pjax-grid']); ?>
<?= GridView::widget([
'dataProvider' => $dataProvider,
'filterModel' => $searchModel,
'columns' => [
['class' => 'yii\grid\SerialColumn'],
'id',
'name',
['class' => 'yii\grid\ActionColumn'],
],
]); ?>
<?php Pjax::end(); ?>
</div>
<?php
$this->registerJs("$(function() {
$('.show-modal').click(function(e) {
e.preventDefault();
$('#modal').modal('show').find('.modal-body')
.load($(this).attr('href'));
});
});", View::POS_READY, '.show-modal');
?>
View _form.php
<?php
use yii\helpers\Html;
use yii\widgets\ActiveForm;
use yii\web\View;
?>
<?php
$this->registerJs(
'$("document").ready(function(){
$("#pjax-create").on("pjax:end", function() {
$.pjax.reload({container:"#pjax-grid"}); //Reload GridView
});
});'
, View::POS_READY, 'pjax-create-end');
?>
<div class="country-form">
<?php yii\widgets\Pjax::begin(['id' => 'pjax-create']) ?>
<?php $form = ActiveForm::begin(['options' => ['data-pjax' => TRUE]]); ?>
<?= $form->field($model, 'name')->textInput(['maxlength' => true]) ?>
<div class="form-group">
<?= Html::submitButton($model->isNewRecord ? Yii::t('app', 'Create') : Yii::t('app', 'Update'), ['class' => $model->isNewRecord ? 'btn btn-success' : 'btn btn-primary']) ?>
</div>
<?php ActiveForm::end(); ?>
<?php yii\widgets\Pjax::end() ?>
</div>
Use Html::button instead Html::a and simple overwrite the content of the modal:
yii\bootstrap\Modal::begin(['id' => 'modal']);
echo '<div id="modal-content"></div>';
yii\bootstrap\Modal::end();
echo Html::button('Create Country', [
'onClick' => 'createCountry("' . Url::to([create]) . '")',
'class' => 'btn btn-primary'
]);
$script = <<< JS
function createCountry(url) {
$('#modal').modal('show').find('#modal-content').load(url);
}
JS
$this->registerJs($script, View::POS_END);
I've created form using modal. The problem is button "Create" in views/index.php. Proccess testing paging & searching successfully, but after that when I to click button "created" in views/index.php. Form create with modal not display, I don't know why.
Code in controller
public function actionCreate()
{
$model = new Donatur();
if ($model->load(Yii::$app->request->post()) && $model->save()) {
Yii::$app->session->setFlash('success', 'Data berhasil disimpan!');
return $this->redirect(['index']);
return $this->refresh();
} else {
if (Yii::$app->request->isAjax) {
return $this->renderAjax('create', ['model' => $model]);
}
else{
return $this->render('create', ['model' => $model]);
}
}
}
Code in views/index.php
<?php \yii\widgets\Pjax::begin(['timeout' => false, 'id' => 'pjax-gridview']); ?>
<?php
use yii\helpers\Html;
use yii\grid\GridView;
use yii\widgets\Pjax;
use yii\bootstrap\Modal;
use yii\helpers\Url;
/* #var $this yii\web\View */
/* #var $searchModel app\models\SearchDonatur */
/* #var $dataProvider yii\data\ActiveDataProvider */
$this->title = 'Data Donatur';
?>
<?php if (Yii::$app->session->hasFlash('success')): ?>
<div class="alert alert-success alert-dismissable">
<button aria-hidden="true" data-dismiss="alert" class="close" type="button">×</button>
<h4><i class="icon fa fa-check"></i>Informasi!</h4>
<?= Yii::$app->session->getFlash('success') ?>
</div>
<?php endif; ?>
<?php if (Yii::$app->session->hasFlash('delete')): ?>
<div class="alert alert-success alert-dismissable">
<button aria-hidden="true" data-dismiss="alert" class="close" type="button">×</button>
<h4><i class="icon fa fa-check"></i>Informasi!</h4>
<?= Yii::$app->session->getFlash('delete') ?>
</div>
<?php endif; ?>
<div class="donatur-index">
<?php Pjax::begin(['timeout'=>false,'id'=>'pjax-gridview']); ?>
<h1><?= Html::encode($this->title) ?></h1>
<?php // echo $this->render('_search', ['model' => $searchModel]); ?>
<p>
<?= Html::button('Tambah Donatur', ['value'=>Url::to('create'),'class' => 'btn btn-success','id'=>'modalButton']) ?>
</p>
<?= GridView::widget([
'dataProvider' => $dataProvider,
'filterModel' => $searchModel,
'emptyCell'=>'-',
'summary'=>'',
'columns' => [
//['class' => 'yii\grid\SerialColumn'],
[
'attribute'=>'kode_donatur',
'value'=>'kode_donatur',
'contentOptions'=>['style'=>'width: 200px;']
],
[
'attribute'=>'nama_donatur',
'value'=>'nama_donatur',
'contentOptions'=>['style'=>'width: 250px;']
],
[
'attribute'=>'alamat',
'value'=>'alamat',
'contentOptions'=>['style'=>'width: 350px;']
],
[
'attribute'=>'telepon',
'value'=>'telepon',
'contentOptions'=>['style'=>'width: 290px;']
],
[
'class' => \yii\grid\ActionColumn::className(),
'header' => 'Aksi',
'template' => '{update} {delete}',
'buttons' => [
'update' => function($url, $model) {
$icon = '<span class="glyphicon glyphicon-pencil"></span>';
return Html::a($icon, $url,[
'data-toggle' => "modal",
'data-target' => "#donaturModal",
]);
},
'delete' => function($url, $model) {
$icon = '<span class="glyphicon glyphicon-trash"></span>';
return Html::a($icon, $url,
[
'data-confirm' => "Apakah yakin dihapus ?",
'data-method' => 'post',
]);
},
]
],
],
]); ?>
<?php \yii\widgets\Pjax::end() ?>
<?php Pjax::end(); ?>
</div>
<?php
// for modal update
Modal::begin([
'id' => 'donaturModal',
'header' => '<h1 align="center">Ubah Data Donatur</h1>',
]);
Pjax::begin(['id'=>'pjax-modal', 'timeout'=>false,
'enablePushState'=>false,
'enableReplaceState'=>false,]);
Pjax::end();
Modal::end();
?>
<?php
// for modal update
$this->registerJs('
$("#donaturModal").on("shown.bs.modal", function (event) {
var button = $(event.relatedTarget)
var href = button.attr("href")
$.pjax.reload("#pjax-modal", {
"timeout":false,
"url":href,
"replace":false,
});
})
');
?>
<?php
// for modal create
Modal::begin([
'header' => '<h1 align="center">Tambah Donatur</h1>',
'id' => 'modal',
]);
echo "<div id='modalContent'><div>";
Modal::end()
?>
<?php
// for modal create
Modal::begin([
'id' => 'modal',
'header' => '<h1 align="center">Ubah Data Donatur</h1>',
]);
Pjax::begin(['id'=>'pjax-modal', 'timeout'=>false,
'enablePushState'=>false,
'enableReplaceState'=>false,]);
Pjax::end();
Modal::end();
?>
<?php
// for modal create
$this->registerJs('
$("#modal").on("shown.bs.modal", function (event) {
var button = $(event.relatedTarget)
var href = button.attr("href")
$.pjax.reload("#pjax-modal", {
"timeout":false,
"url":href,
"replace":false,
});
})
');
?>
Code in views/create.php
<?php
use yii\helpers\Html;
use yii\bootstrap\ActiveForm;
use yii\widgets\Pjax;
use yii\bootstrap\Modal;
use yii\helpers\Url;
use yii\db\ActiveRecord;
/* #var $this yii\web\View */
/* #var $model app\models\Donatur */
?>
<h2 align="center">Form Donatur</h2>
<?php
echo " ";
echo " ";
?>
<?php $form = ActiveForm::begin([
'layout' => 'horizontal',
'enableAjaxValidation' => false,
'id' => 'create-form',
]); ?>
<?= $form->field($model, 'kode_donatur')->textInput(['readonly' => true, 'style'=>'width:100px']) ?>
<?= $form->field($model, 'nama_donatur')->textInput(['style'=>'width:350px']) ?>
<?= $form->field($model, 'alamat')->textArea(['rows' => 3, 'style'=>'width:350px']) ?>
<?= $form->field($model, 'telepon')->textInput(['style'=>'width:350px']) ?>
<div class="form-group">
<div class="col-sm-offset-4">
<?= Html::submitButton('Simpan', ['class'=> 'btn btn-primary']) ?>
<?php
echo " ";
echo " ";
echo Html::a('Keluar', ['index'],[
'class'=>'btn btn-success',
'onclick' =>'$("#modal").modal("hide");
return false;'
]);
?>
</div>
</div>
<?php ActiveForm::end();?>
The before I created form created with modal follow this link : click
I think problem with button handler.
Probably you forgot to add handler:
$(function(){
$('#modalButton').click(function(){ ... });
})