コード例 #1
0
ファイル: notes.php プロジェクト: RCMmedia/rubicon
 function get_text($object, $user = NULL)
 {
     $return = array();
     if (!is_object($object)) {
         return $return;
     }
     $notes = $this->get($object, $user);
     if ($notes) {
         $label = sprintf(HCM::_n('%d Comment', '%d Comments', count($notes)), count($notes));
         $return[] = $label;
         foreach ($notes as $e) {
             $this_note = array();
             $this_note[] = $e->author->present_title(HC_PRESENTER::VIEW_RAW) . ' [' . $e->present_created(HC_PRESENTER::VIEW_TEXT) . ']' . ':';
             $this_note[] = $e->present_content(HC_PRESENTER::VIEW_TEXT);
             $return[] = $this_note;
         }
     }
     return $return;
 }
コード例 #2
0
ファイル: delete.php プロジェクト: RCMmedia/rubicon
 function deleterel($id, $relname, $relid)
 {
     $model = HC_App::model('shift');
     $model->get_by_id($id);
     $this->_check_model($model);
     $acl = HC_App::acl();
     if (!$acl->set_object($model)->can($relname . '::delete')) {
         return;
     }
     $rel = $model->{$relname}->get_by_id($relid);
     if ($model->delete($rel, $relname)) {
         $this->session->set_flashdata('message', sprintf(HCM::_n('%d shift updated', '%d shifts updated', 1), 1));
     } else {
         $this->session->set_flashdata('error', HCM::__('Error'));
     }
     $redirect_to = 'shifts/zoom/' . $id;
     //			$redirect_to = '-referrer-';
     $this->redirect($redirect_to);
     return;
 }
コード例 #3
0
<?php

$my_own = FALSE;
if (!$wrap) {
    $my_own = TRUE;
    $wrap = HC_Html_Factory::widget('list')->add_attr('class', 'list-inline')->add_attr('class', 'list-separated');
}
if ($count_fail) {
    $title = sprintf(HCM::_n('%d Conflict', '%d Conflicts', $count_fail), $count_fail);
    $item = HC_Html_Factory::element('titled', 'span')->add_attr('class', 'display-block')->add_attr('class', 'alert')->add_attr('class', 'alert-condensed2')->add_attr('class', 'alert-danger')->add_attr('class', 'text-smaller2')->add_child($title);
    $wrap->add_item($item);
}
if ($my_own) {
    if ($wrap->items()) {
        echo $wrap->render();
    }
}
コード例 #4
0
<?php

if (!$count) {
    return;
}
$title = sprintf(HCM::_n('%d Pending Timeoff Request', '%d Pending Timeoff Requests', $count), $count);
$temp_shift = HC_App::model('shift');
$linkto = HC_Lib::link('list/browse', array('type' => $temp_shift->_const('TYPE_TIMEOFF'), 'status' => $temp_shift->_const('STATUS_DRAFT'), 'range' => 'upcoming'));
$item = HC_Html_Factory::widget('titled', 'a')->add_attr('class', 'display-block')->add_attr('href', $linkto)->add_attr('class', 'alert')->add_attr('class', 'alert-archive')->add_attr('title', $title)->add_child($title);
echo $item->render();
コード例 #5
0
<?php

$out = HC_Html_Factory::widget('container')->add_item(HC_Html::icon('comment-o'))->add_item(sprintf(HCM::_n('%d Comment', '%d Comments', $count), $count));
echo $out;
コード例 #6
0
 static function formatPeriod($ts, $limitMeasure = '')
 {
     //		$conf =& ntsConf::getInstance();
     //		$limitMeasure = $conf->get('limitTimeMeasure');
     //		$limitMeasure = '';
     switch ($limitMeasure) {
         case 'minute':
             $day = 0;
             $hour = 0;
             $minute = (int) $ts / 60;
             break;
         case 'hour':
             $day = 0;
             $hour = (int) ($ts / (60 * 60));
             $minute = (int) ($ts - 60 * 60 * $hour) / 60;
             break;
         default:
             $day = (int) ($ts / (24 * 60 * 60));
             $hour = (int) (($ts - 24 * 60 * 60 * $day) / (60 * 60));
             $minute = (int) ($ts - 24 * 60 * 60 * $day - 60 * 60 * $hour) / 60;
             break;
     }
     $formatArray = array();
     if ($day > 0) {
         $formatArray[] = sprintf(HCM::_n('%d Day', '%d Days', $day), $day);
     }
     if ($hour > 0) {
         $formatArray[] = sprintf(HCM::_n('%d Hour', '%d Hours', $hour), $hour);
     }
     if ($minute > 0) {
         $formatArray[] = sprintf(HCM::_n('%d Minute', '%d Minutes', $minute), $minute);
     }
     $verbose = join(' ', $formatArray);
     return $verbose;
 }
