【PHP】symfony--备忘

 


未理解
下拉列表
链接助手系列
用PDO自定义SQL查询
用户会话
配置设置
参数
sfConfig

跳转
全局验证
文件上传
LOG
未理解
TOP

关于验证的问题
symfony建立的脚手架中的新增和编辑都是使用的  editsuccess模板

当需要执行验证的时候
 public function handleErrorUpdate()
{
     return sfView::SUCCESS;
}

会提示 The template "/updateSuccess.php" does not exist in:

解决办法是
  public function handleErrorUpdate()
  {
    if (!$this->getRequestParameter('thread_id'))
    {
      return $this->forward('thread', 'create');
    }
    else
    {
      return $this->forward('thread', 'edit');
    }
  }


详细解说见
http://www.symfony-project.org/forum/index.php/m/50936/?srch=Method++doesn't+exist+for+object+of+class+""#msg_50936

 

------------------------------------------------

建立一个action    提交到自己页面
 public function executeUnvalidate()
 {
  if ($this->getRequest()->getMethod() != sfRequest::POST)
  {
   $user_id = $this->getUser()->getAttribute('subscriber_id', '', 'subscriber');
   $this->user = UserPeer::retrieveByPk($user_id);
   return sfView::SUCCESS;
  }
        }


这个时候  提交
如果验证失败   进入验证失败页面  但是会提示   没有对象$user
那么问题出在哪里?

 

现看看symfony  错误处理机制

那么当用户输入错误的数据时会发生什么呢?如果并不满足login.yml文件中所写的条件,那么Symfony控制器就会将这个请求传递给 userActions类的handleErrorUnvalidate()方法,而不是form_tag参数中所设计的executeUnvalidate()方法。如果这个方法不存在,默认行为则会显示UnvalidateError.php模板。这是因为默认的handleError()方法返回:

public function handleERROR()
{
  return sfView::ERROR;
}

这是要编写的一个全新的模板。但是我们更希望重新显示登陆表单,并且将错误信息显示在相关的表单域附近。所以我们要修改显示的登陆错误行为,在我们这个例子中,UnvalidateSuccess.php模板为:

public function handleErrorUnvalidate()
{
  return sfView::SUCCESS;
}


所以  这里需要在 handleErrorUnvalidate 中  加上
 public function handleErrorUnvalidate()
 {
  $user_id = $this->getUser()->getAttribute('subscriber_id', '', 'subscriber');
  $user = UserPeer::retrieveByPk($user_id);
  return sfView::SUCCESS;
 }
结果就会正确显示

 

下拉列表 TOP


//下拉列表

