Komponenta, po přesunutí načítání dat do komponenty přestala pracovat

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

Ahoj,

píšu, protože už fakt nevím co dělám špatně. Vytvořila jsem si komponentu na vykreslování telefonu na všech stránkách. Všechno fungovalo, jenže problém byl v tom, že načtení telefon z DB jsem dělala v BasePresenter, což se mi nelíbí. Logické mi přijde, aby si komponenta provedla všechno sama – načetla z DB, vykreslila.

Takže jsem přidala potřebné modely do konstruktoru komponenty. A najednou nic. Ne že by mi to hlásilo chybu, ale nic se nestane. Jako kdyby komponentu ignoroval.

Přečetla jsem všechno možné, z nette, z toho fora, itnetwork. Fakt už nevím, co mám špatně. Moc prosím o pomoc.

PhoneControl.php

<?php

namespace App\Components;

use App\Model\AssociationManager;

use Nette\Application\UI\Control;
use Nette\Utils\ArrayHash;

use Tracy\Debugger;

/**
 * Pomocná komponenta pro vykreslování hlavniho telefonu
 * @package App\Components
 */
class PhoneControl extends Control
{
	/** Cesta k souborům šablon pro tuto komponentu. */
	const TEMPLATE_PATH = '/../templates/components/MainContact/';

	/** @var AssociationManager Instance třídy modelu */
	private $associationManager;

	private $number_main_phone;

	/**
	 * Konstruktor komponenty s modelem pro práci s produkty.
     * @param AssociationManager $associationManager
     */
	public function __construct(AssociationManager $associationManager)
	{
		parent::__construct();
		$this->associationManager = $associationManager;
	}

	/**
	 * Setter pro pocet hlavnich telefonu na strance
   * @param type $number_main_phone
   */
	public function setNumberPhone($number_main_phone)
	{
		$this->number_main_phone = $number_main_phone;
	}

   /**
    *
    * @param type $separator
    */
   public function render($separator = ', ')
	 {
		  $this->template->setFile(dirname(__FILE__) . self::TEMPLATE_PATH . 'phone.latte'); // Nastaví šablonu komponenty.

      // hlavni telefon
      if ($this->number_main_phone > 0) {
        $main_phone = $this->associationManager->getTableAssociationBySlugAll('home_phone')
        $this->template->main_phone = $array_slice($main_phone, 0, $this->number_main_phone);
      }

	  	$this->template->separator = $separator;
		  $this->template->render(); // Vykreslí komponentu.
	}

}

/**
 * Továrnička pro vytvoření pomocné komponenty pro vykreslování s využitím autowiringu.
 * @package App\Components
 */
interface IPhoneControlFactory
{
	/**
	 * Vrací novou pomocnou komponentu pro vykreslování s automaticky inejectovanými závislostmi.
	 * @return PhoneControl pomocná komponenta pro vykreslování
	 */
	public function create();
}

?>

phone.latte

{* Vypsani hlavnich telefonu *}
{if (!isset($separator) || $separator=='')}
  {var $separator = ', '}
{/if}

{if isset($phone) && count($phone)>0}
  {foreach $phone as $p}{$p|replaceRE:'#([0-9]{3})([0-9]{3})([0-9]{3})#':'\\1 \\2 \\3'}{sep}{$separator|noescape}{/sep}{/foreach}
{/if}

config.neon

parameters:
	# Paramatery
	numberOfMainPhone: 2

services:
	phoneControlFactory: # Továrnička na komponenty pro vykreslování telefonu
		implement: App\Components\IPhoneControlFactory
		setup:
			- setNumberPhone(%numberOfMainPhone%)

BasePresenter.php

<?php
namespace App\Presenters;

use Nette;

use App\Model;
use App\Model\ScaleManager;
use App\Model\ActorManager;
use App\Model\AssociationManager;

use App\Components\IPhoneControlFactory;
use App\Components\PhoneControl;

/**
 * Base presenter for all application presenters.
 */
abstract class BasePresenter extends Presenter
{

  protected $scaleManager;
  protected $actorManager;
  protected $associationManager;

  /** @var IPhoneControlFactory Instance třídy továrničky na tvorbu komponent pro vykreslování */
  private $phoneControlFactory;


  /**
   * Inject metoda s injektovanými třídami modelu, které daný presenter využívá.
   * @param ScaleManager $scaleManager
   * @param ActorManager $actorManager
   * @param AssociationManager $associationManager
   */
  public function injectManagerDependencies(ScaleManager $scaleManager,
                                            ActorManager $actorManager,
                                            AssociationManager $associationManager) {
    $this->scaleManager = $scaleManager;
    $this->actorManager = $actorManager;
    $this->associationManager = $associationManager;
  }



	/**
	 * Speciální setter pro injectování továrničky na tvorbu komponent pro vykreslování telefonu.
	 * @param IPhoneControlFactory $phoneControlFactory automaticky injectovaná továrnička na tvorbu komponent pro
	 *                                                  vykreslování telefonu
	 */
	public function injectPhoneControlFactory(IPhoneControlFactory $phoneControlFactory) {
		$this->phoneControlFactory = $phoneControlFactory;
	}

  protected function beforeRender()
  {
    parent::beforeRender();
      ...
  }


  /**
   * Vytváří a vrací komponentu pro vykreslení telefonu.
   * @return PhoneControl komponenta pro vykreslení telefonu
   */
  protected function createComponentPhone()
  {
    return new PhoneControl($this->associationManager,
                            $this->scaleManager,
                            $this->actorManager);
//      return $this->phoneControlFactory->create();
  }


}
?>

@layout.latte

{control phone}

Děkuju

Andrea

Oli
Člen | 1215
+
+1
-

Myslím, že ti chybí number of phones v továrničce (interface). To je potom 0 a nevykresli se na zakladě podmínky. V configu by to mělo stačit takhle krátký, viz.: http://zlml.cz/…nitive-guide

parameters:
    # Paramatery
    numberOfMainPhone: 2

services:
    - App\Components\IPhoneControlFactory(%numberOfMainPhone%)
interface IPhoneControlFactory
{
    /**
     * Vrací novou pomocnou komponentu pro vykreslování s automaticky inejectovanými závislostmi.
     * @return PhoneControl pomocná komponenta pro vykreslování
     */
    public function create($numberOfMainPhone);
}
protected function createComponentPhone()
{
	return $this->phoneControlFactory->create();
}
class PhoneControl extends Control
{

    public function __construct($numberOfMainPhone, AssociationManager $associationManager)
    {
        parent::__construct();
		$this->numberOfMainPhone = $numberOfMainPhone;
        $this->associationManager = $associationManager;
    }
Saavikam
Člen | 17
+
0
-

Děkuji, jsem z toho naprosto zmatená. Všechno co se týkalo komponenty jsem vymazala a napsala znovu. A najednou to funguje. Absolutně nevím, co bylo předtím špatně. Mám pocit, že všechno je stejně.

Andrea