Projekt

Obecné

Profil

« Předchozí | Další » 

Revize 445

Přidáno uživatelem Jiří Sviták před asi 15 roky(ů)

Pridan export polozek zavislych na podsiti, tj. ip adresy, rozhrani, zarizeni, uzivatele, clenove... Proste takova vychytavka na vypis lidi a zarizeni na APcku.

Zobrazit rozdíly:

freenetis/trunk/kohana/application/i18n/cs_CZ/texts.php
'device information' => 'Informace o zařízení',
'device list of user' => 'Seznam zařízení uživatele',
'device name' => 'Název zařízení',
'device_name' => 'Název zařízení',
'device still has at least one interface' => 'Zařízení má ještě nejméně jedno rozhraní.',
'device still has at least one port' => 'Zařízení má ještě nejméně jeden port.',
'device_type' => 'Typ zařízení',
'devices list' => 'Seznam zařízení',
'devices' => 'Zařízení',
'display member' => 'Zobraz člena',
......
'identified payment' => 'Identifikovaná platba',
'ignore' => 'Ignorovat',
'import new invoice' => 'Import nové faktury',
'import results' => 'Výsledky importu',
'information' => 'Informace',
'information about first user' => 'Informace o prvním uživateli',
'infrastructure account' => 'Účet infrastruktury',
......
'ip addresses list' => 'Seznam IP adres',
'ip addresses list of member' => 'Seznam IP adres člena',
'ip addresses' => 'IP adresy',
'ip_address' => 'IP adresa',
'it is possible to deduct fees only in one year' => 'Členské příspěvky je možné strhávat jen v rámci jednoho roku.',
'item number' => 'Položka č.',
'item separator' => 'Oddělovač položek',
......
'login data' => 'Přihlašovací údaje',
'login logs' => 'Logy přihlášení',
'login name' => 'Přihlašovací jméno',
'login_name' => 'Přihlašovací jméno',
'login to' => 'Přihlášení',
'login' => 'Přihlásit',
'logout' => 'Odhlásit',
......
'member has been successfully updated' => 'Člen byl úspěšně upraven.',
'member id' => 'ID člena',
'member name' => 'Jméno člena (organizace)',
'member_name' => 'Jméno člena (organizace)',
'members account' => 'Účet člena',
'members' => 'Členové',
'membership can be ended only to former member' => 'Členství může být ukončeno jen bývalému členovi.',
......
'segment detail' => 'Detail segmentu',
'segment has been successfully saved' => 'Segment byl úspěšně uložen.',
'segment name' => 'Název segmentu',
'segment_name' => 'Název segmentu',
'segments list' => 'Seznam segmentů',
'segments' => 'Segmenty',
'select' => 'Vyber',
......
'subnet has been successfully deleted' => 'Podsíť byla úspěšně smazána.',
'subnet has not been selected' => 'Podsíť nebyla vybrána.',
'subnet still has at least one ip address' => 'Podsíť má ještě nejméně jednu IP adresu.',
'subnets list' => 'Seznam podsítí',
'subnet_name' => 'Název podsítě',
'subnets list' => 'Seznam podsítí',
'subnets' => 'Podsítě',
'supplier' => 'Dodavatel',
'suppliers account' => 'Účet dodavatelů',
......
'user has been successfully added' => 'Uživatel byl úspěšně přidán.',
'user has been successfully deleted' => 'Uživatel byl úspěšně smazán.',
'user has been successfully updated' => 'Uživatel byl úspěšně upraven.',
'username already exists in database' => 'Uživatelské jméno již v databázi existuje',
'user_name' => 'Křestní jméno',
'username already exists in database' => 'Uživatelské jméno již v databázi existuje',
'username or password do not match' => 'Uživatelské jméno nebo heslo nesouhlasí',
'username' => 'Login',
'users' => 'Uživatelé',
......
'value for earning' => 'Hodnota pro příjem',
'value has not been entered' => 'Hodnota nebyla zadána.',
'variable symbol' => 'Variabilní symbol',
'variable_symbol' => 'Variabilní symbol',
'variable symbol already exists in database' => 'Variabilní symbol už existuje v databázi.',
'vat' => 'DPH',
'vlan detail' => 'Detail VLANu',
freenetis/trunk/kohana/application/models/subnet.php
{
return self::$db->count_records('subnets');
}
/**
* Function gets items of subnet to export.
* @param $subnet_id
* @return unknown_type
*/
public function get_items_of_subnet($subnet_id)
{
return self::$db->query("SELECT
su.id, su.name AS subnet_name,
ip.ip_address,
i.mac,
se.name AS segment_name,
d.name AS device_name,
IFNULL(f.translated_term, e.value) AS device_type,
u.name AS user_name, u.surname, u.phone,
m.name AS member_name, m.variable_symbol, m.entrance_date,
st.street, ap.street_number,
t.town, t.quarter, t.zip_code,
m.comment
FROM subnets su
LEFT JOIN ip_addresses ip ON ip.subnet_id = su.id
LEFT JOIN ifaces i ON i.id = ip.iface_id
LEFT JOIN segments se ON se.id = i.segment_id
LEFT JOIN devices d ON d.id = i.device_id
LEFT JOIN enum_types e on d.type = e.id
LEFT JOIN (SELECT * FROM translations WHERE lang = '".Config::item('locale.lang')."') f ON e.value = f.original_term
LEFT JOIN users u ON u.id = d.user_id
LEFT JOIN members m ON m.id = u.member_id
LEFT JOIN address_points ap ON ap.id = m.address_point_id
LEFT JOIN towns t ON t.id = ap.town_id
LEFT JOIN streets st ON st.id = ap.street_id
WHERE su.id = $subnet_id
ORDER BY ip_address
");
}
}
?>
freenetis/trunk/kohana/application/models/member.php
*/
public function get_all_members_to_export()
{
self::$db->query("SET CHARACTER SET 'utf8'");
self::$db->query("SET collation_connection=utf8_czech_ci");
return self::$db->query("SELECT m.id,
m.registration,
m.name,
m.registration, m.name AS member_name, m.variable_symbol,
s.street, ap.street_number,
t.town, t.quarter,
u.phone, u.email, u.login, u.birthday,
u.phone, u.email, u.login AS login_name, u.birthday,
m.entrance_date,
IF(m.leaving_date = '0000-00-00', null, m.leaving_date) AS leaving_date,
IFNULL(f.translated_term, e.value) AS type, m.comment
freenetis/trunk/kohana/application/controllers/members.php
$query = $model_members->get_all_members($sql_offset, (int)$limit_results, $order_by, $order_by_direction, $filter->values());
// it creates grid to view all members
$grid = new Grid(url_lang::base().'members', url_lang::lang('texts.List of all members'), array(
$headline = url_lang::lang('texts.List of all members');
$grid = new Grid(url_lang::base().'members', $headline, array(
//'separator' => '<br />-----------',
//'use_paginator' => false,
//'use_selector' => false,
......
//$grid->action_field('member_id') ->label(url_lang::lang('texts.Delete')) ->url(url_lang::base().'members/delete') ->action(url_lang::lang('texts.Delete'))->script('onclick="return potvrd(\''.url_lang::lang('texts.delete_member').'\');"');
$grid->datasource($query);
$view = new View('template');
$view->header = new View('base/header');
$view = new View('main');
$view->title = $headline;
$view->content = $grid;
$view->footer = new View('base/footer');
$view->header->menu = Controller::render_menu();
$view->header->title = url_lang::lang('texts.List of all members');
$view->render(TRUE);
} // end of show_all function
......
$voip_grid->action_field('user_id')->label(url_lang::lang('texts.User'))->url(url_lang::base().'users/show')->action(url_lang::lang('texts.Show'));
$voip_grid->datasource($voip);
$view = new View('template');
$view->header = new View('base/header');
$view = new View('main');
$view->header->title = url_lang::lang('texts.Display member');
$view->content = new View('members/show');
$view->footer = new View('base/footer');
$view->header->title = url_lang::lang('texts.Display member');
$view->header->menu = Controller::render_menu();
$view->content->users = $user_grid;
$view->content->voip = $voip_grid;
$view->content->voip = $voip_grid;
$view->content->mis = $mi_grid;
$view->content->account_balance = $account_balance;
foreach($member_data as $key=>$val)
......
}
else
{
$view->form = new View('registration');
$view = new View('template');
$view->header = new View('base/header');
$headline = url_lang::lang('texts.Add new member');
$view = new View('main');
$view->title = $headline;
$view->content = new View('form');
$view->footer = new View('base/footer');
$view->header->menu = Controller::render_menu();
$view->header->title = url_lang::lang('texts.Add new member');
$view->header->other_styles = html::stylesheet('media/css/forms.css');
$view->content->headline = url_lang::lang('texts.Add new member');
$view->content->headline = $headline;
$view->content->form = $form->html();
$view->content->link_back = html::anchor(url_lang::base().'members/show_all/',url_lang::lang('texts.Back to list of members'));
$view->render(TRUE);
......
}
else
{
$view = new View('template');
$view->header = new View('base/header');
$view = new View('main');
$view->title = url_lang::lang('texts.Edit member');
$view->content = new View('form');
$view->footer = new View('base/footer');
$view->header->menu = Controller::render_menu();
$view->header->title = url_lang::lang('texts.Edit member');
$view->content->headline = url_lang::lang('texts.Editing of member').' '.$member_data->pre_title.' '.$member_data->name.' '.$member_data->middle_name.' '.$member_data->surname.' '.$member_data->post_title;
$view->content->form = $form->html();
$view->content->link_back = html::anchor(url_lang::base().'members/show/'.$member_data->member_id,url_lang::lang('texts.Back to the member'));
freenetis/trunk/kohana/application/controllers/subnets.php
* @param $page
* @return unknown_type
*/
function show_all($limit_results = 400, $order_by = 'id', $order_by_direction = 'ASC', $page_word = null, $page = 1)
function show_all($limit_results = 200, $order_by = 'id', $order_by_direction = 'ASC', $page_word = null, $page = 1)
{
if (!$this->acl_check_view('Devices_Controller', 'subnet'))
Controller::error(1);
Controller::error(ACCESS);
// get new selector
if (is_numeric($this->input->get('record_per_page'))) $limit_results = (int) $this->input->get('record_per_page');
$subnet_model = new Subnet_Model();
......
//'use_paginator' => false,
//'use_selector' => false,
'current' => $limit_results, // current selected 'records_per_page' value
'selector_increace' => 200, // increace
'selector_increace' => 200, // increace
'selector_min' => 200, // minimum where selector start
'selector_max_multiplier' => 100,
'base_url' => Config::item('locale.lang').'/devices/show_all/'.$limit_results.'/'.$order_by.'/'.$order_by_direction ,
......
$grid->order_field('name')->label(url_lang::lang('texts.name'));
$grid->order_field('network_address')->label(url_lang::lang('texts.Network address'));
$grid->order_field('netmask')->label(url_lang::lang('texts.Netmask'));
$grid->order_field('OSPF_area_id')->label(url_lang::lang('texts.OSPF area ID'));
//$grid->order_field('OSPF_area_id')->label(url_lang::lang('texts.OSPF area ID'));
if ($this->acl_check_view('Devices_Controller', 'subnet'))
$grid->action_field('id')->label(url_lang::lang('texts.Show')) ->url(url_lang::base().'subnets/show') ->action(url_lang::lang('texts.Show'))->class('center');
$grid->action_field('id')->label(url_lang::lang('texts.Subnet')) ->url(url_lang::base().'subnets/show') ->action(url_lang::lang('texts.Show'))->class('center');
if ($this->acl_check_edit('Devices_Controller', 'subnet'))
$grid->action_field('id')->label(url_lang::lang('texts.Edit')) ->url(url_lang::base().'subnets/edit') ->action(url_lang::lang('texts.Edit'))->class('center');
$grid->action_field('id')->label(url_lang::lang('texts.Subnet')) ->url(url_lang::base().'subnets/edit') ->action(url_lang::lang('texts.Edit'))->class('center');
if ($this->acl_check_delete('Devices_Controller', 'subnet'))
$grid->action_field('id')->label(url_lang::lang('texts.Delete')) ->url(url_lang::base().'subnets/delete') ->action(url_lang::lang('texts.Delete'))->class('center')->script('onclick="return potvrd(\''.url_lang::lang('texts.Do you want to delete this subnet').'\');"');
$grid->action_field('id')->label(url_lang::lang('texts.Subnet')) ->url(url_lang::base().'subnets/delete') ->action(url_lang::lang('texts.Delete'))->class('center')->script('onclick="return potvrd(\''.url_lang::lang('texts.Do you want to delete this subnet').'\');"');
$grid->datasource( $query );
$this->template->content = $grid;
$view = new View('template');
$view->header = new View('base/header');
$view->header->title = url_lang::lang('texts.Subnets list');
$view->header->menu = Controller::render_menu();
$headline = url_lang::lang('texts.Subnets list');
$view = new View('main');
$view->title = $headline;
$view->content = new View('show_all');
$view->content->table = $this->template->content;
$view->content->headline = url_lang::lang('texts.Subnets list');
$view->footer = new View('base/footer');
$view->content->table = $grid;
$view->content->headline = $headline;
$view->render(TRUE);
} // end of show all
......
*/
function show($subnet_id)
{
if (!isset($subnet_id))
Controller::warning(PARAMETER);
$subnet = new subnet_Model($subnet_id);
if (!isset($subnet_id) || $subnet->id == 0) {
Controller::warning(1);
}
if (!$this->acl_check_view('Devices_Controller', 'subnet')) Controller::error(1);
$view = new View('template');
$view->header = new View('base/header');
$view->header->title = url_lang::lang('texts.Subnet detail').' - '.$subnet->name;
$view->header->menu = Controller::render_menu();
if ($subnet->id == 0)
Controller::error(RECORD);
if (!$this->acl_check_view('Devices_Controller', 'subnet'))
Controller::error(ERROR);
$headline = url_lang::lang('texts.Subnet detail').' - '.$subnet->name;
$view = new View('main');
$view->title = $headline;
$view->content = new View('show_subnet');
$view->content->subnet = $subnet;
$view->content->link_back = html::anchor(url_lang::base().'subnets/show_all', url_lang::lang('texts.Back to all subnets'));
$view->content->headline = url_lang::lang('texts.Subnet detail').' - '.$subnet->name;
$view->footer = new View('base/footer');
$view->render(TRUE);
$view->content->subnet = $subnet;
$view->content->link_back = html::anchor(url_lang::base().'subnets/show_all', url_lang::lang('texts.Back to all subnets'));
$view->content->headline = $headline;
$view->render(TRUE);
} // end of show
/**
......
*/
function add()
{
$subnet = new Subnet_Model();
if (!$this->acl_check_new('Devices_Controller', 'subnet')) Controller::error(1);
if (!$this->acl_check_new('Devices_Controller', 'subnet'))
Controller::error(ACCESS);
$form = new Forge(url_lang::base()."subnets/add/", '', 'POST', array('id' => 'article_form'));
$form->set_attr('class', 'form_class')->set_attr('method', 'post');
$form->group('')->label(url_lang::lang('texts.Basic data'));
$form->input('name')->label(url_lang::lang('texts.Subnet name').':')->rules('required|length[3,250]');
$form->input('network_address')->label(url_lang::lang('texts.Network address').':')
->rules('required')->callback(array($this, 'valid_netip'));
$form->input('netmask')->label(url_lang::lang('texts.Netmask').':')
->rules('required|length[1,250]');
$form->input('OSPF_area_id')->label(url_lang::lang('texts.OSPF area ID').':')->rules('valid_digit');
$form->submit('submit')->value(url_lang::lang('texts.Save'));
special::required_forge_style($form, ' *', 'required');
//----- validate form and save data -----------------------------------
// validation
if($form->validate())
{
$form_data = $form->as_array();
......
unset($form_data);
if ($subnet->save()) {
if ($subnet->save())
{
$this->session->set_flash('message', url_lang::lang('texts.Subnet has been successfully saved.'));
url::redirect(url_lang::base().'subnets/show/'.$subnet->id);
exit;
}
}
//----- end validate --------------------------------------------------
$view = new View('template');
$view->header = new View('base/header');
$view->header->title = url_lang::lang('texts.Add new subnet');
$view->header->menu = Controller::render_menu();
$headline = url_lang::lang('texts.Add new subnet');
$view = new View('main');
$view->title = $headline;
$view->content = new View('form');
$view->content->form = $form->html();
$view->content->link_back = html::anchor(url_lang::base().'subnets/show_all/', url_lang::lang('texts.Back to all subnets'));
$view->content->headline = url_lang::lang('texts.Add new subnet');
$view->footer = new View('base/footer');
$view->render(TRUE);
$view->content->headline = $headline;
$view->render(TRUE);
} // end of add
protected $form;
......
*/
function edit($subnet_id)
{
if (!isset($subnet_id))
Controller::warning(PARAMETER);
$subnet = new Subnet_Model($subnet_id);
if (!isset($subnet_id) || $subnet->id == 0) {
Controller::warning(1);
}
if ($subnet->id == 0)
Controller::error(RECORD);
if (!$this->acl_check_edit('Devices_Controller', 'subnet'))
Controller::error(ACCESS);
if (!$this->acl_check_edit('Devices_Controller', 'subnet')) Controller::error(1);
$this->form=$form = new Forge(url_lang::base()."subnets/edit/".$subnet_id, '', 'POST', array('id' => 'article_form'));
$this->form = $form = new Forge(url_lang::base()."subnets/edit/".$subnet_id, '', 'POST', array('id' => 'article_form'));
$form->set_attr('class', 'form_class')->set_attr('method', 'post');
$form->group('')->label(url_lang::lang('texts.Basic data'));
$form->input('name')->label(url_lang::lang('texts.Subnet name').':')->rules('required|length[3,250]')->value($subnet->name);
$form->input('network_address')->label(url_lang::lang('texts.Network address').':')
->rules('required')->callback(array($this, 'valid_netip'))
......
->rules('required|length[1,250]')->value($subnet->netmask);
$form->input('OSPF_area_id')->label(url_lang::lang('texts.OSPF area ID').':')->rules('valid_digit')->value($subnet->OSPF_area_id);
$form->submit('submit')->value(url_lang::lang('texts.update'));
special::required_forge_style($form, ' *', 'required');
//----- validate form and save data -----------------------------------
if($form->validate())
{
$form_data = $form->as_array();
......
url::redirect(url_lang::base().'subnets/show/'.$subnet_id);
}
}
$view = new View('template');
$view->header = new View('base/header');
$view->header->title = url_lang::lang('texts.Edit subnet').' - '.$subnet->name;
$view->header->menu = Controller::render_menu();
}
$headline = url_lang::lang('texts.Edit subnet').' - '.$subnet->name;
$view = new View('main');
$view->title = $headline;
$view->content = new View('form');
$view->content->form = $form->html();
$view->content->link_back = html::anchor(url_lang::base().'subnets/show_all', url_lang::lang('texts.Back to all subnets'));
$view->content->headline = url_lang::lang('texts.Edit subnet').' - '.$subnet->name;
$view->footer = new View('base/footer');
$view->content->form = $form->html();
$view->content->link_back = html::anchor(url_lang::base().'subnets/show_all', url_lang::lang('texts.Back to all subnets'));
$view->content->headline = $headline;
$view->render(TRUE);
}
......
url::redirect(url_lang::base().'subnets/show_all');
}
/**
* Function export all ip addresses of given subnet. With ip address, information is included, like
* interface, device, user, member.
* @param $subnet_id
* @return unknown_type
*/
function csv_export($subnet_id = null, $encoding = 'utf-8')
{
if (!isset($subnet_id))
Controller::warning(PARAMETER);
$subnet_model = new Subnet_Model($subnet_id);
if ($subnet_model->id == 0)
Controller::error(RECORD);
if (!$this->acl_check_view('Devices_Controller', 'subnet'))
Controller::error(ACCESS);
$items = $subnet_model->get_items_of_subnet($subnet_id);
// set content header
header('Content-type: application/csv');
$filename = $subnet_model->name.'.csv';
header('Content-Disposition: attachment; filename="'.$filename.'"');
$first = true;
// this foreach goes through rows
foreach ($items as $line)
{
// first headers of columns will be written
if ($first)
{
foreach ($line as $key => $value)
{
// translation of column titles
$title = url_lang::lang('texts.'.$key);
// file cannot start with ID, otherwise excel and openoffice think that the file is invalid
if ($title == 'ID')
$title = url_lang::lang('texts.Number');
// character encoding
if ($encoding != 'utf-8')
$title = iconv ('utf-8', $encoding, $title);
echo '"'.$title.'";';
}
echo "\n";
$first = false;
}
// this foreach writes line
foreach ($line as $key => $value)
{
// character encoding
if ($encoding != 'utf-8')
$value = iconv ('utf-8', $encoding, $value);
echo '"'.$value.'";';
}
echo "\n";
}
}
/**
* Callback function validates ip address.
* @param $input
* @return unknown_type
freenetis/trunk/kohana/application/controllers/redirect.php
<?php
class Redirect_Controller extends Controller {
class Redirect_Controller extends Controller
{
/**
* This is the address where are members of network redirected to.
* @return unknown_type
*/
function index()
{
url::redirect(url::base());
$ip = server::remote_addr();
echo 'Byli jste presmerovani <br>';
echo $ip;
}
/**
* This function writes list of ipset rules. It contains ip addresses that will be redirected.
* Gateway router regularly gets this data and sets its ipset by these rules.
* @return unknown_type
*/
function ipset()
{
}
/**
* Function redirects all devices of member's users.
* Freenetis connects to gateway based on linux. IP addresses are redirected by shorewall rule in
* linux-based gateway. This is done by assigning ip addresses to "debtor" ipset. Ipset is kernel module.
......
echo 'uz to bude..';
}
/**
* IP address has not been found in database.
* @param $ip_address
freenetis/trunk/kohana/application/controllers/import.php
$view = new View('template');
$view->header = new View('base/header');
$title=url_lang::lang('texts.Bank transfers import results');
$title=url_lang::lang('texts.Import results');
$view->header->title = $title;
$view->header->menu = Controller::render_menu();
$view->content = new View('show_all');
freenetis/trunk/kohana/application/views/show_subnet.php
<h2><?php echo $headline ?></h2>
<?php echo ($message = $this->session->get('message')) ? '<div class="message">'.$message.'</div>' : '' ?>
<?php if (isset($submenu)) echo '<div class="submenu">'.$submenu.'</div>'; ?>
<?php echo $link_back ?>
<?php
if ($this->acl_check_edit('Devices_Controller', 'subnet'))
echo ' | '.html::anchor(url_lang::base().'subnets/edit/'.$subnet->id, url_lang::lang('texts.Edit')) ?><br /><br />
echo ($message = $this->session->get('message')) ? '<div class="message">'.$message.'</div>' : '';
if (isset($submenu))
echo '<div class="submenu">'.$submenu.'</div>';
<table class="extended" cellspacing="0">
<tr>
<th><?php echo url_lang::lang('texts.ID') ?></th>
<td><?php echo $subnet->id ?></td>
</tr>
<tr>
<th><?php echo url_lang::lang('texts.Subnet name') ?></th>
<td><?php echo $subnet->name ?></td>
</tr>
<tr>
<th><?php echo url_lang::lang('texts.Network address') ?></th>
<td><?php echo $subnet->network_address ?></td>
</tr>
<tr>
<th><?php echo url_lang::lang('texts.Netmask') ?></th>
<td><?php echo $subnet->netmask ?></td>
</tr>
<tr>
<th><?php echo url_lang::lang('texts.OSPF area ID') ?></th>
<td><?php echo $subnet->OSPF_area_id ?></td>
</tr>
</table><br />
$links[] = $link_back;
if ($this->acl_check_edit('Devices_Controller', 'subnet'))
$links[] = html::anchor(url_lang::base().'subnets/edit/'.$subnet->id, url_lang::lang('texts.Edit'));
if ($this->acl_check_view('Devices_Controller', 'subnet'))
{
$links[] = html::anchor(url_lang::base().'subnets/csv_export/'.$subnet->id, url_lang::lang('texts.Export to CSV (utf-8)'));
$links[] = html::anchor(url_lang::base().'subnets/csv_export/'.$subnet->id.'/windows-1250', url_lang::lang('texts.Export to CSV (windows-1250)'));
}
echo implode(' | ', $links);
?>
<br /><br />
<table class="extended" cellspacing="0">
<tr>
<th><?php echo url_lang::lang('texts.ID') ?></th>
<td><?php echo $subnet->id ?></td>
</tr>
<tr>
<th><?php echo url_lang::lang('texts.Subnet name') ?></th>
<td><?php echo $subnet->name ?></td>
</tr>
<tr>
<th><?php echo url_lang::lang('texts.Network address') ?></th>
<td><?php echo $subnet->network_address ?></td>
</tr>
<tr>
<th><?php echo url_lang::lang('texts.Netmask') ?></th>
<td><?php echo $subnet->netmask ?></td>
</tr>
<tr>
<th><?php echo url_lang::lang('texts.OSPF area ID') ?></th>
<td><?php echo $subnet->OSPF_area_id ?></td>
</tr>
</table>

Také k dispozici: Unified diff