<?php echo select_tag('payment',
'<option selected="selected">Visa</option>
 <option>Eurocard</option>
 <option>Mastercard</option>')
?>
=> <select name="payment" id="payment">
     <option selected="selected">Visa</option>
     <option>Eurocard</option>
     <option>Mastercard</option>
   </select>

//可选项列表
<?php echo options_for_select(array('Visa','Eurocard','Mastercard'),0) ?>
=> <option value="0" selected="selected">Visa</option>
   <option value="1">Eurocard</option>
   <option value="2">Mastercard</option>

//混合了可选项的下拉列表辅助函数
<?php echo select_tag('payment',options_for_select(array(
 'Visa',
 'Eurocard',
 'Mastercard'
),0)) ?>
=> <select name="payment" id="payment">
     <option value="0" selected">Visa</option>
     <option value="1">Eurocard</option>
     <option value="2">Mastercard</option>
   </select>

//用关联数组指明选项名称
<?php echo select_tag('name',option_for_select(array(
 'Steve'  =>'Steve',
 'Bob'    =>'Bob',
 'Albert' =>'Albert',
 'Ian'    =>'Ian',
 'Buck'   =>'Buck'
),'Ian')) ?>
=><select name="name" id="name">
    <option value="Steve">Steve</option>
    <option value="Bob">Bob</option>
    <option value="Albert">Albert</option>
    <option value="Ian" selected="selected">Ian</option>
    <option value="Buck">Buck</option>
  </select>

//可复选的下拉列表(选中值可以是一个数组)
<?php echo select_tag('payment',options_for_select(
  array('Visa' =>'Visa','Eurocard' =>'Eurocard','Mastercard' =>'Mastercard'),
array('Visa','Mastecard')
),'multiple=multiple') ?>
=><select name="payment" id="payment" multiple="multiple">
    <option value="Visa" selected="selected">
    <option value="Eurocard">Eurocard</option>
    <option value="Mastercard" seletcted="selected">Mastercard</option>
  </select>


链接助手系列 TOP




链接助手系列(Link helpers)
默认已引入
url_for()重构URLurl_for( 'URL_raw' )
link_to()文字链接link_to('link_title', 'URL_raw' [, $options] )

图像链接link_to(image_tag('img'), 'URL_raw' [, $options] )
button_to()按钮链接button_to('link_title', 'URL_raw' [, $options] )
mail_to()邮件链接mail_to('email_address', 'address title' [, $options])
文本助手(Text helpers) 引入声明:use_helper('Text')
truncate_text()裁切文本truncate_text ($text, $length , $truncate_string = '...')
excerpt_text()选摘文本excerpt_text ($text, $sentence, $radius = 100 , $truncate_string = '...')
highlight_text()加亮文本highlight_text($text, $sentence [,$highlighter])
simple_format_text()HTML编码文本simple_format_text($text)
auto_link_text()智能文本链接auto_link_text($text)
image_tag()图像助手image_tag('image_file',[, $options] )
日期助手(Date helpers) 引入声明:use_helper('Date')
format_date()日期格式化format_date($date)
format_datetime()日期时间格式化format_datetime($datetime)
format_daterange()日期区间格式化format_daterange($start_date, $end_date, 'MM/yy', 'from %s to %s', 'starting from %s', until %s')
distance_of_time_in_words()时间区间distance_of_time_in_words($from_time, $to_time, $include_seconds = false)
time_ago_in_words()时间过往time_ago_in_words($from_time, $include_seconds = false)
数字助手(Number Helpers)
引入声明: use_helper('Number')
format_number()数字格式化format_number($the_number)
format_currency()货币格式化format_currency($money_number,'CURRENCY_CODE')
国际化助手(International Helpers)
引入声明:use_helper('I18N')
format_country()地区国际化format_country('COUNTRY_CODE')
format_language()语言国际化format_language('LANGUAGE_CODE')
表单助手(Form Helpers) 默认已引入
form_tag()表单助手form_tag('test/save',[, $options])…</from>
input_tag()文本框input_tag('name', 'default_value')
textarea_tag()文本域textarea_tag('name', 'default_content', 'size=10x20')
checkbox_tag()复选框checkbox_tag('name', 'value', 'true/false')
radiobutton_tag()单选框radiobutton_tag('name', 'value', 'true/false')
input_file_tag()文件域input_file_tag('name')
input_password_tag()密码框input_password_tag('name', 'value')
input_hidden_tag()隐藏域input_hidden_tag('name', 'value')
submit_tag()提交按钮submit_tag('Save')
submit_image_tag()提交图片按钮submit_image_tag('submit_img')
select_tag()单选选取框select_tag('select_name', options_for_select(Value_array), 'selected_value'))

多选选取框select_tag('select_name', options_for_select(Value_array), selected_array,'multiple=multiple'))
object_input_tag()对象文本框object_input_tag($object, $method, $options)
object_textarea_tag()对象文本域object_textarea_tag($object, $method, $options)
object_checkbox_tag()对象复选框object_checkbox_tag($object, $method, $options)
object_select_tag()对象选择框object_select_tag($object, $method, $options)
select_country_tag()国家下拉列表select_country_tag('country', 'COUNTRY_CODE')
JavaScript助手(JavaScript helper) 引入声明:use_helper('Javascript')
link_to_function()Javascript链接link_to_function('link_title','function_name('parameter') [,$options])
javascript_tag()Javascript代码javascript_tag(" function foobar() {...}") ?>
AJAX表单助手 从属于JavaScript助手
update_element_function()更新页面元素update_element_function('element_id', $options)
form_remote_tag()AJAX表单form_remote_tag($options) ?>…</from>
submit_to_remote()AJAX表单按钮submit_to_remote('ajax_submit', 'Add in AJAX', $options))
observe_field()表单元素侦查observe_field('item', $options)
periodically_call_remote()表单整体侦查periodically_call_remote($options)


symfony1.4 解决登陆fronend后backend也直接登陆问题 TOP


 

