Here I have Two independent dropdowns : "Sub company " and " Role" and there is a third dropdown which depends on these two dropdowns. basically what I want to implement is if the chosen "Role" is NOT 'manager' and 'admin', then displays third dropdown "manager", which its options depends on sub company .
Right now I am able to get all the managers depends on sub company , what I need to do is to make a condition to only show managers list when role !== 'manager' && role !== 'admin'.
Here is the view.php
<div class="form-group col-md-4">
<label for="pwd">Sub Company Name</label>
<div class="alert-danger"><?php echo form_error('Subcom'); ?></div>
<select class="form-control" id="Subcom" name="Subcom" >
<option value="">Select Sub Company</option>
<?php
foreach($company_name as $row )
{
echo '<option value="'.$row->company_name.'" '.set_select('Subcom', $row->company_name).'>'.$row->company_name.'</option>';
}
?>
</select>
</div>
<div class="form-group col-md-4">
<label for="pwd">Role</label>
<div class="alert-danger"> <?php echo form_error('role'); ?></div>
<select class="form-control" id="role" name="role" placeholder="Select Role">
<option value="">Select Role</option></div>
<?php
foreach($role_name as $row )
{
echo '<option value="'.$row->id.'" '.set_select('role', $row->role_name).'>'.$row->role_name.'</option>';
}
?>
</select>
</div>
<div class="form-group col-md-4" >
<label for="pwd">Manager</label>
<div class="alert-danger"> <?php echo form_error('manager'); ?></div>
<select class="form-control" id="manager" name="manager" placeholder="Select Manager" style="display:none" disabled>
<option value="">Select Manager</option>
</select>
</div>
And here is the script
<script type="text/javascript">
$(document).ready(function(){
$(' #Subcom, #role').on('change' , function() {
var company_name = $('#Subcom').val();
var role = $('#role').val();
if( company_name!==''&& role !== '' && role !=='manager' && role !==
'admin')
{
//alert('ok');
$('#manager').prop('disabled', false);
$.ajax({
url:"<?php echo base_url()?>getManager",
type: "POST",
data: { 'company_name' : company_name},
dataType:'json',
success: function(data){
console.log(data);
false;
$('#manager').html(data.manager);
$('#manager').show();
},
error: function(event){
console.log(event);
alert('Error occur...');
}
});
}else {
//alert('sgsg');
$('#manager').prop('disabled', true);
$('#manager').hide();
}
});
});
</script>
Here is the controller
public function getManager()
{
//echo json_encode ($_REQUEST); die;
//print_r($_REQUEST);
//die;
$company_name = $this->input->post('company_name');
$getallmanager = $this->project_model->get_manager_query($company_name);
$getallstaff = $this->project_model->get_all_staff($company_name);
$all_the_mangers = '';
$all_the_staffs = '';
if(count($getallmanager)>0)
{
foreach ($getallmanager as $manager){
//if(role!=='manager')
$all_the_mangers .='<option value="' .$manager->first_name.'">'.$manager->first_name.'</option>';
}
}
if(count($getallstaff)>0)
{
foreach ($getallstaff as $staff){
$all_the_staffs .='<option value="' .$staff->first_name.'">'.$staff->first_name.'</option>';
}
}
$result = array('manager'=>$all_the_mangers,'staffs'=>$all_the_staffs);
echo json_encode($result);die;
}
}
And here is the Model:
public function get_manager_query($company_name)
{
$query = $this->db->get_where('user_login', array('company_name' => $company_name,'role'=>'manager'));
return $query->result();
}
public function get_all_staff($company_name)
{
$query = $this->db->get_where('user_login', array('company_name' => $company_name,'role !='=>'manager'));
return $query->result();
}
it is simply pass a var to show or hide.
in your controller file pass data['role_admin'] = 1;
in your view file
if($role_admin==1){
// show your Manager code
}
Add style="display:none" and disabled to manager select so it won't show up at load. Also selects don't need a value, if you want to set a specific option than you need to do it in the loops like this:
foreach($company_name as $row )
{
echo '<option value="'.$row->company_name.'" '.set_select('Subcom', $row->company_name).'>'.$row->company_name.'</option>';
}
Also it would be a good idea to move the form errors before the select and not wrap the options with it.
<script type="text/javascript">
$(document).ready(function(){
$('#Subcom,#role').on('change' , function() {
var company_name = $('#Subcom').val();
var role_name = $('#role').val();
if(company_name !== '' && role_name !== 'manager' && role_name !== 'admin')
{
$('#manager' ).prop('disabled', false);
$.ajax({
url:"<?php echo base_url()?>getManager",
type: "POST",
data: { 'company_name' : company_name},
dataType:'json',
success: function(data){
//alert('ok');
console.log(data);
$('#manager').html(data.manager);
$('#manager').show();
},
error: function(event){
console.log(event);
alert('Error occur...');
}
});
}
else
{
$('#manager').prop('disabled', true);
$('#manager').hide();
}
});
});
</script>
EDIT: for future reference here's the final code
https://jsfiddle.net/Lo50z6q8/
Related
I need help for this. I want to create a select option where it will show a second select option. With that second select option I will select options there that will display data in a id. The data will be came from the 1st select option and to the second select option. Thank you very much in advance.
.
.
So far these are my codes that I created.
students.php
<div class="text-center" align="center">
<select id="ch_br_LdSubs" class="form-control" style="width: 200px; text-align: center !important;">
<option value="">-- select branch --</option>
<option value="MBC">MinSCAT Bongabong Campus</option>
<option value="MMC">MinSCAT Main Campus</option>
<option value="MCC">MinSCAT Calapan City Campus</option>
</select>
</div>
<div style="margin: 10px;"></div>
<div id="printArea">
<div class="scroll-x">
<div id="branchData"></div>
</div>
</div>
ajax.js
$(document).ready(function(){
/* Load the Students for a Specifed Branch and Course */
$('#showStdsByCourse').change(function(){
var course = $(this).val();
var branch = $('#ch_br_LdSubs').val();
$.ajax({
url: 'actions.php',
type: 'POST',
data: {action: 'showStudents', branch: branch, course: course},
dataType: 'html',
success: function(result)
{
$('studentsData').html(result);
},
error: function()
{
alert('Failed to load students!');
}
});
});
/* Load the Branch Data for a Specified Branch */
$('#ch_br_LdSubs').change(function(){
var branch = $(this).val();
$.ajax({
url: 'actions.php',
type: 'POST',
data: {action: 'showBranchData', branch: branch},
dataType: 'html',
success: function(result)
{
$('#branchData').html(result);
},
error: function()
{
alert('Failed to load student data!');
}
});
});
/* Load the Courses for a Specified Branch */
$('#selectedBranch_loadCourse').change(function(){
var branch = $(this).val();
$.ajax({
url: 'actions.php',
type: 'POST',
data: {action: 'loadSubjectsPerBranch', branch: branch},
dataType: 'html',
success: function(result)
{
$('#loadCourseByBranch').html(result);
},
error: function()
{
alert('Failed to load courses!');
}
});
});
});
This are the codes I put on the class I've created
public function showBranchData($branch) {
try {
$stmt = $this->db->prepare("SELECT * FROM students WHERE branch = :branch");
$stmt->bindparam(':branch', $branch);
$stmt->execute();
if ($stmt->rowCount() != null) {
$branch_data = $stmt->fetch(PDO::FETCH_ASSOC);
?>
<div class="panel panel-info">
<div class="panel-heading">
<h4 class="panel-title"><?php print($branch_data['branch']) ?> Students</h4>
</div>
<div class="panel-body">
<select id="showStdsByCourse" class="form-control" style="width: 200px">
<?php
$courses = $this->db->prepare("SELECT * FROM courses WHERE branch = :branch");
$courses->bindparam(":branch", $branch);
$courses->execute();
if ($courses->rowCount() != null) {
echo '<option value="">-- select course --</option>';
while ($courseData = $courses->fetch(PDO::FETCH_ASSOC)) {
?>
<option value="<?php print($courseData['course_acronym']) ?>"><?php print($courseData['course_name']) ?></option>
<?php
}
} else {
?>
<option value="">-- no courses yet --</option>
<?php
}
?>
</select>
<span id="text"></span>
<div id="studentsData"></div>
</div>
</div>
<?php
} else {
?>
<div class="alert alert-danger">
No student data added yet!
</div>
<?php
}
} catch (PDOException $ex) {
echo $ex->getMessage();
return false;
}
}
public function showStudents($branch, $course) {
try {
$stmt = $this->db->prepare("SELECT * FROM students WHERE branch = :branch AND course = :course");
$stmt->bindparam(":branch", $branch);
$stmt->bindparam(":course", $course);
$stmt->execute();
if ($stmt->rowCount() != null) {
echo 'Student Data';
} else {
?>
<div class="alert alert-warning">No student data added yet!</div>
<?php
}
} catch (PDOException $ex) {
echo $ex->getMessage();
return false;
}
}
With that information I only can help you giving you some ideas. For what are you saying I would use JQuery getting the information from the first select to create the new options in the second select. If you need to search the information for the new options inside the database you will have to use Ajax to get the information.
Take a look in these questions. It could help you.
What is the best way to add options to a select from as a JS object with jQuery?
Ajax tutorial for post and get
hello i want to display data of business2's data according to business1's dropdown list but on change() of business1 i got data in response but how to print it in second dropdown list using id. i didn't get response in success function. How to print options of dropdown list using Id.
I got response in mozila's firefox's console but i don't know how to return it in success and then how to print in second dropdown list.
<!-- ajax code starts here -->
<script>
$(document).on('change', 'select.Business1', function(){
var business1 = $('select.Business1 option:selected').val();
alert(business1);
var value = $(this).val();
$.ajax({
type:"POST",
data: { business1:business1 },
url: '<?php echo site_url('client_area/select_business_sub_cat'); ?>',
sucess : function (data){
alert(1);
var abc = $('#business2').html(data);
}
});
});
</script>
<!-- ajax code ends here -->
Model function
public function select_business_sub_cat()
{
$business1 = $this->input->post('business1');
$result_sub_cat1 = $this->db->query("select category.id,subcategory.* From category LEFT JOIN subcategory ON category.id = subcategory.category_id where category.id = '$business1'");
$row_cat1 = $result_sub_cat1->result();
$data = array(
'id' => $row_cat1['0']->id,
'name' => $row_cat1['0']->name
);
echo "<option value='" . $row_cat1['0']->id . "'>" . $row_cat1['0']->name . "</option>";
// return $this->output->set_output($data);
}
View --
<div class="form-group">
<label>Business 1</label>
<select name="txtBusiness1" id="" style="height: 30px;width: 100%;" class="Business1">
<option value=""> Select Business </option>
<?php
$result_cat1 = $this->db->query("select * from category");
$row_cat1 = $result_cat1->result();
?>
<?php foreach($row_cat1 as $item){ ?>
<option value="<?php echo $item->id; ?>"><?php echo $item->name; ?></option>
<?php } ?>
</select>
</div>
<div class="form-group">
<label>Business 2</label>
<select name="txtBusiness2" id="business2" style="height: 30px;width: 100%;" class="Business2">
<option value=""> Select Business2 </option>
</select>
You have a type in your ajax call:
success : function (data) {
It's success not sucess
2 things may creating issue:
1) add double quotes in url
2) make it success instead of sucess
$.ajax({
type:"POST",
data: { business1:business1 },
url: '<?php echo site_url("client_area/select_business_sub_cat"); ?>', // add double quotes in url
success : function (data){ // make it success instead of sucess
alert(1);
var abc = $('#business2').html(data);
}
});
Change sucesss to success. You are using CI framework then use CI parameterized query, don't use static query it's hackable.
Give unique id to both div and select
It's better to follow MVC if you are use CI. Put your query in model with ci parameterized query.
<div class="form-group" id = 'divtxtBusiness1'>
<label>Business 1</label>
<select name="txtBusiness1" id="txtBusiness1" style="height: 30px;width: 100%;" class="Business1">
........
</select>
</div>
<div class="form-group" id = "div_Business_2">
<label>Business 2</label>
<select name="txtBusiness2" id="business2" style="height: 30px;width: 100%;" class="Business2">
<option value=""> Select Business2 </option>
</select>
</div>
<script>
//$(document).on('change', 'select.Business1', function(){
// var business1 = $('select.Business1 option:selected').val();
$(document).on('change', '#txtBusiness1', function(){
var business1 = $('#txtBusiness1').val();
//alert(business1);
//var value = $(this).val();
$.ajax({
type:"POST",
data: { business1:business1 },
url: '<?php echo site_url("client_area/select_business_sub_cat"); ?>',
success : function (data){
//alert(1);
$('#div_Business_2 #business2').remove();
$('#div_Business_2').append(data);
}
});
});
</script>
Controller :
public function select_business_sub_cat()
{
$business1 = $this->input->post('business1');
$result_sub_cat1 = $this->xyzmodel->xyzmodelfunction($business1)
$str = '<select name="txtBusiness2" id="business2" style="height: 30px;width: 100%;" class="Business2">';
for($i = 0 ; $i< count($result_sub_cat1) ; $i++)
{
$str .= '<option value="'.$result_sub_cat1['id'].'"> '.$result_sub_cat1['name'].' </option>';
}
$str .= '</select>';
echo $str;
// return $this->output->set_output($data);
}
Model :
don't use static query it's hackable.
class Xyzmodel extends CI_Model
{
......
public function xyzmodelfunction($business1)
{
$this->db->select(category.id,subcategory.*);
$this->db->from('category');
$this->db->join("subcategory", "category.id = subcategory.category_id", 'LEFT');
$this->db->where('category.id', $business1);
$result = $this->db->get();
return $result->result_array();
}
........
}
I will try the cascading dependent select box and input in Codeigniter with Ajax. The first step works quite well. The Securities can be easily loaded, when selecting an Account. The problem starts with the second step. So, when I try after the Security-selection to set the appropriate changeable Inputs, the Security-select will getting blocked and then nothing works. Don't understand what the problem is.
Please help me, the nasty blockage to dissolve. Thanks.
Ajax:
$(document).ready(function(){
var _form = $("#trans_form").serializeArray();
$('#amount_section').hide();
$('#quantity_section').hide();
$('#accountDrop').on('change',function(){
$("#securityDrop > option").remove();
var accountID = $(this).val();
if(accountID == '#') {return false;}
$.ajax({
data: _form,
type: "POST",
url: global_base_url + "custody/get_securities_dropdown/" + accountID,
success: function(securities) {
$.each(securities,function(id,value) {
var opt = $('<option />');
opt.val(id);
opt.text(value);
$('#securityDrop').append(opt);
});
}
});
});
$('#securityDrop').on('change',function(){
$('#amount_section').hide();
$('#quantity_section').hide();
var securityID = $(this).val();
if(securityID == '#') {return false;}
$.ajax({
data: _form,
type: "POST",
url: global_base_url + "custody/get_security_unit_ajax/" + securityID,
success: function(securUnit) {
if (securUnit == "UNIT") {
$('#quantity_section').show(300);
};
else if (securUnit == "FAMT") {
$('#amount_section').show(300);
};
}
});
});
});
Controller:
public function get_securities_dropdown($account_id){
$securities = $this->custody_model->get_security_by_account($account_id);
header('Content-Type: application/x-json; charset=utf-8');
echo json_encode($securities);
}
public function get_security_unit_ajax($security_id){
$securUnit = $this->custody_model->get_security_unit($security_id);
header('Content-Type: application/x-json; charset=utf-8');
echo json_encode($securUnit);
}
Model:
public function get_accounts_dropdown(){
$accounts = $this->db->select("ID as id, Account_Desc as descr")
->order_by("descr", "ASC")
->get($this->table2)->result();
$accounts_arr;
$accounts_arr['#'] = '-- Please select Account --';
foreach ($accounts as $account) {
$accounts_arr[$account->id] = $account->descr;
}
return $accounts_arr;
}
public function get_security_by_account($account_id){
if(!is_null($account_id)){
$securities = $this->db->where("a.ID_Account", $account_id)
->select("b.ID as id, b.Security_Desc as descr")
->join($this->table5 . " as b", "b.ID = a.ID_Security")
->order_by("descr", "ASC")
->get($this->table6 . " as a");
if($securities->num_rows() > 0){
$securities_arr;
foreach ($securities->result() as $security) {
$securities_arr[$security->id] = $security->descr;
}
return $securities_arr;
}
}
return;
}
View:
<?php echo form_open_multipart(site_url("custody/add_transaction_pro"), array("id" => "trans_form")) ?>
<div>
<label for="accountDrop">Account</label>
<div>
<?php echo form_dropdown('accountDrop', $account_arr, '#', 'id="accountDrop"'); ?>
</div>
</div>
<div id="security_section">
<label for="security_select">Security</label>
<div>
<select name="securityDrop" class="required" id="securityDrop">
<option value="#">-- Please select Security --</option>
</select>
</div>
</div>
<div id="quantity_section">
<label for="quantity">Quantity</label>
<div id="quantityInput">
<input type="text" id="quantity" name="quantity">
</div>
</div>
<div id="amount_section">
<label for="settl_amount">Amount</label>
<div id="amountInput">
<input type="text" id="settl_amount" name="settl_amount">
</div>
</div>
I have solved it. The error was quite simple, the unnecessary semicolons in the ajax part. The syntax is if() { } else if{ }
I have multiple instances of select drop downs on a form, eight to be exact. If I select a number on the first select drop down I want to hide the selected number from the second select drop down up to eighth.
For the purpose of this I will only show two of the eight select drop downs.
View Code -
Select drop down one -
<div class="col-xs-12 col-sm-3">
<div class="form-group">
<?php echo Form::label('test_id', 'Test', array('class' => 'col-xs-3 control-label')) ?>
<div class="col-xs-9">
<select name="test_id" id="test_id" class="form-control select2" data-placeholder="Select...">
<option value=""></option>
<?php foreach (ORM::factory('Test')->order_by('id')->find_all() as $row) : ?>
<option value="<?php echo $row->id ?>"
<?php if ($b->id == $row->id) echo 'selected="selected"' ?>>
<?php echo $row->id ?></option>
<?php endforeach ?>
</select>
</div>
</div>
Select drop down two-
<div class="col-xs-12 col-sm-3">
<div class="form-group">
<?php echo Form::label('test_id', 'Test', array('class' => 'col-xs-3 control-label')) ?>
<div class="col-xs-9">
<select name="test_id" id="test_id" class="form-control select2" data-placeholder="Select...">
<option value=""></option>
<?php foreach (ORM::factory('Test')->order_by('id')->find_all() as $row) : ?>
<option value="<?php echo $row->id ?>"
<?php if ($b->id == $row->id) echo 'selected="selected"' ?>>
<?php echo $row->id ?></option>
<?php endforeach ?>
</select>
</div>
</div>
jQuery Code -
var $selects = $('select');
$('select').change(function () {
$('option:hidden', $selects).each(function () {
var self = this,
toShow = true;
$selects.not($(this).parent()).each(function () {
if (self.value == this.value) toShow = false;
})
if (toShow) $(this).show();
});
if (this.value != "") //to keep default option available
$selects.not(this).children('option[value=' + this.value + ']').hide();
});
This does not work in the slightest.
Any help would be appreciated.
Cheers
This won't work with select2 and hidden options. You can work around this by disabling the options and a bit of CSS to hide them. See below:
JS
$(document).ready(function () {
var $selects = $('select');
$selects.select2();
$('select').change(function () {
$('option:hidden', $selects).each(function () {
var self = this,
toShow = true;
$selects.not($(this).parent()).each(function () {
if (self.value == this.value) toShow = false;
})
if (toShow) {
$(this).removeAttr('disabled');
$(this).parent().select2();
}
});
if (this.value != "") {
$selects.not(this).children('option[value=' + this.value + ']').attr('disabled', 'disabled');
$selects.select2();
}
});
})
CSS
.select2-results .select2-disabled {
display:none;
}
Working example here: http://jsfiddle.net/10nwqwck/4/
Something like this might work :
$(".select").click(function () {
var value = $(this).val();
// to hide every option that have the selected value
$("option").filter(function() {
return $(this).val() == value;
}).hide();
// to show the option currently selected in the current list
$(this).find("option").each(function () {
if ($(this).val() == value)
{
$(this).show();
}
});
});
Hope this help.
$("#Select_id").blur(function () {
var value = $(this).val();
alert($("#Select_id").val() == value);
// to hide every option that have the selected value
if ($("#Select_id").val() == value) {
$("#Option_id"+value).hide();
}
});
Try this
you can remove the selected item from the drop doen like this simply. dropdown id is 'Select_id' and selected option id need to be 'Option_id'. if not equel both then selected option will be remove
Cheers Vlad, that worked mate.
To make the jQuery more optimized, this was done.
$(document).ready(function () {
var $selects = $('select');
$selects.select2();
$('select').change(function () {
$('option:hidden', $selects).each(function () {
var self = this,
toShow = true;
$selects.not($(this).parent()).each(function () {
if (self.value == this.value) toShow = false;
})
if (toShow) {
$(this).removeAttr('disabled');
}
});
if (this.value != "") {
$selects.not(this).children('option[value=' + this.value + ']').attr('disabled', 'disabled');
}
});
})
Thank you for your help :)
I tried to populate a select box based on the first but no result, no error but the second select box is not populate:
My html:
<div class="form-group">
<label>Firm:</label>
<select class="form-control marg-left-10" id="firm">
<?php if($all_firms): ?>
<?php foreach($all_firms as $firm): ?>
<option value="<?php echo $firm['id_firm']; ?>"><?php echo $firm['name_firm']; ?></option>
<?php endforeach; ?>
<?php endif; ?>
</select>
</div>
<div class="form-group">
<label>Administrator</label>
<select class="form-control marg-left-10" id="admin">
</select>
</div>
My php:
public function getAllFirms()
{
$this->load->database();
$all_firms = $this->db->query("SELECT *FROM firms");
if ($all_firms->num_rows())
{
$all_firms = $all_firms->result_array();
}
else
{
$all_firms = NULL;
}
return $all_firms;
}
public function getAdministrator($id)
{
$this->load->database();
$get_admin = $this->db->query("SELECT * FROM users,firms WHERE firms.id_firm = users.fk_firm and users.id = $id");
if ($get_admin->num_rows())
{
$get_admin = $get_admin->result_array();
}
else
{
$get_admin = NULL;
}
return $get_admin;
}
My script:
$("#firm").change(function() {
var selectedMark = $("#firm").val();
if (selectedMark != "") {
$.ajax({
type: "GET",
url: "<?php echo base_url() . 'user/getAdministrator'; ?>" + selectedMark,
success: function(data) {
$("#admin").html("");
$("#admin").append("<option value=''></option>");
$.each(data, function() {
$("#admin").append("<option value='" + this.id + "'>" + this.name + "</option>");
});
}
});
}
});
I use CodeIgniter as backend language, the first selectt box is populated but the second not.Please help me guys...HELP please!!!!! HELP ME GUYS!!Another idea to resolve this?
it looks like you've forgotten to add # when you calling 'admin' select. I.e. see 'success' section of your JS and change:
$('admin')...
to
$('#admin')...
you are looking like this:
<div class="form-group">
<label>Firm:</label>
<select class="form-control marg-left-10" id="firm">
<option value="1">1</option>
<option value="2">2</option>
<option value="3">3</option>
</select>
</div>
<div class="form-group">
<label>Administrator</label>
<select class="form-control marg-left-10" id="admin"></select>
</div>
<script>
$("#firm").change(function() {
var selectedMark = $("#firm option:selected").val();
var selectedMarkt = $("#firm option:selected").text();
if (selectedMark != "") {
$.ajax({
type: "GET",
url: "test.php",
success: function(data) {
$("#admin").append("<option value='" + selectedMark + "'>" + selectedMarkt + "</option>");
}
});
}
});
</script>
Looks like you need another "/" on this line:
url: "<?php echo base_url() . 'user/getAdministrator'; ?>" + selectedMark,
Right after 'user/getAdministrator'.