zend multicheckboxes form controller - php

Merged with multicheckboxes zend form multi populate.
i did do the form with multicheckboxs and it works fine when insert or update but the my problem is how to populate all the multi boxes that is checked form the database this is the code but it doesn't show just one checkbox is checked
$id = (int) $this->_request->getParam('id');
//The incoming request
$request = $this->getRequest();
//initialize form
$form = new Admin_Form_DownFooterTab();
//instance of db
$db = Zend_Db_Table::getDefaultAdapter();
if ($this->getRequest()->isPost()) {
if ($form->isValid($request->getPost())) {
if (isset($id) && $id != "") {
$gettag = $form->getValue('tag_id');
$gettags = count($gettag);
try {
//shift the orders to
$select = $db->select()->from(array('t' => 'tab'), array('t.id',
't.title',
't.tab_position',
't.order',
't.is_active',
't.is_deleted'))->where('id = ?', $id);
$currentTab = $db->fetchRow($select);
$var3 = array('tab.order' => new Zend_Db_Expr('tab.order - 1'));
$var4 = array('tab.order >= ' . $currentTab['order'], 'is_active=1', 'is_deleted=0', 'tab_position=4');
$db->update('tab', $var3, $var4);
$var = array('tab.order' => new Zend_Db_Expr('tab.order + 1'));
$var2 = array('tab.order >= ' . $form->getValue('order'), 'is_active=1', 'is_deleted=0', 'tab_position=4');
$db->update('tab', $var, $var2);
$db->delete('tab_tag', array('tab_id = ?' => $id));
foreach ($gettag as $value) {
$db->insert('tab_tag',
array(
'tag_id' => $value,
'tab_id' => $id
));
}
$db->update('tab', array(
'title' => $form->getValue('title'),
'body' => $form->getValue('body'),
'is_active' => $form->getValue('is_active'),
'banner_link' => $form->getValue('banner_link'),
'tab_path' => $form->getValue('tab_path'),
'link_open' => $form->getValue('link_open'),
'tab_position' => $form->getValue('tab_position'),
'tab_parent' => $form->getValue('tab_parent')
),
array('id =?' => $id));
$this->flash('Tab Updated', 'admin/tab');
} catch (Exception $e) {
$this->flash($e->getMessage(), 'admin/tab');
}
} else {
try {
$formValues = $form->getValues();
$formValues['created_by'] = 1;
$formValues['created_date'] = date('Y/m/d H:i:s');
$formValues['is_deleted'] = 0;
$var = array('tab.order' => new Zend_Db_Expr('tab.order + 1'));
$var2 = array('tab.order >= ' . $form->getValue('order'), 'is_active=1', 'is_deleted=0', 'tab_position=4');
$db->update('tab', $var, $var2);
foreach ($gettag as $value) {
$db->insert('tab_tag',
array(
'tag_id' => $value,
'tab_id' => $id
));
}
$db->insert('tab', array(
'title' => $form->getValue('title'),
'body' => $form->getValue('body'),
'is_active' => $form->getValue('is_active'),
'banner_link' => $form->getValue('banner_link'),
'tab_path' => $form->getValue('tab_path'),
'link_open' => $form->getValue('link_open'),
'tab_position' => $form->getValue('tab_position'),
'tab_parent' => $form->getValue('tab_parent')
));
$this->flash('Tab inserted', 'admin/tab');
} catch (Exception $e) {
$this->flash($e->getMessage(), 'admin/tab');
}
}
}
}
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
if (isset($id) && $id != "") {
$values = $db->fetchRow("SELECT * FROM tab WHERE id = ?", $id);
$form->populate($values);
}
$this->view->form = $form;
}
$ddlCat_parent->setMultiOptions($cats);
$this->view->form = $form;
}

Related

getting multiple customer details In codeigniter

