rozšíření funkcionality – použít dědičnost nebo extensionMethod?
- LeonardoCA
- Člen | 296
Prosím o radu zkušených, mám promyšlené obecné řešení nějakého problému a stále váhám nad zpúsobem realizace. Konkrétně mi jde o to, že potřebuji rozšířit funkcionalitu formulářů a obecně komponent o podporu kontroly, byla li něco editováno + nabídka uložení + autosave + undo/redo.
To znamená, že potřebuji implementovat vlastní interface IEditable pro každou komponentu dědící od (Nette\Application\UI\IRenderable nebo Forms/IControl.php) a interface IAutosave pro Form nebo Container obsahující komponenty…
Stále váhám nad tím co je lepší – podědit všechny komponenty a dopsat funkčnost do nich (moc psaní a duplicity) nebo je „hacknout“ pomocí extensionMethod (nejsem si jist je-li to správná cesta)
Pro představu interfaces, které potřebuji implementovat. (ještě ne finální)
namespace PhpGUI\GUI;
use PhpGUI;
/**
* Component which can be modified.
*
* @author Leonard Odlozilik
*/
interface IEditable
{
/**
* Mark component as changed.
* @return void
*/
function setModified();
/**
* Has the component's state changed?
* @return bool
*/
function isModified();
/**
* Mark component as read only.
* @return void
*/
function setReadOnly();
/**
* Is component ReadOnly?
* @return bool
*/
function isReadOnly();
}
namespace PhpGUI\GUI;
use PhpGUI;
/**
* Component container which might be Autosaved.
*
* @author Leonard Odlozilik
*/
interface IAutosave
{
/**
* Activate Autosave
* @return void
*/
function setAutoSave();
/**
* Is Autosave activated?
* @return int
*/
function hasAutoSave();
/**
* Autosave
* @return void
*/
function autoSave();
}
Kromě rozšíření všech těch tříd bude celkovou funkcionalitu zastřešovat service, který bude monitorovat registované komponenty jak v php tak v javascriptu…
Když se povede, tak přidám do doplňků… Poraďte
Editováno: Případně napište, jestli by se vám něco takového hodilo a jestli by jste měli k tomu nějaké nápady nebo připomínky.
Představa funkčnosti je, že každý komponent/prvek formuláře, si bude pamatovat výchozí stav a bude mít příznak byl-li od posledního uložení změněn. Zároveň pokud uživatel stav změní, ale vrátí jej zase do původního stavu, tak to komponenta pozná a IsModified bude hlásit FALSE.
Container bude monitorovat všechny podřízené komponenty, respektive, komponenty budou hlásit změnu svému containeru, aby to bylo pružnější a container si bude držet historii změn, jak v javascriptu, tak v session, uvažuji o možnosti „undo“ i pro již uložené změny.
V javascriptu bude monitorovací service zajišťovat hlídání před nechtěným opuštěním stránky v případě změn… a vyhodí hlášku při zavírání stránky nebo kliknutí na odkaz …
Editoval LeonardoCA (23. 5. 2012 14:30)
- LeonardoCA
- Člen | 296
Potřebuji nějak přidat každému prvku minimálně volání události onChange při změně hodnoty.
- frosty22
- Člen | 373
No jasně – v případě, že to chceš na straně klienta (JS), tak to přes jQuery uděláš i bez změny renderování selectorů, například:
$(".special-form :input").change(function(){ ... });
A při rozšíření UI/Form:
class HistoryForm extends \Nette\Application\UI\Form
{
public function __construct($parent, $name)
{
parent::__construct($parent, $name);
$this->getElementPrototype()->class("special-form");
$this->onSuccess[] = callback(...); // (?) nevím možná, viz níže
}
.....
}
A zároveň tedy by asi bylo možné (nvm píši ve spěchu končí prac. doba :D a musel bych to zkusit) v kontruktoru mít i navěšení události onSuccess, na kterou by šlo navázat ty vlastní handlery pro autoSave, … ale přeci jen, podle toho co popisuješ, té funkcionality chceš přidat dost a některé ty věci spolu přímo ani nesouvisí, čili bych se snažil asi přistupovat individuálně. Už jen ona zmínka řešení pro formuláře a obecné komponenty – to se bude dost lišit a u obecných si nedokážu představit ono využití a funkcionalitu.
Editoval frosty22 (24. 5. 2012 17:18)