コード例 #7
0
ファイル: confirm.php プロジェクト: RCMmedia/rubicon
if ($status_input !== NULL) {
    $out->add_item(HC_Html_Factory::widget('label_row')->set_label(HCM::__('Status'))->set_content($status_input));
}
/* ADD NOTE IF POSSIBLE */
$new_shift = HC_App::model('shift');
$extensions = HC_App::extensions();
$more_content = $extensions->run('shifts/add/confirm', $new_shift);
if ($more_content) {
    $more_holder = HC_Html_Factory::widget('list')->add_attr('class', 'list-unstyled')->add_attr('class', 'list-separated2');
    foreach ($more_content as $mc) {
        $more_holder->add_item($mc);
    }
    $out->add_item($more_holder);
}
$out->add_divider();
$add_btn_label = HCM::__('Add');
$type = $params->get('type');
if ($type !== NULL) {
    $shift = HC_App::model('shift');
    switch ($type) {
        case $shift->_const('TYPE_TIMEOFF'):
            $add_btn_label = sprintf(HCM::_n('Request New Timeoff', 'Request %d New Timeoffs', $shifts_count), $shifts_count);
            break;
        case $shift->_const('TYPE_SHIFT'):
            $add_btn_label = sprintf(HCM::_n('Add New Shift', 'Add %d New Shifts', $shifts_count), $shifts_count);
            break;
    }
}
$out->add_item(HC_Html_Factory::element('input')->add_attr('type', 'submit')->add_attr('class', array('btn', 'btn-success'))->add_attr('title', $add_btn_label)->add_attr('value', $add_btn_label));
$display_form->add_item($out);
echo $display_form->render();
コード例 #8
0
<?php

$label = NULL;
if ($entries) {
    $label = array();
    $icon = HC_Html::icon(HC_App::icon_for('conflict'))->add_attr('class', 'text-danger');
    $label[] = $icon;
    $label[] = sprintf(HCM::_n('%d Conflict', '%d Conflicts', count($entries)), count($entries));
    $label = join('', $label);
    $label = HC_Html_Factory::widget('titled', 'span')->add_attr('class', array('alert', 'alert-danger'))->add_attr('class', array('alert-condensed'))->add_attr('class', array('display-block'))->add_child($label);
}
if ($label) {
    $out = HC_Html_Factory::widget('container')->add_item($label);
    echo $out;
}
コード例 #9
0
ファイル: add.php プロジェクト: RCMmedia/rubicon
 function insert()
 {
     $extensions = HC_App::extensions();
     $params = $this->_init_add_params(func_get_args());
     $params_array = $params->to_array();
     $model = HC_App::model('shift');
     $date_input = $this->form_add_time->input('date');
     $date_input->set_value($params_array['date']);
     $dates = $date_input->dates();
     /* if post supplied */
     $post = $this->input->post();
     $this->form_confirm->grab($post);
     $form_values = $this->form_confirm->values();
     $possible_statuses = $params->get_options('status');
     if (count($possible_statuses) > 1) {
         if (array_key_exists('status', $form_values)) {
             $params_array['status'] = $form_values['status'];
         }
     } elseif (count($possible_statuses) == 1) {
         $params_array['status'] = array_shift($possible_statuses);
     }
     $success_count = 0;
     $users_ids = $params_array['user'];
     // $publish_now = ($form_values['status'] == $model->_const('STATUS_ACTIVE')) ? TRUE : FALSE;
     $publish_now = $params_array['status'] == $model->_const('STATUS_ACTIVE') ? TRUE : FALSE;
     unset($params_array['user']);
     if (!$params_array['location']) {
         unset($params_array['location']);
     }
     /* group id */
     $group_id = 0;
     if (count($dates) * count($users_ids) > 1) {
         $max_group_id = $model->select_max('group_id')->get()->group_id;
         if (!$max_group_id) {
             $max_group_id = 0;
         }
         $group_id = $max_group_id + 1;
     }
     $result_models = array();
     foreach ($dates as $date) {
         foreach ($users_ids as $uid) {
             $this_params = $params_array;
             $this_params['date'] = $date;
             if ($uid) {
                 $this_params['user'] = $uid;
             }
             $model->clear();
             $related = $model->from_array($this_params);
             $model->group_id = $group_id;
             /* create shift */
             if (!$model->save($related)) {
                 $errors = $model->errors();
                 $this->form_confirm->set_errors($errors);
                 $orphan_errors = $this->form_confirm->orphan_errors();
                 return $this->_add($params, 'confirm');
             }
             $success_count++;
             $result_models[] = clone $model;
             /* extensions */
             $extensions->run('shifts/insert', $post, $model);
         }
     }
     switch ($model->type) {
         case $model->_const('TYPE_SHIFT'):
             $msg = sprintf(HCM::_n('%d shift added', '%d shifts added', $success_count), $success_count);
             break;
         case $model->_const('TYPE_TIMEOFF'):
             $msg = sprintf(HCM::_n('%d timeoff added', '%d timeoffs added', $success_count), $success_count);
             break;
     }
     $this->session->set_flashdata('message', $msg);
     $redirect_to = 'list/calendar';
     $parent_refresh = array();
     foreach ($result_models as $o) {
         $this_parent_refresh = $o->present_calendar_refresh();
         $parent_refresh = array_merge($parent_refresh, $this_parent_refresh);
     }
     $parent_refresh = array_keys($parent_refresh);
     $this->redirect($redirect_to, $parent_refresh);
 }