symfony生成后台和前台后,默认的session_name是同名的,所以当前台或后台登陆任一个的时候再打开另一个应用程序状态自然是登陆状态(getAuthenticated为true),只要改变各自的session_name就可以了。

在各自的factories.yml文件中添加:
all:
routing:
    class: sfPatternRouting
    param:
      generate_shortest_url:            true
      extra_parameters_as_query_string: true

view_cache_manager:
    class: sfViewCacheManager
    param:
      cache_key_use_vary_headers: true
      cache_key_use_host_name:    true

storage:
    class: sfSessionStorage
    param:
      session_name: yunfei_backend   #前台的改成yunfei_frontend 这样就不会相互影响了


用PDO自定义 TOP


$connection = Doctrine_Manager::connection();
$query 'SELECT MAX(created_at) AS max FROM blog_article';
$statement $connection->execute($query);
$statement->execute();
$resultset $statement->fetch(PDO::FETCH_OBJ);
$max $resultset->max;


用户会话 TOP


//以下句子为任何地方均可使用

sfContext::getInstance()->getUser()->getAttribute('user_id')

 

//以下为在模板中使用

(1.2版)$sf_user->getAttribute('user_id')


(1.4版)<?php if ($sf_user->hasflash("notice")){echo $sf_user->getflash("notice"); } ?>


//以下为在action中使用

$this->getUser()->getAttribute('user_id')

$this->getUser()->setAttribute('user_id')


//会话

class myAccountActions extends sfActions

{

    public function executeLogin()

    {

        if($this->getRequestParameter('login') == 'foobar')

        {

            $this->getUser()->setAuthenticated(true);

        }

    }


    Public function executeLogout()

    {

        $this->getUser()->setAuthenticated(false);

    }

}

$this->getUser()->setAttribute('nickname', $nickname);

$tihs->getUser()->getAttribute('nickname', 'AnonymousCoward');

$this->getUser()->hasAttribute('nickname');

$this->getUser()->getAttributeHolder()->remove('nickname');

$this->getUser()->getAttributeHolder()->clear();

 

//只存在一次的会话

//在显示出下一页后,短暂属性attrib就被删除了.即使在下一页里你没有调用这个属性,它也一样会被从会话里删除.

//action中

$this->setFlash('attrib',$value);

$value = $this->getFlash('attrib');

//模板中

<?php if ($sf_flash->has('attrib')): ?>

  <?php echo $sf_flash->get('attrib') ?>

<?php endif; ?>

或者:

<?php echo $sf_flash->get('attrib') ?>


配置设置 TOP



设置访问限制,在

app/myapp/modules/mymodule/config/security.yml里


read:

  is_secure:   off     #所有的用户都可以执行read动作

update:

  is_secure:   on      #update动作只有认证的用户可以执行

delete:

  is_secure:   on      #只有认证用户

  credentials: admin   #并且有admin证书可以执行

all:

  is_secure:   off     #off是默认值


默认的安全动作在apps/myapp/config/settings.yml里设置

all:

  .actions:

    login_module:    default

    login_action:    login


    secure_module:   default

    secure_action:   secure


参数 TOP


//行为中取得参数

$request->getParameter('name');

 

//模板中取得参数

<?php echo $sf_params->get('name') ?>


//带默认值的参数

<?php echo $sf_params->get('name''default') ?>


//在模板中判断一个参数是否存在

<?php if ($sf_params->has('name')): ?>

  <p>Hello, <?php echo $sf_params->get('name') ?>!</p>

<?php else: ?>

  <p>Hello,John Doe!</p>

<?php endif; ?>


//包含所有参数的数组

$request->getParameterHolder()->getAll()


//完整的URI路径

//'http://localhost/myapp_dev.php/mymodule/myaction'

getUri()


//'/mymodule/myaction'

getPathInfo()


//在action中

$hasFoo = $this->getRequest()->hasParameter('foo');

$hasFoo = $this->hasRequestParameter('foo'); //Shorter version

$foo    = $this->getRequest()->getParameter('foo');

$foo    = $this->getRequestParameter('foo'); //Shorter version


sfConfig TOP


参数的名字由几部分组成,中间用下划线分割,顺序如下:

