Problém s handle v Quick Startu (Dokončení základní aplikace)

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

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é :)

Solution
Člen | 50
+
0
-

Postni sem zdrojový kod od: createComponentTodoForm()

Johnny
Člen | 24
+
0
-

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‘);
}

}

Solution
Člen | 50
+
0
-
  1. Ten kod dej do php tagů(aby se to dalo číst na foru)
  2. Chybu vidím tady:
<?php
	public function processTodoForm(AppForm $form) {
?>

má to být:

<?php
public function processTodoForm(NAppForm $form) {
?>
Johnny
Člen | 24
+
0
-

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.

?>
Solution
Člen | 50
+
0
-

Něco se ti tam cyklí, ale nevím kde, zkusil jsem použít tvůj TodoList presenter a je funkční, co tam máš ještě dál za formy?

Johnny
Člen | 24
+
0
-

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

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

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 ►)

?>
Solution
Člen | 50
+
0
-

Zkus v metodě „processTodoform“ zakomentovat toto:

<?php
//$this->redirect('Todolist:show');
?>
Johnny
Člen | 24
+
0
-

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

5.2.kolik?
Když tak vyzkoušej Checker, co je přibalen k Nette.

Editoval Padik (30. 10. 2010 19:02)

Johnny
Člen | 24
+
0
-

Laděnka píše..:
PHP 5.2.0–8
Apache/2.2.3 (Debian) PHP/5.2.0–8 mod_ssl/2.2.3 OpenSSL/0.9.8c
Nette Framework 2.0-dev (revision ecc11df released on 2010–09–30)

Solution
Člen | 50
+
0
-

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

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 :)

Aurielle
Člen | 1281
+
0
-

Na PHP 5.3 samozřejmě můžeš používat i verzi pro 5.2, jen se ochudíš o možnost použití namespace + fičur co jsou psány na namespaceované Nette…

Honza Kuchař
Člen | 1662
+
0
-

PHP od verze 5.2.3 mi funguje bez problémů.