i have written this code to receive data from the Android device. it was inserted just one customer data I need to receive multiple customer details if app goes offline. but it was inserting one data into DB in offline mode also.how can i change this for multiple customer data insertions.
function index_post($customerID = false) {
if ($customerID) {
//update the record
$updateData = array();
$allowedparams = array('streetid' => 'streetid', 'name' => 'name', 'mobile' => 'mobile', 'adhaar' => 'adhaar', 'profession' => 'profession', 'address' => 'address', 'pincode' => 'pincode', 'nearby' => 'nearby', 'paddress' => 'paddress', 'isOwned' => 'isOwned');
foreach ($allowedparams as $k => $v) {
if (!$this->IsNullOrEmptyString($this->post($k, true))) {
$updateData[$v] = $this->post($k, true);
}
}
if ($this->model_customer->update($customerID, $updateData)) {
$data = array('status' => true, 'messsage' => 'cusotmer updated succesfully');
$http_code = REST_Controller::HTTP_OK;
} else {
$data = array('status' => false, 'messsage' => 'cusotmer failed to update.');
$http_code = REST_Controller::HTTP_INTERNAL_SERVER_ERROR;
}
} else {
//insert the record
$allowedparams = array('streetid' => 'streetid', 'name' => 'name', 'mobile' => 'mobile', 'adhaar' => 'adhaar', 'profession' => 'profession', 'address' => 'address', 'pincode' => 'pincode', 'cycle' => 'cycle', 'nearby' => 'nearby', 'paddress' => 'paddress', 'isOwned' => 'isOwned');
$requiredParam = array('streetid', 'name', 'mobile', 'cycle');
$insertdata = array();
foreach ($allowedparams as $k => $v) {
if (in_array($k, $requiredParam)) {
//check if its not null
if ($this->post($k) == null || trim($this->post($k)) == '') {
$data = array('status' => false, 'message' => $k . ' parameter missing or empty');
$http_code = REST_Controller::HTTP_BAD_REQUEST;
break;
}
}
$insertData[$v] = $this->post($k, true);
}
if ($customerID = $this->model_customer->create($insertData)) {
$data['customerID'] = $this->_frameCustomer2($this->model_customer->get($customerID)); //you need to put
$http_code = REST_Controller::HTTP_OK;
} else {
$data = array('status' => false, 'message' => 'unable to create customer');
$http_code = REST_Controller::HTTP_INTERNAL_SERVER_ERROR;
}
}
$this->response($data, $http_code);
}
private function _frameCustomer2($c) { //get value from index_get
$data = array();
$data['id'] = $c->id;
$data['name'] = $c->name;
$data['street'] = array('id' => $c->streetid);
$data['creationDate'] = $c->creationdate;
$data['mobile'] = $c->mobile;
$data['adhaar'] = $c->adhaar;
$data['profession'] = $c->profession;
$data['isOwned'] = ($c->isOwned == 1) ? true : false;
$data['address'] = $c->address;
$data['pincode'] = $c->pincode;
$data['status'] = $c->status;
$data['cycle'] = $c->cycle;
$data['balance'] = $c->balance;
$data['creditAvailable'] = $c->creditbalance;
$data['nearby'] = $c->nearby;
$data['accountNumber'] = $c->accountnumber;
$data['permanentAddress'] = $c->paddress;
$data['lastVisit'] = $this->model_customer->lastVisit($c->id);
return $data;
}
and my part of model function is
function create($insertdata = array()) { //new customer insert
if ($this->db->insert('customer', $insertdata)) {
return $this->db->insert_id();
} else {
return false;
}
}
function update($customerID = 0, $updateData = array()) {
$this->db->where('id', $customerID);
if ($this->db->update('customer', $updateData) && $this->db->affected_rows() == 1) {
return true;
} else {
return false;
}
Instead of customer Id, you can ask the mobile developers to send data in the form of array. In both online and offline. In case of online there will be just one element in the request array.
function index_post() {
$request_data = $this->request->body;
foreach($request_data as $key => $value)
{
//Check if customer id is present
if(Customer present)
{
Update the record
} else {
Insert the record
}
}
}

return data from web service in one json string

i want to return data from a web services with php in one group json container. my below script gives me each of the data seperated like this
{"No":"01","Name":"JOSEPH"}{"No":"02","Name":"AMINU"}
But i wan it to return like this
[{"No":"01","Name":"JOSEPH","No":"02","Name":"AMINU"}]
below is my script
try{
$service = new NTLMSoapClient($pageURL);
$params = array('filter' => array(
array('Field' => 'District_Name', 'Criteria' => '')
),
'setSize' => 2); //setSize =0 will return all rows - Can cause performance issue with large results set!
$result = $service->ReadMultiple($params);
$resultSet = $result->ReadMultiple_Result->customer;
if (is_array($resultSet)) {
foreach($resultSet as $item) {
$data=array('No' => $item->No,'Name' => $item->Name);
echo json_encode($data);
}
}
else {
echo json_encode('record not found');
}
}
catch (Exception $e) {
echo "<hr><b>ERROR: SoapException:</b> [".$e."]<hr>";
echo "<pre>".htmlentities(print_r($service->__getLastRequest(),1))."</pre>";
}
Try you foreach with this.
try{
$service = new NTLMSoapClient($pageURL);
$params = array('filter' => array(
array('Field' => 'District_Name', 'Criteria' => '')
),
'setSize' => 2); //setSize =0 will return all rows - Can cause performance issue with large results set!
$result = $service->ReadMultiple($params);
$resultSet = $result->ReadMultiple_Result->customer;
if (is_array($resultSet)) {
$jsonArray = [];
foreach($resultSet as $item) {
$data = array('No' => $item->No,'Name' => $item->Name);
$jsonArray = array_merge($jsonArray, $data);
}
echo json_encode($jsonArray);
}
else {
echo json_encode('record not found');
}
}
catch (Exception $e) {
echo "<hr><b>ERROR: SoapException:</b> [".$e."]<hr>";
echo "<pre>".htmlentities(print_r($service->__getLastRequest(),1))."</pre>";
}
try{
$service = new NTLMSoapClient($pageURL);
$params = array('filter' => array(
array('Field' => 'District_Name', 'Criteria' => '')
),
'setSize' => 2); //setSize =0 will return all rows - Can cause performance issue with large results set!
$result = $service->ReadMultiple($params);
$resultSet = $result->ReadMultiple_Result->customer;
if (is_array($resultSet)) {
$data = array();
foreach($resultSet as $item) {
$data = $data + array('No' => $item->No,'Name' => $item->Name);
}
echo json_encode($data);
}
else {
echo json_encode('record not found');
}
}
catch (Exception $e) {
echo "<hr><b>ERROR: SoapException:</b> [".$e."]<hr>";
echo "<pre>".htmlentities(print_r($service->__getLastRequest(),1))."</pre>";
}

Slow upload with .csv files and PHP

I've created a function to upload csv files using PHP and insert its contents into a Mongo database.
The upload is taking to much time to be completed and I don't have idea how to build a better code to do this.
Bellow my function in PHP:
public function importEmail($file,$list_name,$header){
$data = $this->ReadCSV($file, $has_header);
global $Email;
$falhas = 0;
array_shift($data);
if($data === false) {
return false;
} else {
foreach($data as $key => $value) {
$Email->email = $value[$header["email"]];
$Email->first_name = $value[$header["fName"]];
$Email->last_name = $value[$header["lName"]];
$Email->gender = strtoupper($value[$header["gender"]]);
$Email->status = $value[$header["status"]] !="" ? $value[$header["status"]] : "1";
$Email->list_name = $list_name;
$Email->opt_out = $v = (strtoupper($value[$header["opt"]]) != "" ? strtoupper($value[$header["opt"]]) : "N");
if(!$Email->update(trim($value[$header["email"]]))) $falhas++;
}
}
return $falhas === 0 ? true : false;
}
EDITED
This is the update() method which is responsible to insert records into MongoDB
public function update($id) {
global $mongo, $gClient;
$update = array(
'$set' => array(
'userData.name' => $this->first_name,
'userData.lastName' => $this->last_name,
'userData.gender' => $this->gender,
'userData.optOut' => $this->opt_out == "Y" || $this->opt_out == "N" ? $this->opt_out : "Y",
'userData.lastUpdate' => (int)(microtime(true) * 1000),
'userData.status' => $this->status == 0 || $this->status == 1 ? +$this->status : 0
),
'$setOnInsert' => array(
'userData.registerDate' => (int)(microtime(true) * 1000)
)
);
if(is_string($this->list_name) && strlen($this->list_name) > 0)
$update['$push'] = array(
'userData.meta' => array(
'type' => 'listname',
'name' => $this->list_name
)
);
$result = $mongo->{$gClient->slug}->usersHistory->update(array(
'userEmail' => $id
), $update, array(
'upsert' => true
));
if(!$this->email) $this->email = $id;
$mongo->{$gClient->slug}->usersHistory->update(array(
'userEmail' => $id
), array(
'$set' => array(
'userEmail' => $this->email
)
));
return $result['n'] > 0;
}
Those .csv files are always bigger than 50k (lines).
How can I build something faster than this method?

Set up a A-Z Bar in a Custom Drupal module using PHP

Im trying to use print a A-Z bar to filter entries based on the letter click. (i.e click "A" it only show the "A" listing, click "B" show only the "B" listing, if there arent "C" listing than "C" doesnt show, "A-B-D-E")
This is in PHP and is part of a custom DRUPAL module. The contents are already alphabetized.
I know there is alot of code below, I just dont know where or what to apply to solve this problem.
Thank you in advance for all your help.
Alan
Im trying to get the RED OUTLINED box into the RED FILLED-IN box.
Sorry it took so long to get an image up. Thank you for all your help!
<?php
// NITAAC Calendar Synchronization Module
// Based off of Assyst's origonal solution
// Re-written to only pull updates where needed
// TODO: write a proper help section
function cloud_computing_data_help($path, $arg){
switch ($path){
case "admin/help#cloud_computing_data":
$text = '<p>' . t("TODO - WRITE A HELP FILE.") . '</p>';
return $text;
break;
}
}
/**
* Menu functions
*/
function cloud_computing_data_menu()
{
$items = array();
$items['cloud-computing/cio-sp3'] = array(
'title' => 'Cloud Computing',
'description' => '',
'page callback' => 'cloud_computing_data_grid_display',
'access callback' => TRUE,
);
$items['cloud-computing/update-from-node/%'] = array(
'title' => 'Cloud Computing data update',
'description' => 'Utility to update the CIO-SP3/SB Cloud Computing data in the database based on a sheetnode',
'page callback' => 'cloud_computing_data_populate_from_node',
'page arguments' => array(2),
'access arguments' => array('access administration pages'),
);
return $items;
}
/**
* Block Definitions
*/
function cloud_computing_data_block_info(){
$blocks['cloud_computing_filters'] = array(
'info' => t('NITAAC Cloud Computing Filters'),
'status' => 1,
'region' => 'subfeature_top',
'visibility' => BLOCK_VISIBILITY_LISTED,
'weight' => '999',
'pages' => 'cloud-computing/cio-sp3',
'cahce' => DRUPAL_CACHE_PER_ROLE,
);
return $blocks;
}
function cloud_computing_data_theme(){
$module_path = drupal_get_path('module', 'cloud_computing_data');
$base = array(
'file' => 'theme.inc',
'path' => "$module_path/theme",
);
return array(
'cloud_computing_page' => $base + array(
'template' => 'cloud-computing-page',
'variables' => array('companies' => array()),
),
'cloud_computing_item' => $base + array(
'template' => 'cloud-computing-item',
'variables' => array('company' => array()),
),
'cloud_computing_item_details' => $base + array(
'template' => 'cloud-computing-item-details',
'variables' => array('company' => array()),
),
);
}
/// Page Definition Functions //////////////////////////////////////////////////
function cloud_computing_data_grid_display_filters(){
// form definition
$filters = array(
'#method' => 'get',
'#tree' => true,
'#theme_wrappers' => array('form'),
'#no_redirect' => true,
'#always_process' => true,
'#type' => 'form',
'#token' => false,
'#after_build' => array('cloud_computing_data_grid_display_filters_unset_id'),
'#attributes' => array(
'class' => array('cc-filters'),
),
);
// get service provider listing
$qry = db_select('cloud_computing_capability_data', 'cd');
$qry -> fields('cd', array(
'service_provider',
))
-> orderBy('service_provider', 'ASC')
-> groupBy('service_provider');
$result = $qry -> execute();
$providers = array();
foreach($result as $provider_serialized){
$provider_parts = explode(';',$provider_serialized->service_provider);
foreach($provider_parts as $part){
$part = trim($part);
if (!empty($part)){
$providers[$part] = $part;
}
}
}
$qry = db_select('cloud_computing_capability_data', 'cd');
$qry -> fields('cd', array(
'contract',
))
-> orderBy('contract', 'ASC')
-> groupBy('contract');
$result = $qry -> execute();
$contracts = array();
foreach($result as $row){
$contracts[$row->contract] = $row->contract;
}
// contract dropdown
$filters['contract'] = array(
'#type' => 'select',
'#title' => t('Contract'),
'#default_value' => 'Any',
'#options' => array(
'any' => 'Any'
),
'#multiple' => false,
'#name' => 'contract',
);
foreach($contracts as $contract){
$contract_plain = check_url($contract);
$contract_plain = preg_replace('/\s/','-',strtolower($contract_plain));
$filters['contract']['#options'][$contract_plain] = $contract;
}
// providers dropdown
$filters['service_provider'] = array(
'#type' => 'select',
'#title' => t('Service Provider'),
'#default_value' => 'Any',
'#options' => array(
'any' => 'Any'
),
'#multiple' => false,
'#name' => 'provider',
);
foreach($providers as $provider){
$provider_plain = check_url($provider);
$provider_plain = preg_replace('/\s/','-',strtolower($provider_plain));
$filters['service_provider']['#options'][$provider_plain] = $provider;
}
// services checkboxes
$filters['services'] = array(
'#attributes' => array(
'class' => array('checkbox-list'),
),
'#type' => 'container',
);
$filters['services']['iaas'] = array(
'#type' => 'checkbox',
'#title' => t('IaaS'),
'#value' => false,
'#name' => 'iaas',
);
$filters['services']['paas'] = array(
'#type' => 'checkbox',
'#title' => t('PaaS'),
'#value' => false,
'#name' => 'paas',
);
$filters['services']['saas'] = array(
'#type' => 'checkbox',
'#title' => t('SaaS'),
'#value' => false,
'#name' => 'saas',
);
$filters['services']['eaas'] = array(
'#type' => 'checkbox',
'#title' => t('EaaS'),
'#value' => false,
'#name' => 'eaas',
);
// if the form was submitted previously...
if (!empty($_GET)){
// handle previous submissions manually for service provider
if (isset($_GET['provider'])){
$provider_plain = check_url($_GET['provider']);
$provider_plain = preg_replace('/\s/','-',strtolower($provider_plain));
if (isset($filters['service_provider']['#options'][$provider_plain])){
$filters['service_provider']['#value'] = $provider_plain;
}
$filters['us_hosting']['#value'] = check_plain($_GET['hosted']);
}
// handle previous submissions manually for contract
if (isset($_GET['contract'])){
$contract_plain = check_url($_GET['contract']);
$contract_plain = preg_replace('/\s/','-',strtolower($contract_plain));
if (isset($filters['contract']['#options'][$contract_plain])){
$filters['contract']['#value'] = $contract_plain;
}
}
// handle previous submissions manually for services
foreach($filters['services'] as $k => &$service){
if (isset($_GET[$service['#name']])){
$service['#value'] = $_GET[$service['#name']] ? true : false;
}
}
}
// add service description label
$filters['services']['description'] = array(
'#type' => 'markup',
'#name' => 'Services Offerings',
'#markup' => '<div class="checkbox-label">Service Offerings</div>',
'#weight' => -1,
);
// services checkboxes
$filters['filter'] = array(
'#attributes' => array(
'class' => array('submission-buttons'),
),
'#type' => 'container',
);
// add service description label
$filters['filter']['description'] = array(
'#type' => 'markup',
'#name' => 'Filter Results',
'#markup' => '<div class="submission-buttons-label">Filter Results</div>',
'#weight' => -1,
);
// add submit button
$filters['filter']['submit'] = array(
'#type' => 'submit',
'#value' => t('Filter'),
'#submit' => array('cloud_computing_data_grid_display_filters_submit'),
'#name' => '',
'#processed' => true,
);
$path = base_path() . 'cloud-computing/cio-sp3';
$filters['filter']['reset'] = array(
'#type' => 'markup',
'#name' => 'reset',
'#markup' => '<a class="reset-button" href="' . $path . '">Reset</a>'
);
return $filters;
}
function cloud_computing_data_grid_display_filters_unset_id($form){
unset($form['#build_id'], $form['form_build_id'], $form['form_id']);
return $form;
}
function cloud_computing_data_grid_display_filters_submit(){
return;
}
function cloud_computing_data_block_view($delta = ''){
switch($delta){
case 'cloud_computing_filters':
$block['subject'] = t('Cloud Computing Filters');
$form_state = array();
$filters = drupal_build_form('cloud_computing_data_grid_display_filters', $form_state);
$filters['#action'] = base_path() . 'cloud-computing/cio-sp3';
$block['content'] = drupal_render($filters);
return $block;
}
return null;
}
/**
* Class to help make managing company data easier.
*/
class cloud_computing_data_company{
// instance variables
public $name = '';
public $contract = '';
public $roles = array();
public $service_providers = array();
public $cloud_types = array();
public $us_hosted = array();
public $iaas = false;
public $paas = false;
public $saas = false;
public $eaas = false;
public $fedramp = false;
public $other = false;
// function to build object from DB row
public static function build($row){
$instance = new cloud_computing_data_company();
$instance -> ccid = $row -> ccid;
$instance -> delta = $row -> delta;
$instance -> name = $row -> company;
$instance -> contract = $row -> contract;
$instance -> roles = explode(';',$row -> role);
$instance -> service_providers = explode(';',$row -> service_provider);
$instance -> cloud_types = explode(';',$row -> cloud_type);
$instance -> us_hosted = explode(';',$row -> us_hosted);
$instance -> iaas = $row -> iaas;
$instance -> paas = $row -> paas;
$instance -> saas = $row -> saas;
$instance -> eaas = $row -> eaas;
$instance -> fedramp = $row -> fedramp;
$instance -> other = $row -> other;
return $instance;
}
// function to un-foobar an array of terribly formatted spreadsheet data
public static function un_foobar_array($foobar_array){
$assoc_parts = array();
foreach($foobar_array as $foobar_item){
$foobar_item = preg_replace('/\?/','',$foobar_item);
$foobar_item = preg_replace('/(,|;|(<br\/>)|([0-9]\.))/',',',$foobar_item);
$foobar_parts = explode(',', $foobar_item); // BOOM! <-- FUUUUNNY
foreach($foobar_parts as $part){
$part = trim($part);
if (!empty($part)){
$assoc_parts[$part] = $part;
}
}
}
$fixed_array = array();
foreach($assoc_parts as $k => $v){
$fixed_array[] = $v;
}
sort($fixed_array);
return $fixed_array;
}
// function to merge multiple companies into one
// I wish it were as effecient as the one AT&T uses to combat anti-monopoly measures <--- FUNNY AGAIN
public static function merge($companies){
$merged_company = new cloud_computing_data_company();
// uncommented string processing code ahead
foreach($companies as $company){
if (!empty($company -> name)){
$merged_company -> name = trim($company -> name);
}
$company -> contract = trim($company -> contract);
if (!empty($company -> contract)){
$merged_company -> contract = trim($company -> contract);
}
$merged_company -> roles = array_merge($merged_company->roles, $company->roles);
$merged_company -> service_providers = array_merge($merged_company->service_providers, $company->service_providers);
$merged_company -> cloud_types = array_merge($merged_company->cloud_types, $company->cloud_types);
$merged_company -> us_hosted = array_merge($merged_company->us_hosted, $company->us_hosted);
if (($company->iaas) && (strtolower($company->iaas) != 'no')){
$merged_company -> iaas = true;
}
if (($company->paas) && (strtolower($company->paas) != 'no')){
$merged_company -> paas = true;
}
if (($company->saas) && (strtolower($company->saas) != 'no')){
$merged_company -> saas = true;
}
if (($company->eaas) && (strtolower($company->eaas) != 'no')){
$merged_company -> eaas = true;
}
$company -> fedramp = trim($company -> fedramp);
if (!empty($company -> fedramp)){
$merged_company -> fedramp = trim($company -> fedramp);
}
$company -> other = trim($company -> other);
if (!empty($company -> other)){
$merged_company -> other = trim($company -> other);
}
}
// fix all of the corrupt arrays
$merged_company -> roles = cloud_computing_data_company::un_foobar_array($merged_company -> roles);
$merged_company -> service_providers = cloud_computing_data_company::un_foobar_array($merged_company -> service_providers);
$merged_company -> cloud_types = cloud_computing_data_company::un_foobar_array($merged_company -> cloud_types);
$merged_company -> us_hosted = cloud_computing_data_company::un_foobar_array($merged_company -> us_hosted);
return $merged_company;
}
// function to get DB fields
public static function db_fields(){
return array(
'ccid',
'delta',
'company',
'contract',
'role',
'service_provider',
'cloud_type',
'us_hosted',
'iaas',
'paas',
'saas',
'eaas',
'fedramp',
'other',
);
}
// function to convert to array for DB insertion
public function db_values(){
return array(
'ccid' => $this->ccid,
'delta' => $this->delta,
'company' => $this->name,
'contract' => $this->contract,
'role' => implode(';',$this->roles),
'service_provider' => implode(';',$this->service_providers),
'cloud_type' => implode(';',$this->cloud_types),
'us_hosted' => implode(';',$this->us_hosted),
'iaas' => $this->iaas,
'paas' => $this->paas,
'saas' => $this->saas,
'eaas' => $this->eaas,
'fedramp' => $this->fedramp,
'other' => $this->other,
);
}
// function to convert to array for theming
public function to_array(){
return array(
'ccid' => $this->ccid,
'delta' => $this->delta,
'company' => $this->name,
'name' => $this->name,
'contract' => $this->contract,
'roles' => $this->roles,
'service_providers' => $this->service_providers,
'cloud_types' => $this->cloud_types,
'us_hosted' => $this->us_hosted,
'iaas' => $this->iaas,
'paas' => $this->paas,
'saas' => $this->saas,
'eaas' => $this->eaas,
'fedramp' => $this->fedramp,
'other' => $this->other,
);
}
}
/**
* This function displays a grid of cloud computing companies
*/
function cloud_computing_data_grid_display($arg){
// Definitely should have just used views here. Opted to do it live, because
// I didn't want to create more useless nodes to store cloud
// computing details. Really should have just made a "cloud computing dossier"
// content type or something. At least this executes (comparitively) fast...
$form_state = array('method' => 'get');
$filters = drupal_build_form('cloud_computing_data_grid_display_filters', $form_state);
// get companies ------------use this to filter company names and apply A-Z Filter----------
$companies = array(); // array of company names for filtering
$qry = db_select('cloud_computing_capability_data', 'cd');
$qry -> fields('cd', cloud_computing_data_company::db_fields());
// add service provider filter
if (!empty($form_state['values']['service_provider'])){
if (strtolower($form_state['values']['service_provider']) != 'any'){
$provider_plain = check_plain($form_state['values']['service_provider']);
$provider_wildcards = preg_replace('/-/','%',strtolower($provider_plain));
$provider_wildcards = '%' . $provider_wildcards . '%';
$qry -> condition('cd.service_provider', $provider_wildcards, 'LIKE');
}
}
// add service provider filter
if (!empty($form_state['values']['contract'])){
if (strtolower($form_state['values']['contract']) != 'any'){
$contract_plain = check_plain($form_state['values']['contract']);
$contract_wildcards = preg_replace('/-/','%',strtolower($contract_plain));
$contract_wildcards = '%' . $contract_wildcards . '%';
$qry -> condition('cd.contract', $contract_wildcards, 'LIKE');
}
}
// filter by services offered
$iaas_required = $form_state['values']['services']['iaas'];
$paas_required = $form_state['values']['services']['paas'];
$saas_required = $form_state['values']['services']['saas'];
$eaas_required = $form_state['values']['services']['eaas'];
if ($iaas_required){ $qry -> condition('cd.iaas', true); }
if ($paas_required){ $qry -> condition('cd.paas', true); }
if ($saas_required){ $qry -> condition('cd.saas', true); }
if ($eaas_required){ $qry -> condition('cd.eaas', true); }
$qry -> orderBy('cd.company', 'ASC');
$company_rows = $qry -> execute();
foreach ($company_rows as $row){
$company = cloud_computing_data_company::build($row);
$companies[$company -> name] = $company->to_array();
}
$companies_themed = array();
foreach($companies as $name => $company){
$company['services_display'] = array();
$company['services_display']['IaaS'] = cloud_computing_data_wrap_service($company['iaas'], 'IaaS');
$company['services_display']['PaaS'] = cloud_computing_data_wrap_service($company['paas'], 'PaaS');
$company['services_display']['SaaS'] = cloud_computing_data_wrap_service($company['saas'], 'SaaS');
$company['services_display']['EaaS'] = cloud_computing_data_wrap_service($company['eaas'], 'EaaS');
$companies_themed[] = theme('cloud_computing_item', array('company' => $company));
}
$res_path = drupal_get_path('module', 'cloud_computing_data');
drupal_add_css($res_path . '/theme/cloud-computing.css');
drupal_add_js($res_path . '/theme/cloud-computing-grid.js');
return theme('cloud_computing_page', array('companies' => $companies_themed));
}
// filter by company name
/**
* This function wraps a service name in a span and adds an icon in order
* to indicate whether a given company provides said service.
*/
function cloud_computing_data_wrap_service($value, $name){
global $base_url;
$module_path = $base_url . '/' . drupal_get_path('module', 'cloud_computing_data');
$returnVal = "";
if ($value){
$returnVal .= "<span class='cloud-service-offering offered' title='This contract holder provides $name.'>$name";
$returnVal .= "<img class='icon' src='{$module_path}/theme/service-provided.png' alt='This contract holder provides $name.'/>";
$returnVal .= "</span>";
} else {
$returnVal .= "<span class='cloud-service-offering not-offered' title='This contract holder does not provide $name.'>$name";
$returnVal .= "<img class='icon' src='{$module_path}/theme/service-not-provided.png' alt='This contract holder does not provide $name.'/>";
$returnVal .= "</span>";
}
return $returnVal;
}
/**
* The function that went here has been deleted.
*/
/// Database Population Functions //////////////////////////////////////////////
/**
* This function accepts the nid of a sheetnode, and updates the cloud computing
* database using the data from said node. It is indended to be triggered via
* a url redirect (implemented by Rules) after saving the node in question.
*/
function cloud_computing_data_populate_from_node($nid){
// ensure we have a viable node to work with
$node = node_load($nid);
if (!$node){
drupal_set_message('The specified node was not found.', error);
return array();
}
if ($node -> type != 'sheetnode'){
drupal_set_message('The specified node is not of the correct type (not a sheetnode).', error);
return array();
}
// include socialcalc api functionality from sheetnode
require_once(drupal_get_path('module', 'sheetnode') . '/socialcalc.inc');
// standard column mapping for cloud computing sheet
$col_mapping = array(
'A' => 'company',
'B' => 'contract',
'C' => 'role',
'D' => 'service_provider',
'E' => 'cloud_type',
'F' => 'us_hosted',
'G' => 'iaas',
'H' => 'paas',
'I' => 'saas',
'J' => 'eaas',
'K' => 'fedramp',
'L' => 'other',
);
$sheetnodes = db_query("SELECT * FROM {sheetnode} WHERE nid in (:nid) GROUP BY nid", array(':nid' => $nid));
if (empty($sheetnodes)){
throw new Exception('Unable to find a sheetnode with matching id in database.');
}
foreach($sheetnodes as $sheetnode){
$sheet = socialcalc_parse_sheet((string) $sheetnode->value);
}
// transpose values into an easy-to-reference 2d array
$rows = array();
foreach($sheet['cells'] as $loc => $cell){
$row = preg_replace('/[^0-9]/', '',$loc);
$col = preg_replace('/[0-9]/', '',$loc);
$rows[$row][$col] = $cell['datavalue'];
}
$unmerged_companies = array();
$last_company_name = '';
foreach($rows as $k => $row){
$mapped_row = array();
foreach($row as $row_key => $row_val){
$mapped_row[$col_mapping[$row_key]] = $row_val;
}
$company = cloud_computing_data_company::build((object)$mapped_row);
if (!(empty($company->name))){
$last_company_name = $company -> name;
} else {
$company -> name = $last_company_name;
}
if (!isset($unmerged_companies[$company -> name])){
$unmerged_companies[$company -> name] = array();
}
$unmerged_companies[$company -> name][] = $company;
}
$companies = array();
foreach($unmerged_companies as $name => $company_group){
$company = cloud_computing_data_company::merge($company_group);
if (strtolower($company -> name) != 'company'){
$companies[$company -> name] = $company;
}
}
// clear existing data
$query = db_delete('cloud_computing_capability_data') -> where(1);
$query -> execute();
// insert new values into database.
$query = db_insert('cloud_computing_capability_data');
$query -> fields(cloud_computing_data_company::db_fields());
$ccid = 0;
foreach($companies as $name => $row){
$delta = 0;
$row->ccid = $ccid;
$row->delta = $delta;
$query->values($row->db_values());
$ccid++;
}
$query->execute();
drupal_set_message('The CIO-SP3 / SB Cloud Computing database has been updated!');
drupal_set_message("Debug info: $ccid companies recognized and added to database.");
drupal_goto("node/$nid");
return array();
}
Try Glossary mode of view. See this http://www.youtube.com/watch?v=18Ajtmstxsg

PHP optional function arguments with array. How to code / Better way to code?

I'm sure there is a better to this. Any help will be greatly appreciated.
I want to pass an array to a php function that contains the argument and all the arguments are optional. I'm using code ignitor and am by no means an expert. Below is what i have been using so far:
function addLinkPost($postDetailArray) {
if (isset($postDetailArray['title'])) {
$title = $postDetailArray['title']; }
else {
$title = "Error: No Title";
}
if (isset($postDetailArray['url'])) {
$url = $postDetailArray['url'];
} else {
$url = "no url";
}
if (isset($postDetailArray['caption'])) {
$caption = $postDetailArray['caption'];
} else {
$caption = "";
}
if (isset($postDetailArray['publish'])) {
$publish = $postDetailArray['publish'];
} else {
$publish = TRUE;
}
if (isset($postDetailArray['postdate'])) {
$postdate = $postDetailArray['postdate'];
} else {
$postdate = "NOW()";
}
if (isset($postDetailArray['tagString'])) {
$tagString = $postDetailArray['tagString'];
} else {
$tagString = "";
}
You can use an array of defaults and then merge the argument array with the defaults. The defaults will be overridden if they appear in the argument array. A simple example:
$defaults = array(
'foo' => 'aaa',
'bar' => 'bbb',
'baz' => 'ccc',
);
$options = array(
'foo' => 'ddd',
);
$merged = array_merge($defaults, $options);
print_r($merged);
/*
Array
(
[foo] => ddd
[bar] => bbb
[baz] => ccc
)
*/
In your case, that would be:
function addLinkPost($postDetailArray) {
static $defaults = array(
'title' => 'Error: No Title',
'url' => 'no url',
'caption' => '',
'publish' => true,
'postdate' => 'NOW()',
'tagString' => '',
);
$merged = array_merge($defaults, $postDetailArray);
$title = $merged['title'];
$url = $merged['url'];
$caption = $merged['caption'];
$publish = $merged['publish'];
$postdate = $merged['postdate'];
$tagString = $merged['$tagString'];
}
You could do it like this:
function addLinkPost(array $postDetailArray)
{
$fields = array(
'key' => 'default value',
'title' => 'Error: No Title',
);
foreach ($fields as $key => $default) {
$$key = isset($postDetailArray[$key]) ? $postDetailArray[$key] : $default;
}
}
Simply edit the $fields array with your key and its default value.
Using the array as an argument is a good idea in this case. However, you could simplify the code in the function a bit by using the ternary operator (http://dk.php.net/ternary):
$title = isset($postDetailArray['title']) ? $postDetailArray['title'] : 'Error: No Title';
You could simplify it even more by doing the following:
function addLinkPost($data) {
$arguments = array('title', 'url', 'caption', 'publish', 'postdate', 'tagString');
foreach ($arguments as $value) {
$$value = isset($data[$value]) ? $data[$value] : 'Error: No '.$value;
}
}
Try this:
function addLinkPost($postDetailArray) {
foreach($array as $key=>$value){
$$key = (isset($value) && !empty($value)) ? $value : ('no '.$key);
}
//all keys are available as variables
var_dump($url); var_dump($publish); //etc
}
You could make all elements of the array parameters of the function. Check if the first is an array in the function and if so, extract the array.
function addLinkPost($title = null, $url = null, $caption = null, $publish = null, $postDate = null, $tagString = null)
{
if(is_array($title)) {
extract($title);
}
....
}
Maybe that makes the code a little more clear.
How about:
function getdefault($value, $default = null) {
return isset($value) ? $value : $default;
}
function addLinkPost($postDetailArray) {
$title = getdefault($postDetailArray['title'], 'Error: No Title');
$url = getdefault($postDetailArray['url'], 'no url');
$caption = getdefault($postDetailArray['caption'], '');
$publish = getdefault($postDetailArray['publish'], TRUE);
$postdate = getdefault($postDetailArray['postdate'], 'NOW()');
$tagString = getdefault($postDetailArray['tagString'], '');
}
or alternatively:
$defaults = array(
'title' => 'Error: No Title',
'url' => 'no url',
'caption' => '',
'publish' => TRUE,
'postdate' => 'NOW()',
'tagString' => '',
);
function addLinkPost($postDetailArray) {
global $defaults;
foreach ($defaults as $k => $v) {
$$k = isset($postDetailArray[$k]) ? $postDetailArray[$k] : $v;
}
}
With the one warning that if you have an array key of 'defaults' in $defaults, it will overwrite the global $defaults.

Categories