error code : 1305 is specific to mysql when it does not recognise a function., in this case, "ifnull". you should probably upgrade your mysql version.

the following link contains some theme:
https://frontaccounting.com/wbt/pages/download/download-themes.php
if you want to create your own theme, it's quiet easy

28

(2 replies, posted in FA Modifications)

there is a lot of (free) tools available: Aptana studio (An eclipse based IDE), Komodo Edit. i personnaly use Netbeans as an IDE and xdebug for debugging. it's also  a good idea to turn on the $go_debug variable in the config.php, to see error messages. you'll need sometimes to turn off javascript in your browser.

well, the easist and  the fastest way for doi it is to edit the customers.php under the applications folder.
you just have to modify the $label variable for the menu item you want to change.

add_lapp_function($level, $label, $link = "", $access = 'SA_OPEN', $category = '')  or add_rapp_function($level, $label, $link = "", $access = 'SA_OPEN', $category = '')  : lapp/rapp (stands for [b] left/right [/b] application)

as for the menu title in the main menu, you need to change, the $name variable ("ordres" to whatever is your need)

$this->application("orders", _($this->help_context = "&Sales"));

keep in mind that if you change the displayed text directly in the source code, you wont be able to use any translation for it, you'll need to do some customization to you .po file.

30

(17 replies, posted in FA Modifications)

you sure have a point. but actually i was just reading FA's code so i can figured out how things are working.
i intend to use FA as an ERP in my company and i certainly will need to do some heavy costumization, and yes i might choose a more advanced orm.
the example i posted was made in 15 min (not my best shot).
Anyway, i'll share the code once it's made and fully tested.
thanx

31

(17 replies, posted in FA Modifications)

hello yall,
i was wondering why FA keeps using mysql_connect and other old functions, the $godebug=1 keeps reminding me that these fucntions are indeed deprecated and will be no longer supported by future php release?!!
At the same time i had a look at webERP source code which actually support mysqli, mariadb and even postrgres.
Anyway, i rewrited connect_db.inc, 15 min of work, i even borrowed the DB_escape_string() (thanks guys) from webERP, and FA works just fine. well here's the code, feel free to try it or modify it and i'll be very glad if you have any suggestions/comments or improvements ...

<?php

function set_global_connection($company = -1) {
    global $db, $transaction_level, $db_connections;

    cancel_transaction(); // cancel all aborted transactions if any
    $transaction_level = 0;

    if ($company == -1)
        $company = $_SESSION["wa_current_user"]->company;

    $_SESSION["wa_current_user"]->cur_con = $company;

    $connection = $db_connections[$company];
    $db = mysqli_connect($connection["host"], $connection["dbuser"], $connection["dbpassword"]);
    mysqli_select_db($db, $connection["dbname"]);
    return $db;
}

$db_duplicate_error_code = 1062;

//DB wrapper functions to change only once for whole application