コード例 #10
0
ファイル: quickstats.php プロジェクト: RCMmedia/rubicon
<?php

$my_own = FALSE;
if (!$wrap) {
    $my_own = TRUE;
    $wrap = HC_Html_Factory::widget('list')->add_attr('class', 'list-inline')->add_attr('class', 'list-separated');
}
if ($count) {
    $title = sprintf(HCM::_n('%d Shift Release Pending', '%d Shift Release Pending', $count), $count);
    $item = HC_Html_Factory::widget('titled', 'span')->add_attr('class', 'display-block')->add_attr('class', 'label')->add_attr('class', 'label-warning')->add_child($title);
    $wrap->add_item($item);
}
if ($my_own) {
    if ($wrap->items()) {
        echo $wrap->render();
    }
}
コード例 #11
0
ファイル: shift_groups.php プロジェクト: RCMmedia/rubicon
 function bulk()
 {
     $acl = HC_App::acl();
     $extensions = HC_App::extensions();
     /* if post supplied */
     $post = $this->input->post();
     if (isset($post['id'])) {
         $ids = $post['id'];
     } elseif (isset($post['ids'])) {
         $ids = explode('|', $post['ids']);
     } else {
         $ids = array();
     }
     // $action = isset($post['action']) ? $post['action'] : '';
     // if( $ids && $action ){
     if ($ids) {
         $model = HC_App::model('shift');
         $model->where_in('id', $ids)->get();
         $success_count = 0;
         $action = 'update';
         /* delete */
         if (isset($post['delete'])) {
             $action = 'delete';
             foreach ($model as $o) {
                 if (!$acl->set_object($o)->can('delete')) {
                     continue;
                 }
                 if ($o->delete()) {
                     $success_count++;
                 }
             }
         } else {
             $this->form->grab($post);
             $form_values = $this->form->values();
             foreach ($model as $o) {
                 if (!$acl->set_object($o)->can('edit')) {
                     continue;
                 }
                 reset($form_values);
                 foreach ($form_values as $k => $v) {
                     if ($v === NULL) {
                         continue;
                     }
                     $o->{$k} = $v;
                 }
                 if ($o->save()) {
                     $success_count++;
                 } else {
                     $errors = $o->errors();
                 }
             }
         }
         switch ($action) {
             case 'delete':
                 $msg = sprintf(HCM::_n('%d shift deleted', '%d shifts deleted', $success_count), $success_count);
                 break;
             default:
                 $msg = sprintf(HCM::_n('%d shift updated', '%d shifts updated', $success_count), $success_count);
                 break;
         }
         if ($msg) {
             $this->session->set_flashdata('message', $msg);
         }
         foreach ($model as $o) {
             $extensions->run('shifts/update', $post, $o);
         }
     }
     $redirect_to = '-referrer-';
     $parent_refresh = array();
     foreach ($model as $o) {
         $this_parent_refresh = $o->present_calendar_refresh();
         $parent_refresh = array_merge($parent_refresh, $this_parent_refresh);
     }
     $parent_refresh = array_keys($parent_refresh);
     $this->redirect($redirect_to, $parent_refresh);
 }
