1. Hugh is now back at work, more or less full time, after a slower than expected recovery from his neck surgery early this month. Obviously we have a backlog of support to clear, and are working as hard as we can to take care of it. If you have an unanswered thread more than 3 days old, please post one (and only one) "bump" on it, to move it in to our "last 3 days" list. If you have an unanswered issue in a forum you no longer have access to due to subscriptions timing out, please use the Contact Us form, and provide us with the URL to the thread.

Opening connections to other than the Joomla DB

Discussion in 'Standard Support' started by mccarty, Mar 18, 2010.

  1. mccarty New Member

    Level: Community
    Hi,

    I am storing the data for an application in a separate database and have a fabrik connection defined for it. I want to do a variety of operations to pull certain fields from the DB as part of some server-side validation, but of course I cannot just use "$db =& JFactory::getDBO();" to access it.

    Is there an existing method within the Fabrik environment to open a DB connection for other than the Joomla DB without having to retrieve the DB uid/password from the _fabrik_connections table (or elsewhere) myself and then calling mysql_connect() directly?

    (If this doesn't exist, it would be nice to have in the toolbox... :) )

    --Rick
  2. rob Administrator

    Level: Community
    PHP:

    $options        = array ( 'driver' => $driver, 'host' => $host, 'user' => $user, 'password' => $password, 'database' => $database, 'prefix' => $prefix );
     $dbs[$cn->id] =& JDatabase::getInstance( $options );
     
    to get an idea of the values for $driver etc you can load in J's default config values:

    PHP:

    $conf =& JFactory::getConfig();
          $host         = $conf->getValue('config.host');
          $user         = $conf->getValue('config.user');
          $password     = $conf->getValue('config.password');
          $database    = $conf->getValue('config.db');
          $prefix     = $conf->getValue('config.dbprefix');
          $driver     = $conf->getValue('config.dbtype');
          $debug         = $conf->getValue('config.debug');
     
  3. cheesegrits Support Gopher

    Level: Community
    So where does $cn->id come from?

    -- hugh
  4. mccarty New Member

    Level: Community
    I probably should have been a bit clearer with my question. I am already using JDatabase::getInstance - I just reflexively wrote mysql_connect() out of habit.

    The question really was how can I get at the connection parameters for a database stored in Fabrik's connection table? I know I can do a query myself (and I have, as a workaround), but it seems to me that it would be a good thing to be able to access it through a Fabrik-supplied interface instead.

    To be more specific - is there an internal Fabrik interface I can use instead of having to use the following code I wrote to handle this:

    function mwGetFabrikDBInfo($dbname)
    {
    $db = JFactory::getDBO();

    $query = "
    SELECT ".$db->nameQuote('host').",
    ".$db->nameQuote('user').",
    ".$db->nameQuote('password')."
    FROM ".$db->nameQuote('#__fabrik_connections')."
    WHERE ".$db->nameQuote('database')." = ".$db->quote($dbname).";
    ";

    $db->setQuery($query);
    $result = $db->loadObject();

    if ($db->getErrorNum()) {
    jexit('(mwGetFabrikDBInfo) Database query Error: ' . $db->getErrorMsg() );
    }

    return ($result);
    }

    function mwOpenFabrikDB($dbname, $host, $user, $password)
    {
    $parms = array();

    $parms['driver'] = 'mysql';
    $parms['host'] = $host;
    $parms['user'] = $user;
    $parms['password'] = $password;
    $parms['database'] = $dbname;
    $parms['prefix'] = '';
    $db =& JDatabase::getInstance($parms);

    if (JError::isError($db)) {
    jexit('(mwOpenFabrikDB) JDatabase::getInstance: Database open Error: ' . $db->toString() );
    }

    return ($db);
    }

    $dbinfo = mwGetFabrikDBInfo($dbname);
    $db = mwOpenFabrikDB($dbname, $dbinfo->host, $dbinfo->user, $dbinfo->password);

    Best regards,

    Rick
  5. amilks New Member

    Level: Community
    Friendly Bump...
  6. amilks New Member

    Level: Community
    Hugh, a friendly bump.... We talked about this on skype
  7. cheesegrits Support Gopher

    Level: Community
    I'm without power at my house at the moment (lightning storm last night), sitting at a coffee shop. So I don't have access to my test server to look at the code. Bump this again tomorrow.

    -- hugh
  8. amilks New Member

    Level: Community
    LOL! :eek: Will do
  9. cheesegrits Support Gopher

    Level: Community
    Testing some code, will hopefully get back to you today on this one.

    -- hugh
  10. cheesegrits Support Gopher

    Level: Community
    Try this:

    PHP:
    $cn = JModel::getInstance('Connection', 'FabrikModel');
    $cn->setId(2);
    $db =& $cn->getDb();
    -- hugh
  11. amilks New Member

    Level: Community
    Here is the exact code I am using:

    User_Ajax.php

    Code (text):
    class userAjax {
    function getStudent(){
    $cn = JModel::getInstance('Connection', 'FabrikModel');
    $cn->setId(2);
    $db =& $cn->getDb();
    $checkId = JRequest::getVar('idField', '');
    $query = "SELECT * from jos_fbkstudents WHERE student_id = '$checkId' LIMIT 1";
    $db->setQuery($query);
    $results = $db->loadObjectList();
    echo json_encode($results);
    }
    }
    3.js

    Code (text):
    function doCalc(){
    var total = 0;
    var type = form_3.formElements.get('jos_signups___signup_type').getValue();
    var question = form_3.formElements.get('jos_signups___current_student_q').getValue(); //question
    var url = 'index.php?option=com_fabrik&format=raw&controller=plugin&c=plugin&task=userAjax';
    var idField = $('jos_signups___student_id').getValue(); //id field
    var originalId = $('jos_signups___student_id'); //id field
    var verifyIdField = $('jos_signups___verify_id'); //verify id field
    var updateEmail = $('jos_signups___email'); //student email
    var updateName = $('jos_signups___name'); //student name
    var updateAddress1 = $('jos_signups___address1'); //street address
    var updateAddress2 = $('jos_signups___address2'); //street address 2
    var updateCity = $('jos_signups___city'); //city
    var updateState = $('jos_signups___state'); //state
    var updateZip = $('jos_signups___zip'); //zip
    var updateCountry = $('jos_signups___country'); //country
    var updatePrePhone = $('jos_signups___pre_phone'); //preferred phone
    var updateAltPhone = $('jos_signups___alt_phone') //alternate phone
    var updateFax = $('jos_signups___fax'); //fax
    var date1 = $('jos_signups___date1');
    var specialDate = form_3.formElements.get('jos_signups___datespecial').getValue();

    new Ajax(url,{
    data:{method:'getStudent',
    'idField':idField},

    onComplete:function(r){
    var student_info = Json.decode(r);
    verifyIdField.value = student_info[0].student_id;
    updateEmail.value = student_info[0].email;
    updateName.value = student_info[0].name;
    updateAddress1.value = student_info[0].address1;
    updateAddress2.value = student_info[0].address2;
    updateCity.value = student_info[0].city;
    updateState.value = student_info[0].state;
    updateZip.value = student_info[0].zip;
    updateCountry.value = student_info[0].country;
    updatePrePhone.value = student_info[0].pre_phone;
    updateAltPhone.value = student_info[0].alt_phone;
    updateFax.value = student_info[0].fax;
    if (type == "1") {
    $('jos_signups___cost').value = 400;  
    $('group5').hide();
    $('jos_signups___group_name').hide();
    $('fb_el_jos_signups___group_name_text').hide();
    if (question == "2" && originalId.value == verifyIdField.getValue() && originalId.value != '') {
    $('jos_signups___cost').value = 199;
    $('fb_el_jos_signups___signup_type_text').hide();
    $('jos_signups___paypal_desc').value = 'Total Terminology Course, ' + specialDate + ', student id ' + originalId.getValue();
    date1.value = specialDate;
    $('jos_signups___datespecial').show();
    $('fb_el_jos_signups___datespecial_text').show();
    $('jos_signups___date1').hide();
    $('fb_el_jos_signups___date1_text').hide();
    $('jos_signups___date2').hide();
    $('fb_el_jos_signups___date2_text').hide();
    $('jos_signups___date3').hide();
    $('fb_el_jos_signups___date3_text').hide();
    $('jos_signups___signup_type').hide();
    $('fb_el_jos_signups___signup_type_text').hide();
    $('jos_signups___signup_type_text').show();
    $('fb_el_jos_signups___signup_type_text_text').show();
    }
    else {  
    $('jos_signups___cost').value = 400;
    $('jos_signups___signup_type').show();
    $('fb_el_jos_signups___signup_type_text').show();
    $('jos_signups___paypal_desc').value = 'Total Terminology Course, ' + date1.getValue();
    $('jos_signups___datespecial').hide();
    $('fb_el_jos_signups___datespecial_text').hide();
    $('jos_signups___date1').show();
    $('fb_el_jos_signups___date1_text').show();
    $('jos_signups___date2').show();
    $('fb_el_jos_signups___date2_text').show();
    $('jos_signups___date3').show();
    $('fb_el_jos_signups___date3_text').show();
    $('jos_signups___signup_type').show();
    $('fb_el_jos_signups___signup_type_text').show();
    $('jos_signups___signup_type_text').hide();
    $('fb_el_jos_signups___signup_type_text_text').hide();
    }
    }
    else if (type == "2") {
    $('group5').show();
    $('jos_signups___group_name').show();
    $('fb_el_jos_signups___group_name_text').show();
    $('group5').getElements('input[id^=jos_signups___group_subcost]').each(
       function(i){
        total += i.getValue().toInt();
         $('jos_signups___cost').value = total;
         if ($('jos_signups___cost').value <= 1200) {
           $('jos_signups___cost').value = 1200;
           }
         else {
         $('jos_signups___cost').value = total;
         }
       })}
    }}).request();};
    And here is the error I am getting:

    Code (text):
    missing ) in parenthetical
    http://website.com/components/com_fabrik/libs/mootools1.2/mootools-1.2.js
    Line 255
    Hope this helps. Maybe I am just doing something a LITTLE wrong.
    1 person likes this.

Share This Page