Problém s handle v Quick Startu (Dokončení základní aplikace)
- Johnny
- Člen | 24
Ahoj,
následuji návod Quick start a jsem zde: https://doc.nette.org/cs/quickstart.
Nejdříve jsem všechny signály i např. funkci createComponentTodoForm()
nakopíroval do presenteru TodolistPresenter. Poté vytvořil šablonu add.phtml
a dal do ní, co je tam napsáno.
Když jsem zkusil spustit stránku /todolist/add/ napsalo to Fatal error:
Allowed memory size of 8388608 bytes exhausted (tried to allocate 7680 bytes)
in /data/www/virtuals/abc/html/nette/libs/Nette/Forms/Controls/SubmitButton.php
on line 52. Tak jsem do .htaccess přidal php_value memory_limit 32M. Ale
zlobí to pořád.
Konkrétně mi laděnka píše: Indirect modification of overloaded property
NHtml::$data has no effect
Nevíte, čím by to mohlo být? Snažím se dodržovat návod, ale i to je pro mě ne zrovna lehké :)
- Johnny
- Člen | 24
Tady je celý TodolistPresenter.php:
<?php
final class TodolistPresenter extends BasePresenter
{
/** @var TodoManager */
private $todoManager = NULL;
public function actionShow($showDoneTasks = FALSE)
{
$this->template->todos = $this->model->findAllTodos($order =
array(
‚added‘ ⇒ ‚ASC‘,
), $where = array(
‚done‘ ⇒ $showDoneTasks ? ‚yes‘ : ‚no‘,
));
}
public function renderShow($showDoneTasks) {
$this->template->showDone = $showDoneTasks;
}
public function getModel() {
if(!isset($this->todoManager))
$this->todoManager = new TodoManager;
return $this->todoManager;
}
public function handleDelete($id)
{
$this->flashMessage(‚Úkol smazán.‘);
$todo = $this->model->findTodo($id);
if($todo) {
$todo->delete();
}
$this->redirect(‚this‘); // this vyjadřuje aktuální presenter i view,
ale bez signálu
}
public function handleChangeState($id)
{
$this->flashMessage(‚Stav byl změněn.‘);
$todo = $this->model->findTodo($id);
if($todo) {
$todo->changeState();
}
$this->redirect(‚this‘, $todo->done === ‚yes‘ ? TRUE :
FALSE);
}
public function createComponentTodoForm()
{
$form = new NAppForm;
$form->addText(‚text‘, ‚Úkol‘, 60, 100)
->addRule(NForm::FILLED, ‚Musíte vyplnit text!‘);
$form->addSubmit(‚save‘, ‚Uložit‘);
$form->addSubmit(‚back‘, ‚Zpět‘)->setValidationScope(NULL);
$form->onSubmit[] = callback($this, ‚processTodoForm‘);
return $form;
}
public function processTodoForm(AppForm $form)
{
if($form[‚save‘]->isSubmittedBy()) {
$this->flashMessage(‚Úkol vložen.‘);
$values = $form->getValues();
$todo = new Todo;
$todo->text = $values[‚text‘];
$todo->added = new DateTime;
$this->model->createTodo($todo);
}
$this->redirect(‚Todolist:show‘);
}
}
- Johnny
- Člen | 24
Díky za radu, bohužel do pořád nefunguje, změna žádná…
Laděnka píše po rozkliknutí části source file toto:
<?php
File: /data/www/virtuals/abc/html/nette/libs/Nette/Forms/Controls/FormControl.php Line: 381
Line 374: $control->name = $this->getHtmlName();
Line 375: $control->disabled = $this->disabled;
Line 376: $control->id = $this->getHtmlId();
Line 377: $rules = self::exportRules($this->rules);
Line 378: $rules = substr(json_encode($rules), 1, -1);
Line 379: $rules = preg_replace('#"([a-z0-9]+)":#i', '$1:', $rules);
Line 380: $rules = preg_replace('#(?<!\\\\)"([^\\\\\',]*)"#i', "'$1'", $rules);
Line 381: $control->data['nette-rules'] = $rules ? $rules : NULL;
Line 382: return $control;
Line 383: }
Line 384:
Line 385:
Line 386:
Line 387: /**
Line 388: * Generates label's HTML element.
?>
- Johnny
- Člen | 24
No opravdu jen následuji kroky v tom Quick Startu…
Přikládám soubor TodoManager.php
<?php
class TodoManager
{
public function findAllTodos($order = NULL, $where = NULL, $offset = NULL, $limit = NULL)
{
return dibi::query(
'SELECT * FROM [tasks]',
'%if', isset($where), 'WHERE %and', isset($where) ? $where : array(), '%end',
'%if', isset($order), 'ORDER BY %by', $order, '%end',
'%if', isset($limit), 'LIMIT %i %end', $limit,
'%if', isset($offset), 'OFFSET %i %end', $offset
)->setRowClass('Todo');
}
public function findTodo($id)
{
return dibi::query('SELECT * FROM [tasks] WHERE [id]=%i LIMIT 1', $id)
->setRowClass('Todo')
->fetch();
}
public function todoCount($where = NULL)
{
return dibi::fetchSingle('SELECT COUNT([id]) FROM [tasks] %if',
isset($where), 'WHERE', isset($where) ? $where : array()
);
}
public function createTodo(Todo $todo)
{
return dibi::query('INSERT INTO [tasks]', (array) $todo);
}
}
?>
a Todo.php:
<?php
class Todo extends DibiRow // DibiRow obstará korektní načtení dat
{
public function __construct($arr = array())
{
parent::__construct($arr);
}
public function delete()
{
return dibi::query('DELETE FROM [tasks] WHERE [id]=%i', $this->id);
}
public function save()
{
return dibi::query('UPDATE [tasks] SET', (array) $this, 'WHERE [id]=%i', $this->id); // využijeme toho, že DibiRow dědí od ArrayObject
}
public function changeState()
{
$this->done = $this->done === 'yes' ? 'no' : 'yes';
$this->save();
}
}
?>
pak add.phtml
<?php
{block content}
{widget todoForm} ?>
- Johnny
- Člen | 24
Napadlo mě, nemohlo by to mít něco společného s tímto: https://forum.nette.org/…5-2-0-notice ?
- Johnny
- Člen | 24
Ještě bych rád dodal, že vše ostatní jinak funguje (např. mazání),
jen když chci zobrazit/todolist/add/, vůbec to nejde…
Laděnka v sekci Call stack vypisuje toto, je-li vám to k něčemu:
<?php
Controls/TextBase.php (99) source ► NFormControl-> getControl ()
Controls/TextInput.php (83) source ► NTextBase-> getControl ()
Renderers/ConventionalRenderer.php (472) source ► NTextInput-> getControl ()
Renderers/ConventionalRenderer.php (382) source ► NConventionalRenderer-> renderControl (arguments ►)
Renderers/ConventionalRenderer.php (355) source ► NConventionalRenderer-> renderPair (arguments ►)
Renderers/ConventionalRenderer.php (320) source ► NConventionalRenderer-> renderControls (arguments ►)
Renderers/ConventionalRenderer.php (144) source ► NConventionalRenderer-> renderBody ()
inner-code NConventionalRenderer-> render (arguments ►)
Forms/Form.php (566) source ► call_user_func_array (arguments ►)
c-Nette.FileTemplate/_templates.Todolist.add.phtml-8a7df2c558e58d216c5fa3a914ba2ed1.php (12) source ► NForm-> render ()
Line 5: $_l = NLatteMacros::initRuntime($template, NULL, '4bbfbfb369'); unset($_extends);
Line 6:
Line 7:
Line 8: //
Line 9: // block content
Line 10: //
Line 11: if (!function_exists($_l->blocks['content'][] = '_lbc26499f6f5_content')) { function _lbc26499f6f5_content($_l, $_args) { extract($_args)
Line 12: ;$control->getWidget("todoForm")->render() ?> <?php
Line 13: }}
Line 14:
Line 15: //
Line 16: // end of blocks
Line 17: //
Line 18:
Line 19: if ($_l->extends) { ob_start(); }
Filters/LatteMacros.php (1015) source ► _lbc26499f6f5_content (arguments ►)
c-Nette.FileTemplate/_templates._layout.phtml-841c51bd748e6b6b3c4a2fcba622da19.php (33) source ► NLatteMacros:: callBlock (arguments ►)
Loaders/LimitedScope.php (63) source ► include (arguments ►)
Templates/FileTemplate.php (119) source ► NLimitedScope:: load (arguments ►)
c-Nette.FileTemplate/_templates.Todolist.add.phtml-8a7df2c558e58d216c5fa3a914ba2ed1.php (26) source ► NFileTemplate-> render ()
Loaders/LimitedScope.php (63) source ► include (arguments ►)
Templates/FileTemplate.php (119) source ► NLimitedScope:: load (arguments ►)
Responses/RenderResponse.php (54) source ► NFileTemplate-> render ()
Application/Application.php (143) source ► NRenderResponse-> send ()
app/bootstrap.php (61) source ► NApplication-> run ()
document_root/index.php (19) source ► require (arguments ►)
?>
- Johnny
- Člen | 24
Bohužel žádná změna.
Opět – nemohlo by to být tímto bugem v PHP? Mám totiž verzi 5.2 https://forum.nette.org/…5-2-0-notice
- Solution
- Člen | 50
Áha, někdo by měl napsat velkým tučným písmem, že by měl člověk
před započnutím vývoje přes checker zkontrolovat stroj. No nic, musíš
upgradovat php server, pokud ho máš na lokálu, nejlépe na 5.3.1+, tam už
můžeš používat verzi s namespace aj. výhodami.
Myslel jsem, že verzi jsi tu už včera někde řešil, tak jsem to
přešel.
- Johnny
- Člen | 24
Aha, tak já zjistím, jak to jde na hostingu aktualizovat. Myslel jsem, že
když mám verzi Nette Framework 2.0-alpha pro PHP 5.2, tak by to mělo být bez
problémů i se starší verzí PHP. Takhle budu muset i stahnout verzi Nette
Framework 2.0-alpha pro PHP 5.3, pokud to aktualizuji na PHP 5.3, že? A kromě
toho mě i takový ten „testovač“ na začátku napsal, že je vše
v pořádku :)
jinak moc díky za pomoc, pomalu se prokousávám :)