Добрый день! Помогите, пожалуйста, понять в чём дело. =( Работаю с чужим кодом... Решила дописать в игрушке рост питомца (игрушка - онлайн-тамагоч). В php абсолютный чайник, поэтому догадаться даже до самых простых вещей иногда очень трудно.( Мне нужно извлечь из таблицы mysql дату создания питомца. После этого я пишу условие, в котором в зависимости от кол-ва отсчитанных месяцев отображается нужная картинка, изображающая питомца (новорождённый, ребёнок, подросток и т.д.). При загрузке этого кода на сервер картинки просто нет. =( Хотя всё остальное работает... Выборка и таблиц бд происходит через класс Zend_Db_Table. Помогите, пожалуйста, три дня уже голову ломаю. =( Не могу понять где ошиблась...(((( п.с.:В игре есть декремент времени по которому идёт отсчёт голода и счастья (unixtime_next_decrement int(10)), но по нему прописать условие я не смогла... Код (PHP): class Pet extends ActiveTable { protected $table_name = 'user_pet'; protected $primary_key = 'user_pet_id'; protected $LOOKUPS = array( array( 'local_key' => 'pet_specie_id', 'foreign_table' => 'pet_specie', 'foreign_key' => 'pet_specie_id', 'join_type' => 'inner', ), array( 'local_key' => 'pet_specie_color_id', 'foreign_table' => 'pet_specie_color', 'foreign_key' => 'pet_specie_color_id', 'join_type' => 'inner', ), ); protected $RELATED = array( 'user' => array( 'class' => 'User', 'local_key' => 'user_id', 'foreign_key' => 'user_id', 'one' => true, ), ); $happybirthday = $this->getCreatedAt(); function happybirthday($birthdayStr) { $now = new DateTime(); $birthday = new DateTime($birthdayStr); list($year, $month, $day) = explode('|', $birthday->diff($now)->format('%y|%m|%d')); $result = declination($year); $result .= declination($month); $result .= declination($day); return $result; } public function getImageUrl() { global $APP_CONFIG; if($month > 0 && $month <= 1) return "{$APP_CONFIG['public_dir']}/resources/pets/{$this->getRelativeImageDir()}/{$this->getColorImg()}"; elseif($month > 1 && $month <= 2) return "{$APP_CONFIG['public_dir']}/resources/pets/{$this->getRelativeImageDir()}/"."2"."{$this->getColorImg()}"; elseif($month > 2 && $month <= 4) return "{$APP_CONFIG['public_dir']}/resources/pets/{$this->getRelativeImageDir()}/"."3"."{$this->getColorImg()}"; elseif($month > 4 && $month <= 9) return "{$APP_CONFIG['public_dir']}/resources/pets/{$this->getRelativeImageDir()}/"."4"."{$this->getColorImg()}"; elseif($month > 9) return "{$APP_CONFIG['public_dir']}/resources/pets/{$this->getRelativeImageDir()}/"."5"."{$this->getColorImg()}"; ; } А так выглядит БД: ссылка
Спасибо вам большое за ваш пост! Путь должен получиться вида: основной путь к движку/resources/pets/папка к виду питомца/имя изображения с форматом и пристыкованным числом, которое обозначает возраст (1pet.gif). Собственно, вместо моих комментариев там выведены переменные для смарти, т.е. всё это потом передастся в .tpl Хотя, ошибки быть не должно в выводе картинки... Потому что как только я убираю условие или прописываю вместо этой переменной другую (переменную декремента), то самое первое стандартное изображение отображается. От декремента я отказалась, потому что так и не поняла в каком виде он выводится и как им вообще пользоваться... А тут у меня чувство, что, то ли я не верно вывела дату создания из бд, то ли скрипт пересчёта косячный, то ли я не правильно оттуда месяцы вытащила... Или в условии намудрила. В общем каша в голове( Ужас. А так хочется скорее это сделать и начать рисовать((((
Значит я вас не очень поняла( Вы же имели ввиду путь к изображению? {$APP_CONFIG['public_dir']}/resources/pets/{$this->getRelativeImageDir()}/{$this->getColorImg()} - должно отображаться так (собственно так и отображается, если убрать условие) - sitename.ru/resources/pets/dog/babydog.gif Изначальный абсолютно рабочий скрипт вывода изображения был таким: Код (PHP): public function getImageUrl() { global $APP_CONFIG; return "{$APP_CONFIG['public_dir']}/resources/pets/{$this->getRelativeImageDir()}/{$this->getColorImg()}"; }
ну так и покажите, какой получается. вы же сказали, что он неправильный, что картинка не показывается. Так какой он получается сейчас и какой должен быть правильным?
Простите, что туплю! =) Дело в том, что картинка не выводится вообще! Т.е. условие похоже не работает. Если посмотреть исходный код страницы, то кода самого изображения мы не увидим вообще (даже тэгов), пусто. Т.е. условие возвращает ложь и другое условие (оно в другом файле) выводит "Нет картинки". У меня чувство, что сама переменная $month не имеет значения почему-то( А может быть там вместо кол-ва месяцев числовое имя месяца?.... В общем - кошмар))) Как из функции подсчёта грамотно вытащить кол-во месяцев? И нормально ли извлечена дата вообще ($happybirthday = $this->getCreatedAt()?
это понятно =) адрес какой у неё при этом? Как же вы определили, что это путь неправильный, если вы его даже не видели? Может вы картинку не туда положили или права не выдали. Путь картинки смотрите, пишите сюда с комментариями.
Я вам выслала в ПМ адрес ссылки и доступ к тестовому аккаунту. Вы просто не так меня поняли - путь-то как раз верный, условие возвращает ложь и поэтому урла картинки НЕТ ВООБЩЕ. Никакого! В другом файле, другое условие принимает ложь этого условия и выводит слово "нет картинки". Х) Да... я сама уже кашу в голове устроила, пытаясь читать этот код....
Код (PHP): public function getImageUrl() { global $APP_CONFIG; if($month > 0 && $month <= 1 откуда берется $month? ) Раз его нет, то и условие не выполняется.
Спасибо!!!!) Значит всё-таки условие... А вы не подскажете, как вытащить эту переменную из функции function happybirthday($birthdayStr)??? Потому что там ретурном вроде как выводится всё сразу, а когда я беру месяц - как видите скрипт не пашет.
Там написано "Нет картинки". Это не то же самое, что картинки просто нет. =) Видимо он считает, что файла с картинкой нету. функция getImageUrl() в удачном случае возвращает путь. дайте тот код, в котором эта функция используется.
Хм... happybirthday($birthdayStr) возвращает уже строку с датой. Как вариант, можно передать в getImageUrl() $birthdayStr и снова там ей распарсить. Лучше конечно вынести в отдельный метод типа такого: Код (PHP): public function getDate($birthdayStr) { $now = new DateTime(); $birthday = new DateTime($birthdayStr); return explode('|', $birthday->diff($now)->format('%y|%m|%d')); } // $date = $this->getDate($birthdayStr); $month = $data[1];
Сейча-а-ас... Вот. Смарти) Код (PHP): {if $pet.image != null}<img src='{$pet.image}' border='0' alt='{$pet.name}' />{else}Нет картинки{/if} Так, сейчас попробую... но не факт что смогу, так как я всё делаю по своей логике и по примерам))))) Подскажите, что лучше гуглить, чтобы сделать так как вы описали? =)
А кто ж его этот ваш Zend знает, я им не пользовался ни разу ) Вообще, смарти тут выступает в качестве шаблона, приведенный вами в первом посте код - модели. Ещё должен быть контроллер который всё это связывает, очевидно Игорь просит его. Где-то в нем и вызывается этот getImageUrl(), там и надо передать $month в метод.
нужен код, где эта функция упоминается, а не какой-то кусочек шаблона, где нет ни слова про эту функцию =)
Извините... ^^ Похоже вот куда уходят результаты: Код (PHP): $pet_id = stripinput($_REQUEST['pet_id']); $pet = new Pet($db); $pet = $pet->findOneByUserPetId($pet_id); if($pet == null) { draw_errors('Неверно указано имя питомца'); } else { $owner = $pet->grabUser(); $PET = array( 'id' => $pet->getUserPetId(), 'name' => $pet->getPetName(), 'owner' => array( 'id' => $owner->getUserId(), 'name' => $owner->getUserName(), ), 'specie' => $pet->getSpecieName(), 'hunger' => $pet->getHungerText(), 'happiness' => $pet->getHappinessText(), 'birthdate' => $User->formatDate($pet->getCreatedAt()), 'profile' => $pet->getProfile(), 'image' => $pet->getImageUrl(), ); $renderer->assign('pet',$PET); $renderer->display('pets/profile.tpl'); } // end display pet Оказывается мой код всё это время имел синтаксическую ошибку, ибо я неверно извлекла дату. Видимо раньше через ФТП он просто не загружался, глючила файлзилла. Х( Интерпретатор ругался на эту строку: $happybirthday = $this->getCreatedAt(); И говорил вот что: syntax error, unexpected T_VARIABLE, expecting T_FUNCTION По аналогии я поправила код, попробовала внедрить вариант кода от romach. В общем теперь код выглядит так: Код (PHP): function happybirthday($birthdayStr) { $happybirthday = $this->getCreatedAt(); $now = new DateTime(); $birthday = new DateTime($birthdayStr); list($year, $month, $day) = explode('|', $birthday->diff($now)->format('%y|%m|%d')); $result = declination($year); $result .= declination($month); $result .= declination($day); return $result; } public function getDate($birthdayStr) { $now = new DateTime(); $birthday = new DateTime($birthdayStr); return explode('|', $birthday->diff($now)->format('%y|%m|%d')); $date = $this->getDate($birthdayStr); } // $month = $data[1]; //////**///// public function getImageUrl() { global $APP_CONFIG; if($month > 0 && $month <= 1) return "{$APP_CONFIG['public_dir']}/resources/pets/{$this->getRelativeImageDir()}/{$this->getColorImg()}"; elseif($month > 1 && $month <= 2) return "{$APP_CONFIG['public_dir']}/resources/pets/{$this->getRelativeImageDir()}/"."2"."{$this->getColorImg()}"; elseif($month > 2 && $month <= 4) return "{$APP_CONFIG['public_dir']}/resources/pets/{$this->getRelativeImageDir()}/"."3"."{$this->getColorImg()}"; elseif($month > 4 && $month <= 9) return "{$APP_CONFIG['public_dir']}/resources/pets/{$this->getRelativeImageDir()}/"."4"."{$this->getColorImg()}"; elseif($month > 9) return "{$APP_CONFIG['public_dir']}/resources/pets/{$this->getRelativeImageDir()}/"."5"."{$this->getColorImg()}"; ; } А выдаёт это. xDDDD
Написано же, надо выставить timezone по умолчанию ) Иначе datetime будет выкидывать exception. http://php.ru/manual/function.date-default-timezone-set.html
Простите, пожалуйста Игорь и Romach, не смогла я найти var_dump($pet) и class Pet extends... И я не знаю как timezone изменить. ((((( Очень не удобно вас напрягать, просто не к кому обратится. А я давно мечтала такую игрушку сделать... http://yadi.sk/d/EPnjsq0cPpteX - вот весь дамп БД и файловой системы (config.inc.php - содержит данные для коннекта, я их обнулила) Я вам что угодно нарисую, помогу в вёрстке - вы и так уже со мной замучились... Я почти оканчиваю уже образование на художника, а подрабатываю верстальщиком HTML+CSS и художником, поэтому правда что-то умею... п.с.: После того, как переменные ($date и $month) внесла внутрь функции getDate($birthdayStr) - сайт снова стал отображатся... х( да что за блин...
Ничего больше не нашла кроме двух файлов profile.php и pet.class.php ну и самого шаблона смарти... Поэтому полезла в документацию по зенду.... Нашла это: profile.php Код (PHP): <?php $pet_id = stripinput($_REQUEST['pet_id']); $pet = new Pet($db); $pet = $pet->findOneByUserPetId($pet_id); if($pet == null) { draw_errors('Неверно указано имя питомца'); } else { $owner = $pet->grabUser(); $PET = array( 'id' => $pet->getUserPetId(), 'name' => $pet->getPetName(), 'owner' => array( 'id' => $owner->getUserId(), 'name' => $owner->getUserName(), ), 'specie' => $pet->getSpecieName(), 'hunger' => $pet->getHungerText(), 'happiness' => $pet->getHappinessText(), 'birthdate' => $User->formatDate($pet->getCreatedAt()), 'profile' => $pet->getProfile(), 'image' => $pet->getImageUrl(), ); $renderer->assign('pet',$PET); $renderer->display('pets/profile.tpl'); } // end display pet ?> pet.class.php Код (PHP): <?php class Pet extends ActiveTable { protected $table_name = 'user_pet'; protected $primary_key = 'user_pet_id'; protected $LOOKUPS = array( array( 'local_key' => 'pet_specie_id', 'foreign_table' => 'pet_specie', 'foreign_key' => 'pet_specie_id', 'join_type' => 'inner', ), array( 'local_key' => 'pet_specie_color_id', 'foreign_table' => 'pet_specie_color', 'foreign_key' => 'pet_specie_color_id', 'join_type' => 'inner', ), ); protected $RELATED = array( 'user' => array( 'class' => 'User', 'local_key' => 'user_id', 'foreign_key' => 'user_id', 'one' => true, ), ); /** * Get the full URL for this pet's image. * * @return string /////////////*извлекаю запись из бд - формат даты: 2014-05-06 11:27:28*///////////// /////////////*пытаюсь перевести полученную дату в mktime*///////////// //$happybirthday = date('Y-m-d H:i:s', mktime($year, $month, $day, $H, $i, $s)); ////echo happybirthday($happybirthday); // Количество лет, месяцев и дней, прошедших со дня рождения function happybirthday($birthdayStr) { $happybirthday = $this->getCreatedAt(); $now = new DateTime(); $birthday = new DateTime($birthdayStr); list($year, $month, $day) = explode('|', $birthday->diff($now)->format('%y|%m|%d')); $result = declination($year); $result .= declination($month); $result .= declination($day); return $result; } public function getDate($birthdayStr) { $now = new DateTime(); $birthday = new DateTime($birthdayStr); return explode('|', $birthday->diff($now)->format('%y|%m|%d')); $date = $this->getDate($birthdayStr); $month = $data[1]; } // //////**///// public function getImageUrl() { global $APP_CONFIG; if($month > 0 && $month <= 1) return "{$APP_CONFIG['public_dir']}/resources/pets/{$this->getRelativeImageDir()}/{$this->getColorImg()}"; elseif($month > 1 && $month <= 2) return "{$APP_CONFIG['public_dir']}/resources/pets/{$this->getRelativeImageDir()}/"."2"."{$this->getColorImg()}"; elseif($month > 2 && $month <= 4) return "{$APP_CONFIG['public_dir']}/resources/pets/{$this->getRelativeImageDir()}/"."3"."{$this->getColorImg()}"; elseif($month > 4 && $month <= 9) return "{$APP_CONFIG['public_dir']}/resources/pets/{$this->getRelativeImageDir()}/"."4"."{$this->getColorImg()}"; elseif($month > 9) return "{$APP_CONFIG['public_dir']}/resources/pets/{$this->getRelativeImageDir()}/"."5"."{$this->getColorImg()}"; ; } // end getImageUrl /** * Make this its owner's active pet. * * @return bool **/ public function makeActive() { $user = $this->grabUser(); // Should never happen... if($user == null) { return false; } $user->setActiveUserPetId($this->getUserPetId()); $user->save(); return true; } // end public function makeActive /** * Add the appropriate amount to the pet's hunger level. * * @param integer $amount * @return bool **/ public function consume($amount) { $hunger = $this->getHunger() + $amount; if($hunger > $this->getMaxHunger()) { $hunger = $this->getMaxHunger(); } $this->setHunger($hunger); return $this->save(); } // end consume /** * Add the appropriate amount to the pet's happiness level. * * @param integer $amount * @return bool **/ public function play($amount) { $happy = $this->getHappiness() + $amount; if($happy > $this->getMaxHappiness()) { $happy = $this->getMaxHappiness(); } $this->setHappiness($happy); return $this->save(); } // end consume /** * Hackishly return the hunger level as a string. * * @hack * @return string **/ public function getHungerText() { $hunger = $this->getHunger(); if($hunger <= 2) return 'Истощение! Покормите!'; elseif($hunger > 2 && $hunger <= 4) return 'Сильный голод'; elseif($hunger > 4 && $hunger <= 6) return 'Небольшой голод'; elseif($hunger > 6 && $hunger <= 8) return 'Не голоден, но не против лакомства'; elseif($hunger > 8 && $hunger <= 12) return 'Сыт'; elseif($hunger > 12) return 'Обжора! Лопнет же!'; return 'error!'; } // end getHungerText /** * Hackishly return the happiness level as a string. * * @hack * @return string **/ public function getHappinessText() { $happy = $this->getHappiness(); if($happy <= 2) return 'В бешенстве! >8E'; elseif($happy > 2 && $happy <= 4) return 'Грустит и злится >:('; elseif($happy > 4 && $happy <= 6) return 'В печали :('; elseif($happy > 6 && $happy <= 8) return 'Нейтралитет :|'; elseif($happy > 8 && $happy <= 12) return 'Счастье :)'; elseif($happy > 12) return 'Счастье и радость! :D'; return 'error!'; } // end getHungerText /** * If it's time for the pet's attribute to drop, do it. * * @param integer $period_length The number of seconds that equals * one period. * @return bool **/ public function doDecrement($period_length=3600) { // It is time. if($this->getUnixtimeNextDecrement() <= time()) { // First time. if($this->getUnixtimeNextDecrement() == 0) { $interval = 1; } else { $interval = time() - $this->getUnixtimeNextDecrement(); $interval = floor($interval / $period_length); } return $this->decrementAttributes($interval,(time() + $period_length)); } // end time check // Nope, not time. return false; } // end doDecrement /** * Decrement a pet's hunger/happiness level by rand(1,3). * * @param int $periods The number of periods to decrement for. * @param int $next_time The next time to perform decremention at. * @return bool **/ protected function decrementAttributes($periods,$next_time) { // The DB should protected against negative values. $this->setHunger(($this->getHunger() - (rand(1,3) * $periods))); $this->setHappiness(($this->getHappiness() - (rand(1,3) * $periods))); $this->setUnixtimeNextDecrement($next_time); return $this->save(); } // end decrementAttributes } // end Pet ?>
В предыдущем архиве была база прямо в архиве, но для удобства - вот отдельно =) : http://yadi.sk/d/cSHs977KPqPNj