コード例 #12
0
ファイル: recurring_date.php プロジェクト: RCMmedia/rubicon
    function render()
    {
        $enabled = $this->enabled();
        $value = $this->value(TRUE);
        $t = HC_Lib::time();
        if (isset($value['datestart'])) {
            $t->setDateDb($value['datestart']);
        }
        /* single date part */
        $wrap_single = HC_Html_Factory::widget('list')->add_attr('class', array('list-unstyled', 'list-separated'));
        $wrap_single->add_item($this->fields['datesingle']);
        /* recurring part */
        $wrap = HC_Html_Factory::widget('list')->add_attr('class', array('list-unstyled', 'list-separated'))->add_attr('class', 'hc-radio-info-container');
        /* DATES */
        $item_dates = HC_Html_Factory::widget('list')->add_attr('class', array('list-inline', 'list-separated'));
        $item_dates->add_item($this->fields['datestart']);
        $item_dates->add_item(' - ');
        $item_dates->add_item($this->fields['dateend']);
        $wrap->add_item($item_dates);
        /* RECURRING OPTIONS */
        $repeat = clone $this->fields['repeat'];
        $repeat->add_option('daily', HCM::__('Daily'));
        $repeat->add_option('weekday', HCM::__('Every Weekday') . ' (' . $t->formatWeekdayShort(1) . ' - ' . $t->formatWeekdayShort(5) . ')');
        $repeat->add_option('weekly', HCM::__('Weekly') . ' (' . $t->formatWeekdayShort() . ')');
        $wkds = array(0, 1, 2, 3, 4, 5, 6);
        $wkds = $t->sortWeekdays($wkds);
        /* weekly custom */
        $weekly_custom = clone $this->fields['weeklycustom'];
        $this_weekday = $t->getWeekday();
        if (!$weekly_custom->value()) {
            $weekly_custom->set_value(array($this_weekday));
        }
        reset($wkds);
        foreach ($wkds as $wkd) {
            $weekly_custom->add_option($wkd, $t->formatWeekdayShort($wkd));
        }
        // $weekly_custom->set_readonly($this_weekday);
        $repeat->add_option('weeklycustom', HCM::__('Weekly') . ' (' . HCM::__('Selected Days') . ')', $weekly_custom);
        /* biweekly custom */
        $this_weekday = $t->getWeekday();
        $biweekly_custom1 = clone $this->fields['biweeklycustom1'];
        if (!$biweekly_custom1->value()) {
            $biweekly_custom1->set_value(array($this_weekday));
        }
        $biweekly_custom2 = clone $this->fields['biweeklycustom2'];
        if (!$biweekly_custom2->value()) {
            $biweekly_custom2->set_value(array($this_weekday));
        }
        reset($wkds);
        foreach ($wkds as $wkd) {
            $biweekly_custom1->add_option($wkd, $t->formatWeekdayShort($wkd));
            $biweekly_custom2->add_option($wkd, $t->formatWeekdayShort($wkd));
        }
        // $weekly_custom->set_readonly($this_weekday);
        $repeat->add_option('biweeklycustom', HCM::__('Biweekly') . ' (' . HCM::__('Selected Days') . ')', array($biweekly_custom1, $biweekly_custom2));
        /* in/out */
        if (!$this->fields['inoutin']->value()) {
            $this->fields['inoutin']->set_value(2);
        }
        if (!$this->fields['inoutout']->value()) {
            $this->fields['inoutout']->set_value(2);
        }
        $repeat->add_option('inout', join(' / ', array(sprintf(HCM::_n('%s Day On', '%s Days On', 100), 'X'), sprintf(HCM::_n('%s Day Off', '%s Days Off', 100), 'Y'))), HC_Html_Factory::widget('list')->add_attr('class', array('list-inline', 'list-separated'))->add_item($this->fields['inoutin']->add_attr('size', 2))->add_item('/')->add_item($this->fields['inoutout']->add_attr('size', 2)));
        $repeat->add_option('monthlyday', HCM::__('Monthly') . ' (' . join(', ', array($t->formatWeekdayShort(), $t->formatWeekOfMonth())) . ')');
        $repeat->add_option('monthlydayend', HCM::__('Monthly') . ' (' . join(', ', array($t->formatWeekdayShort(), $t->formatWeekOfMonthFromEnd())) . ')');
        $repeat->add_option('monthlydate', HCM::__('Monthly') . ' (' . HCM::__('Day') . ': ' . $t->getDay() . ')');
        $wrap->add_item($repeat);
        /* build output */
        // $recurring_part = $wrap->render();
        // $recurring_part = $this->decorate( $recurring_part );
        // $single_part = $wrap_single->render();
        // $single_part = $this->decorate( $wrap_single );
        $return = HC_Html_Factory::widget('container');
        if (count($enabled) > 1) {
            $tabs = HC_Html_Factory::widget('tabs');
            $tabs_id = 'nts' . hc_random();
            $tabs->set_id($tabs_id);
            $tabs->add_tab('single', HCM::__('Single Day'), $wrap_single);
            $tabs->add_tab('recurring', HCM::__('Multiple Days'), $wrap);
            $value_recurring = $value['recurring'];
            $tabs->set_active($value_recurring);
            $return->add_item($this->fields['recurring']);
            $return->add_item($tabs);
            $name_recurring = $this->fields['recurring']->name();
            $tabs_js = <<<EOT

<script language="JavaScript">
jQuery('#{$tabs_id}').closest('form').find('[name={$name_recurring}]').val( "{$value_recurring}" )
jQuery('#{$tabs_id} a.hc-tab-toggler').on('shown.hc.tab', function(e)
{
\tvar active_tab = jQuery(this).data('toggle-tab');
\tjQuery(this).closest('form').find('[name={$name_recurring}]').val( active_tab );
});
</script>

EOT;
            $return->add_item($tabs_js);
        } else {
            if (in_array('single', $enabled)) {
                $return->add_item($wrap_single);
            }
            if (in_array('recurring', $enabled)) {
                $return->add_item($wrap);
            }
        }
        $return = $return->render();
        // return $return;
        return $this->decorate($return);
    }
