DatePicker (nextras) a Nette 2.3.1
- Croc
- Člen | 270
Zdravím,
chtěl bych se prosím zepatat, jestli DatePicker (ZDROJ) je
kompatibilní s Nette 2.3.1.
Mám továrničku na formulář:
<?php
namespace App\Forms;
use Nette,
App\Model\UserManager,
Nette\Application\UI\Form,
App\Model,
Nette\Forms\Container as FormContainer;
class OwnerFormFactory extends Nette\Object
{
/** @var Nette\Security\User */
public $user;
/** @var \App\Model\UserManager */
public $userManager;
public function __construct(UserManager $userManager, Nette\Security\User $user)
{
$this->userManager = $userManager;
$this->user = $user;
FormContainer::extensionMethod('addDatePicker', function (FormContainer $container, $name, $label = NULL) {
return $container[$name] = new \JanTvrdik\Components\DatePicker($label);
});
}
/**
* @return Form
*/
public function create()
{
$form = new Form;
//..........
//..........
$form->addDatePicker('birth_date', 'Datum narození:')
->setAttribute('class', 'date')
->addCondition(Form::FILLED)
->addRule(Form::PATTERN, 'Datum musí být ve formátu 15.10.2011', '([0-9]{1,2})\.([0-9]{1,2})\.([0-9]{4})');
Ale dostávám error:
Fatal Error
Class 'JanTvrdik\Components\DatePicker' not found
Tedy problém v namespace. Zkusil jsem do autoload_classmap.php (autoload od composeru) dodat toto:
'JanTvrdik\\Components\\DatePicker' => $baseDir . '/libs/DatePicker/DatePicker.php',
a pak to vrací chybu:
Nette\MemberAccessException
Cannot read an undeclared property Nette\Forms\Rule::$type
G:\workspace\XXXX\libs\DatePicker\DatePicker.php:230 source Nette\Object-> __get (arguments)
220: * Finds minimum and maximum allowed dates.
221: *
222: * @author Jan Tvrdík
223: * @param Forms\Rules
224: * @return array 0 => DateTime|NULL $minDate, 1 => DateTime|NULL $maxDate
225: */
226: private function extractRangeRule(Forms\Rules $rules)
227: {
228: $controlMin = $controlMax = NULL;
229: foreach ($rules as $rule) {
230: if ($rule->type === Forms\Rule::VALIDATOR) {
231: if ($rule->operation === Forms\Form::RANGE && !$rule->isNegative) {
232: $ruleMinMax = $rule->arg;
233: }
234:
Což už tedy je problém přímo v DatePicker.
Je tedy tato verze kompatibilní s nette 2.3.1? Nebo dělám něco špatně?
Editoval Croc (6. 5. 2015 14:55)
- Croc
- Člen | 270
Díky za tip.
Nainstaloval jsem přes composer. Dle návodu vložil potřebné do bootstrap.php:
<?php
require __DIR__ . '/../vendor/autoload.php';
use Nette\Forms\Container;
use Nextras\Forms\Controls;
$configurator = new Nette\Configurator;
$configurator->setDebugMode(true); // enable for your remote IP
$configurator->enableDebugger(__DIR__ . '/../log');
$configurator->setTempDirectory(__DIR__ . '/../temp');
$configurator->createRobotLoader()
->addDirectory(__DIR__)
->register();
$configurator->addConfig(__DIR__ . '/config/config.neon');
$configurator->addConfig(__DIR__ . '/config/config.local.neon');
//$configurator->addConfig(__DIR__ . '/config/config.production.neon');
Container::extensionMethod('addOptionList', function (Container $container, $name, $label = NULL, array $items = NULL) {
return $container[$name] = new Controls\OptionList($label, $items);
});
Container::extensionMethod('addMultiOptionList', function (Container $container, $name, $label = NULL, array $items = NULL) {
return $container[$name] = new Controls\MultiOptionList($label, $items);
});
Container::extensionMethod('addDatePicker', function (Container $container, $name, $label = NULL) {
return $container[$name] = new Controls\DatePicker($label);
});
Container::extensionMethod('addDateTimePicker', function (Container $container, $name, $label = NULL) {
return $container[$name] = new Controls\DateTimePicker($label);
});
Container::extensionMethod('addTypeahead', function(Container $container, $name, $label = NULL, $callback = NULL) {
return $container[$name] = new Controls\Typeahead($label, $callback);
});
$container = $configurator->createContainer();
return $container;
config.neon mám takto:
parameters:
php:
date.timezone: Europe/Prague
application:
errorPresenter: Error
mapping:
*: App\*Module\Presenters\*Presenter
session:
autoStart: true
expiration: 14 days
services:
- App\Model\UserManager
- App\Model\AuthManager
- App\Model\LogManager
- App\Forms\SignFormFactory
- App\Forms\RegisterFormFactory
- App\Forms\ForgotFormFactory
- App\Forms\PasswordFormFactory
- App\Forms\OwnerFormFactory
router: App\RouterFactory::createRouter
nette:
latte:
macros:
- Nextras\Forms\Bridges\Latte\Macros\BS3InputMacros
Pokud použiju:
$form->addDatePicker('birth_date', 'Datum narození:');
Formulář se zobrazí, ale datepicker se nezobrazí… Navíc PHPStorm hlásí:
Method 'addDatePicker' not found in class \Nette\Application\UI\Forms
JavaScript soubory mám načtené v hlavní šabloně:
<script src="//nette.github.io/resources/js/netteForms.min.js" type="text/javascript"></script>
<script src="{$basePath}/js/live-form-validation.js" type="text/javascript"></script>
<script src="{$basePath}/js/nextras.datetimepicker.init.js" type="text/javascript"></script>
EDIT: Tak problém bude v .js. Zkusím ještě pořešit.
Editoval Croc (7. 5. 2015 19:14)
- n.u.r.v.
- Člen | 485
mě se to teď povedlo rozběhnout, ale mám problém – typ pole se automaticky nastaví na datetime-local a v chromu + opeře se pole vykresluje špatně – chrome i opera si tam doplní svůj kalendář a další kontrolní prvky a když použiju bootstrap datetimepicker, tak se to naklikané datum do formuláře nevloží.
Nejlépe to funguje ve firefoxu
Editoval n.u.r.v. (10. 5. 2015 20:03)
- Croc
- Člen | 270
Podařilo, ale je tu jeden problém. nextras/forms nastavuje input type na date, což ve Chromu dělá problémy, protože se zobrazí nejen datepicker kalendář, ale také HTML5 vlastní kalendář pro Chrome (Ano, oba zároveň). Chrome také ignoruje formát data z DatePicker a použije vlastní – mm/dd/yyyy – tím pádem vybrané datum nevloží do inputu. Formát data v inputu pro HTML5 se změnit nedá.
Tak vyřešeno. Ve třídě **DatePicker **u nextras/forms jsem nastavil následující (původně date):
protected $htmlType = 'text';
Takže můžu používat addDatePicker a zároveň je input type = text.
Editoval Croc (20. 6. 2015 19:34)
- Croc
- Člen | 270
Ještě mám jeden problém. Výběr data a uložení do DB funguje bez problému, ale pokud načítám datum do formuláře, zobrazí se mi ve formátu yyyy-mm-dd. Poté co kliku do inputu s datumem se zobrazí kalendář, kliknu jinam (pro zavření kalendáře) a datum z pole zmizí.
Něco je evidentně špatně. Bohužel jsem zatím nepřišel co. Nemáte někdo nějaký typ prosím?
EDIT:
Áha, problém vyřešen. Ve třídě DateTimePickerPrototype
je konstanta W3C_DATE_FORMAT, pomocí které se nastaví
formát data…
Editoval Croc (20. 6. 2015 19:34)
- n.u.r.v.
- Člen | 485
tak jsem vyzkoušel výše uvedené postupy. Změnil jsem $htmlType na text (používám datetime) a sice to už funguje ve všech prohlížečích, ale blbě se ukládá čas – když např. naklikám datum 30.05.2015 23:55, tak se mi uloží do DB 2015–05–30 03:55:00, když dám 2015–05–30 10:10:00, tak se uloží 2015–05–30 00:10:00.
Co s tím? díky
- iru
- Člen | 113
Také teď řeším DatePicker s nette 2.3, problém s namespace jsem vyřešila, ale zůstavá problém, který tu byl taky uvedený: Cannot read an undeclared property Nette\Forms\Rule::$type v případě že ho vyžaduji jako povinný.
hrach tady doporučil https://github.com/nextras/forms, tak se chci zeptat, jestli to tady někomu už funguje, zvažuji jestli zkusit tohle…
- Jan Kardaš
- Člen | 4
Řešil jsem problém ohledně data-nette-rules pro client-side validaci formulářů, vycházím z videa on Honzy Skráška https://www.youtube.com/watch?…
Nextras forms mi nechtělo přidat data-nette-rules do html dokumentu pro DateTimePicker.
...
public function getControl()
{
$control = parent::getControl();
$control->type = $this->htmlType;
$control->addClass($this->htmlType);
//$control->{'data-nette-rules'} = NULL;
...
V souboru DateTimePickerPrototype.php jsem musel zakomentovat řádek 52, nyní se pravidla přidávají.