function db_query($sql, $err_msg = null) {
    global $db, $show_sql, $sql_trail, $select_trail, $go_debug, $sql_queries, $Ajax,
    $db_connections, $db_last_inserted_id;

    // set current db prefix
    $cur_prefix = $db_connections[$_SESSION["wa_current_user"]->cur_con]['tbpref'];
    $sql = str_replace(TB_PREF, $cur_prefix, $sql);

    if ($show_sql) {
        $Ajax->activate('footer_debug');
        $sql_queries .= "<pre>$sql</pre>\n<hr>";
    }

    //$result = mysql_query($sql, $db);
    $result = mysqli_query($db, $sql);

    if ($sql_trail) {
        $db_last_inserted_id = mysql_insert_id($db); // preserve in case trail insert is done
        if ($select_trail || (strstr($sql, 'SELECT') === false)) {
            mysqli_query($db, "INSERT INTO " . $cur_prefix . "sql_trail
                (`sql`, `result`, `msg`)
                VALUES(" . db_escape($sql) . "," . ($result ? 1 : 0) . ",
                " . db_escape($err_msg) . ")");
        }
    }

    if ($err_msg != null || $go_debug) {
        $exit = $err_msg != null;
        if (function_exists('xdebug_call_file'))
            check_db_error('<br>At file ' . xdebug_call_file() . ':' . xdebug_call_line() . ':<br>' . $err_msg, $sql, $exit);
        else
            check_db_error($err_msg, $sql, $exit);
    }
    return $result;
}

function db_fetch_row($result) {
    return mysqli_fetch_row($result);
}

function db_fetch_assoc($result) {
    return mysqli_fetch_assoc($result);
}

function db_fetch($result) {
    return mysqli_fetch_array($result);
}

function db_seek(&$result, $record) {
    return mysqli_data_seek($result, $record);
}

function db_free_result($result) {
    if ($result)
        mysqli_free_result($result);
}

function db_num_rows($result) {
    return mysqli_num_rows($result);
}

function db_num_fields($result) {
    return mysqli_num_fields($result);
}

function db_escape($value = "", $nullify = false) {
    $value = @html_entity_decode($value, ENT_QUOTES, $_SESSION['language']->encoding);
    $value = @htmlspecialchars($value, ENT_QUOTES, $_SESSION['language']->encoding);

    //reset default if second parameter is skipped
    $nullify = ($nullify === null) ? (false) : ($nullify);

    //check for null/unset/empty strings
    if ((!isset($value)) || (is_null($value)) || ($value === "")) {
        $value = ($nullify) ? ("NULL") : ("''");
    } else {
        if (is_string($value)) {
            //value is a string and should be quoted; determine best method based on available extensions
            if (function_exists('mysql_real_escape_string')) {
                $value = "'" . DB_escape_string($value) . "'";
            } else {
                $value = "'" . DB_escape_string($value) . "'";
            }
        } else if (!is_numeric($value)) {
            //value is not a string nor numeric
            display_error("ERROR: incorrect data type send to sql query");
            echo '<br><br>';
            exit();
        }
    }
    return $value;
}

function db_error_no() {
    global $db;
    return mysqli_connect_errno();
}

function db_error_msg($conn) {
    return mysqli_error($conn);
}

function db_insert_id() {
    global $db_last_inserted_id, $sql_trail, $db;
    return $sql_trail ? $db_last_inserted_id : mysqli_insert_id($db);
}

function db_num_affected_rows() {
    global $db;
    return mysqli_affected_rows($db);
}

function db_field_name($result, $n) {
    return mysqli_field_name($result, $n);
}

function db_create_db($connection) {
    $db = mysqli_connect($connection["host"], $connection["dbuser"], $connection["dbpassword"]);
    if (!mysqli_select_db($db, $connection["dbname"])) {
        $sql = "CREATE DATABASE IF NOT EXISTS " . $connection["dbname"] . "";
        if (!mysqli_query($db, $sql) || !mysqli_select_db($db, $connection["dbname"]))
            return 0;
    }
    return $db;
}

function db_drop_db($connection) {
    if ($connection["tbpref"] == "") {
        $sql = "DROP DATABASE IF EXISTS " . $connection["dbname"] . "";
        return mysqli_query($db, $sql);
    } else {
        $res = db_query("show table status");
        $all_tables = array();
        while ($row = db_fetch($res))
            $all_tables[] = $row;
        // get table structures
        foreach ($all_tables as $table) {
            if (strpos($table['Name'], $connection["tbpref"]) === 0) {
                db_query("DROP TABLE `" . $table['Name'] . "`");
            }
        }
        //deleting the tables, how??
        return true;
    }
}

function db_close($dbase = null) {
    global $db;

    if (!$dbase)
        $dbase = $db;
    return mysqli_close($dbase);
}

function DB_escape_string($String) {
    global $db;
    return mysqli_real_escape_string($db, htmlspecialchars($String, ENT_COMPAT, 'utf-8', false));
}

?>