コード例 #13
0
<?php

if (!$count) {
    return;
}
/* translators: title for shifts that have no employee assigned yet */
$title = sprintf(HCM::_n('%d Open Shift', '%d Open Shifts', $count), $count);
$linkto = HC_Lib::link('list/browse', array('staff' => 0, 'range' => 'upcoming'));
$item = HC_Html_Factory::widget('titled', 'a')->add_attr('class', 'display-block')->add_attr('href', $linkto)->add_attr('class', 'alert')->add_attr('class', 'alert-danger-o')->add_attr('title', $title)->add_child($title);
echo $item->render();
コード例 #14
0
ファイル: update.php プロジェクト: RCMmedia/rubicon
 function index($id)
 {
     $extensions = HC_App::extensions();
     $args = func_get_args();
     $id = array_shift($args);
     $model = HC_App::model('shift');
     $model->where('id', $id)->get();
     $this->_check_model($model);
     $acl = HC_App::acl();
     if (!$acl->set_object($model)->can('edit')) {
         return;
     }
     $original_model = clone $model;
     /* supplied as parameters */
     $values = hc_parse_args($args);
     /* if post supplied */
     $form = $this->form_edit;
     $post = $this->input->post();
     if ($post) {
         $form->grab($post);
         $form_values = $form->values();
         $values = array_merge($values, $form_values);
     }
     $relname = 'user';
     $unassign = FALSE;
     if ($values[$relname] === '0' or $values[$relname] === 0 or $values[$relname] == '' or $values[$relname] === NULL) {
         // delete user relation
         unset($values[$relname]);
         if ($model->user_id) {
             $unassign = TRUE;
         }
     }
     if (!$values) {
         return $this->_zoom($model, 'time');
     }
     if ($values['location'] === NULL) {
         unset($values['location']);
     }
     $related = $model->from_array($values);
     $action_result1 = $model->save($related);
     $action_result2 = TRUE;
     if ($unassign) {
         $rel = $model->{$relname}->get();
         $action_result2 = $model->delete($rel, $relname);
     }
     if ($action_result1 && $action_result2) {
         /* extensions */
         $extensions->run('shifts/update', $post, $model);
         /* save and redirect here */
         if ($id) {
             $msg = sprintf(HCM::_n('%d shift updated', '%d shifts updated', 1), 1);
         } else {
             $msg = sprintf(HCM::_n('%d shift added', '%d shifts added', 1), 1);
         }
         $this->session->set_flashdata('message', $msg);
         $redirect_to = 'shifts/zoom/index/id/' . $id;
         //			$redirect_to = '-referrer-';
         /* what to refresh on referring page */
         $parent_refresh = $model->present_calendar_refresh();
         $parent_refresh = array_keys($parent_refresh);
         $this->redirect($redirect_to, $parent_refresh);
     } else {
         /* final layout */
         $this->layout->set_partial('content', Modules::run('shifts/zoom/index', 'id', $model));
         $this->layout();
     }
 }
