/**
     * Get all features, which has values for product
     * 
     * @param int $is_lang Language on which we should return labels and values of features
     * @param bool $withGroups whether we should return features with groups or not
     * @return array of features. @see parent::getFrontFeatures()
     */
    public function getFrontFeatures($id_lang, $withGroups = true)
    {
        if (!$withGroups) {
            return parent::getFrontFeatures($id_lang);
        }
        $id_product = $this->id;
        if (!array_key_exists($this->id . '-' . $id_lang, self::$_frontFeaturesCache)) {
            self::$_frontFeaturesCache[$this->id . '-' . $id_lang] = Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS('
			SELECT 
                fl.name AS feature_name, 
                value, 
                pf.id_feature, 
                fgl.id_group, 
                fgl.name AS feature_group_name,
                fg.position AS group_position,
                f.position AS feature_position
			FROM ' . _DB_PREFIX_ . 'feature_product pf
            LEFT JOIN ' . _DB_PREFIX_ . 'feature f ON pf.id_feature=f.id_feature
            LEFT JOIN ' . _DB_PREFIX_ . 'feature_group fg ON f.id_group=fg.id_group
            LEFT JOIN ' . _DB_PREFIX_ . 'feature_group_lang fgl ON (fg.id_group=fgl.id_group AND fgl.id_lang = ' . (int) $id_lang . ')
			LEFT JOIN ' . _DB_PREFIX_ . 'feature_lang fl ON (fl.id_feature = pf.id_feature AND fl.id_lang = ' . (int) $id_lang . ')
			LEFT JOIN ' . _DB_PREFIX_ . 'feature_value_lang fvl ON (fvl.id_feature_value = pf.id_feature_value AND fvl.id_lang = ' . (int) $id_lang . ')
			WHERE pf.id_product = ' . intval($this->id));
        }
        $result = array();
        foreach (self::$_frontFeaturesCache[$id_product . '-' . $id_lang] as $frecord) {
            if (!$frecord['id_group'] || !$frecord['id_feature']) {
                continue;
            }
            if (!array_key_exists($frecord["id_group"], $result)) {
                $result[$frecord["id_group"]] = array("name" => $frecord['feature_group_name'], "position" => $frecord["group_position"], 'features' => array());
            }
            $result[$frecord['id_group']]['features'][$frecord['id_feature']] = array("name" => $frecord['feature_name'], "position" => $frecord["feature_position"], 'value' => $frecord["value"]);
        }
        uasort($result, array($this, 'sortFeaturesGroupsByPositionCallback'));
        foreach ($result as $group_id => &$group_data) {
            uasort($group_data["features"], array($this, 'sortFeaturesByPositionCallback'));
        }
        return $result;
    }