Komponenta, po přesunutí načítání dat do komponenty přestala pracovat
- Saavikam
- Člen | 17
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
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;
}