&与配置文件名有关的前缀(sf_代表 settings.yml, app_代表app.yml, mod_ 代表 module.yml, sf_i18n_ 代表 i18n.yml, sf_logging_ 代表 logging.yml)

&父键名(如果有),小写形式

&键名,小写形式



symfony 1.1.9取得环境的方法: sfConfig::get('sf_environment')


跳转 TOP


return sfView::NONE;

//避开视图层,但应答有HTTP头

return sfView::HEADER_ONLY;

//如果动作转发给另一个动作:

$this->forward('otherModule','index');

//如果跳转到另一个动作:

$this->redriect('otherModule/index');

$this->redirect('http://www.google.com/');

 

//错误的跳转处理:

forwardIf();

forwardUnless();

forward404If();

forward404Unless();

redirectIf();

redirectUnless();


全局验证 TOP


symfony 1.1.9 的全局验证:<?php echo $form->renderglobalerrors(); ?>


文件上传 TOP


sfWebRequest对象知道如何处理附件

class mymoduleActions extends sfActions
{
    public function executeUpload()
    {
        if ($this->getRequest()->hasFiles())
        {
            foreach ($this->getRequest()->getFileNames() as $fileName)
            {
                $fileSize = $this->getRequest()->getFileSize($fileName);
                $fileType = $this->getRequest()->getFileType($fileName);
                $fileError = $this->getRequest()->hasFileError($fileName);
                $uploadDir = sfConfig::get('sf_upload_dir');
                $this->getRequest()->moveFile('file', $uploadDir.'/'.
                $fileName);
              }
        }
    }
}

LOGTOP


调用:

                Tool::saveLog('innn_error','login:没找到$_POST["fbID"]',1);
                Tool::saveLog('innn_error','login:没找到$_POST["fbID"]',2);
                Tool::saveLog('innn_error','login:没找到$_POST["fbID"]',3);
                Tool::saveLog('innn_error','login:没找到$_POST["fbID"]',4);
                Tool::saveLog('innn_error','login:没找到$_POST["fbID"]',5);
                Tool::saveLog('innn_error','login:没找到$_POST["fbID"]',6);

类:

abstract class Tool{
   
    public static function saveLog($log_file_name,$content,$error_type)
    {
         //文本日志记录
         $logger = new sfFileLogger(new sfEventDispatcher(), array('file' => sfConfig::get('sf_log_dir'). '/'.$log_file_name.'.log'));
         $logger->log($content,$error_type, sfFileLogger::INFO);
         }

    }

生成后的LOG:
      Sep 25 01:13:08 symfony [alert] login:没找到$_POST["fbID"]
      Sep 25 01:13:08 symfony [crit] login:没找到$_POST["fbID"]
      Sep 25 01:13:08 symfony [err] login:没找到$_POST["fbID"]
      Sep 25 01:13:08 symfony [warning] login:没找到$_POST["fbID"]
      Sep 25 01:13:08 symfony [notice] login:没找到$_POST["fbID"]
      Sep 25 01:13:08 symfony [info] login:没找到$_POST["fbID"]

URL_FORTOP



url_for()在Symfony项目中,是用得比较多的一个函数,其作用就是跟据URL规则(或路由)产生一个URL字符串。

url_for() 有两种用法:

1) function url_for($internal_uri, $absolute = false);

第一种的用法,是使用内部地址(或路由规则),再加上参数(参数也一起跟在$internal_uri),产生URL字符串。$absolute为True时产生绝对路径,为False时产生相对路径,默认为False;
示例:
url_for(My_Module/My_Action);
url_for(My_Module/My_Action?id=1);
url_for(My_Module/My_Action?id=1,true);

url_for(@My_Module_Rount_Name?id=1&pageid=2);
url_for(@My_Module_Rount_Name?id=1&pageid=2&show=3,true);

2) function url_for($routeName, $params = array(), $absolute = false);

第二种的用法,是直接使用路由规则,再加上参数,产生URL字符串。$absolute为True时产生绝对路径,为False时产生相对路径,默认为False;
示例:

url_for(My_Module_Rount_Name);
url_for(My_Module_Rount_Name, array(id=>1, pageid=>2));
url_for(My_Module_Rount_Name, array(id=>1, pageid=>2, show=>3), true);

需要注意的是,第二种方式的写法的第一个参数Rount_Name,不能象第一种写法那样在前面加个@符号

TOP
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值