コード例 #15
0
ファイル: _control_btns.php プロジェクト: RCMmedia/rubicon
<?php

$temp_shift = HC_App::model('shift');
/* create buttons */
$create_btns = array();
$create_btns['shift'] = HC_Html_Factory::element('a')->add_attr('class', array('btn'))->add_attr('class', array('btn-success'))->add_attr('href', HC_Lib::link('shifts/add/index')->url(array('type' => $temp_shift->_const('TYPE_SHIFT'))))->add_child(HC_Html::icon(HC_App::icon_for('shift')))->add_attr('title', sprintf(HCM::_n('Add New Shift', 'Add %d New Shifts', 1), 1));
$create_btns['timeoff'] = HC_Html_Factory::element('a')->add_attr('class', array('btn'))->add_attr('class', array('btn-warning-o'))->add_attr('href', HC_Lib::link('shifts/add/index')->url(array('type' => $temp_shift->_const('TYPE_TIMEOFF'))))->add_child(HC_Html::icon(HC_App::icon_for('timeoff')))->add_child(sprintf(HCM::_n('Request New Timeoff', 'Request %d New Timeoffs', 1), 1))->add_attr('title', sprintf(HCM::_n('Request New Timeoff', 'Request %d New Timeoffs', 1), 1));
$btns = HC_Html_Factory::widget('list')->add_attr('class', 'list-inline')->add_attr('class', 'list-separated');
$this_user_id = $this->auth->user()->id;
$acl = HC_App::acl();
$test_shift = HC_App::model('shift');
$test_shift->user_id = $this_user_id;
$add_btns = array();
if (isset($fix) && isset($fix['type']) && $fix['type'] && is_array($fix['type']) && count($fix['type']) == 1) {
    switch ($fix['type'][0]) {
        case $test_shift->_const('TYPE_TIMEOFF'):
            $test_shift->type = $fix['type'][0];
            if ($acl->set_object($test_shift)->can('validate')) {
                $add_btns[] = $create_btns['timeoff'];
            }
            break;
    }
} else {
    /*
    	$test_shift->type = $test_shift->_const('TYPE_SHIFT');
    	if( $acl->set_object($test_shift)->can('validate') ){
    		$add_btns[] = $create_btns['shift'];
    	}
    
    	$test_shift->type = $test_shift->_const('TYPE_TIMEOFF');
    	if( $acl->set_object($test_shift)->can('validate') ){
コード例 #16
0
ファイル: _header.php プロジェクト: RCMmedia/rubicon
<?php

$header_text = HCM::__('Add');
$type = $params->get('type');
if ($type !== NULL) {
    $shift = HC_App::model('shift');
    switch ($type) {
        case $shift->_const('TYPE_TIMEOFF'):
            $header_text = sprintf(HCM::_n('Request New Timeoff', 'Request %d New Timeoffs', 1), 1);
            break;
        case $shift->_const('TYPE_SHIFT'):
            $header_text = sprintf(HCM::_n('Add New Shift', 'Add %d New Shifts', 1), 1);
            break;
    }
}
$header = HC_Html_Factory::widget('list')->add_attr('class', 'list-unstyled');
$header->add_item($header_text);
echo HC_Html::page_header(HC_Html_Factory::element('h2')->add_child($header));