rozšíření funkcionality – použít dědičnost nebo extensionMethod?

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
LeonardoCA
Člen | 296
+
0
-

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)

frosty22
Člen | 373
+
0
-

Zajímavé a jistě i užitečné, pouze nebylo by jednodušší rozšířit celý UI/Form?

LeonardoCA
Člen | 296
+
0
-

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
+
0
-

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)