Temat: Modyfikacja Kohana 3.8.x
Może ja się wypowiem i nieco Ci podpowiem, bo w pracy mamy bardzo mocno przerobioną Kohanę ale we wersji 2.3.4. Krótka lista tego, co się zmieniło/doszło:
- własny moduł uwierzytelnienia,
- własny moduł kontroli dostępu (grupy użytkowników, uprawnienia przyznawane grupom czy pojedynczym użytkownikom - w sumie 5 poziomów nadawania uprawnień, nadawanie dostępu dla akcji oraz pól w formularzach (uwzględniane również w UPDATE)),
- klasa PageHead czyli budowanie nagłówka strony (dołączanie JS, CSS, nadawanie tytułu strony, znaczników meta),
- moduł "struktury" czyli każda podstrona ma swój identyfikator (zintegrowane m.in. z modułem ACL oraz z PageHead),
- zapis wykonywanych zapytań do bazy danych (czyli mamy możliwość zdiagnozowania kto co usunął lub co zmienił),
- kontroler dla żądań AJAX oraz zadań CRON (z metodą execute() do pojedynczego uruchomienia lub run() dla uruchomienia ciągłego oraz z zabezpieczeniem przed ponownym uruchomieniem jeśli zadanie aktualnie działa),
- moduł multi_app czyli odpalanie kilku aplikacji na tej samej Kohanie (kontrolery i widoki w podkatalogach odpowiadających nazwie aplikacji) + pełna (!!!) kaskadowość m.in. dla plików konfiguracyjnych (czyli dodanie na samym szczycie wczytywania konfigu dla danej aplikacji (nie tego z application)),
- klasa do tworzenia drzewek z dowolnych danych o określonej strukturze,
- klasa do tworzenia menu,
- moduł grida (do wykorzystania z w adminie oraz prostsza wersja tworząca po prostu tabelkę),
- własny moduł tworzenia formularzy,
- moduł "generatora" admina (wykorzystujący moduł grida oraz formularzy) z możliwością ustawiania/nadpisywania wszystkiego (nie to co ten w Symfony...). Przykład całej akcji listy:
<?php
/**
* Klasa akcji listy zasobów ACL.
*
* @author Michał "phpion" Płonka
*
*/
class Generator_Action_Acl_resource_List extends Generator_Action_List {
/**
* (non-PHPdoc)
* @see protected/modules/generator/libraries/Generator/Action/Generator_Action_List::configure_grid()
*/
protected function configure_grid() { $this->grid->add_column(new Grid_Column('id', 'ID'));
$this->grid->add_column(new Grid_Column('name', $this->i18n('fields.name')));
$this->grid->add_column(new Grid_Column('permission', $this->i18n('fields.permission')));
$this->grid->get_column_by_id('name')->set_is_link_to_edit(TRUE);
}
/**
* (non-PHPdoc)
* @see protected/modules/generator/libraries/Generator/Action/Generator_Action_List::configure_filters_form()
*/
protected function configure_filters_form() {
$fieldset = new Formject_Element_Fieldset();
$fieldset->set_controllers(new Generator_Form_Controllers_Filters());
$this->filters_form->add_element($fieldset);
$field = new Formject_Element_Field_Single_Text('filter[id]');
$field->set_label(new Formject_Element_Label('ID'));
$fieldset->add_element($field);
$field = new Formject_Element_Field_Single_Text('filter[name]');
$field->set_label(new Formject_Element_Label($this->i18n('fields.name')));
$fieldset->add_element($field);
$field = new Generator_Form_Field_Filter_Boolean('filter[permission]');
$field->set_label(new Formject_Element_Label($this->i18n('fields.permission')));
$fieldset->add_element($field);
}
}
oraz całej akcji formularza edycji:
<?php
/**
* Klasa akcji formularza zasobu ACL.
*
* @author Michał "phpion" Płonka
*
*/
class Generator_Action_Acl_resource_Form extends Generator_Action_Form {
/**
* (non-PHPdoc)
* @see protected/modules/generator/libraries/Generator/Action/Generator_Action_Form::configure_form()
*/
protected function configure_form() { $tab = new Generator_Form_Tab(Kohana::lang('generator/form.basic_data'));
$this->form->add_element($tab);
$fieldset = new Generator_Form_Fieldset();
$tab->add_element($fieldset);
$field = new Formject_Element_Field_Single_Text('acl_resource[name]');
$field->set_is_required(TRUE);
$field->set_label(new Formject_Element_Label($this->i18n('fields.name')));
$fieldset->add_element($field);
$field = new Formject_Element_Field_Single_Select('acl_resource[acl_resource_namespace_id]');
$field->set_options(ORM::factory('acl_resource_namespace')->select_list());
$field->set_is_required(TRUE);
$field->set_label(new Formject_Element_Label($this->i18n('fields.acl_resource_namespace_id')));
$fieldset->add_element($field);
$field = new Formject_Element_Field_Single_Checkbox_Boolean('acl_resource[permission]');
$field->set_label(new Formject_Element_Label($this->i18n('fields.permission')));
$fieldset->add_element($field);
//
$this->form->get_validation()
->pre_filter('trim')
->add_rules('acl_resource.name', 'required', 'length[1,255]', array($this, 'validate_name_acl_resource_namespace_id_uniqueness'))
;
}
/**
* Sprawdza unikalność nazwy i przestrzeni nazw zasobu.
*
* @param string $name Nazwa wersji użytkownika.
* @return bool TRUE jeśli nazwa i przestrzeń nazw jest unikalna, FALSE w przeciwnym wypadku.
*/
public function validate_name_acl_resource_namespace_id_uniqueness($name) { return Validation::factory(array())->db_uniqueness('acl_resources', array(
'name' => (string)$name,
'acl_resource_namespace_id' => (int)$this->input->request('obj.acl_resource_namespace_id')
), array(
'id !=' => (int)$this->input->request('id', 0)
));
}
}
Generalnie modyfikacji jest mnóstwo, większość bezpośrednio w samym katalogu "system". Przyznasz więc, że Twoja aktualna własna Kohana ma przed sobą jeszcze długą drogę ;)