Увеличение размера кучи - это не «исправление», это «штукатурка», на 100% временная. Это снова рухнет в другом месте. Чтобы избежать этих проблем, напишите высокопроизводительный код.
Чтобы добавить новую переменную, вам необходимо создать плагин и реализовать точку расширения org.eclipse.ui.editors.templates.
Вы должны внести подкласс org.eclipse.jface.text.templates.TemplateVariableResolver, который будет реализовывать различные методы разрешения, чтобы разрешить заполнитель для желаемых значений.
См. здесь для получения справки по точке расширения и примера который вносит переменные ant.
Как говорит Мэтт Б., вам часто просто нужно определить свой текст как шаблон, поэтому реализация переменной для этого является излишним.
] = $ this-> Auth-> user ();
Замены для $ _ POST
:
<?php
...
//foreach ($_POST as $key => $value) {
foreach ($this->params['form'] as $key => $value) {
...
//if (isset($_POST['test_ipn'])) {
if (isset($this->params['form']['test_ipn'])) {
...
?>
Урок 2 : представления предназначены для совместного использования (с пользователем )
Документированный код «Компилирует премиальную информацию и отправляет пользователя в Paypal» не отправляет пользователя в PayPal. Вы выполняете перенаправление в представлении?
<?php
function redirect($premiumId) {
...
$this->redirect($url . '?' . http_build_query($paypalData), 303);
}
Перенаправляете в конце вашего контроллера и удаляете представление. :)
Урок 3 : Управление данными относится к уровню модели
<?php
class PremiumSite extends AppModel {
...
function beforeSave() {
if ($this->data['PremiumSite']['type'] == "1") {
$cost = Configure::read('App.costs.premium');
$numberOfWeeks = ((int) $this->data['PremiumSite']['length']) + 1;
$timestring = String::insert('+:number weeks', array(
'number' => $numberOfWeeks,
));
$expiration = date('Y-m-d H:i:s', strtotime($timestring));
$this->data['PremiumSite']['upfront_weeks'] = $weeks;
$this->data['PremiumSite']['upfront_expiration'] = $expiration;
$this->data['PremiumSite']['cost'] = $cost * $numberOfWeeks;
} else {
$this->data['PremiumSite']['cost'] = $cost;
}
return true;
}
...
}
?>
Урок 4 : Модели не только для доступа к базе данных
Переместите документированный код «Включает премиум-сайт после оплаты» в модель PremiumSite , и вызовите его после оплаты:
<?php
class PremiumSite extends AppModel {
...
function enable($id) {
$transaction = $this->find('first', array(
'conditions' => array('PaypalNotification.id' => $id),
'recursive' => 0,
));
$transactionType = $transaction['PaypalNotification']['txn_type'];
if ($transactionType == 'subscr_signup' ||
$transaction['PaypalNotification']['payment_status'] == 'Completed') {
//New subscription or payment
...
} elseif ($transactionType == 'subscr-cancel' ||
$transactionType == 'subscr-eot') {
//Subscription cancellation or other problem
...
}
return $this->saveAll($data);
}
...
}
?>
Вы бы позвонили из контроллера, используя $ this-> PaypalNotification-> PremiumSite-> enable (...);
, но мы не собираемся этого делать, поэтому давайте смешаем все вместе ...
Урок 5 : Источники данных - это здорово
Преобразуйте ваши взаимодействия PayPal IPN в источник данных, который используется моделью.
Конфигурация находится в app / config / database.php
<?php
class DATABASE_CONFIG {
...
var $paypal = array(
'datasource' => 'paypal_ipn',
'sandbox' => true,
'api_key' => 'w0u1dnty0ul1k3t0kn0w',
}
...
}
?>
Источник данных имеет дело с запросами веб-сервисов ( app / models / datasources / paypal_ipn_source.php
)
<?php
class PaypalIpnSource extends DataSource {
...
var $endpoint = 'http://www.paypal.com/';
var $Http = null;
var $_baseConfig = array(
'sandbox' => true,
'api_key' => null,
);
function _construct() {
if (!$this->config['api_key']) {
trigger_error('No API key specified');
}
if ($this->config['sandbox']) {
$this->endpoint = 'http://www.sandbox.paypal.com/';
}
$this->Http = App::import('Core', 'HttpSocket'); // use HttpSocket utility lib
}
function validate($data) {
...
$reponse = $this->Http->post($this->endpoint, $data);
..
return $valid; // boolean
}
...
}
?>
Пусть модель выполняет работу ( app / models / paypal_notification.php
)
Уведомления сохраняются, только если они действительны, сайты доступны только в том случае, если уведомление сохранено
<?php
class PaypalNotification extends AppModel {
...
function beforeSave() {
$valid = $this->validate($this->data);
if (!$valid) {
return false;
}
//Minor change to use item_id as premium_site_id
$this->data['PaypalNotification']['premium_site_id'] =
$this->data['PaypalNotification']['item_number'];
/*
$this->data['PaypalNotification'] = am($this->data, // use shorthand functions
array('premium_site_id' => $this->data['item_number']));
*/
return true;
}
...
function afterSave() {
return $this->PremiumSite->enable($this->id);
}
...
function validate($data) {
$paypal = ConnectionManager::getDataSource('paypal');
return $paypal->validate($data);
}
...
?>
Контроллеры не работают. ( app / controllers / paypal_notifications_controller.php
)
«Вы - пост? Нет? .. Значит, меня даже не существует». Теперь это действие просто кричит: «Я сохраняю опубликованные уведомления PayPal!»
<?php
class PaypalNotificationsController extends AppModel {
...
var $components = array('RequestHandler', ...);
...
function callback() {
if (!$this->RequestHandler->isPost()) { // use RequestHandler component
$this->cakeError('error404');
}
$processed = $this->PaypalNotification->save($notification);
if (!$processed) {
$this->cakeError('paypal_error');
}
}
...
}
?>
Бонусный раунд : используйте предоставленные библиотеки вместо собственного PHP
. Примеры следующего см. В предыдущих уроках:
Одна возможность:
String imgRegex = "<img[^>]+src\\s*=\\s*['\"]([^'\"]+)['\"][^>]*>";
- это возможность (при совпадении без учета регистра). Это немного беспорядок, и он намеренно игнорирует случай, когда кавычки не используются. Чтобы представить его, не беспокоясь о побегах строк:
<img[^>]+src\s*=\s*['"]([^'"]+)['"][^>]*>
Это соответствует:
>
(т.е. возможные другие атрибуты) src
=
'
или "
>
(другие возможные атрибуты) >
, чтобы закрыть tag На заметку:
За исключением всего того, что было отмечено deizel (отлично post btw), запомните один из основных принципов торта: толстые модели, худые контроллеры . Вы можете проверить этот пример , но основная идея состоит в том, чтобы поместить все ваши вещи, связанные с изменением данных, в ваши модели. Ваш контроллер должен (в основном) быть просто связующим звеном между вашими моделями и представлениями. Ваш PremiumSitesController :: index () является прекрасным примером того, что должно быть где-то в вашей модели (как указано deizel).
Крис Хартджес также написал книгу о рефакторинге , вы можете взглянуть на него, если действительно хотите научиться (это не бесплатно, но дешево). Кроме того, у Мэтта Карри есть один с классным названием: Super Awesome Advanced CakePHP Tips , и это совершенно бесплатно для загрузки. Обе версии хороши для чтения.
Я также хотел бы добавить свою собственную статью о торте, который, как мне кажется, важен для качества кода в торте: Форматирование и читаемость кода . Хотя я понимаю, если люди не согласны ..: -)
Ваш PremiumSitesController :: index () является прекрасным примером того, что должно быть где-то в вашей модели (как указано deizel).Крис Хартджес также написал книгу о рефакторинге , вы можете взглянуть на него, если действительно хотите научиться (это не бесплатно, но дешево). Кроме того, у Мэтта Карри есть один с классным названием: Super Awesome Advanced CakePHP Tips , и это совершенно бесплатно для загрузки. Обе версии хороши для чтения.
Я также хотел бы добавить свою собственную статью о торте, который, как мне кажется, важен для качества кода в торте: Форматирование и читаемость кода . Хотя я понимаю, если люди не согласны ..: -)
Ваш PremiumSitesController :: index () является прекрасным примером того, что должно быть где-то в вашей модели (как указано deizel).Крис Хартджес также написал книгу о рефакторинге , вы можете взглянуть на него, если действительно хотите научиться (это не бесплатно, но дешево). Кроме того, у Мэтта Карри есть один с классным названием: Super Awesome Advanced CakePHP Tips , и это совершенно бесплатно для загрузки. Обе версии хороши для чтения.
Я также хотел бы добавить свою собственную статью о торте, который, как мне кажется, важен для качества кода в торте: Форматирование и читаемость кода . Хотя я понимаю, если люди не согласны ..: -)
index () - прекрасный пример того, что должно быть где-то в вашей модели (как указано deizel).Крис Хартджес также написал книгу о рефакторинге , вы можете захотеть взгляните на него, если действительно хотите научиться (это не бесплатно, но дешево). Кроме того, у Мэтта Карри есть один с классным названием: Super Awesome Advanced CakePHP Tips , и это совершенно бесплатно для загрузки. Обе версии хороши для чтения.
Я также хотел бы добавить свою собственную статью о торте, который, как мне кажется, важен для качества кода в торте: Форматирование и читаемость кода . Хотя я понимаю, если люди не согласны ..: -)
index () - прекрасный пример того, что должно быть где-то в вашей модели (как указано deizel).Крис Хартджес также написал книгу о рефакторинге , вы можете захотеть взгляните на него, если действительно хотите научиться (это не бесплатно, но дешево). Кроме того, у Мэтта Карри есть один с классным названием: Super Awesome Advanced CakePHP Tips , и это совершенно бесплатно для загрузки. Обе версии хороши для чтения.
Я также хотел бы добавить свою собственную статью о торте, который, как мне кажется, важен для качества кода в торте: Форматирование и читаемость кода . Хотя я понимаю, если люди не согласны ..: -)
вы можете взглянуть на него, если действительно хотите научиться (это не бесплатно, но дешево). Кроме того, у Мэтта Карри есть один с классным названием: Super Awesome Advanced CakePHP Tips , и это совершенно бесплатно для загрузки. Обе версии хороши для чтения.Я также хотел бы добавить свою собственную статью о торте, который, как мне кажется, важен для качества кода в торте: Форматирование и читаемость кода . Хотя я понимаю, если люди не согласны ..: -)
вы можете взглянуть на него, если действительно хотите научиться (это не бесплатно, но дешево). Кроме того, у Мэтта Карри есть один с классным названием: Super Awesome Advanced CakePHP Tips , и это совершенно бесплатно для загрузки. Обе версии хороши для чтения.Я также хотел бы добавить свою собственную статью о торте, который, как мне кажется, важен для качества кода в торте: Форматирование и читаемость кода . Хотя я понимаю, если люди не согласны ..: -)
Я также хотел бы добавить свою статью о торте, который, как мне кажется, важен для качества кода в торте: Форматирование и читаемость кода . Хотя я понимаю, если люди не согласны ..: -) Я также хотел бы добавить свою статью о торте, который, как мне кажется, важен для качества кода в торте: Форматирование и читаемость кода . Хотя я понимаю, если люди не согласны ..: -)